From 1aa56272a37d4e1fbb2dc55fe2ee87fb878ff7ec Mon Sep 17 00:00:00 2001 From: Takashi Takebayashi Date: Fri, 2 Feb 2018 14:13:27 +0900 Subject: [PATCH 001/710] Fix typo * ture -> true --- .../parts/emmet/electron-browser/emmet.contribution.i18n.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index d368fda6a7e..af127333714 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -6,9 +6,9 @@ { "emmetConfigurationTitle": "Emmet", "triggerExpansionOnTab": "啟用時,按下 TAB 即可展開 Emmet 縮寫。當 emmet.useNewemmet 設定為 true 時不適用。", - "emmetPreferences": "用以修改部分 Emmet 動作及解析程式之行為的喜好設定。emmet.useNewemmet 設定為 ture 時不適用。", + "emmetPreferences": "用以修改部分 Emmet 動作及解析程式之行為的喜好設定。emmet.useNewemmet 設定為 true 時不適用。", "emmetSyntaxProfiles": "為指定的語法定義設定檔,或透過特定規則使用自己的設定檔。", "emmetExclude": "不應展開 Emmet 縮寫的語言陣列。", "emmetExtensionsPath": "包含 Emmet 設定檔、片段及喜好設定的資料夾路徑。emmet.useNewEmmet 設定為 true 時僅會從延伸模組路徑接受設定檔。", "useNewEmmet": "試試所有 Emmet 功能的新 Emmet 模組 (最終會取代舊的單一 Emmet 程式庫)。" -} \ No newline at end of file +} From f198b6fdd015aa2e0e9e20428bcd96396816b162 Mon Sep 17 00:00:00 2001 From: Michael Klement Date: Thu, 22 Feb 2018 17:04:29 -0500 Subject: [PATCH 002/710] Update package.json PowerShell Core, whose executable filename is `pwsh`, supports shebang lines on Unix platforms. This change would make VSCode properly recognize extension-less PowerShell Core scripts that have a shebang line. --- extensions/powershell/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/powershell/package.json b/extensions/powershell/package.json index 82b93077a48..f26fc072676 100644 --- a/extensions/powershell/package.json +++ b/extensions/powershell/package.json @@ -10,6 +10,7 @@ "id": "powershell", "extensions": [ ".ps1", ".psm1", ".psd1", ".pssc", ".psrc" ], "aliases": [ "PowerShell", "powershell", "ps", "ps1" ], + "firstLine": "^#!/.*\\bpwsh\\b", "configuration": "./language-configuration.json" }], "grammars": [{ @@ -25,4 +26,4 @@ "scripts": { "update-grammar": "node ../../build/npm/update-grammar.js PowerShell/EditorSyntax PowerShellSyntax.tmLanguage ./syntaxes/powershell.tmLanguage.json" } -} \ No newline at end of file +} From 173d9a2dec16a038d9d21ce174a38f53e0d3c8a8 Mon Sep 17 00:00:00 2001 From: Greg Van Liew Date: Thu, 1 Mar 2018 14:23:32 -0800 Subject: [PATCH 003/710] Edit pass on built-in extension descriptions --- extensions/bat/package.nls.json | 2 +- extensions/clojure/package.nls.json | 2 +- extensions/coffeescript/package.nls.json | 2 +- extensions/configuration-editing/package.nls.json | 2 +- extensions/cpp/package.nls.json | 2 +- extensions/csharp/package.nls.json | 2 +- extensions/docker/package.nls.json | 2 +- extensions/extension-editing/package.nls.json | 2 +- extensions/fsharp/package.nls.json | 2 +- extensions/go/package.nls.json | 2 +- extensions/groovy/package.nls.json | 2 +- extensions/handlebars/package.nls.json | 2 +- extensions/hlsl/package.nls.json | 2 +- extensions/ini/package.nls.json | 2 +- extensions/java/package.nls.json | 2 +- extensions/javascript/package.nls.json | 2 +- extensions/less/package.nls.json | 2 +- extensions/log/package.nls.json | 2 +- extensions/lua/package.nls.json | 2 +- extensions/make/package.nls.json | 2 +- extensions/markdown-basics/package.nls.json | 2 +- extensions/merge-conflict/package.nls.json | 2 +- extensions/objective-c/package.nls.json | 2 +- extensions/perl/package.nls.json | 2 +- extensions/php/package.nls.json | 2 +- extensions/powershell/package.nls.json | 2 +- extensions/pug/package.nls.json | 2 +- extensions/python/package.nls.json | 2 +- extensions/r/package.nls.json | 2 +- extensions/razor/package.nls.json | 2 +- extensions/ruby/package.nls.json | 2 +- extensions/rust/package.nls.json | 2 +- extensions/scss/package.nls.json | 2 +- extensions/shaderlab/package.nls.json | 2 +- extensions/shellscript/package.nls.json | 2 +- extensions/sql/package.nls.json | 2 +- extensions/swift/package.nls.json | 2 +- extensions/typescript-basics/package.nls.json | 2 +- extensions/vb/package.nls.json | 2 +- extensions/xml/package.nls.json | 2 +- extensions/yaml/package.nls.json | 2 +- 41 files changed, 41 insertions(+), 41 deletions(-) diff --git a/extensions/bat/package.nls.json b/extensions/bat/package.nls.json index d03ce9092a3..c5052ca0214 100644 --- a/extensions/bat/package.nls.json +++ b/extensions/bat/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Windows Bat Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in Windows batch files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in Windows batch files." } \ No newline at end of file diff --git a/extensions/clojure/package.nls.json b/extensions/clojure/package.nls.json index b104a0b455f..30bff28016a 100644 --- a/extensions/clojure/package.nls.json +++ b/extensions/clojure/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Clojure Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Clojure files" + "description": "Provides syntax highlighting and bracket matching in Clojure files." } \ No newline at end of file diff --git a/extensions/coffeescript/package.nls.json b/extensions/coffeescript/package.nls.json index 97a46719ce4..6cc7751873b 100644 --- a/extensions/coffeescript/package.nls.json +++ b/extensions/coffeescript/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "CoffeeScript Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in CoffeeScript files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in CoffeeScript files." } diff --git a/extensions/configuration-editing/package.nls.json b/extensions/configuration-editing/package.nls.json index 7e75dbe9053..b8c247a9de3 100644 --- a/extensions/configuration-editing/package.nls.json +++ b/extensions/configuration-editing/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Configuration Editing", - "description": "Provides capabilities (advanced intelli-sense, auto-fixing) in configuration files like settings, launch and extension recommendation files" + "description": "Provides capabilities (advanced IntelliSense, auto-fixing) in configuration files like settings, launch and extension recommendation files." } \ No newline at end of file diff --git a/extensions/cpp/package.nls.json b/extensions/cpp/package.nls.json index 10d615e7215..558bf45298a 100644 --- a/extensions/cpp/package.nls.json +++ b/extensions/cpp/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "C/C++ Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in C/C++ files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in C/C++ files." } \ No newline at end of file diff --git a/extensions/csharp/package.nls.json b/extensions/csharp/package.nls.json index a488acb7de2..bdc206114dd 100644 --- a/extensions/csharp/package.nls.json +++ b/extensions/csharp/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "C# Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in C# files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in C# files." } \ No newline at end of file diff --git a/extensions/docker/package.nls.json b/extensions/docker/package.nls.json index 89e45d3ad8f..2a38ca3da6b 100644 --- a/extensions/docker/package.nls.json +++ b/extensions/docker/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Docker Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Docker files" + "description": "Provides syntax highlighting and bracket matching in Docker files." } \ No newline at end of file diff --git a/extensions/extension-editing/package.nls.json b/extensions/extension-editing/package.nls.json index 89325ce28d9..9265e6a3c9d 100644 --- a/extensions/extension-editing/package.nls.json +++ b/extensions/extension-editing/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Package File Editing", - "description": "Provides intelli-sense for VS Code extension points and linting capabilities in Package json files" + "description": "Provides IntelliSense for VS Code extension points and linting capabilities in package.json files." } \ No newline at end of file diff --git a/extensions/fsharp/package.nls.json b/extensions/fsharp/package.nls.json index 914b614cb4b..42733fffaf8 100644 --- a/extensions/fsharp/package.nls.json +++ b/extensions/fsharp/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "F# Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in F# files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in F# files." } \ No newline at end of file diff --git a/extensions/go/package.nls.json b/extensions/go/package.nls.json index d781cc6f3c6..dfd2ae9f474 100644 --- a/extensions/go/package.nls.json +++ b/extensions/go/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Go Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Go files" + "description": "Provides syntax highlighting and bracket matching in Go files." } \ No newline at end of file diff --git a/extensions/groovy/package.nls.json b/extensions/groovy/package.nls.json index 82c811d8c43..9e08b0bf49b 100644 --- a/extensions/groovy/package.nls.json +++ b/extensions/groovy/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Groovy Language Basics", - "description": "Provides Syntax highlighting, Bracket matching and Snippets in Groovy files" + "description": "Provides snippets, syntax highlighting and bracket matching in Groovy files." } \ No newline at end of file diff --git a/extensions/handlebars/package.nls.json b/extensions/handlebars/package.nls.json index 8646e325426..1c2e3910e43 100644 --- a/extensions/handlebars/package.nls.json +++ b/extensions/handlebars/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Handlebars Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Handlebars files" + "description": "Provides syntax highlighting and bracket matching in Handlebars files." } \ No newline at end of file diff --git a/extensions/hlsl/package.nls.json b/extensions/hlsl/package.nls.json index 8f390728c6a..e9eefbab28a 100644 --- a/extensions/hlsl/package.nls.json +++ b/extensions/hlsl/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "HLSL Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in HLSL files" + "description": "Provides syntax highlighting and bracket matching in HLSL files." } \ No newline at end of file diff --git a/extensions/ini/package.nls.json b/extensions/ini/package.nls.json index edb501adcbc..9696de83059 100644 --- a/extensions/ini/package.nls.json +++ b/extensions/ini/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Ini Language Basics", - "description": "Provides Syntax highlightin and Bracket matching in Ini files" + "description": "Provides syntax highlighting and bracket matching in Ini files." } \ No newline at end of file diff --git a/extensions/java/package.nls.json b/extensions/java/package.nls.json index 0e29ab615b3..72c9857c303 100644 --- a/extensions/java/package.nls.json +++ b/extensions/java/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Java Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in Java files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in Java files." } \ No newline at end of file diff --git a/extensions/javascript/package.nls.json b/extensions/javascript/package.nls.json index af3370cda54..bb1285e1ad5 100644 --- a/extensions/javascript/package.nls.json +++ b/extensions/javascript/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "JavaScript Language Basics", - "description": "Provides syntax highlighting, Bracket matching, Folding and Snippets in JavaScript files." + "description": "Provides snippets, syntax highlighting, bracket matching and folding in JavaScript files." } \ No newline at end of file diff --git a/extensions/less/package.nls.json b/extensions/less/package.nls.json index 969637051dc..7010e123b8e 100644 --- a/extensions/less/package.nls.json +++ b/extensions/less/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Less Language Basics", - "description": "Provides Syntax highlighting, Folding and Bracket matching Less files." + "description": "Provides syntax highlighting, bracket matching and folding Less files." } \ No newline at end of file diff --git a/extensions/log/package.nls.json b/extensions/log/package.nls.json index a5d3018fbc6..91c5e93ad3a 100644 --- a/extensions/log/package.nls.json +++ b/extensions/log/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Log", - "description": "Provides Syntax highlighting for files with .log extension" + "description": "Provides syntax highlighting for files with .log extension." } \ No newline at end of file diff --git a/extensions/lua/package.nls.json b/extensions/lua/package.nls.json index 1a3f5dfe377..9a0e601f559 100644 --- a/extensions/lua/package.nls.json +++ b/extensions/lua/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Lua Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Lua files" + "description": "Provides syntax highlighting and bracket matching in Lua files." } \ No newline at end of file diff --git a/extensions/make/package.nls.json b/extensions/make/package.nls.json index e5171e92d28..5aeb89f25af 100644 --- a/extensions/make/package.nls.json +++ b/extensions/make/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Make Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Make files" + "description": "Provides syntax highlighting and bracket matching in Make files." } \ No newline at end of file diff --git a/extensions/markdown-basics/package.nls.json b/extensions/markdown-basics/package.nls.json index f06d85aeb9f..5911d3fdc59 100644 --- a/extensions/markdown-basics/package.nls.json +++ b/extensions/markdown-basics/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Markdown Language Basics", - "description": "Provides syntax and snippets for Markdown." + "description": "Provides snippets and syntax highlighting for Markdown." } diff --git a/extensions/merge-conflict/package.nls.json b/extensions/merge-conflict/package.nls.json index e9510e46810..66076bd7a87 100644 --- a/extensions/merge-conflict/package.nls.json +++ b/extensions/merge-conflict/package.nls.json @@ -1,6 +1,6 @@ { "displayName": "Merge Conflict", - "description": "Coloring and commands for inline merge conflicts.", + "description": "Highlighting and commands for inline merge conflicts.", "command.category": "Merge Conflict", "command.accept.all-current": "Accept All Current", "command.accept.all-incoming": "Accept All Incoming", diff --git a/extensions/objective-c/package.nls.json b/extensions/objective-c/package.nls.json index 90f5821427f..5bc51c5d049 100644 --- a/extensions/objective-c/package.nls.json +++ b/extensions/objective-c/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Objective-C Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Objective-C files" + "description": "Provides syntax highlighting and bracket matching in Objective-C files." } \ No newline at end of file diff --git a/extensions/perl/package.nls.json b/extensions/perl/package.nls.json index b06f9a96e1f..a26752a1e1a 100644 --- a/extensions/perl/package.nls.json +++ b/extensions/perl/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Perl Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Perl files" + "description": "Provides syntax highlighting and bracket matching in Perl files." } \ No newline at end of file diff --git a/extensions/php/package.nls.json b/extensions/php/package.nls.json index f6e3473c824..89a9cfedd29 100644 --- a/extensions/php/package.nls.json +++ b/extensions/php/package.nls.json @@ -7,5 +7,5 @@ "commands.categroy.php": "PHP", "command.untrustValidationExecutable": "Disallow PHP validation executable (defined as workspace setting)", "displayName": "PHP Language Features", - "description": "Provides intelli-sense, linting, and language basics for PHP files." + "description": "Provides IntelliSense, linting, and language basics for PHP files." } \ No newline at end of file diff --git a/extensions/powershell/package.nls.json b/extensions/powershell/package.nls.json index b59de8f4f1e..b54b734e599 100644 --- a/extensions/powershell/package.nls.json +++ b/extensions/powershell/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Powershell Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in Powershell files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in Powershell files." } \ No newline at end of file diff --git a/extensions/pug/package.nls.json b/extensions/pug/package.nls.json index 3469faae36e..2c7f5324dfe 100644 --- a/extensions/pug/package.nls.json +++ b/extensions/pug/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Pug Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Pug files" + "description": "Provides syntax highlighting and bracket matching in Pug files." } \ No newline at end of file diff --git a/extensions/python/package.nls.json b/extensions/python/package.nls.json index ee59c605818..9bdaf5a3d67 100644 --- a/extensions/python/package.nls.json +++ b/extensions/python/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Python Language Basics", - "description": "Provides Syntax highlighting, Folding and Bracket matching in Python files" + "description": "Provides syntax highlighting, bracket matching and folding in Python files." } \ No newline at end of file diff --git a/extensions/r/package.nls.json b/extensions/r/package.nls.json index b383264f198..e55a5012fdd 100644 --- a/extensions/r/package.nls.json +++ b/extensions/r/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "R Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in R files" + "description": "Provides syntax highlighting and bracket matching in R files." } \ No newline at end of file diff --git a/extensions/razor/package.nls.json b/extensions/razor/package.nls.json index c409d4312ac..b4f470556fd 100644 --- a/extensions/razor/package.nls.json +++ b/extensions/razor/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Razor Language Basics", - "description": "Provides Syntax highlighting, Folding and Bracket matching in Razor files" + "description": "Provides syntax highlighting, bracket matching and folding in Razor files." } \ No newline at end of file diff --git a/extensions/ruby/package.nls.json b/extensions/ruby/package.nls.json index 1b134871413..272eb46fbad 100644 --- a/extensions/ruby/package.nls.json +++ b/extensions/ruby/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Ruby Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Ruby files" + "description": "Provides syntax highlighting and bracket matching in Ruby files." } \ No newline at end of file diff --git a/extensions/rust/package.nls.json b/extensions/rust/package.nls.json index bf7a9840462..432a2206737 100644 --- a/extensions/rust/package.nls.json +++ b/extensions/rust/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Rust Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Rust files" + "description": "Provides syntax highlighting and bracket matching in Rust files." } \ No newline at end of file diff --git a/extensions/scss/package.nls.json b/extensions/scss/package.nls.json index 9660808805d..f328492b249 100644 --- a/extensions/scss/package.nls.json +++ b/extensions/scss/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "SCSS Language Basics", - "description": "Provides Syntax highlighting, Folding and Bracket matching SCSS files." + "description": "Provides syntax highlighting, bracket matching and folding in SCSS files." } \ No newline at end of file diff --git a/extensions/shaderlab/package.nls.json b/extensions/shaderlab/package.nls.json index db100b851ef..1ea4ae8174e 100644 --- a/extensions/shaderlab/package.nls.json +++ b/extensions/shaderlab/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Shaderlab Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Shaderlab files" + "description": "Provides syntax highlighting and bracket matching in Shaderlab files." } \ No newline at end of file diff --git a/extensions/shellscript/package.nls.json b/extensions/shellscript/package.nls.json index ff0c82f49d5..9360510f798 100644 --- a/extensions/shellscript/package.nls.json +++ b/extensions/shellscript/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Shell Script Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in Shell Script files" + "description": "Provides syntax highlighting and bracket matching in Shell Script files." } \ No newline at end of file diff --git a/extensions/sql/package.nls.json b/extensions/sql/package.nls.json index 5177a791d97..328fcb3e153 100644 --- a/extensions/sql/package.nls.json +++ b/extensions/sql/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "SQL Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in SQL files" + "description": "Provides syntax highlighting and bracket matching in SQL files." } \ No newline at end of file diff --git a/extensions/swift/package.nls.json b/extensions/swift/package.nls.json index 4eb3fe90f47..6a7ea4be353 100644 --- a/extensions/swift/package.nls.json +++ b/extensions/swift/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Swift Language Basics", - "description": "Provides Syntax highlighting, Bracket matching and Snippets in Swift files" + "description": "Provides snippets, syntax highlighting and bracket matching in Swift files." } \ No newline at end of file diff --git a/extensions/typescript-basics/package.nls.json b/extensions/typescript-basics/package.nls.json index 3e66d8b560d..744f91f8a47 100644 --- a/extensions/typescript-basics/package.nls.json +++ b/extensions/typescript-basics/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "TypeScript Language Basics", - "description": "Provides Syntax highlighting, Bracket matching, Folding and Snippets in TypeScript files." + "description": "Provides snippets, syntax highlighting, bracket matching and folding in TypeScript files." } \ No newline at end of file diff --git a/extensions/vb/package.nls.json b/extensions/vb/package.nls.json index e7e3008a753..45bed3ab41f 100644 --- a/extensions/vb/package.nls.json +++ b/extensions/vb/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "Visual Basic Language Basics", - "description": "Provides Syntax highlighting, Folding, Bracket matching and Snippets in Visual Basic files" + "description": "Provides snippets, syntax highlighting, bracket matching and folding in Visual Basic files." } \ No newline at end of file diff --git a/extensions/xml/package.nls.json b/extensions/xml/package.nls.json index c8e40d0c315..110b511768d 100644 --- a/extensions/xml/package.nls.json +++ b/extensions/xml/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "XML Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in XML files" + "description": "Provides syntax highlighting and bracket matching in XML files." } \ No newline at end of file diff --git a/extensions/yaml/package.nls.json b/extensions/yaml/package.nls.json index b7637e2430f..b8f93d03998 100644 --- a/extensions/yaml/package.nls.json +++ b/extensions/yaml/package.nls.json @@ -1,4 +1,4 @@ { "displayName": "YAML Language Basics", - "description": "Provides Syntax highlighting and Bracket matching in YAML files" + "description": "Provides syntax highlighting and bracket matching in YAML files." } \ No newline at end of file From 3eda13adefc0b9b01457ad7020e3de519b227d84 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Sat, 17 Mar 2018 10:31:07 +0100 Subject: [PATCH 004/710] refactoring of alreadyExists() --- .../files/electron-browser/fileActions.ts | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 7685d1f407e..3a43a3133c7 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1365,8 +1365,8 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti // Do not allow to overwrite existing file if (!allowOverwriting) { let p = parent; - const alreadyExisting = names.every((folderName) => { - let { exists, child } = alreadyExists(p, folderName); + const alreadyExisting = names.every((pathSegment) => { + let { exists, child } = alreadyExists(p, pathSegment); if (!exists) { return false; @@ -1398,22 +1398,13 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti } function alreadyExists(parent: IFileStat, name: string): { exists: boolean, child: IFileStat | undefined } { - let duplicateChild: IFileStat; - if (parent.children) { - let exists: boolean = parent.children.some((c) => { - let found: boolean; - if (isLinux) { - found = c.name === name; - } else { - found = c.name.toLowerCase() === name.toLowerCase(); + for (const child of parent.children) { + const exists: boolean = isLinux ? child.name === name : child.name.toLowerCase() === name.toLowerCase(); + if (exists) { + return { exists, child }; } - if (found) { - duplicateChild = c; - } - return found; - }); - return { exists, child: duplicateChild }; + } } return { exists: false, child: undefined }; From 3d89966399af76e1771983a0e3851a58ebc274a6 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Sat, 17 Mar 2018 11:14:43 +0100 Subject: [PATCH 005/710] removes unused param in TriggerRenameFileAction.validateFileName() --- src/vs/workbench/parts/files/electron-browser/fileActions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 3a43a3133c7..7bfd8849ce8 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -166,7 +166,7 @@ class TriggerRenameFileAction extends BaseFileAction { this._updateEnablement(); } - public validateFileName(parent: IFileStat, name: string): string { + public validateFileName(name: string): string { return this.renameAction.validateFileName(this.element.parent, name); } @@ -188,7 +188,7 @@ class TriggerRenameFileAction extends BaseFileAction { viewletState.setEditable(stat, { action: this.renameAction, validator: (value) => { - const message = this.validateFileName(this.element.parent, value); + const message = this.validateFileName(value); if (!message) { return null; From d4cc1e79fe71158d629a8cf14132b71f56247166 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Sat, 17 Mar 2018 12:57:26 +0100 Subject: [PATCH 006/710] adds validation check: file must always be a leaf --- .../files/electron-browser/fileActions.ts | 65 ++++++++++++++----- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 7bfd8849ce8..921a05069d2 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1349,7 +1349,6 @@ export class CopyPathAction extends Action { } } - export function validateFileName(parent: IFileStat, name: string, allowOverwriting: boolean = false): string { // Produce a well formed file name @@ -1362,23 +1361,16 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti const names: string[] = name.split(/[\\/]/).filter(part => !!part); + const pathAnalysis: IPathAnalysis = validatePath(parent, names); + + // a file must always be a leaf + if (!pathAnalysis.leafInfo.isLeaf) { + return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", trimLongName(pathAnalysis.leafInfo.filename)); + } + // Do not allow to overwrite existing file - if (!allowOverwriting) { - let p = parent; - const alreadyExisting = names.every((pathSegment) => { - let { exists, child } = alreadyExists(p, pathSegment); - - if (!exists) { - return false; - } else { - p = child; - return true; - } - }); - - if (alreadyExisting) { - return nls.localize('fileNameExistsError', "A file or folder **{0}** already exists at this location. Please choose a different name.", name); - } + if (!allowOverwriting && pathAnalysis.fullPathAlreadyExists) { + return nls.localize('fileNameExistsError', "A file or folder **{0}** already exists at this location. Please choose a different name.", name); } // Invalid File name @@ -1397,6 +1389,45 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti return null; } + +interface IPathAnalysis { + fullPathAlreadyExists: boolean; + leafInfo: { isLeaf: boolean, filename: string }; +} + +function validatePath(parent: IFileStat, names: string[]): IPathAnalysis { + const pathAnalysis: IPathAnalysis = { + fullPathAlreadyExists: true, + leafInfo: { isLeaf: true, filename: '' } + }; + + let p = parent; + for (let i = 0; i < names.length; i++) { + const pathSegment = names[i]; + + let { exists, child } = alreadyExists(p, pathSegment); + + if (!exists) { + pathAnalysis.fullPathAlreadyExists = false; + break; + } + + else if (!child.isDirectory) { + if (i !== names.length - 1) { + // it's not the last segment + pathAnalysis.leafInfo.isLeaf = false; + pathAnalysis.leafInfo.filename = child.name; + } + } + + else { + p = child; + } + } + + return pathAnalysis; +} + function alreadyExists(parent: IFileStat, name: string): { exists: boolean, child: IFileStat | undefined } { if (parent.children) { for (const child of parent.children) { From 5ac01be6473b941c1caaccbf2c6ec162d570f8f5 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Sat, 17 Mar 2018 16:17:39 +0100 Subject: [PATCH 007/710] displayCurrentPath() didn't make use of param projectFolderName --- .../parts/files/electron-browser/views/explorerViewer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 7430f8b23ae..0f935711c91 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -342,7 +342,7 @@ export class FileRenderer implements IRenderer { if (inputBox.validate()) { const value = inputBox.value; if (value && value.search(/[\\/]/) !== -1) { // only show if there's a slash - let newPath = paths.normalize(paths.join(initialRelPath, value), true); + let newPath = paths.normalize(paths.join(projectFolderName, initialRelPath, value), true); newPath = rtrim(newPath, paths.nativeSep); const fileType: string = FileKind[fileKind].toLowerCase(); From d7731d8e7f83771fa9e5f6dfb8faad6eade47013 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Sat, 17 Mar 2018 16:32:09 +0100 Subject: [PATCH 008/710] fixes leading slash --- .../files/electron-browser/views/explorerViewer.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 0f935711c91..03bf645a1e0 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -8,6 +8,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as nls from 'vs/nls'; import * as objects from 'vs/base/common/objects'; import * as DOM from 'vs/base/browser/dom'; +import * as path from 'path'; import URI from 'vs/base/common/uri'; import { once } from 'vs/base/common/functional'; import * as paths from 'vs/base/common/paths'; @@ -49,7 +50,6 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { extractResources, SimpleFileResourceDragAndDrop, CodeDataTransfers, fillResourceDataTransfers } from 'vs/workbench/browser/dnd'; -import { relative } from 'path'; import { WorkbenchTree, WorkbenchTreeController } from 'vs/platform/list/browser/listService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { DataTransfers } from 'vs/base/browser/dnd'; @@ -323,7 +323,7 @@ export class FileRenderer implements IRenderer { } }), DOM.addStandardDisposableListener(inputBox.inputElement, DOM.EventType.KEY_UP, (e: IKeyboardEvent) => { - const initialRelPath: string = relative(stat.root.resource.fsPath, stat.parent.resource.fsPath); + const initialRelPath: string = path.relative(stat.root.resource.fsPath, stat.parent.resource.fsPath); let projectFolderName: string = ''; if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { projectFolderName = paths.basename(stat.root.resource.fsPath); // show root folder name in multi-folder project @@ -342,13 +342,13 @@ export class FileRenderer implements IRenderer { if (inputBox.validate()) { const value = inputBox.value; if (value && value.search(/[\\/]/) !== -1) { // only show if there's a slash - let newPath = paths.normalize(paths.join(projectFolderName, initialRelPath, value), true); - newPath = rtrim(newPath, paths.nativeSep); + let displayPath = path.normalize(path.join(projectFolderName, initialRelPath, value)); + displayPath = rtrim(displayPath, paths.nativeSep); const fileType: string = FileKind[fileKind].toLowerCase(); inputBox.showMessage({ type: MessageType.INFO, - content: nls.localize('constructedPath', "Create {0} in **{1}**", fileType, newPath), + content: nls.localize('constructedPath', "Create {0} in **{1}**", fileType, displayPath), formatContent: true }); } @@ -701,7 +701,7 @@ export class FileFilter implements IFilter { // Hide those that match Hidden Patterns const siblingsFn = () => siblings && siblings.map(c => c.name); const expression = this.hiddenExpressionPerRoot.get(stat.root.resource.toString()) || Object.create(null); - if (glob.match(expression, paths.normalize(relative(stat.root.resource.fsPath, stat.resource.fsPath), true), siblingsFn)) { + if (glob.match(expression, paths.normalize(path.relative(stat.root.resource.fsPath, stat.resource.fsPath), true), siblingsFn)) { return false; // hidden through pattern } From 2b3ff85c6984dfd8e5490b1db5340fd60cc04170 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Sat, 17 Mar 2018 17:51:39 +0100 Subject: [PATCH 009/710] info messages better reflect action --- .../electron-browser/views/explorerViewer.ts | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 03bf645a1e0..8eda0a97219 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -328,7 +328,7 @@ export class FileRenderer implements IRenderer { if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { projectFolderName = paths.basename(stat.root.resource.fsPath); // show root folder name in multi-folder project } - this.displayCurrentPath(inputBox, initialRelPath, fileKind, projectFolderName); + this.displayCurrentPath(inputBox, initialRelPath, projectFolderName, editableData.action.id); }), DOM.addDisposableListener(inputBox.inputElement, DOM.EventType.BLUR, () => { done(inputBox.isInputValid(), true); @@ -338,17 +338,33 @@ export class FileRenderer implements IRenderer { ]; } - private displayCurrentPath(inputBox: InputBox, initialRelPath: string, fileKind: FileKind, projectFolderName: string = '') { + private displayCurrentPath(inputBox: InputBox, initialRelPath: string, projectFolderName: string = '', actionID: string) { if (inputBox.validate()) { const value = inputBox.value; if (value && value.search(/[\\/]/) !== -1) { // only show if there's a slash let displayPath = path.normalize(path.join(projectFolderName, initialRelPath, value)); displayPath = rtrim(displayPath, paths.nativeSep); - const fileType: string = FileKind[fileKind].toLowerCase(); + + const indexLastSlash: number = displayPath.lastIndexOf(paths.nativeSep); + const name: string = displayPath.substring(indexLastSlash + 1); + const leadingPathPart: string = displayPath.substring(0, indexLastSlash); + + let msg: string; + switch (actionID) { + case 'workbench.files.action.createFileFromExplorer': + msg = nls.localize('createFileFromExplorerInfoMessage', "Create file **{0}** in **{1}**", name, leadingPathPart); + break; + case 'workbench.files.action.renameFile': + msg = nls.localize('renameFileFromExplorerInfoMessage', "Move and rename to **{0}**", displayPath); + break; + case 'workbench.files.action.createFolderFromExplorer': // fallthrough + default: + msg = nls.localize('createFolderFromExplorerInfoMessage', "Create folder **{0}** in **{1}**", name, leadingPathPart); + } inputBox.showMessage({ type: MessageType.INFO, - content: nls.localize('constructedPath', "Create {0} in **{1}**", fileType, displayPath), + content: msg, formatContent: true }); } From a9a570a545c63193a78b6aa67c818a0634926bfe Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Thu, 22 Mar 2018 08:53:07 +0100 Subject: [PATCH 010/710] refactoring --- .../files/electron-browser/fileActions.ts | 54 ++++++++----------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 49863a9f63e..c6a74508c9e 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1353,15 +1353,20 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti const names: string[] = name.split(/[\\/]/).filter(part => !!part); - const pathAnalysis: IPathAnalysis = validatePath(parent, names); + const pathMapping: IPathMapping[] = mapPathsToExistingFolders(parent, names); + const fileWithDescendants = pathMapping.slice(0, -1) // remove leaf + .filter(p => p.exists && p.isFile) // check if one of the parents is a file + .reduce((prev, curr) => prev || curr, null); // a file must always be a leaf - if (!pathAnalysis.leafInfo.isLeaf) { - return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", trimLongName(pathAnalysis.leafInfo.filename)); + if (fileWithDescendants) { + return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", fileWithDescendants.name); } + const fullPathAlreadyExists = pathMapping.every(p => p.exists); + // Do not allow to overwrite existing file - if (!allowOverwriting && pathAnalysis.fullPathAlreadyExists) { + if (!allowOverwriting && fullPathAlreadyExists) { return nls.localize('fileNameExistsError', "A file or folder **{0}** already exists at this location. Please choose a different name.", name); } @@ -1381,43 +1386,30 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti return null; } - -interface IPathAnalysis { - fullPathAlreadyExists: boolean; - leafInfo: { isLeaf: boolean, filename: string }; +interface IPathMapping { + exists: boolean; + isFile: boolean; + name: string; } -function validatePath(parent: IFileStat, names: string[]): IPathAnalysis { - const pathAnalysis: IPathAnalysis = { - fullPathAlreadyExists: true, - leafInfo: { isLeaf: true, filename: '' } - }; +function mapPathsToExistingFolders(parent: IFileStat, pathNames: string[]): IPathMapping[] { + const mapping: IPathMapping[] = []; - let p = parent; - for (let i = 0; i < names.length; i++) { - const pathSegment = names[i]; - - let { exists, child } = alreadyExists(p, pathSegment); + for (const name of pathNames) { + let { exists, child } = alreadyExists(parent, name); if (!exists) { - pathAnalysis.fullPathAlreadyExists = false; - break; + mapping.push({ exists: false, isFile: false, name }); + return mapping; } - else if (!child.isDirectory) { - if (i !== names.length - 1) { - // it's not the last segment - pathAnalysis.leafInfo.isLeaf = false; - pathAnalysis.leafInfo.filename = child.name; - } - } + const isFile: boolean = !child.isDirectory; + mapping.push({ exists: true, isFile, name }); - else { - p = child; - } + parent = child; } - return pathAnalysis; + return mapping; } function alreadyExists(parent: IFileStat, name: string): { exists: boolean, child: IFileStat | undefined } { From 4ddeb7fb68c48c02c337c9cfd6acb61e339850f0 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Sun, 25 Mar 2018 10:44:20 +0200 Subject: [PATCH 011/710] refactoring --- .../files/electron-browser/fileActions.ts | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index c6a74508c9e..e9c1bb9866b 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1352,24 +1352,18 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti } const names: string[] = name.split(/[\\/]/).filter(part => !!part); - - const pathMapping: IPathMapping[] = mapPathsToExistingFolders(parent, names); - const fileWithDescendants = pathMapping.slice(0, -1) // remove leaf - .filter(p => p.exists && p.isFile) // check if one of the parents is a file - .reduce((prev, curr) => prev || curr, null); - - // a file must always be a leaf - if (fileWithDescendants) { - return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", fileWithDescendants.name); - } - - const fullPathAlreadyExists = pathMapping.every(p => p.exists); + const pathMapping = mapPathsToExistingFolders(parent, names); // Do not allow to overwrite existing file - if (!allowOverwriting && fullPathAlreadyExists) { + if (!allowOverwriting && pathMapping.fullPathAlreadyExists) { return nls.localize('fileNameExistsError', "A file or folder **{0}** already exists at this location. Please choose a different name.", name); } + // a file must always be a leaf + if (pathMapping.last.isFile) { + return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", pathMapping.last.name); + } + // Invalid File name if (names.some((folderName) => !paths.isValidBasename(folderName))) { return nls.localize('invalidFileNameError', "The name **{0}** is not valid as a file or folder name. Please choose a different name.", trimLongName(name)); @@ -1386,30 +1380,34 @@ export function validateFileName(parent: IFileStat, name: string, allowOverwriti return null; } -interface IPathMapping { - exists: boolean; - isFile: boolean; - name: string; +interface IMappedPath { + fullPathAlreadyExists: boolean; + last: { + isFile: boolean; + name: string; + }; } -function mapPathsToExistingFolders(parent: IFileStat, pathNames: string[]): IPathMapping[] { - const mapping: IPathMapping[] = []; +function mapPathsToExistingFolders(parent: IFileStat, pathNames: string[]): IMappedPath { + let fullPathAlreadyExists = true; + let lastPath = { isFile: false, name: '' }; for (const name of pathNames) { - let { exists, child } = alreadyExists(parent, name); + const { exists, child } = alreadyExists(parent, name); if (!exists) { - mapping.push({ exists: false, isFile: false, name }); - return mapping; + fullPathAlreadyExists = false; + break; } const isFile: boolean = !child.isDirectory; - mapping.push({ exists: true, isFile, name }); + lastPath.isFile = isFile; + lastPath.name = name; parent = child; } - return mapping; + return { fullPathAlreadyExists, last: lastPath }; } function alreadyExists(parent: IFileStat, name: string): { exists: boolean, child: IFileStat | undefined } { From 526a88aeb0fbfe2f3dea5b2c6a79a21f9e2e2815 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Tue, 27 Mar 2018 22:28:29 +0200 Subject: [PATCH 012/710] added npmExplorer --- extensions/npm/package.json | 47 +++++- extensions/npm/resources/dark/refresh.svg | 1 + extensions/npm/resources/light/refresh.svg | 1 + extensions/npm/src/main.ts | 16 +- extensions/npm/src/npmView.ts | 177 +++++++++++++++++++++ extensions/npm/src/tasks.ts | 15 ++ 6 files changed, 251 insertions(+), 6 deletions(-) create mode 100644 extensions/npm/resources/dark/refresh.svg create mode 100644 extensions/npm/resources/light/refresh.svg create mode 100644 extensions/npm/src/npmView.ts create mode 100644 extensions/npm/src/tasks.ts diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 7f2648c3d50..1f5c6526cd3 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -7,6 +7,7 @@ "engines": { "vscode": "0.10.x" }, + "enableProposedApi": true, "icon": "images/npm_icon.png", "categories": [ "Other" @@ -28,9 +29,53 @@ "main": "./out/main", "activationEvents": [ "onCommand:workbench.action.tasks.runTask", - "onLanguage:json" + "onLanguage:json", + "onView:npm" ], "contributes": { + "views": { + "explorer": [ + { + "id": "npm", + "name": "npm scripts" + } + ] + }, + "commands": [ + { + "command": "npm.runScript", + "title": "Run Script" + }, + { + "command": "npm.openScript", + "title": "Open Script" + }, + { + "command": "npm.refresh", + "title": "Refresh", + "icon": { + "light": "resources/light/refresh.svg", + "dark": "resources/dark/refresh.svg" + } + } + ], + "menus": { + "view/title": [ + { + "command": "npm.refresh", + "when": "view == npm", + "group": "navigation" + } + ], + "view/item/context": [ + { + "command": "npm.openScript", + "when": "view == npm && viewItem == packageJSON", + "group": "1_navigation" + } + ] + }, + "configuration": { "id": "npm", "type": "object", diff --git a/extensions/npm/resources/dark/refresh.svg b/extensions/npm/resources/dark/refresh.svg new file mode 100644 index 00000000000..d79fdaa4e8e --- /dev/null +++ b/extensions/npm/resources/dark/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/npm/resources/light/refresh.svg b/extensions/npm/resources/light/refresh.svg new file mode 100644 index 00000000000..e0345748192 --- /dev/null +++ b/extensions/npm/resources/light/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index ee072978725..49530ec615f 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -14,11 +14,22 @@ import * as minimatch from 'minimatch'; const localize = nls.loadMessageBundle(); import { addJSONProviders } from './features/jsonContributions'; +import { NpmScriptsTreeDataProvider } from './npmView'; +import { NpmTaskDefinition, ScriptValidator } from './tasks'; type AutoDetect = 'on' | 'off'; let taskProvider: vscode.Disposable | undefined; +class Validator implements ScriptValidator { + async scriptIsValid(_task: vscode.Task): Promise { + // let tasks = await provideNpmScriptsForFolder(packageUri); + return true; + } +} + export function activate(context: vscode.ExtensionContext): void { + vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, new Validator())); + if (!vscode.workspace.workspaceFolders) { return; } @@ -67,11 +78,6 @@ async function readFile(file: string): Promise { }); } -interface NpmTaskDefinition extends vscode.TaskDefinition { - script: string; - path?: string; -} - const buildNames: string[] = ['build', 'compile', 'watch']; function isBuildTask(name: string): boolean { for (let buildName of buildNames) { diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts new file mode 100644 index 00000000000..375bb881b4b --- /dev/null +++ b/extensions/npm/src/npmView.ts @@ -0,0 +1,177 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { + ExtensionContext, Task, TreeDataProvider, TreeItem, TreeItemCollapsibleState, + WorkspaceFolder, workspace, commands, window, EventEmitter, Event, + ThemeIcon, Uri, TextDocument +} from 'vscode'; +import { NpmTaskDefinition, ScriptValidator } from './tasks'; +import * as path from 'path'; + +class Folder extends TreeItem { + packages: PackageJSON[] = []; + + constructor(folder: WorkspaceFolder) { + super(folder.name, TreeItemCollapsibleState.Collapsed); + this.contextValue = 'folder'; + this.resourceUri = folder.uri; + this.iconPath = ThemeIcon.Folder; + } + + addPackage(packageJson: PackageJSON) { + this.packages.push(packageJson); + } +} + +const packageName = 'package.json'; + +class PackageJSON extends TreeItem { + path: string; + folder: Folder; + scripts: NpmScript[] = []; + + static getLabel(folderName: string, relativePath: string): string { + if (relativePath.length > 0) { + return path.join(relativePath, packageName); + } + return path.join(folderName, packageName); + } + + constructor(folder: Folder, relativePath: string) { + super(PackageJSON.getLabel(folder.label!, relativePath), TreeItemCollapsibleState.Collapsed); + this.folder = folder; + this.path = relativePath; + this.contextValue = 'packageJSON'; + this.resourceUri = Uri.file(path.join(folder!.resourceUri!.fsPath, relativePath, packageName)); + this.iconPath = ThemeIcon.File; + } + + addScript(script: NpmScript) { + this.scripts.push(script); + } +} + +class NpmScript extends TreeItem { + task: Task; + package: PackageJSON; + + constructor(packageJson: PackageJSON, task: Task) { + super(task.name, TreeItemCollapsibleState.None); + this.contextValue = 'script'; + this.package = packageJson; + this.task = task; + this.command = { + title: 'Run Script', + command: 'npm.runScript', + arguments: [task] + }; + } +} + +export class NpmScriptsTreeDataProvider implements TreeDataProvider { + private taskTree: Folder[] | PackageJSON[] | null = null; + private validator: ScriptValidator; + private _onDidChangeTreeData: EventEmitter = new EventEmitter(); + readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; + + + constructor(context: ExtensionContext, validator: ScriptValidator) { + const subscriptions = context.subscriptions; + this.validator = validator; + subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); + subscriptions.push(commands.registerCommand('npm.openScript', this.openScript, this)); + subscriptions.push(commands.registerCommand('npm.refresh', this.refresh, this)); + } + + private runScript(task: Task) { + if (!this.validator.scriptIsValid(task)) { + window.showErrorMessage(`Could not find script ${task.name}`); + return; + } + workspace.executeTask(task); + } + + private async openScript(packageJSON: PackageJSON) { + let document: TextDocument = await workspace.openTextDocument(packageJSON.resourceUri!); + window.showTextDocument(document); + } + + private refresh() { + this.taskTree = null; + this._onDidChangeTreeData.fire(); + } + + getTreeItem(element: TreeItem): TreeItem { + return element; + } + + getParent(element: TreeItem): TreeItem | null { + if (element instanceof Folder) { + return null; + } + if (element instanceof PackageJSON) { + return element.folder; + } + if (element instanceof NpmScript) { + return element.package; + } + return null; + } + + async getChildren(element?: TreeItem): Promise { + if (!this.taskTree) { + let tasks = await workspace.fetchTasks(); + let npmTasks = tasks.filter(each => each.definition.type === 'npm'); + this.taskTree = this.buildTaskTree(npmTasks); + } + if (element instanceof Folder) { + return element.packages; + } + if (element instanceof PackageJSON) { + return element.scripts; + } + if (element instanceof NpmScript) { + return []; + } + return this.taskTree; + } + + private isWorkspaceFolder(value: any): value is WorkspaceFolder { + return value && typeof value !== 'number'; + } + + private buildTaskTree(tasks: Task[]): Folder[] | PackageJSON[] { + let folders: Map = new Map(); + let packages: Map = new Map(); + + let folder = null; + let packageJson = null; + + tasks.forEach(each => { + if (this.isWorkspaceFolder(each.scope)) { + folder = folders.get(each.scope.name); + if (!folder) { + folder = new Folder(each.scope); + folders.set(each.scope.name, folder); + } + let definition: NpmTaskDefinition = each.definition; + let path = definition.path ? definition.path : ''; + packageJson = packages.get(path); + if (!packageJson) { + packageJson = new PackageJSON(folder, path); + folder.addPackage(packageJson); + packages.set(path, packageJson); + } + let script = new NpmScript(packageJson, each); + packageJson.addScript(script); + } + }); + if (folders.size === 1) { + return [...packages.values()]; + } + return [...folders.values()]; + } +} \ No newline at end of file diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts new file mode 100644 index 00000000000..24c4ba2e497 --- /dev/null +++ b/extensions/npm/src/tasks.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { TaskDefinition, Task } from 'vscode'; + +export interface NpmTaskDefinition extends TaskDefinition { + script: string; + path?: string; +} + +export interface ScriptValidator { + scriptIsValid(task: Task): Promise; +} \ No newline at end of file From 67949967f940f25347260504783683b32cdeb2e5 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Tue, 27 Mar 2018 23:50:23 +0200 Subject: [PATCH 013/710] fetch only npm tasks --- extensions/npm/src/main.ts | 18 ++++++++++-------- extensions/npm/src/npmView.ts | 20 ++++++++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 49530ec615f..29cfd32d14b 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -28,20 +28,22 @@ class Validator implements ScriptValidator { } export function activate(context: vscode.ExtensionContext): void { - vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, new Validator())); - - if (!vscode.workspace.workspaceFolders) { - return; - } - - taskProvider = vscode.workspace.registerTaskProvider('npm', { + let provider: vscode.TaskProvider = { provideTasks: () => { return provideNpmScripts(); }, resolveTask(_task: vscode.Task): vscode.Task | undefined { return undefined; } - }); + }; + taskProvider = vscode.workspace.registerTaskProvider('npm', provider); + + vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, new Validator())); + + if (!vscode.workspace.workspaceFolders) { + return; + } + configureHttpRequest(); vscode.workspace.onDidChangeConfiguration(() => configureHttpRequest()); diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 375bb881b4b..fa00617ef46 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -6,7 +6,7 @@ import { ExtensionContext, Task, TreeDataProvider, TreeItem, TreeItemCollapsibleState, WorkspaceFolder, workspace, commands, window, EventEmitter, Event, - ThemeIcon, Uri, TextDocument + ThemeIcon, Uri, TextDocument, TaskProvider } from 'vscode'; import { NpmTaskDefinition, ScriptValidator } from './tasks'; import * as path from 'path'; @@ -74,13 +74,15 @@ class NpmScript extends TreeItem { export class NpmScriptsTreeDataProvider implements TreeDataProvider { private taskTree: Folder[] | PackageJSON[] | null = null; private validator: ScriptValidator; + private taskProvider: TaskProvider; private _onDidChangeTreeData: EventEmitter = new EventEmitter(); readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; - constructor(context: ExtensionContext, validator: ScriptValidator) { + constructor(context: ExtensionContext, taskProvider: TaskProvider, validator: ScriptValidator) { const subscriptions = context.subscriptions; this.validator = validator; + this.taskProvider = taskProvider; subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); subscriptions.push(commands.registerCommand('npm.openScript', this.openScript, this)); subscriptions.push(commands.registerCommand('npm.refresh', this.refresh, this)); @@ -123,9 +125,10 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { async getChildren(element?: TreeItem): Promise { if (!this.taskTree) { - let tasks = await workspace.fetchTasks(); - let npmTasks = tasks.filter(each => each.definition.type === 'npm'); - this.taskTree = this.buildTaskTree(npmTasks); + let tasks = await this.taskProvider.provideTasks(); + if (tasks) { + this.taskTree = this.buildTaskTree(tasks); + } } if (element instanceof Folder) { return element.packages; @@ -136,7 +139,12 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { if (element instanceof NpmScript) { return []; } - return this.taskTree; + if (!element) { + if (this.taskTree) { + return this.taskTree; + } + } + return []; } private isWorkspaceFolder(value: any): value is WorkspaceFolder { From a765cafa61a1a24296846671d5ee9119f56d1255 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Wed, 28 Mar 2018 15:51:19 +0200 Subject: [PATCH 014/710] Detect out of date scripts --- extensions/npm/src/main.ts | 30 ++++++++++++++++++++++++++---- extensions/npm/src/npmView.ts | 21 +++++++++++---------- extensions/npm/src/tasks.ts | 6 +++++- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 29cfd32d14b..38935c2c68a 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -15,15 +15,37 @@ const localize = nls.loadMessageBundle(); import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; -import { NpmTaskDefinition, ScriptValidator } from './tasks'; +import { NpmTaskDefinition, ScriptValidator, isWorkspaceFolder } from './tasks'; type AutoDetect = 'on' | 'off'; let taskProvider: vscode.Disposable | undefined; class Validator implements ScriptValidator { - async scriptIsValid(_task: vscode.Task): Promise { - // let tasks = await provideNpmScriptsForFolder(packageUri); - return true; + async scriptIsValid(task: vscode.Task): Promise { + let uri: vscode.Uri | null = this.getPackageJsonUri(task); + if (uri) { + let tasks = await provideNpmScriptsForFolder(uri); + for (let i = 0; i < tasks.length; i++) { + const t = tasks[i]; + if (isWorkspaceFolder(task.scope) && isWorkspaceFolder(task.scope)) { + if (t.name === task.name && t.scope === task.scope && ((t.execution)).commandLine === ((task.execution)).commandLine) { + return true; + } + } + } + } + return false; + } + + getPackageJsonUri(task: vscode.Task): vscode.Uri | null { + if (isWorkspaceFolder(task.scope)) { + if (task.definition.path) { + return vscode.Uri.file(path.join(task.scope.uri.fsPath, task.definition.path, 'package.json')); + } else { + return vscode.Uri.file(path.join(task.scope.uri.fsPath, 'package.json')); + } + } + return null; } } diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index fa00617ef46..cb0f455c048 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -8,7 +8,7 @@ import { WorkspaceFolder, workspace, commands, window, EventEmitter, Event, ThemeIcon, Uri, TextDocument, TaskProvider } from 'vscode'; -import { NpmTaskDefinition, ScriptValidator } from './tasks'; +import { NpmTaskDefinition, ScriptValidator, isWorkspaceFolder } from './tasks'; import * as path from 'path'; class Folder extends TreeItem { @@ -45,7 +45,11 @@ class PackageJSON extends TreeItem { this.folder = folder; this.path = relativePath; this.contextValue = 'packageJSON'; - this.resourceUri = Uri.file(path.join(folder!.resourceUri!.fsPath, relativePath, packageName)); + if (relativePath) { + this.resourceUri = Uri.file(path.join(folder!.resourceUri!.fsPath, relativePath, packageName)); + } else { + this.resourceUri = Uri.file(path.join(folder!.resourceUri!.fsPath, packageName)); + } this.iconPath = ThemeIcon.File; } @@ -83,14 +87,15 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { const subscriptions = context.subscriptions; this.validator = validator; this.taskProvider = taskProvider; + subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); subscriptions.push(commands.registerCommand('npm.openScript', this.openScript, this)); subscriptions.push(commands.registerCommand('npm.refresh', this.refresh, this)); } - private runScript(task: Task) { - if (!this.validator.scriptIsValid(task)) { - window.showErrorMessage(`Could not find script ${task.name}`); + private async runScript(task: Task) { + if (!await this.validator.scriptIsValid(task)) { + window.showErrorMessage(`Could not find script '${task.name}' or the script has changed. Try to refresh the view.`); return; } workspace.executeTask(task); @@ -147,10 +152,6 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { return []; } - private isWorkspaceFolder(value: any): value is WorkspaceFolder { - return value && typeof value !== 'number'; - } - private buildTaskTree(tasks: Task[]): Folder[] | PackageJSON[] { let folders: Map = new Map(); let packages: Map = new Map(); @@ -159,7 +160,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let packageJson = null; tasks.forEach(each => { - if (this.isWorkspaceFolder(each.scope)) { + if (isWorkspaceFolder(each.scope)) { folder = folders.get(each.scope.name); if (!folder) { folder = new Folder(each.scope); diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 24c4ba2e497..cb443e387b6 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { TaskDefinition, Task } from 'vscode'; +import { TaskDefinition, Task, WorkspaceFolder } from 'vscode'; export interface NpmTaskDefinition extends TaskDefinition { script: string; @@ -12,4 +12,8 @@ export interface NpmTaskDefinition extends TaskDefinition { export interface ScriptValidator { scriptIsValid(task: Task): Promise; +} + +export function isWorkspaceFolder(value: any): value is WorkspaceFolder { + return value && typeof value !== 'number'; } \ No newline at end of file From 2f581e89868ba7196c64317c0a7c021b272dc706 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Wed, 28 Mar 2018 15:34:56 -0700 Subject: [PATCH 015/710] Allow a space between # and `region` for folding in Python Automatic formatting inserts a space between the comment marker `#` and text in the Python extension, so without the allowance for whitespace then `"editor.formatOnType": true` breaks all region markers. Closes Microsoft/vscode-python#1073 and Microsoft/vscode-python#33 --- extensions/python/language-configuration.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/python/language-configuration.json b/extensions/python/language-configuration.json index c2c4aabc862..4717d09750b 100644 --- a/extensions/python/language-configuration.json +++ b/extensions/python/language-configuration.json @@ -43,8 +43,8 @@ "folding": { "offSide": true, "markers": { - "start": "^\\s*#region\\b", - "end": "^\\s*#endregion\\b" + "start": "^\\s*#\\s*region\\b", + "end": "^\\s*#\\s*endregion\\b" } } } From 2ce1f53e36f5e4f848c659e39f80b2daaf2b8548 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Fri, 30 Mar 2018 16:51:05 +0200 Subject: [PATCH 016/710] add Debug script command --- extensions/npm/package.json | 18 +++++- extensions/npm/src/main.ts | 106 +++++++--------------------------- extensions/npm/src/npmView.ts | 89 +++++++++++++++++++++++----- extensions/npm/src/tasks.ts | 62 ++++++++++++++++++-- 4 files changed, 167 insertions(+), 108 deletions(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 1f5c6526cd3..cf413e1ec40 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -44,11 +44,15 @@ "commands": [ { "command": "npm.runScript", - "title": "Run Script" + "title": "Run" + }, + { + "command": "npm.debugScript", + "title": "Debug" }, { "command": "npm.openScript", - "title": "Open Script" + "title": "Open" }, { "command": "npm.refresh", @@ -72,6 +76,16 @@ "command": "npm.openScript", "when": "view == npm && viewItem == packageJSON", "group": "1_navigation" + }, + { + "command": "npm.runScript", + "when": "view == npm && viewItem == script", + "group": "1_navigation" + }, + { + "command": "npm.debugScript", + "when": "view == npm && viewItem == script", + "group": "1_navigation" } ] }, diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 38935c2c68a..b3109903ee6 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -5,7 +5,6 @@ 'use strict'; import * as path from 'path'; -import * as fs from 'fs'; import * as httpRequest from 'request-light'; import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; @@ -15,40 +14,11 @@ const localize = nls.loadMessageBundle(); import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; -import { NpmTaskDefinition, ScriptValidator, isWorkspaceFolder } from './tasks'; +import { NpmTaskDefinition, getScripts } from './tasks'; type AutoDetect = 'on' | 'off'; let taskProvider: vscode.Disposable | undefined; -class Validator implements ScriptValidator { - async scriptIsValid(task: vscode.Task): Promise { - let uri: vscode.Uri | null = this.getPackageJsonUri(task); - if (uri) { - let tasks = await provideNpmScriptsForFolder(uri); - for (let i = 0; i < tasks.length; i++) { - const t = tasks[i]; - if (isWorkspaceFolder(task.scope) && isWorkspaceFolder(task.scope)) { - if (t.name === task.name && t.scope === task.scope && ((t.execution)).commandLine === ((task.execution)).commandLine) { - return true; - } - } - } - } - return false; - } - - getPackageJsonUri(task: vscode.Task): vscode.Uri | null { - if (isWorkspaceFolder(task.scope)) { - if (task.definition.path) { - return vscode.Uri.file(path.join(task.scope.uri.fsPath, task.definition.path, 'package.json')); - } else { - return vscode.Uri.file(path.join(task.scope.uri.fsPath, 'package.json')); - } - } - return null; - } -} - export function activate(context: vscode.ExtensionContext): void { let provider: vscode.TaskProvider = { provideTasks: () => { @@ -60,7 +30,7 @@ export function activate(context: vscode.ExtensionContext): void { }; taskProvider = vscode.workspace.registerTaskProvider('npm', provider); - vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, new Validator())); + vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, localize)); if (!vscode.workspace.workspaceFolders) { return; @@ -83,25 +53,6 @@ export function deactivate(): void { } } -async function exists(file: string): Promise { - return new Promise((resolve, _reject) => { - fs.exists(file, (value) => { - resolve(value); - }); - }); -} - -async function readFile(file: string): Promise { - return new Promise((resolve, reject) => { - fs.readFile(file, (err, data) => { - if (err) { - reject(err); - } - resolve(data.toString()); - }); - }); -} - const buildNames: string[] = ['build', 'compile', 'watch']; function isBuildTask(name: string): boolean { for (let buildName of buildNames) { @@ -182,46 +133,29 @@ function isExcluded(folder: vscode.WorkspaceFolder, packageJsonUri: vscode.Uri) async function provideNpmScriptsForFolder(packageJsonUri: vscode.Uri): Promise { let emptyTasks: vscode.Task[] = []; - if (packageJsonUri.scheme !== 'file') { - return emptyTasks; - } - - let packageJson = packageJsonUri.fsPath; - - if (!await exists(packageJson)) { - return emptyTasks; - } - let folder = vscode.workspace.getWorkspaceFolder(packageJsonUri); if (!folder) { return emptyTasks; } - - try { - var contents = await readFile(packageJson); - var json = JSON.parse(contents); - if (!json.scripts) { - return emptyTasks; - } - - const result: vscode.Task[] = []; - Object.keys(json.scripts).filter(isNotPreOrPostScript).forEach(each => { - const task = createTask(each, `run ${each}`, folder!, packageJsonUri); - const lowerCaseTaskName = each.toLowerCase(); - if (isBuildTask(lowerCaseTaskName)) { - task.group = vscode.TaskGroup.Build; - } else if (isTestTask(lowerCaseTaskName)) { - task.group = vscode.TaskGroup.Test; - } - result.push(task); - }); - // always add npm install (without a problem matcher) - // result.push(createTask('install', 'install', rootPath, folder, [])); - return result; - } catch (e) { - let localizedParseError = localize('npm.parseError', 'Npm task detection: failed to parse the file {0}', packageJsonUri); - throw new Error(localizedParseError); + let scripts = await getScripts(packageJsonUri, localize); + if (!scripts) { + return emptyTasks; } + + const result: vscode.Task[] = []; + Object.keys(scripts).filter(isNotPreOrPostScript).forEach(each => { + const task = createTask(each, `run ${each}`, folder!, packageJsonUri); + const lowerCaseTaskName = each.toLowerCase(); + if (isBuildTask(lowerCaseTaskName)) { + task.group = vscode.TaskGroup.Build; + } else if (isTestTask(lowerCaseTaskName)) { + task.group = vscode.TaskGroup.Test; + } + result.push(task); + }); + // always add npm install (without a problem matcher) + // result.push(createTask('install', 'install', rootPath, folder, [])); + return result; } function createTask(script: string, cmd: string, folder: vscode.WorkspaceFolder, packageJsonUri: vscode.Uri, matcher?: any): vscode.Task { diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index cb0f455c048..fe03679c5b2 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -2,14 +2,15 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +'use strict'; -import { - ExtensionContext, Task, TreeDataProvider, TreeItem, TreeItemCollapsibleState, - WorkspaceFolder, workspace, commands, window, EventEmitter, Event, - ThemeIcon, Uri, TextDocument, TaskProvider -} from 'vscode'; -import { NpmTaskDefinition, ScriptValidator, isWorkspaceFolder } from './tasks'; import * as path from 'path'; +import { + DebugConfiguration, Event, EventEmitter, ExtensionContext, Task, TaskProvider, + TextDocument, ThemeIcon, TreeDataProvider, TreeItem, TreeItemCollapsibleState, Uri, + WorkspaceFolder, commands, debug, window, workspace +} from 'vscode'; +import { NpmTaskDefinition, getPackageJsonUriFromTask, getScripts, isWorkspaceFolder } from './tasks'; class Folder extends TreeItem { packages: PackageJSON[] = []; @@ -70,35 +71,95 @@ class NpmScript extends TreeItem { this.command = { title: 'Run Script', command: 'npm.runScript', - arguments: [task] + arguments: [this] }; } } export class NpmScriptsTreeDataProvider implements TreeDataProvider { private taskTree: Folder[] | PackageJSON[] | null = null; - private validator: ScriptValidator; private taskProvider: TaskProvider; + private localize: any; private _onDidChangeTreeData: EventEmitter = new EventEmitter(); readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; - constructor(context: ExtensionContext, taskProvider: TaskProvider, validator: ScriptValidator) { + constructor(context: ExtensionContext, taskProvider: TaskProvider, localize: any) { const subscriptions = context.subscriptions; - this.validator = validator; this.taskProvider = taskProvider; + this.localize = localize; subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); + subscriptions.push(commands.registerCommand('npm.debugScript', this.debugScript, this)); subscriptions.push(commands.registerCommand('npm.openScript', this.openScript, this)); subscriptions.push(commands.registerCommand('npm.refresh', this.refresh, this)); } - private async runScript(task: Task) { - if (!await this.validator.scriptIsValid(task)) { - window.showErrorMessage(`Could not find script '${task.name}' or the script has changed. Try to refresh the view.`); + private async scriptIsValid(scripts: any, task: Task): Promise { + if (scripts[task.name]) { + return true; + } + return false; + } + + private async runScript(script: NpmScript) { + let task = script.task; + let uri = getPackageJsonUriFromTask(task); + let scripts = await getScripts(uri!, this.localize); + + if (!await this.scriptIsValid(scripts, task)) { + window.showErrorMessage(`Could not find script '${task.name}'. Try to refresh the view.`); return; } - workspace.executeTask(task); + workspace.executeTask(script.task); + } + + private async extractPort(scripts: any, task: Task): Promise { + let script: string = scripts[task.name]; + let match = script.match(/--inspect-brk=(\d*)/); + if (match && match.length === 2) { + return parseInt(match[1]); + } + return null; + } + + private async debugScript(script: NpmScript) { + let task = script.task; + let uri = getPackageJsonUriFromTask(task); + let scripts = await getScripts(uri!, this.localize); + + if (!await this.scriptIsValid(scripts, task)) { + window.showErrorMessage(`Could not find script '${task.name}'. Try to refresh the view.`); + return; + } + + let port = await this.extractPort(scripts, task); + // let debugArgs = null; + // if (!port) { + // port = 9229; + // debugArgs = ['--', '--nolazy', `--inspect-brk=${port}`]; + // } + if (!port) { + window.showErrorMessage(`Could not launch for debugging, the script does not define --inspect-brk=port.`); + return; + } + const config: DebugConfiguration = { + type: 'node', + request: 'launch', + name: `Debug ${task.name}`, + runtimeExecutable: 'npm', + runtimeArgs: [ + 'run-script', + task.name, + ], + port: port + }; + // if (debugArgs) { + // config.runtimeArgs.push(...debugArgs); + // } + if (isWorkspaceFolder(task.scope)) { + debug.startDebugging(task.scope, config); + } } private async openScript(packageJSON: PackageJSON) { diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index cb443e387b6..c443ee2f252 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -2,18 +2,68 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +'use strict'; -import { TaskDefinition, Task, WorkspaceFolder } from 'vscode'; +import { TaskDefinition, Task, WorkspaceFolder, Uri } from 'vscode'; +import * as path from 'path'; +import * as fs from 'fs'; export interface NpmTaskDefinition extends TaskDefinition { script: string; path?: string; } -export interface ScriptValidator { - scriptIsValid(task: Task): Promise; -} - export function isWorkspaceFolder(value: any): value is WorkspaceFolder { return value && typeof value !== 'number'; -} \ No newline at end of file +} + +export function getPackageJsonUriFromTask(task: Task): Uri | null { + if (isWorkspaceFolder(task.scope)) { + if (task.definition.path) { + return Uri.file(path.join(task.scope.uri.fsPath, task.definition.path, 'package.json')); + } else { + return Uri.file(path.join(task.scope.uri.fsPath, 'package.json')); + } + } + return null; +} + +export async function exists(file: string): Promise { + return new Promise((resolve, _reject) => { + fs.exists(file, (value) => { + resolve(value); + }); + }); +} + +export async function readFile(file: string): Promise { + return new Promise((resolve, reject) => { + fs.readFile(file, (err, data) => { + if (err) { + reject(err); + } + resolve(data.toString()); + }); + }); +} + +export async function getScripts(packageJsonUri: Uri, localize: any): Promise { + + if (packageJsonUri.scheme !== 'file') { + return null; + } + + let packageJson = packageJsonUri.fsPath; + if (!await exists(packageJson)) { + return null; + } + + try { + var contents = await readFile(packageJson); + var json = JSON.parse(contents); + return json.scripts; + } catch (e) { + let localizedParseError = localize('npm.parseError', 'Npm task detection: failed to parse the file {0}', packageJsonUri); + throw new Error(localizedParseError); + } +} From 2b731189421d595b2044a793a3a84c1067a1d0da Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Fri, 30 Mar 2018 17:32:18 +0200 Subject: [PATCH 017/710] adding open for script --- extensions/npm/package.json | 11 ++++++++--- extensions/npm/src/npmView.ts | 13 +++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index cf413e1ec40..42eaffd1130 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -75,17 +75,22 @@ { "command": "npm.openScript", "when": "view == npm && viewItem == packageJSON", - "group": "1_navigation" + "group": "navigation" }, { "command": "npm.runScript", "when": "view == npm && viewItem == script", - "group": "1_navigation" + "group": "navigation@1" }, { "command": "npm.debugScript", "when": "view == npm && viewItem == script", - "group": "1_navigation" + "group": "navigation@2" + }, + { + "command": "npm.openScript", + "when": "view == npm && viewItem == script", + "group": "navigation@3" } ] }, diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index fe03679c5b2..b932d84681a 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -162,8 +162,17 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { } } - private async openScript(packageJSON: PackageJSON) { - let document: TextDocument = await workspace.openTextDocument(packageJSON.resourceUri!); + private async openScript(selection: PackageJSON | NpmScript) { + let uri: Uri | undefined = undefined; + if (selection instanceof PackageJSON) { + uri = selection.resourceUri!; + } else if (selection instanceof NpmScript) { + uri = selection.package.resourceUri; + } + if (!uri) { + return; + } + let document: TextDocument = await workspace.openTextDocument(uri); window.showTextDocument(document); } From 2599d9526b36e10b15663c4aac7344fb5b6ed99f Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sat, 31 Mar 2018 12:48:53 +0200 Subject: [PATCH 018/710] honor the package manager when launching for debugging --- extensions/npm/src/main.ts | 4 ++-- extensions/npm/src/npmView.ts | 18 +++++++++++++----- extensions/npm/src/tasks.ts | 6 +++++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index b3109903ee6..67dd1c2f150 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -14,7 +14,7 @@ const localize = nls.loadMessageBundle(); import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; -import { NpmTaskDefinition, getScripts } from './tasks'; +import { NpmTaskDefinition, getScripts, getPackageManager } from './tasks'; type AutoDetect = 'on' | 'off'; let taskProvider: vscode.Disposable | undefined; @@ -168,7 +168,7 @@ function createTask(script: string, cmd: string, folder: vscode.WorkspaceFolder, } function getCommandLine(folder: vscode.WorkspaceFolder, cmd: string): string { - let packageManager = vscode.workspace.getConfiguration('npm', folder.uri).get('packageManager', 'npm'); + let packageManager = getPackageManager(folder); if (vscode.workspace.getConfiguration('npm', folder.uri).get('runSilent')) { return `${packageManager} --silent ${cmd}`; } diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index b932d84681a..62889d038ac 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -10,15 +10,17 @@ import { TextDocument, ThemeIcon, TreeDataProvider, TreeItem, TreeItemCollapsibleState, Uri, WorkspaceFolder, commands, debug, window, workspace } from 'vscode'; -import { NpmTaskDefinition, getPackageJsonUriFromTask, getScripts, isWorkspaceFolder } from './tasks'; +import { NpmTaskDefinition, getPackageJsonUriFromTask, getScripts, isWorkspaceFolder, getPackageManager } from './tasks'; class Folder extends TreeItem { packages: PackageJSON[] = []; + workspaceFolder: WorkspaceFolder; constructor(folder: WorkspaceFolder) { - super(folder.name, TreeItemCollapsibleState.Collapsed); + super(folder.name, TreeItemCollapsibleState.Expanded); this.contextValue = 'folder'; this.resourceUri = folder.uri; + this.workspaceFolder = folder; this.iconPath = ThemeIcon.Folder; } @@ -42,7 +44,7 @@ class PackageJSON extends TreeItem { } constructor(folder: Folder, relativePath: string) { - super(PackageJSON.getLabel(folder.label!, relativePath), TreeItemCollapsibleState.Collapsed); + super(PackageJSON.getLabel(folder.label!, relativePath), TreeItemCollapsibleState.Expanded); this.folder = folder; this.path = relativePath; this.contextValue = 'packageJSON'; @@ -74,6 +76,10 @@ class NpmScript extends TreeItem { arguments: [this] }; } + + getFolder(): WorkspaceFolder { + return this.package.folder.workspaceFolder; + } } export class NpmScriptsTreeDataProvider implements TreeDataProvider { @@ -140,14 +146,16 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { // debugArgs = ['--', '--nolazy', `--inspect-brk=${port}`]; // } if (!port) { - window.showErrorMessage(`Could not launch for debugging, the script does not define --inspect-brk=port.`); + window.showErrorMessage(`Could not launch for debugging, the script needs to include the node debug options: --inspect-brk=port.`); return; } + + let packageManager = getPackageManager(script.getFolder()); const config: DebugConfiguration = { type: 'node', request: 'launch', name: `Debug ${task.name}`, - runtimeExecutable: 'npm', + runtimeExecutable: packageManager, runtimeArgs: [ 'run-script', task.name, diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index c443ee2f252..6c4db9e1d31 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TaskDefinition, Task, WorkspaceFolder, Uri } from 'vscode'; +import { TaskDefinition, Task, WorkspaceFolder, Uri, workspace } from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; @@ -17,6 +17,10 @@ export function isWorkspaceFolder(value: any): value is WorkspaceFolder { return value && typeof value !== 'number'; } +export function getPackageManager(folder: WorkspaceFolder): string { + return workspace.getConfiguration('npm', folder.uri).get('packageManager', 'npm'); +} + export function getPackageJsonUriFromTask(task: Task): Uri | null { if (isWorkspaceFolder(task.scope)) { if (task.definition.path) { From f27b68cdcc53eade9de91d50020163bf9bd5c38f Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sat, 31 Mar 2018 15:52:32 +0200 Subject: [PATCH 019/710] improve error message --- extensions/npm/src/npmView.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 62889d038ac..440a3ce7030 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -140,13 +140,8 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { } let port = await this.extractPort(scripts, task); - // let debugArgs = null; - // if (!port) { - // port = 9229; - // debugArgs = ['--', '--nolazy', `--inspect-brk=${port}`]; - // } if (!port) { - window.showErrorMessage(`Could not launch for debugging, the script needs to include the node debug options: --inspect-brk=port.`); + window.showErrorMessage(`Could not launch '${task.name}' for debugging, the script needs to include the node debug options: '--nolazy --inspect-brk=port', [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).`); return; } @@ -162,9 +157,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { ], port: port }; - // if (debugArgs) { - // config.runtimeArgs.push(...debugArgs); - // } + if (isWorkspaceFolder(task.scope)) { debug.startDebugging(task.scope, config); } From 41b49e2dc18a434c595e2288bd42920d961cadea Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sat, 31 Mar 2018 17:24:32 +0200 Subject: [PATCH 020/710] added icons --- extensions/npm/package.json | 9 ++++++++- extensions/npm/resources/dark/script.svg | 1 + extensions/npm/resources/light/script.svg | 1 + extensions/npm/src/npmView.ts | 11 ++++++++--- 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 extensions/npm/resources/dark/script.svg create mode 100644 extensions/npm/resources/light/script.svg diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 42eaffd1130..80b5975c9a0 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -37,7 +37,8 @@ "explorer": [ { "id": "npm", - "name": "npm scripts" + "name": "npm scripts", + "when": "config.npm.explorerVisible" } ] }, @@ -136,6 +137,12 @@ }, "description": "%config.npm.exclude%", "scope": "resource" + }, + "npm.explorerVisible": { + "type": "boolean", + "default": true, + "scope": "resource", + "description": "Show the npm scripts explorer" } } }, diff --git a/extensions/npm/resources/dark/script.svg b/extensions/npm/resources/dark/script.svg new file mode 100644 index 00000000000..f90781897a7 --- /dev/null +++ b/extensions/npm/resources/dark/script.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/npm/resources/light/script.svg b/extensions/npm/resources/light/script.svg new file mode 100644 index 00000000000..fb1c74cf773 --- /dev/null +++ b/extensions/npm/resources/light/script.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 440a3ce7030..241f6404850 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -65,7 +65,7 @@ class NpmScript extends TreeItem { task: Task; package: PackageJSON; - constructor(packageJson: PackageJSON, task: Task) { + constructor(context: ExtensionContext, packageJson: PackageJSON, task: Task) { super(task.name, TreeItemCollapsibleState.None); this.contextValue = 'script'; this.package = packageJson; @@ -75,6 +75,10 @@ class NpmScript extends TreeItem { command: 'npm.runScript', arguments: [this] }; + this.iconPath = { + light: context.asAbsolutePath(path.join('resources', 'light', 'script.svg')), + dark: context.asAbsolutePath(path.join('resources', 'dark', 'script.svg')) + }; } getFolder(): WorkspaceFolder { @@ -86,6 +90,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { private taskTree: Folder[] | PackageJSON[] | null = null; private taskProvider: TaskProvider; private localize: any; + private extensionContext: ExtensionContext; private _onDidChangeTreeData: EventEmitter = new EventEmitter(); readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; @@ -94,7 +99,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { const subscriptions = context.subscriptions; this.taskProvider = taskProvider; this.localize = localize; - + this.extensionContext = context; subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); subscriptions.push(commands.registerCommand('npm.debugScript', this.debugScript, this)); subscriptions.push(commands.registerCommand('npm.openScript', this.openScript, this)); @@ -245,7 +250,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { folder.addPackage(packageJson); packages.set(path, packageJson); } - let script = new NpmScript(packageJson, each); + let script = new NpmScript(this.extensionContext, packageJson, each); packageJson.addScript(script); } }); From 14ce79bb4e69d500a40319d867cd68ee2da4bae3 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sat, 31 Mar 2018 17:35:54 +0200 Subject: [PATCH 021/710] refactoring: extract task related code into tasks module --- extensions/npm/src/main.ts | 148 +----------------------------------- extensions/npm/src/tasks.ts | 147 ++++++++++++++++++++++++++++++++++- 2 files changed, 148 insertions(+), 147 deletions(-) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 67dd1c2f150..4ed886bc55f 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -4,25 +4,22 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import * as path from 'path'; import * as httpRequest from 'request-light'; import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; -import * as minimatch from 'minimatch'; const localize = nls.loadMessageBundle(); import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; -import { NpmTaskDefinition, getScripts, getPackageManager } from './tasks'; +import { provideNpmScripts } from './tasks'; -type AutoDetect = 'on' | 'off'; let taskProvider: vscode.Disposable | undefined; export function activate(context: vscode.ExtensionContext): void { let provider: vscode.TaskProvider = { provideTasks: () => { - return provideNpmScripts(); + return provideNpmScripts(localize); }, resolveTask(_task: vscode.Task): vscode.Task | undefined { return undefined; @@ -52,144 +49,3 @@ export function deactivate(): void { taskProvider.dispose(); } } - -const buildNames: string[] = ['build', 'compile', 'watch']; -function isBuildTask(name: string): boolean { - for (let buildName of buildNames) { - if (name.indexOf(buildName) !== -1) { - return true; - } - } - return false; -} - -const testNames: string[] = ['test']; -function isTestTask(name: string): boolean { - for (let testName of testNames) { - if (name === testName) { - return true; - } - } - return false; -} - -function isNotPreOrPostScript(script: string): boolean { - return !(script.startsWith('pre') || script.startsWith('post')); -} - -async function provideNpmScripts(): Promise { - let emptyTasks: vscode.Task[] = []; - let allTasks: vscode.Task[] = []; - - let folders = vscode.workspace.workspaceFolders; - if (!folders) { - return emptyTasks; - } - try { - for (let i = 0; i < folders.length; i++) { - let folder = folders[i]; - if (isEnabled(folder)) { - let relativePattern = new vscode.RelativePattern(folder, '**/package.json'); - let paths = await vscode.workspace.findFiles(relativePattern, '**/node_modules/**'); - for (let j = 0; j < paths.length; j++) { - if (!isExcluded(folder, paths[j])) { - let tasks = await provideNpmScriptsForFolder(paths[j]); - allTasks.push(...tasks); - } - } - } - } - return allTasks; - } catch (error) { - return Promise.reject(error); - } -} - -function isEnabled(folder: vscode.WorkspaceFolder): boolean { - return vscode.workspace.getConfiguration('npm', folder.uri).get('autoDetect') === 'on'; -} - -function isExcluded(folder: vscode.WorkspaceFolder, packageJsonUri: vscode.Uri) { - function testForExclusionPattern(path: string, pattern: string): boolean { - return minimatch(path, pattern, { dot: true }); - } - - let exclude = vscode.workspace.getConfiguration('npm', folder.uri).get('exclude'); - - if (exclude) { - if (Array.isArray(exclude)) { - for (let pattern of exclude) { - if (testForExclusionPattern(packageJsonUri.fsPath, pattern)) { - return true; - } - } - } else if (testForExclusionPattern(packageJsonUri.fsPath, exclude)) { - return true; - } - } - return false; -} - -async function provideNpmScriptsForFolder(packageJsonUri: vscode.Uri): Promise { - let emptyTasks: vscode.Task[] = []; - - let folder = vscode.workspace.getWorkspaceFolder(packageJsonUri); - if (!folder) { - return emptyTasks; - } - let scripts = await getScripts(packageJsonUri, localize); - if (!scripts) { - return emptyTasks; - } - - const result: vscode.Task[] = []; - Object.keys(scripts).filter(isNotPreOrPostScript).forEach(each => { - const task = createTask(each, `run ${each}`, folder!, packageJsonUri); - const lowerCaseTaskName = each.toLowerCase(); - if (isBuildTask(lowerCaseTaskName)) { - task.group = vscode.TaskGroup.Build; - } else if (isTestTask(lowerCaseTaskName)) { - task.group = vscode.TaskGroup.Test; - } - result.push(task); - }); - // always add npm install (without a problem matcher) - // result.push(createTask('install', 'install', rootPath, folder, [])); - return result; -} - -function createTask(script: string, cmd: string, folder: vscode.WorkspaceFolder, packageJsonUri: vscode.Uri, matcher?: any): vscode.Task { - - function getTaskName(script: string, file: string) { - if (file.length) { - return `${script} - ${file.substring(0, file.length - 1)}`; - } - return script; - } - - function getCommandLine(folder: vscode.WorkspaceFolder, cmd: string): string { - let packageManager = getPackageManager(folder); - if (vscode.workspace.getConfiguration('npm', folder.uri).get('runSilent')) { - return `${packageManager} --silent ${cmd}`; - } - return `${packageManager} ${cmd}`; - } - - function getRelativePath(folder: vscode.WorkspaceFolder, packageJsonUri: vscode.Uri): string { - let rootUri = folder.uri; - let absolutePath = packageJsonUri.path.substring(0, packageJsonUri.path.length - 'package.json'.length); - return absolutePath.substring(rootUri.path.length + 1); - } - - let kind: NpmTaskDefinition = { - type: 'npm', - script: script - }; - let relativePackageJson = getRelativePath(folder, packageJsonUri); - if (relativePackageJson.length) { - kind.path = getRelativePath(folder, packageJsonUri); - } - let taskName = getTaskName(script, relativePackageJson); - let cwd = path.dirname(packageJsonUri.fsPath); - return new vscode.Task(kind, folder, taskName, 'npm', new vscode.ShellExecution(getCommandLine(folder, cmd), { cwd: cwd }), matcher); -} diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 6c4db9e1d31..9f10bb91201 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -4,15 +4,42 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TaskDefinition, Task, WorkspaceFolder, Uri, workspace } from 'vscode'; +import { TaskDefinition, Task, TaskGroup, WorkspaceFolder, RelativePattern, ShellExecution, Uri, workspace } from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; +import * as minimatch from 'minimatch'; export interface NpmTaskDefinition extends TaskDefinition { script: string; path?: string; } +type AutoDetect = 'on' | 'off'; + +const buildNames: string[] = ['build', 'compile', 'watch']; +function isBuildTask(name: string): boolean { + for (let buildName of buildNames) { + if (name.indexOf(buildName) !== -1) { + return true; + } + } + return false; +} + +const testNames: string[] = ['test']; +function isTestTask(name: string): boolean { + for (let testName of testNames) { + if (name === testName) { + return true; + } + } + return false; +} + +function isNotPreOrPostScript(script: string): boolean { + return !(script.startsWith('pre') || script.startsWith('post')); +} + export function isWorkspaceFolder(value: any): value is WorkspaceFolder { return value && typeof value !== 'number'; } @@ -21,6 +48,124 @@ export function getPackageManager(folder: WorkspaceFolder): string { return workspace.getConfiguration('npm', folder.uri).get('packageManager', 'npm'); } +export async function provideNpmScripts(localize: any): Promise { + let emptyTasks: Task[] = []; + let allTasks: Task[] = []; + + let folders = workspace.workspaceFolders; + if (!folders) { + return emptyTasks; + } + try { + for (let i = 0; i < folders.length; i++) { + let folder = folders[i]; + if (isEnabled(folder)) { + let relativePattern = new RelativePattern(folder, '**/package.json'); + let paths = await workspace.findFiles(relativePattern, '**/node_modules/**'); + for (let j = 0; j < paths.length; j++) { + if (!isExcluded(folder, paths[j])) { + let tasks = await provideNpmScriptsForFolder(localize, paths[j]); + allTasks.push(...tasks); + } + } + } + } + return allTasks; + } catch (error) { + return Promise.reject(error); + } +} + +function isEnabled(folder: WorkspaceFolder): boolean { + return workspace.getConfiguration('npm', folder.uri).get('autoDetect') === 'on'; +} + +function isExcluded(folder: WorkspaceFolder, packageJsonUri: Uri) { + function testForExclusionPattern(path: string, pattern: string): boolean { + return minimatch(path, pattern, { dot: true }); + } + + let exclude = workspace.getConfiguration('npm', folder.uri).get('exclude'); + + if (exclude) { + if (Array.isArray(exclude)) { + for (let pattern of exclude) { + if (testForExclusionPattern(packageJsonUri.fsPath, pattern)) { + return true; + } + } + } else if (testForExclusionPattern(packageJsonUri.fsPath, exclude)) { + return true; + } + } + return false; +} + +async function provideNpmScriptsForFolder(localize: any, packageJsonUri: Uri): Promise { + let emptyTasks: Task[] = []; + + let folder = workspace.getWorkspaceFolder(packageJsonUri); + if (!folder) { + return emptyTasks; + } + let scripts = await getScripts(packageJsonUri, localize); + if (!scripts) { + return emptyTasks; + } + + const result: Task[] = []; + Object.keys(scripts).filter(isNotPreOrPostScript).forEach(each => { + const task = createTask(each, `run ${each}`, folder!, packageJsonUri); + const lowerCaseTaskName = each.toLowerCase(); + if (isBuildTask(lowerCaseTaskName)) { + task.group = TaskGroup.Build; + } else if (isTestTask(lowerCaseTaskName)) { + task.group = TaskGroup.Test; + } + result.push(task); + }); + // always add npm install (without a problem matcher) + // result.push(createTask('install', 'install', rootPath, folder, [])); + return result; +} + +function createTask(script: string, cmd: string, folder: WorkspaceFolder, packageJsonUri: Uri, matcher?: any): Task { + + function getTaskName(script: string, file: string) { + if (file.length) { + return `${script} - ${file.substring(0, file.length - 1)}`; + } + return script; + } + + function getCommandLine(folder: WorkspaceFolder, cmd: string): string { + let packageManager = getPackageManager(folder); + if (workspace.getConfiguration('npm', folder.uri).get('runSilent')) { + return `${packageManager} --silent ${cmd}`; + } + return `${packageManager} ${cmd}`; + } + + function getRelativePath(folder: WorkspaceFolder, packageJsonUri: Uri): string { + let rootUri = folder.uri; + let absolutePath = packageJsonUri.path.substring(0, packageJsonUri.path.length - 'package.json'.length); + return absolutePath.substring(rootUri.path.length + 1); + } + + let kind: NpmTaskDefinition = { + type: 'npm', + script: script + }; + let relativePackageJson = getRelativePath(folder, packageJsonUri); + if (relativePackageJson.length) { + kind.path = getRelativePath(folder, packageJsonUri); + } + let taskName = getTaskName(script, relativePackageJson); + let cwd = path.dirname(packageJsonUri.fsPath); + return new Task(kind, folder, taskName, 'npm', new ShellExecution(getCommandLine(folder, cmd), { cwd: cwd }), matcher); +} + + export function getPackageJsonUriFromTask(task: Task): Uri | null { if (isWorkspaceFolder(task.scope)) { if (task.definition.path) { From 3d5f0b75afe14bf05826c6176c328ea3efff0173 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sat, 31 Mar 2018 23:06:43 +0200 Subject: [PATCH 022/710] externalize strings --- extensions/npm/package.json | 12 ++++++------ extensions/npm/package.nls.json | 10 +++++++++- extensions/npm/src/main.ts | 25 ++++++++++++------------- extensions/npm/src/npmView.ts | 12 +++++++++--- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 80b5975c9a0..6d980700c56 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -37,7 +37,7 @@ "explorer": [ { "id": "npm", - "name": "npm scripts", + "name": "%view.name%", "when": "config.npm.explorerVisible" } ] @@ -45,19 +45,19 @@ "commands": [ { "command": "npm.runScript", - "title": "Run" + "title": "%command.run%" }, { "command": "npm.debugScript", - "title": "Debug" + "title": "%command.debug%" }, { "command": "npm.openScript", - "title": "Open" + "title": "%command.openScript%" }, { "command": "npm.refresh", - "title": "Refresh", + "title": "%command.refresh%", "icon": { "light": "resources/light/refresh.svg", "dark": "resources/dark/refresh.svg" @@ -142,7 +142,7 @@ "type": "boolean", "default": true, "scope": "resource", - "description": "Show the npm scripts explorer" + "description": "%config.npm.explorerVisible%" } } }, diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json index 0a9ece35f6e..1738894f9e0 100644 --- a/extensions/npm/package.nls.json +++ b/extensions/npm/package.nls.json @@ -5,7 +5,15 @@ "config.npm.runSilent": "Run npm commands with the `--silent` option.", "config.npm.packageManager": "The package manager used to run scripts.", "config.npm.exclude": "Configure glob patterns for folders that should be excluded from automatic script detection.", + "config.npm.explorerVisible": "Show the npm scripts explorer.", "npm.parseError": "Npm task detection: failed to parse the file {0}", "taskdef.script": "The npm script to customize.", - "taskdef.path": "The path to the folder of the package.json file that provides the script. Can be ommitted." + "taskdef.path": "The path to the folder of the package.json file that provides the script. Can be ommitted.", + "view.name": "npm scripts", + "command.refresh": "Refresh", + "command.run": "Run", + "command.debug": "Debug", + "command.openScript": "Open", + "npm.scriptInvalid": "Could not find the script '{0}'. Try to refresh the view.", + "npm.noDebugOptions": "Could not launch '{0}' for debugging, the script needs to include the node debug options: '--nolazy --inspect-brk=port', [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).`" } diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 4ed886bc55f..1cce17efab8 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -17,20 +17,19 @@ import { provideNpmScripts } from './tasks'; let taskProvider: vscode.Disposable | undefined; export function activate(context: vscode.ExtensionContext): void { - let provider: vscode.TaskProvider = { - provideTasks: () => { - return provideNpmScripts(localize); - }, - resolveTask(_task: vscode.Task): vscode.Task | undefined { - return undefined; - } - }; - taskProvider = vscode.workspace.registerTaskProvider('npm', provider); - vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, localize)); - - if (!vscode.workspace.workspaceFolders) { - return; + if (vscode.workspace.workspaceFolders) { + let provider: vscode.TaskProvider = { + provideTasks: () => { + return provideNpmScripts(localize); + }, + resolveTask(_task: vscode.Task): vscode.Task | undefined { + return undefined; + } + }; + taskProvider = vscode.workspace.registerTaskProvider('npm', provider); + let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, localize)); + context.subscriptions.push(treeDataProvider); } configureHttpRequest(); diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 241f6404850..97fb9461f29 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -119,7 +119,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let scripts = await getScripts(uri!, this.localize); if (!await this.scriptIsValid(scripts, task)) { - window.showErrorMessage(`Could not find script '${task.name}'. Try to refresh the view.`); + this.scriptNotValid(task); return; } workspace.executeTask(script.task); @@ -140,13 +140,14 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let scripts = await getScripts(uri!, this.localize); if (!await this.scriptIsValid(scripts, task)) { - window.showErrorMessage(`Could not find script '${task.name}'. Try to refresh the view.`); + this.scriptNotValid(task); return; } let port = await this.extractPort(scripts, task); if (!port) { - window.showErrorMessage(`Could not launch '${task.name}' for debugging, the script needs to include the node debug options: '--nolazy --inspect-brk=port', [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).`); + let message = this.localize('npm.noDebugOptions', 'Could not launch "{0}" for debugging, the script needs to include the node debug options: "--nolazy --inspect-brk=port", [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).', task.name); + window.showErrorMessage(message); return; } @@ -168,6 +169,11 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { } } + private scriptNotValid(task: Task) { + let message = this.localize('npm.scriptInvalid', 'Could not find the script "{0}". Try to refresh the view.', task.name); + window.showErrorMessage(message); + } + private async openScript(selection: PackageJSON | NpmScript) { let uri: Uri | undefined = undefined; if (selection instanceof PackageJSON) { From 8f6206c7d0386b96c17c5fc899282c474d67b95d Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sun, 1 Apr 2018 18:13:55 +0200 Subject: [PATCH 023/710] bug fixing --- extensions/npm/src/npmView.ts | 25 ++++++++++++++----------- extensions/npm/src/tasks.ts | 18 +++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 97fb9461f29..d55c62f834f 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -10,7 +10,7 @@ import { TextDocument, ThemeIcon, TreeDataProvider, TreeItem, TreeItemCollapsibleState, Uri, WorkspaceFolder, commands, debug, window, workspace } from 'vscode'; -import { NpmTaskDefinition, getPackageJsonUriFromTask, getScripts, isWorkspaceFolder, getPackageManager } from './tasks'; +import { NpmTaskDefinition, getPackageJsonUriFromTask, getScripts, isWorkspaceFolder, getPackageManager, getTaskName } from './tasks'; class Folder extends TreeItem { packages: PackageJSON[] = []; @@ -94,7 +94,6 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { private _onDidChangeTreeData: EventEmitter = new EventEmitter(); readonly onDidChangeTreeData: Event = this._onDidChangeTreeData.event; - constructor(context: ExtensionContext, taskProvider: TaskProvider, localize: any) { const subscriptions = context.subscriptions; this.taskProvider = taskProvider; @@ -106,9 +105,12 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { subscriptions.push(commands.registerCommand('npm.refresh', this.refresh, this)); } - private async scriptIsValid(scripts: any, task: Task): Promise { - if (scripts[task.name]) { - return true; + private scriptIsValid(scripts: any, task: Task): boolean { + for (const script in scripts) { + let label = getTaskName(script, task.definition.path); + if (task.name === label) { + return true; + } } return false; } @@ -118,7 +120,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let uri = getPackageJsonUriFromTask(task); let scripts = await getScripts(uri!, this.localize); - if (!await this.scriptIsValid(scripts, task)) { + if (!this.scriptIsValid(scripts, task)) { this.scriptNotValid(task); return; } @@ -139,7 +141,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { let uri = getPackageJsonUriFromTask(task); let scripts = await getScripts(uri!, this.localize); - if (!await this.scriptIsValid(scripts, task)) { + if (!this.scriptIsValid(scripts, task)) { this.scriptNotValid(task); return; } @@ -249,12 +251,13 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { folders.set(each.scope.name, folder); } let definition: NpmTaskDefinition = each.definition; - let path = definition.path ? definition.path : ''; - packageJson = packages.get(path); + let relativePath = definition.path ? definition.path : ''; + let fullPath = path.join(each.scope.name, relativePath); + packageJson = packages.get(fullPath); if (!packageJson) { - packageJson = new PackageJSON(folder, path); + packageJson = new PackageJSON(folder, relativePath); folder.addPackage(packageJson); - packages.set(path, packageJson); + packages.set(fullPath, packageJson); } let script = new NpmScript(this.extensionContext, packageJson, each); packageJson.addScript(script); diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 9f10bb91201..01a9bcb3346 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -129,14 +129,14 @@ async function provideNpmScriptsForFolder(localize: any, packageJsonUri: Uri): P return result; } -function createTask(script: string, cmd: string, folder: WorkspaceFolder, packageJsonUri: Uri, matcher?: any): Task { - - function getTaskName(script: string, file: string) { - if (file.length) { - return `${script} - ${file.substring(0, file.length - 1)}`; - } - return script; +export function getTaskName(script: string, relativePath: string | undefined) { + if (relativePath && relativePath.length) { + return `${script} - ${relativePath.substring(0, relativePath.length - 1)}`; } + return script; +} + +function createTask(script: string, cmd: string, folder: WorkspaceFolder, packageJsonUri: Uri, matcher?: any): Task { function getCommandLine(folder: WorkspaceFolder, cmd: string): string { let packageManager = getPackageManager(folder); @@ -177,7 +177,7 @@ export function getPackageJsonUriFromTask(task: Task): Uri | null { return null; } -export async function exists(file: string): Promise { +async function exists(file: string): Promise { return new Promise((resolve, _reject) => { fs.exists(file, (value) => { resolve(value); @@ -185,7 +185,7 @@ export async function exists(file: string): Promise { }); } -export async function readFile(file: string): Promise { +async function readFile(file: string): Promise { return new Promise((resolve, reject) => { fs.readFile(file, (err, data) => { if (err) { From 7bcf857c33081277967ba71570112b0086f41d1b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 3 Apr 2018 18:04:57 +0200 Subject: [PATCH 024/710] wip: driver --- src/vs/base/common/event.ts | 2 +- src/vs/code/common/driver.ts | 21 ++++++++++ src/vs/code/common/driverIpc.ts | 39 +++++++++++++++++++ src/vs/code/node/driverClient.ts | 13 +++++++ .../environment/common/environment.ts | 3 ++ .../environment/node/environmentService.ts | 2 + test/driver/.gitignore | 1 + test/driver/main.ts | 10 +++++ test/driver/package.json | 17 ++++++++ test/driver/tsconfig.json | 15 +++++++ test/driver/yarn.lock | 11 ++++++ 11 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/vs/code/common/driver.ts create mode 100644 src/vs/code/common/driverIpc.ts create mode 100644 src/vs/code/node/driverClient.ts create mode 100644 test/driver/.gitignore create mode 100644 test/driver/main.ts create mode 100644 test/driver/package.json create mode 100644 test/driver/tsconfig.json create mode 100644 test/driver/yarn.lock diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 2ac42d2fa4e..060b728bcc6 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -279,7 +279,7 @@ export function debounceEvent(event: Event, merger: (last: O, event: I) let subscription: IDisposable; let output: O = undefined; - let handle: number = undefined; + let handle: any = undefined; let numDebouncedCalls = 0; const emitter = new Emitter({ diff --git a/src/vs/code/common/driver.ts b/src/vs/code/common/driver.ts new file mode 100644 index 00000000000..9a34754c143 --- /dev/null +++ b/src/vs/code/common/driver.ts @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const ID = 'driverService'; +export const IDriverService = createDecorator(ID); + +export interface IWindow { + id: string; +} + +export interface IDriverService { + _serviceBrand: any; + getWindows(): TPromise; +} diff --git a/src/vs/code/common/driverIpc.ts b/src/vs/code/common/driverIpc.ts new file mode 100644 index 00000000000..0b5323594c8 --- /dev/null +++ b/src/vs/code/common/driverIpc.ts @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IWindow, IDriverService } from './driver'; + +export interface IDriverChannel extends IChannel { + call(command: 'getWindows'): TPromise; + call(command: string, arg: any): TPromise; +} + +export class DriverChannel implements IDriverChannel { + + constructor(private service: IDriverService) { } + + call(command: string, arg?: any): TPromise { + switch (command) { + case 'getWindows': return this.service.getWindows(); + } + + return undefined; + } +} + +export class DriverChannelClient implements IDriverService { + + _serviceBrand: any; + + constructor(private channel: IDriverChannel) { } + + getWindows(): TPromise { + return this.channel.call('getWindows'); + } +} diff --git a/src/vs/code/node/driverClient.ts b/src/vs/code/node/driverClient.ts new file mode 100644 index 00000000000..703ce7b7d4c --- /dev/null +++ b/src/vs/code/node/driverClient.ts @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export function foo() { + return 1; +} \ No newline at end of file diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 5917f324e14..518e521076d 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -57,6 +57,7 @@ export interface ParsedArgs { 'file-write'?: boolean; 'file-chmod'?: boolean; 'upload-logs'?: string; + 'driver-handle'?: string; } export const IEnvironmentService = createDecorator('environmentService'); @@ -130,4 +131,6 @@ export interface IEnvironmentService { installSourcePath: string; disableUpdates: boolean; disableCrashReporter: boolean; + + driverHandle: string; } diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index cc1adabd5fd..356b0dd77f5 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -170,6 +170,8 @@ export class EnvironmentService implements IEnvironmentService { get disableUpdates(): boolean { return !!this._args['disable-updates']; } get disableCrashReporter(): boolean { return !!this._args['disable-crash-reporter']; } + get driverHandle(): string { return this._args['driver-handle']; } + constructor(private _args: ParsedArgs, private _execPath: string) { if (!process.env['VSCODE_LOGS']) { const key = toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, ''); diff --git a/test/driver/.gitignore b/test/driver/.gitignore new file mode 100644 index 00000000000..c585e19389d --- /dev/null +++ b/test/driver/.gitignore @@ -0,0 +1 @@ +out \ No newline at end of file diff --git a/test/driver/main.ts b/test/driver/main.ts new file mode 100644 index 00000000000..22c7ab7d609 --- /dev/null +++ b/test/driver/main.ts @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { foo } from '../../src/vs/code/node/driverClient'; + +foo(); diff --git a/test/driver/package.json b/test/driver/package.json new file mode 100644 index 00000000000..ce66edd2d85 --- /dev/null +++ b/test/driver/package.json @@ -0,0 +1,17 @@ +{ + "name": "driver", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "tsc", + "watch": "tsc --watch", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@types/node": "^9.6.1", + "typescript": "^2.8.1" + } +} diff --git a/test/driver/tsconfig.json b/test/driver/tsconfig.json new file mode 100644 index 00000000000..7858b08b089 --- /dev/null +++ b/test/driver/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "classic", + "target": "es6", + "rootDirs": [ + ".", + "../../src" + ], + "outDir": "out" + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/test/driver/yarn.lock b/test/driver/yarn.lock new file mode 100644 index 00000000000..96f212815f6 --- /dev/null +++ b/test/driver/yarn.lock @@ -0,0 +1,11 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/node@^9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.1.tgz#e2d374ef15b315b48e7efc308fa1a7cd51faa06c" + +typescript@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" From 4c5157954b2a1f8df340ddca7ce5b805fc85b1c8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Apr 2018 12:15:04 +0200 Subject: [PATCH 025/710] driver as a standalone module --- build/gulpfile.vscode.js | 1 + src/bootstrap-amd.js | 15 ++++--- test/driver/main.ts => src/driver.js | 8 ++-- src/vs/code/buildfile.js | 5 ++- src/vs/code/common/driver.ts | 35 ++++++++++++++++- src/vs/code/common/driverIpc.ts | 39 ------------------- src/vs/code/electron-main/driver.ts | 32 +++++++++++++++ .../code/node/{driverClient.ts => driver.ts} | 11 ++++-- test/driver/.gitignore | 1 - test/driver/package.json | 17 -------- test/driver/tsconfig.json | 15 ------- test/driver/yarn.lock | 11 ------ 12 files changed, 89 insertions(+), 101 deletions(-) rename test/driver/main.ts => src/driver.js (73%) delete mode 100644 src/vs/code/common/driverIpc.ts create mode 100644 src/vs/code/electron-main/driver.ts rename src/vs/code/node/{driverClient.ts => driver.ts} (54%) delete mode 100644 test/driver/.gitignore delete mode 100644 test/driver/package.json delete mode 100644 test/driver/tsconfig.json delete mode 100644 test/driver/yarn.lock diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 403d4faad4c..80b85f13bd1 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -67,6 +67,7 @@ const vscodeEntryPoints = _.flatten([ const vscodeResources = [ 'out-build/main.js', 'out-build/cli.js', + 'out-build/driver.js', 'out-build/bootstrap.js', 'out-build/bootstrap-amd.js', 'out-build/paths.js', diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index 8b91b77b671..f0015d389d3 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -18,8 +18,8 @@ function uriFromPath(_path) { } function readFile(file) { - return new Promise(function(resolve, reject) { - fs.readFile(file, 'utf8', function(err, data) { + return new Promise(function (resolve, reject) { + fs.readFile(file, 'utf8', function (err, data) { if (err) { reject(err); return; @@ -35,7 +35,7 @@ var nlsConfig = rawNlsConfig ? JSON.parse(rawNlsConfig) : { availableLanguages: // We have a special location of the nls files. They come from a language pack if (nlsConfig._resolvedLanguagePackCoreLocation) { let bundles = Object.create(null); - nlsConfig.loadBundle = function(bundle, language, cb) { + nlsConfig.loadBundle = function (bundle, language, cb) { let result = bundles[bundle]; if (result) { cb(undefined, result); @@ -47,7 +47,7 @@ if (nlsConfig._resolvedLanguagePackCoreLocation) { bundles[bundle] = json; cb(undefined, json); }) - .catch(cb); + .catch(cb); }; } @@ -66,10 +66,13 @@ if (nlsConfig.pseudo) { }); } -exports.bootstrap = function (entrypoint) { +exports.bootstrap = function (entrypoint, onLoad, onError) { if (!entrypoint) { return; } - loader([entrypoint], function () { }, function (err) { console.error(err); }); + onLoad = onLoad || function () { }; + onError = onError || function (err) { console.error(err); }; + + loader([entrypoint], onLoad, onError); }; diff --git a/test/driver/main.ts b/src/driver.js similarity index 73% rename from test/driver/main.ts rename to src/driver.js index 22c7ab7d609..b2c50fdf6ae 100644 --- a/test/driver/main.ts +++ b/src/driver.js @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; +const { bootstrap } = require('./bootstrap-amd'); -import { foo } from '../../src/vs/code/node/driverClient'; - -foo(); +bootstrap('vs/code/node/driver', ({ connect }) => { + console.log(connect); +}); \ No newline at end of file diff --git a/src/vs/code/buildfile.js b/src/vs/code/buildfile.js index 0293acbb5be..bdbdbc74d46 100644 --- a/src/vs/code/buildfile.js +++ b/src/vs/code/buildfile.js @@ -12,7 +12,7 @@ function createModuleDescription(name, exclude) { excludes = excludes.concat(exclude); } result.exclude= excludes; - + return result; } @@ -22,6 +22,7 @@ exports.collectModules= function() { createModuleDescription('vs/code/node/cli', []), createModuleDescription('vs/code/node/cliProcessMain', ['vs/code/node/cli']), createModuleDescription('vs/code/electron-browser/sharedProcess/sharedProcessMain', []), - createModuleDescription('vs/code/electron-browser/issue/issueReporterMain', []) + createModuleDescription('vs/code/electron-browser/issue/issueReporterMain', []), + createModuleDescription('vs/code/node/driver', []) ]; }; \ No newline at end of file diff --git a/src/vs/code/common/driver.ts b/src/vs/code/common/driver.ts index 9a34754c143..e1e2086685c 100644 --- a/src/vs/code/common/driver.ts +++ b/src/vs/code/common/driver.ts @@ -7,15 +7,46 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; export const ID = 'driverService'; -export const IDriverService = createDecorator(ID); +export const IDriver = createDecorator(ID); export interface IWindow { id: string; } -export interface IDriverService { +export interface IDriver { _serviceBrand: any; getWindows(): TPromise; } + + +export interface IDriverChannel extends IChannel { + call(command: 'getWindows'): TPromise; + call(command: string, arg: any): TPromise; +} + +export class DriverChannel implements IDriverChannel { + + constructor(private service: IDriver) { } + + call(command: string, arg?: any): TPromise { + switch (command) { + case 'getWindows': return this.service.getWindows(); + } + + return undefined; + } +} + +export class DriverChannelClient implements IDriver { + + _serviceBrand: any; + + constructor(private channel: IDriverChannel) { } + + getWindows(): TPromise { + return this.channel.call('getWindows'); + } +} diff --git a/src/vs/code/common/driverIpc.ts b/src/vs/code/common/driverIpc.ts deleted file mode 100644 index 0b5323594c8..00000000000 --- a/src/vs/code/common/driverIpc.ts +++ /dev/null @@ -1,39 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IWindow, IDriverService } from './driver'; - -export interface IDriverChannel extends IChannel { - call(command: 'getWindows'): TPromise; - call(command: string, arg: any): TPromise; -} - -export class DriverChannel implements IDriverChannel { - - constructor(private service: IDriverService) { } - - call(command: string, arg?: any): TPromise { - switch (command) { - case 'getWindows': return this.service.getWindows(); - } - - return undefined; - } -} - -export class DriverChannelClient implements IDriverService { - - _serviceBrand: any; - - constructor(private channel: IDriverChannel) { } - - getWindows(): TPromise { - return this.channel.call('getWindows'); - } -} diff --git a/src/vs/code/electron-main/driver.ts b/src/vs/code/electron-main/driver.ts new file mode 100644 index 00000000000..d31c9adaafc --- /dev/null +++ b/src/vs/code/electron-main/driver.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { IDriver, IWindow, DriverChannel } from 'vs/code/common/driver'; +import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { serve } from 'vs/base/parts/ipc/node/ipc.net'; + +class Driver implements IDriver { + + _serviceBrand: any; + + constructor( + @IWindowsMainService protected windowsService: IWindowsMainService + ) { } + + getWindows(): TPromise { + return TPromise.as(this.windowsService.getWindows().map(w => ({ id: `${w.id}` }))); + } +} + +export async function startDriver(handle: string, instantiationService: IInstantiationService): TPromise { + const server = await serve(handle); + const driver = instantiationService.createInstance(Driver); + const channel = new DriverChannel(driver); + server.registerChannel('driver', channel); +} \ No newline at end of file diff --git a/src/vs/code/node/driverClient.ts b/src/vs/code/node/driver.ts similarity index 54% rename from src/vs/code/node/driverClient.ts rename to src/vs/code/node/driver.ts index 703ce7b7d4c..c61be791e9b 100644 --- a/src/vs/code/node/driverClient.ts +++ b/src/vs/code/node/driver.ts @@ -6,8 +6,11 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IDriver, DriverChannelClient } from 'vs/code/common/driver'; +import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; -export function foo() { - return 1; -} \ No newline at end of file +export async function connect(handle: string): TPromise { + const client = await connectNet(handle, 'driverClient'); + const channel = client.getChannel('driver'); + return new DriverChannelClient(channel); +} diff --git a/test/driver/.gitignore b/test/driver/.gitignore deleted file mode 100644 index c585e19389d..00000000000 --- a/test/driver/.gitignore +++ /dev/null @@ -1 +0,0 @@ -out \ No newline at end of file diff --git a/test/driver/package.json b/test/driver/package.json deleted file mode 100644 index ce66edd2d85..00000000000 --- a/test/driver/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "driver", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "build": "tsc", - "watch": "tsc --watch", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "@types/node": "^9.6.1", - "typescript": "^2.8.1" - } -} diff --git a/test/driver/tsconfig.json b/test/driver/tsconfig.json deleted file mode 100644 index 7858b08b089..00000000000 --- a/test/driver/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "moduleResolution": "classic", - "target": "es6", - "rootDirs": [ - ".", - "../../src" - ], - "outDir": "out" - }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/test/driver/yarn.lock b/test/driver/yarn.lock deleted file mode 100644 index 96f212815f6..00000000000 --- a/test/driver/yarn.lock +++ /dev/null @@ -1,11 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/node@^9.6.1": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.1.tgz#e2d374ef15b315b48e7efc308fa1a7cd51faa06c" - -typescript@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" From b1f17c53d19a44ee2461954356bdc9a9b3d2fc99 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Apr 2018 16:04:36 +0200 Subject: [PATCH 026/710] wip: code driver --- src/vs/code/common/driver.ts | 3 +- src/vs/code/electron-main/app.ts | 13 ++++++++ src/vs/code/electron-main/driver.ts | 11 +++---- src/vs/code/node/driver.ts | 7 ++-- .../environment/common/environment.ts | 2 +- .../environment/node/environmentService.ts | 2 +- test/smoke2/package.json | 16 +++++++++ src/driver.js => test/smoke2/src/driver.d.ts | 17 +++++++--- test/smoke2/src/driver.js | 12 +++++++ test/smoke2/src/main.ts | 18 ++++++++++ test/smoke2/tools/postbuild.js | 14 ++++++++ test/smoke2/tools/prebuild.js | 33 +++++++++++++++++++ test/smoke2/tsconfig.json | 9 +++++ test/smoke2/yarn.lock | 7 ++++ tslint.json | 7 ++++ 15 files changed, 155 insertions(+), 16 deletions(-) create mode 100644 test/smoke2/package.json rename src/driver.js => test/smoke2/src/driver.d.ts (55%) create mode 100644 test/smoke2/src/driver.js create mode 100644 test/smoke2/src/main.ts create mode 100644 test/smoke2/tools/postbuild.js create mode 100644 test/smoke2/tools/prebuild.js create mode 100644 test/smoke2/tsconfig.json create mode 100644 test/smoke2/yarn.lock diff --git a/src/vs/code/common/driver.ts b/src/vs/code/common/driver.ts index e1e2086685c..0cf868b3549 100644 --- a/src/vs/code/common/driver.ts +++ b/src/vs/code/common/driver.ts @@ -12,6 +12,7 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; export const ID = 'driverService'; export const IDriver = createDecorator(ID); +//*START export interface IWindow { id: string; } @@ -20,7 +21,7 @@ export interface IDriver { _serviceBrand: any; getWindows(): TPromise; } - +//*END export interface IDriverChannel extends IChannel { call(command: 'getWindows'): TPromise; diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 6662a4d20e4..2f310039371 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -62,6 +62,7 @@ import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { join } from 'path'; import { copy } from 'vs/base/node/pfs'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; +import { serve, Driver } from './driver'; export class CodeApplication { @@ -291,6 +292,18 @@ export class CodeApplication { // Services const appInstantiationService = this.initServices(machineId); + // Create driver + if (this.environmentService.driverHandle) { + const driver = appInstantiationService.createInstance(Driver); + + serve(this.environmentService.driverHandle, driver).then(server => { + this.logService.info('Driver started at:', this.environmentService.driverHandle); + this.toDispose.push(server); + }, err => { + this.logService.error('Failed to start driver running at:', this.environmentService.driverHandle); + }); + } + // Setup Auth Handler const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); this.toDispose.push(authHandler); diff --git a/src/vs/code/electron-main/driver.ts b/src/vs/code/electron-main/driver.ts index d31c9adaafc..e7c6018af87 100644 --- a/src/vs/code/electron-main/driver.ts +++ b/src/vs/code/electron-main/driver.ts @@ -8,10 +8,9 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IDriver, IWindow, DriverChannel } from 'vs/code/common/driver'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { serve } from 'vs/base/parts/ipc/node/ipc.net'; +import { serve as serveNet, Server } from 'vs/base/parts/ipc/node/ipc.net'; -class Driver implements IDriver { +export class Driver implements IDriver { _serviceBrand: any; @@ -24,9 +23,9 @@ class Driver implements IDriver { } } -export async function startDriver(handle: string, instantiationService: IInstantiationService): TPromise { - const server = await serve(handle); - const driver = instantiationService.createInstance(Driver); +export async function serve(handle: string, driver: IDriver): TPromise { + const server = await serveNet(handle); const channel = new DriverChannel(driver); server.registerChannel('driver', channel); + return server; } \ No newline at end of file diff --git a/src/vs/code/node/driver.ts b/src/vs/code/node/driver.ts index c61be791e9b..9ac3c7936fb 100644 --- a/src/vs/code/node/driver.ts +++ b/src/vs/code/node/driver.ts @@ -7,10 +7,11 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IDriver, DriverChannelClient } from 'vs/code/common/driver'; -import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; +import { connect as connectNet, Client } from 'vs/base/parts/ipc/node/ipc.net'; -export async function connect(handle: string): TPromise { +export async function connect(handle: string): TPromise<{ client: Client, driver: IDriver }> { const client = await connectNet(handle, 'driverClient'); const channel = client.getChannel('driver'); - return new DriverChannelClient(channel); + const driver = new DriverChannelClient(channel); + return { client, driver }; } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 518e521076d..7b9d2d42259 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -57,7 +57,7 @@ export interface ParsedArgs { 'file-write'?: boolean; 'file-chmod'?: boolean; 'upload-logs'?: string; - 'driver-handle'?: string; + 'driver'?: string; } export const IEnvironmentService = createDecorator('environmentService'); diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 356b0dd77f5..cd875edaccd 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -170,7 +170,7 @@ export class EnvironmentService implements IEnvironmentService { get disableUpdates(): boolean { return !!this._args['disable-updates']; } get disableCrashReporter(): boolean { return !!this._args['disable-crash-reporter']; } - get driverHandle(): string { return this._args['driver-handle']; } + get driverHandle(): string { return this._args['driver']; } constructor(private _args: ParsedArgs, private _execPath: string) { if (!process.env['VSCODE_LOGS']) { diff --git a/test/smoke2/package.json b/test/smoke2/package.json new file mode 100644 index 00000000000..93dc469c630 --- /dev/null +++ b/test/smoke2/package.json @@ -0,0 +1,16 @@ +{ + "name": "smoke2", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "compile": "node tools/prebuild && tsc && node tools/postbuild", + "watch": "tsc --watch", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "typescript": "^2.8.1" + } +} diff --git a/src/driver.js b/test/smoke2/src/driver.d.ts similarity index 55% rename from src/driver.js rename to test/smoke2/src/driver.d.ts index b2c50fdf6ae..6d417e693df 100644 --- a/src/driver.js +++ b/test/smoke2/src/driver.d.ts @@ -3,8 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -const { bootstrap } = require('./bootstrap-amd'); +export interface IWindow { + id: string; +} -bootstrap('vs/code/node/driver', ({ connect }) => { - console.log(connect); -}); \ No newline at end of file +export interface IDriver { + _serviceBrand: any; + getWindows(): Promise; +} + +export interface IDisposable { + dispose(): void; +} + +export function connect(outPath: string, handle: string): Promise<{ client: IDisposable, driver: IDriver }>; diff --git a/test/smoke2/src/driver.js b/test/smoke2/src/driver.js new file mode 100644 index 00000000000..7ff3b7964f0 --- /dev/null +++ b/test/smoke2/src/driver.js @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const path = require('path'); + +exports.connect = function (outPath, handle) { + const bootstrapPath = path.join(outPath, 'bootstrap-amd.js'); + const { bootstrap } = require(bootstrapPath); + return new Promise((c, e) => bootstrap('vs/code/node/driver', ({ connect }) => connect(handle).then(c, e), e)); +}; \ No newline at end of file diff --git a/test/smoke2/src/main.ts b/test/smoke2/src/main.ts new file mode 100644 index 00000000000..7f38e7e77d8 --- /dev/null +++ b/test/smoke2/src/main.ts @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as path from 'path'; +import { connect } from './driver'; + +const rootPath = path.dirname(path.dirname(path.dirname(__dirname))); +const outPath = path.join(rootPath, 'out'); +const handlePath = path.join(rootPath, 'foo.sock'); + +connect(outPath, handlePath).then(({ client, driver }) => { + return driver.getWindows().then(w => { + console.log(w); + client.dispose(); + }); +}, err => console.error('oh no', err)); \ No newline at end of file diff --git a/test/smoke2/tools/postbuild.js b/test/smoke2/tools/postbuild.js new file mode 100644 index 00000000000..86b408b55f6 --- /dev/null +++ b/test/smoke2/tools/postbuild.js @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const fs = require('fs'); +const path = require('path'); + +const root = path.dirname(__dirname); +const driverPath = path.join(root, 'src/driver.js'); +const driver = fs.readFileSync(driverPath); + +const outDriverPath = path.join(root, 'out/driver.js'); +fs.writeFileSync(outDriverPath, driver); diff --git a/test/smoke2/tools/prebuild.js b/test/smoke2/tools/prebuild.js new file mode 100644 index 00000000000..f5d41b977f4 --- /dev/null +++ b/test/smoke2/tools/prebuild.js @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const fs = require('fs'); +const path = require('path'); + +const root = path.dirname(path.dirname(path.dirname(__dirname))); +const driverPath = path.join(root, 'src/vs/code/common/driver.ts'); + +let contents = fs.readFileSync(driverPath, 'utf8'); +contents = /\/\/\*START([\s\S]*)\/\/\*END/mi.exec(contents)[1].trim(); +contents = contents.replace(/\bTPromise\b/g, 'Promise'); + +contents = `/*--------------------------------------------------------------------------------------------- +* Copyright (c) Microsoft Corporation. All rights reserved. +* Licensed under the MIT License. See License.txt in the project root for license information. +*--------------------------------------------------------------------------------------------*/ + +${contents} + +export interface IDisposable { + dispose(): void; +} + +export function connect(outPath: string, handle: string): Promise<{ client: IDisposable, driver: IDriver }>; +`; + +const srcPath = path.join(path.dirname(__dirname), 'src'); +const outDriverPath = path.join(srcPath, 'driver.d.ts'); + +fs.writeFileSync(outDriverPath, contents); \ No newline at end of file diff --git a/test/smoke2/tsconfig.json b/test/smoke2/tsconfig.json new file mode 100644 index 00000000000..1f7ec1ce592 --- /dev/null +++ b/test/smoke2/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "module": "commonjs", + "outDir": "out" + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/test/smoke2/yarn.lock b/test/smoke2/yarn.lock new file mode 100644 index 00000000000..68bc04c3196 --- /dev/null +++ b/test/smoke2/yarn.lock @@ -0,0 +1,7 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +typescript@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" diff --git a/tslint.json b/tslint.json index 31396c2aa56..002b358ba8b 100644 --- a/tslint.json +++ b/tslint.json @@ -430,6 +430,13 @@ "*" ] }, + { + "target": "**/test/smoke2/**", + "restrictions": [ + "**/test/smoke2/**", + "*" + ] + }, { "target": "{**/**.test.ts,**/test/**}", "restrictions": "{**/vs/**,assert,sinon,crypto}" From 3f6dd33f884be160fd897af1ea58b2791b37b6e6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Apr 2018 16:36:52 +0200 Subject: [PATCH 027/710] woo: smoke infrastructure up and running --- src/vs/platform/environment/node/argv.ts | 3 +- test/smoke2/package.json | 2 + test/smoke2/src/code.ts | 131 +++++++++++++++++++++++ test/smoke2/src/main.ts | 25 +++-- test/smoke2/tsconfig.json | 4 +- test/smoke2/yarn.lock | 14 +++ 6 files changed, 171 insertions(+), 8 deletions(-) create mode 100644 test/smoke2/src/code.ts diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index ed297cda684..336ec1dcbcb 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -29,7 +29,8 @@ const options: minimist.Opts = { 'enable-proposed-api', 'export-default-configuration', 'install-source', - 'upload-logs' + 'upload-logs', + 'driver' ], boolean: [ 'help', diff --git a/test/smoke2/package.json b/test/smoke2/package.json index 93dc469c630..6e0ca026745 100644 --- a/test/smoke2/package.json +++ b/test/smoke2/package.json @@ -11,6 +11,8 @@ "author": "", "license": "ISC", "devDependencies": { + "@types/tmp": "^0.0.33", + "tmp": "^0.0.33", "typescript": "^2.8.1" } } diff --git a/test/smoke2/src/code.ts b/test/smoke2/src/code.ts new file mode 100644 index 00000000000..3b65a83766d --- /dev/null +++ b/test/smoke2/src/code.ts @@ -0,0 +1,131 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as fs from 'fs'; +import * as path from 'path'; +import * as cp from 'child_process'; +import { tmpName } from 'tmp'; +import { IDriver, connect as connectDriver, IDisposable } from './driver'; + +const repoPath = path.join(__dirname, '../../..'); + +function getDevElectronPath(): string { + const buildPath = path.join(repoPath, '.build'); + const product = require(path.join(repoPath, 'product.json')); + + switch (process.platform) { + case 'darwin': + return path.join(buildPath, 'electron', `${product.nameLong}.app`, 'Contents', 'MacOS', 'Electron'); + case 'linux': + return path.join(buildPath, 'electron', `${product.applicationName}`); + case 'win32': + return path.join(buildPath, 'electron', `${product.nameShort}.exe`); + default: + throw new Error('Unsupported platform.'); + } +} + +function getBuildElectronPath(root: string): string { + switch (process.platform) { + case 'darwin': + return path.join(root, 'Contents', 'MacOS', 'Electron'); + case 'linux': { + const product = require(path.join(root, 'resources', 'app', 'product.json')); + return path.join(root, product.applicationName); + } + case 'win32': { + const product = require(path.join(root, 'resources', 'app', 'product.json')); + return path.join(root, `${product.nameShort}.exe`); + } + default: + throw new Error('Unsupported platform.'); + } +} + +function getDevOutPath(): string { + return path.join(repoPath, 'out'); +} + +function getBuildOutPath(root: string): string { + switch (process.platform) { + case 'darwin': + return path.join(root, 'Contents', 'Resources', 'app', 'out'); + default: + return path.join(root, 'resources', 'app', 'out'); + } +} + +export class Code { + + constructor( + private process: cp.ChildProcess, + private client: IDisposable, + readonly driver: IDriver + ) { + + } + + dispose(): void { + this.client.dispose(); + this.process.kill(); + } +} + +export interface SpawnOptions { + codePath?: string; + userDataDir: string; + extensionsPath: string; +} + +export async function connect(child: cp.ChildProcess, outPath: string, handlePath: string): Promise { + let errCount = 0; + + while (true) { + try { + const { client, driver } = await connectDriver(outPath, handlePath); + return new Code(child, client, driver); + } catch (err) { + if (++errCount > 50) { + child.kill(); + throw err; + } + + // retry + await new Promise(c => setTimeout(c, 100)); + } + } +} + +export function spawn(options: SpawnOptions): Promise { + const codePath = options.codePath; + const electronPath = codePath ? getBuildElectronPath(codePath) : getDevElectronPath(); + const outPath = codePath ? getBuildOutPath(codePath) : getDevOutPath(); + + return new Promise((c, e) => { + tmpName((err, handlePath) => { + if (err) { return e(err); } + + const args = [ + '--skip-getting-started', + '--skip-release-notes', + '--sticky-quickopen', + '--disable-telemetry', + '--disable-updates', + '--disable-crash-reporter', + `--extensions-dir=${options.extensionsPath}`, + `--user-data-dir=${options.userDataDir}`, + '--driver', handlePath + ]; + + if (!codePath) { + args.unshift(repoPath); + } + + const child = cp.spawn(electronPath, args); + + connect(child, outPath, handlePath).then(c, e); + }); + }); +} \ No newline at end of file diff --git a/test/smoke2/src/main.ts b/test/smoke2/src/main.ts index 7f38e7e77d8..8e5024f5289 100644 --- a/test/smoke2/src/main.ts +++ b/test/smoke2/src/main.ts @@ -5,14 +5,27 @@ import * as path from 'path'; import { connect } from './driver'; +import { spawn } from './code'; -const rootPath = path.dirname(path.dirname(path.dirname(__dirname))); -const outPath = path.join(rootPath, 'out'); -const handlePath = path.join(rootPath, 'foo.sock'); +// const rootPath = path.dirname(path.dirname(path.dirname(__dirname))); +// const outPath = path.join(rootPath, 'out'); +// const handlePath = path.join(rootPath, 'foo.sock'); -connect(outPath, handlePath).then(({ client, driver }) => { - return driver.getWindows().then(w => { +// connect(outPath, handlePath).then(({ client, driver }) => { +// return driver.getWindows().then(w => { +// console.log(w); +// client.dispose(); +// }); +// }, err => console.error('oh no', err)); + +const opts = { + extensionsPath: '/Users/joao/Desktop/extensions', + userDataDir: '/Users/joao/Desktop/user-data-dir', +}; + +spawn(opts).then(code => { + return code.driver.getWindows().then(w => { console.log(w); - client.dispose(); + code.dispose(); }); }, err => console.error('oh no', err)); \ No newline at end of file diff --git a/test/smoke2/tsconfig.json b/test/smoke2/tsconfig.json index 1f7ec1ce592..754cc8e4c46 100644 --- a/test/smoke2/tsconfig.json +++ b/test/smoke2/tsconfig.json @@ -1,7 +1,9 @@ { "compilerOptions": { "module": "commonjs", - "outDir": "out" + "outDir": "out", + "target": "es6", + "strictNullChecks": true }, "exclude": [ "node_modules" diff --git a/test/smoke2/yarn.lock b/test/smoke2/yarn.lock index 68bc04c3196..4a70bf942ef 100644 --- a/test/smoke2/yarn.lock +++ b/test/smoke2/yarn.lock @@ -2,6 +2,20 @@ # yarn lockfile v1 +"@types/tmp@^0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + typescript@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" From 6848956bf49388ce0a849a7435a6a251aa8b807f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Apr 2018 16:37:28 +0200 Subject: [PATCH 028/710] fix prebuild scritp --- test/smoke2/tools/prebuild.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/smoke2/tools/prebuild.js b/test/smoke2/tools/prebuild.js index f5d41b977f4..155dec4fa78 100644 --- a/test/smoke2/tools/prebuild.js +++ b/test/smoke2/tools/prebuild.js @@ -14,9 +14,9 @@ contents = /\/\/\*START([\s\S]*)\/\/\*END/mi.exec(contents)[1].trim(); contents = contents.replace(/\bTPromise\b/g, 'Promise'); contents = `/*--------------------------------------------------------------------------------------------- -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. See License.txt in the project root for license information. -*--------------------------------------------------------------------------------------------*/ + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ ${contents} From 36be36db813a989eec8a1908b639c6686dcf29e9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Apr 2018 16:46:49 +0200 Subject: [PATCH 029/710] :lipstick: --- test/smoke2/src/code.ts | 42 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/test/smoke2/src/code.ts b/test/smoke2/src/code.ts index 3b65a83766d..041f9b0c42d 100644 --- a/test/smoke2/src/code.ts +++ b/test/smoke2/src/code.ts @@ -98,34 +98,28 @@ export async function connect(child: cp.ChildProcess, outPath: string, handlePat } } -export function spawn(options: SpawnOptions): Promise { +export async function spawn(options: SpawnOptions): Promise { const codePath = options.codePath; const electronPath = codePath ? getBuildElectronPath(codePath) : getDevElectronPath(); const outPath = codePath ? getBuildOutPath(codePath) : getDevOutPath(); + const handlePath = await new Promise((c, e) => tmpName((err, handlePath) => err ? e(err) : c(handlePath))); - return new Promise((c, e) => { - tmpName((err, handlePath) => { - if (err) { return e(err); } + const args = [ + '--skip-getting-started', + '--skip-release-notes', + '--sticky-quickopen', + '--disable-telemetry', + '--disable-updates', + '--disable-crash-reporter', + `--extensions-dir=${options.extensionsPath}`, + `--user-data-dir=${options.userDataDir}`, + '--driver', handlePath + ]; - const args = [ - '--skip-getting-started', - '--skip-release-notes', - '--sticky-quickopen', - '--disable-telemetry', - '--disable-updates', - '--disable-crash-reporter', - `--extensions-dir=${options.extensionsPath}`, - `--user-data-dir=${options.userDataDir}`, - '--driver', handlePath - ]; + if (!codePath) { + args.unshift(repoPath); + } - if (!codePath) { - args.unshift(repoPath); - } - - const child = cp.spawn(electronPath, args); - - connect(child, outPath, handlePath).then(c, e); - }); - }); + const child = cp.spawn(electronPath, args); + return connect(child, outPath, handlePath); } \ No newline at end of file From f20b144ba5379e7f7f420e4952b44befa7eeebcc Mon Sep 17 00:00:00 2001 From: Ivor Huang Date: Thu, 5 Apr 2018 01:13:54 -0400 Subject: [PATCH 030/710] implemented feature but unsure of isEnabled due to condition for calling StartAction.isEnabled --- .../parts/debug/browser/debugActions.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index ccb596753d1..c9f19fb3063 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -215,10 +215,21 @@ export class RestartAction extends AbstractDebugAction { static LABEL = nls.localize('restartDebug', "Restart"); static RECONNECT_LABEL = nls.localize('reconnectDebug', "Reconnect"); - constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) { + private startAction: StartAction; + + constructor(id: string, label: string, + @IDebugService debugService: IDebugService, + @IKeybindingService keybindingService: IKeybindingService, + @IWorkspaceContextService private contextService?: IWorkspaceContextService, + @IHistoryService historyService?: IHistoryService + ) { super(id, label, 'debug-action restart', debugService, keybindingService, 70); this.setLabel(this.debugService.getViewModel().focusedProcess); this.toDispose.push(this.debugService.getViewModel().onDidFocusStackFrame(() => this.setLabel(this.debugService.getViewModel().focusedProcess))); + + if (contextService !== undefined && historyService !== undefined) { + this.startAction = new StartAction(id, label, debugService, keybindingService, contextService, historyService); + } } private setLabel(process: IProcess): void { @@ -230,7 +241,7 @@ export class RestartAction extends AbstractDebugAction { process = this.debugService.getViewModel().focusedProcess; } if (!process) { - return TPromise.as(null); + return this.startAction.run(); } if (this.debugService.getModel().getProcesses().length <= 1) { @@ -240,6 +251,9 @@ export class RestartAction extends AbstractDebugAction { } protected isEnabled(state: State): boolean { + if (!this.debugService.getViewModel().focusedProcess) { + return StartAction.isEnabled(this.debugService, this.contextService, this.debugService.getConfigurationManager().selectedConfiguration.name); + } return super.isEnabled(state) && (state === State.Running || state === State.Stopped); } } From 225d7e5a21371583d8eb7fb3012f7c501c7b26ed Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 11:45:28 +0200 Subject: [PATCH 031/710] cleanup API --- .../src/areas/activitybar/activityBar.ts | 3 +- test/smoke/src/areas/css/css.test.ts | 13 +-- test/smoke/src/areas/debug/debug.ts | 2 +- test/smoke/src/areas/editor/editor.ts | 5 +- test/smoke/src/areas/editor/quickoutline.ts | 24 ++-- test/smoke/src/areas/explorer/explorer.ts | 2 +- test/smoke/src/areas/extensions/extensions.ts | 4 +- test/smoke/src/areas/git/scm.ts | 2 +- .../src/areas/preferences/preferences.test.ts | 6 +- test/smoke/src/areas/problems/problems.ts | 5 +- test/smoke/src/areas/search/search.ts | 17 ++- .../src/areas/statusbar/statusbar.test.ts | 4 +- test/smoke/src/areas/terminal/terminal.ts | 5 +- test/smoke/src/areas/workbench/workbench.ts | 8 +- test/smoke/src/spectron/client.ts | 104 ++---------------- 15 files changed, 52 insertions(+), 152 deletions(-) diff --git a/test/smoke/src/areas/activitybar/activityBar.ts b/test/smoke/src/areas/activitybar/activityBar.ts index 894eef36f9f..2873dd26d37 100644 --- a/test/smoke/src/areas/activitybar/activityBar.ts +++ b/test/smoke/src/areas/activitybar/activityBar.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Element } from 'webdriverio'; import { SpectronApplication } from '../../spectron/application'; export enum ActivityBarPosition { @@ -17,7 +16,7 @@ export class ActivityBar { // noop } - public async getActivityBar(position: ActivityBarPosition): Promise { + public async getActivityBar(position: ActivityBarPosition): Promise { let positionClass: string; if (position === ActivityBarPosition.LEFT) { diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index b7ee545445a..cf6f7085f4c 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; import { SpectronApplication } from '../../spectron/application'; import { ProblemSeverity, Problems } from '../problems/problems'; @@ -26,14 +25,12 @@ export function setup() { await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - let warning = await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); + await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); await app.screenCapturer.capture('CSS Warning in editor'); - assert.ok(warning, `Warning squiggle is not shown in 'style.css'.`); await app.workbench.problems.showProblemsView(); - warning = await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); + await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); await app.screenCapturer.capture('CSS Warning in problems view'); - assert.ok(warning, 'Warning does not appear in Problems view.'); await app.workbench.problems.hideProblemsView(); }); @@ -43,15 +40,13 @@ export function setup() { await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - let error = await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); + await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); await app.screenCapturer.capture('CSS Error in editor'); - assert.ok(error, `Warning squiggle is not shown in 'style.css'.`); const problems = new Problems(app); await problems.showProblemsView(); - error = await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); + await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); await app.screenCapturer.capture('CSS Error in probles view'); - assert.ok(error, 'Warning does not appear in Problems view.'); await problems.hideProblemsView(); }); }); diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 0f9dfa15582..a77719c362a 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -52,7 +52,7 @@ export class Debug extends Viewlet { async setBreakpointOnLine(lineNumber: number): Promise { await this.spectron.client.waitForElement(`${GLYPH_AREA}(${lineNumber})`); - await this.spectron.client.leftClick(`${GLYPH_AREA}(${lineNumber})`, 5, 5); + await this.spectron.client.waitAndClick(`${GLYPH_AREA}(${lineNumber})`, 5, 5); await this.spectron.client.waitForElement(BREAKPOINT_GLYPH); } diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 14c95e3ff6b..7bb51cdc7ce 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -103,7 +103,7 @@ export class Editor { `.monaco-editor[data-uri$="${filename}"]` ].join(' '); - await this.spectron.client.element(editor); + await this.spectron.client.waitForElement(editor); const textarea = `${editor} textarea`; await this.spectron.client.waitForActiveElement(textarea); @@ -174,7 +174,8 @@ export class Editor { const result: { text: string, className: string }[] = await this.spectron.webclient.selectorExecute(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, elements => (Array.isArray(elements) ? elements : [elements]) .map(element => ({ text: element.textContent, className: element.className }))); - return result.filter(r => r.text === term).map(({ className }) => className); + const { className } = result.filter(r => r.text === term)[0]; + return className.split(/\s/g); } private async getViewLineIndex(line: number): Promise { diff --git a/test/smoke/src/areas/editor/quickoutline.ts b/test/smoke/src/areas/editor/quickoutline.ts index 852bd8b9145..de21d887701 100644 --- a/test/smoke/src/areas/editor/quickoutline.ts +++ b/test/smoke/src/areas/editor/quickoutline.ts @@ -3,26 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; import { QuickOpen } from '../quickopen/quickopen'; export class QuickOutline extends QuickOpen { - constructor(spectron: SpectronApplication) { - super(spectron); - } - public async open(): Promise { - await this.spectron.client.waitFor(async () => { + let retries = 0; + + while (++retries < 10) { await this.spectron.runCommand('workbench.action.gotoSymbol'); - const entry = await this.spectron.client.element('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry'); - if (entry) { - const text = await this.spectron.client.getText('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); - if (text !== 'No symbol information for the file') { - return entry; - } + + const text = await this.spectron.client.waitForText('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); + + if (text !== 'No symbol information for the file') { + return; } + await this.closeQuickOpen(); - }, undefined, 'Opening Outline'); + await new Promise(c => setTimeout(c, 250)); + } } } diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index 6159e62c45f..3ba320d1af6 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -25,7 +25,7 @@ export class Explorer extends Viewlet { } public async openFile(fileName: string): Promise { - await this.spectron.client.doubleClickAndWait(`div[class="monaco-icon-label file-icon ${fileName}-name-file-icon ${this.getExtensionSelector(fileName)} explorer-item"]`); + await this.spectron.client.waitAndDoubleClick(`div[class="monaco-icon-label file-icon ${fileName}-name-file-icon ${this.getExtensionSelector(fileName)} explorer-item"]`); await this.spectron.workbench.waitForEditorFocus(fileName); } diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index d0c3f97320d..55646637461 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -24,7 +24,7 @@ export class Extensions extends Viewlet { } async searchForExtension(name: string): Promise { - await this.spectron.client.click(SEARCH_BOX); + await this.spectron.client.waitAndClick(SEARCH_BOX); await this.spectron.client.waitForActiveElement(SEARCH_BOX); await this.spectron.client.setValue(SEARCH_BOX, name); } @@ -34,7 +34,7 @@ export class Extensions extends Viewlet { // we might want to wait for a while longer since the Marketplace can be slow // a minute should do - await this.spectron.client.waitFor(() => this.spectron.client.click(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`), void 0, 'waiting for install button', 600); + await this.spectron.client.waitFor(() => this.spectron.client.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`), void 0, 'waiting for install button', 600); await this.spectron.client.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.reload`); return true; diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index 7f25c3a3881..c3eb3c1a71f 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -41,7 +41,7 @@ export class SCM extends Viewlet { } async refreshSCMViewlet(): Promise { - await this.spectron.client.click(REFRESH_COMMAND); + await this.spectron.client.waitAndClick(REFRESH_COMMAND); } private async queryChanges(name: string, type?: string): Promise { diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index f273d6a9c12..e1e7bf76b0e 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -18,16 +18,14 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.explorer.openFile('app.js'); - let lineNumbers = await app.client.waitForElements('.line-numbers'); + await app.client.waitForElements('.line-numbers', elements => !!elements.length); await app.screenCapturer.capture('app.js has line numbers'); - assert.ok(!!lineNumbers.length, 'Line numbers are not present in the editor before disabling them.'); await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); await app.workbench.selectTab('app.js'); - lineNumbers = await app.client.waitForElements('.line-numbers', result => !result || result.length === 0); + await app.client.waitForElements('.line-numbers', result => !result || result.length === 0); await app.screenCapturer.capture('line numbers hidden'); - assert.ok(!lineNumbers.length, 'Line numbers are still present in the editor after disabling them.'); }); it(`changes 'workbench.action.toggleSidebarPosition' command key binding and verifies it`, async function () { diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index 64156eced8e..d40d103c269 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -32,9 +32,8 @@ export class Problems { } } - public async isVisible(): Promise { - const element = await this.spectron.client.element(Problems.PROBLEMS_VIEW_SELECTOR); - return !!element; + isVisible(): Promise { + return this.spectron.client.doesElementExist(Problems.PROBLEMS_VIEW_SELECTOR); } public async waitForProblemsView(): Promise { diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index 5418cad3c21..e28182761d7 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -22,22 +22,22 @@ export class Search extends Viewlet { } async searchFor(text: string): Promise { - await this.spectron.client.click(INPUT); + await this.spectron.client.waitAndClick(INPUT); await this.spectron.client.waitForActiveElement(INPUT); await this.spectron.client.setValue(INPUT, text); await this.submitSearch(); } async submitSearch(): Promise { - await this.spectron.client.click(INPUT); + await this.spectron.client.waitAndClick(INPUT); await this.spectron.client.waitForActiveElement(INPUT); await this.spectron.client.keys(['Enter', 'NULL']); - await this.spectron.client.element(`${VIEWLET} .messages[aria-hidden="false"]`); + await this.spectron.client.waitForElement(`${VIEWLET} .messages[aria-hidden="false"]`); } async setFilesToIncludeText(text: string): Promise { - await this.spectron.client.click(INCLUDE_INPUT); + await this.spectron.client.waitAndClick(INCLUDE_INPUT); await this.spectron.client.waitForActiveElement(INCLUDE_INPUT); await this.spectron.client.setValue(INCLUDE_INPUT, text || ''); } @@ -54,9 +54,8 @@ export class Search extends Viewlet { } } - async areDetailsVisible(): Promise { - const element = await this.spectron.client.element(`${VIEWLET} .query-details.more`); - return !!element; + areDetailsVisible(): Promise { + return this.spectron.client.doesElementExist(`${VIEWLET} .query-details.more`); } async removeFileMatch(index: number): Promise { @@ -72,13 +71,13 @@ export class Search extends Viewlet { async setReplaceText(text: string): Promise { await this.spectron.client.waitAndClick(`${VIEWLET} .search-widget .replace-container .monaco-inputbox input[title="Replace"]`); - await this.spectron.client.element(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`); + await this.spectron.client.waitForElement(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`); await this.spectron.client.setValue(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`, text); } async replaceFileMatch(index: number): Promise { await this.spectron.client.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); - await this.spectron.client.click(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-replace-all`); + await this.spectron.client.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-replace-all`); } async waitForResultText(text: string): Promise { diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 044af05c8d9..28e4aac969e 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; - import { SpectronApplication, Quality } from '../../spectron/application'; import { StatusBarElement } from './statusbar'; @@ -69,7 +67,7 @@ export function setup() { } await app.workbench.statusbar.clickOn(StatusBarElement.FEEDBACK_ICON); - assert.ok(!!await app.client.waitForElement('.feedback-form')); + await app.client.waitForElement('.feedback-form'); }); it(`checks if 'Go to Line' works if called from the status bar`, async function () { diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts index 951497edccf..79c2a82bf59 100644 --- a/test/smoke/src/areas/terminal/terminal.ts +++ b/test/smoke/src/areas/terminal/terminal.ts @@ -20,9 +20,8 @@ export class Terminal { } } - async isVisible(): Promise { - const element = await this.spectron.client.element(PANEL_SELECTOR); - return !!element; + isVisible(): Promise { + return this.spectron.client.doesElementExist(PANEL_SELECTOR); } async runCommand(commandText: string): Promise { diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index c2711f449d3..2208b39fed5 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -65,12 +65,12 @@ export class Workbench { await this.editor.waitForActiveEditor(fileName); } - public async waitForActiveTab(fileName: string, isDirty: boolean = false): Promise { - return this.spectron.client.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); + public async waitForActiveTab(fileName: string, isDirty: boolean = false): Promise { + await this.spectron.client.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); } - public async waitForTab(fileName: string, isDirty: boolean = false): Promise { - return this.spectron.client.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`).then(() => true); + public async waitForTab(fileName: string, isDirty: boolean = false): Promise { + await this.spectron.client.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); } public async newUntitledFile(): Promise { diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 428d6a18310..ffa04d62d00 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -7,9 +7,6 @@ import { Application } from 'spectron'; import { RawResult, Element } from 'webdriverio'; import { SpectronApplication } from './application'; -/** - * Abstracts the Spectron's WebdriverIO managed client property on the created Application instances. - */ export class SpectronClient { // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding @@ -30,10 +27,6 @@ export class SpectronClient { return Promise.resolve(); } - async getText(selector: string, capture: boolean = true): Promise { - return this.spectron.client.getText(selector); - } - async waitForText(selector: string, text?: string, accept?: (result: string) => boolean): Promise { accept = accept ? accept : result => text !== void 0 ? text === result : !!result; return this.waitFor(() => this.spectron.client.getText(selector), accept, `getText with selector ${selector}`); @@ -45,35 +38,14 @@ export class SpectronClient { return this.waitFor(fn, s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); } - async waitForValue(selector: string, value?: string, accept?: (result: string) => boolean): Promise { - accept = accept ? accept : result => value !== void 0 ? value === result : !!result; - return this.waitFor(() => this.spectron.client.getValue(selector), accept, `getValue with selector ${selector}`); + async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { + return this.waitFor(() => this.spectron.client.leftClick(selector, xoffset, yoffset), void 0, `click with selector ${selector}`); } - async waitAndClick(selector: string): Promise { - return this.waitFor(() => this.spectron.client.click(selector), void 0, `click with selector ${selector}`); - } - - async click(selector: string): Promise { - return this.spectron.client.click(selector); - } - - async doubleClickAndWait(selector: string, capture: boolean = true): Promise { + async waitAndDoubleClick(selector: string, capture: boolean = true): Promise { return this.waitFor(() => this.spectron.client.doubleClick(selector), void 0, `doubleClick with selector ${selector}`); } - async leftClick(selector: string, xoffset: number, yoffset: number, capture: boolean = true): Promise { - return this.spectron.client.leftClick(selector, xoffset, yoffset); - } - - async rightClick(selector: string, capture: boolean = true): Promise { - return this.spectron.client.rightClick(selector); - } - - async moveToObject(selector: string, capture: boolean = true): Promise { - return this.spectron.client.moveToObject(selector); - } - async waitAndMoveToObject(selector: string): Promise { return this.waitFor(() => this.spectron.client.moveToObject(selector), void 0, `move to object with selector ${selector}`); } @@ -82,23 +54,16 @@ export class SpectronClient { return this.spectron.client.setValue(selector, text); } - async waitForElements(selector: string, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { - return this.waitFor>(() => this.spectron.client.elements(selector), result => accept(result.value), `elements with selector ${selector}`) - .then(result => result.value); + async doesElementExist(selector: string): Promise { + return this.spectron.client.element(selector).then(result => !!result.value); } - async waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { - return this.waitFor>(() => this.spectron.client.element(selector), result => accept(result ? result.value : void 0), `element with selector ${selector}`) - .then(result => result.value); + async waitForElements(selector: string, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { + return this.waitFor(() => this.spectron.client.elements(selector), result => accept(result.value), `elements with selector ${selector}`) as Promise; } - async waitForVisibility(selector: string, accept: (result: boolean) => boolean = result => result): Promise { - return this.waitFor(() => this.spectron.client.isVisible(selector), accept, `isVisible with selector ${selector}`); - } - - async element(selector: string): Promise { - return this.spectron.client.element(selector) - .then(result => result.value); + async waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { + return this.waitFor>(() => this.spectron.client.element(selector), result => accept(result ? result.value : void 0), `element with selector ${selector}`) as Promise; } async waitForActiveElement(selector: string): Promise { @@ -109,38 +74,6 @@ export class SpectronClient { ); } - async waitForAttribute(selector: string, attribute: string, accept: (result: string) => boolean = result => !!result): Promise { - return this.waitFor(() => this.spectron.client.getAttribute(selector), accept, `attribute with selector ${selector}`); - } - - async dragAndDrop(sourceElem: string, destinationElem: string, capture: boolean = true): Promise { - return this.spectron.client.dragAndDrop(sourceElem, destinationElem); - } - - async selectByValue(selector: string, value: string, capture: boolean = true): Promise { - return this.spectron.client.selectByValue(selector, value); - } - - async getValue(selector: string, capture: boolean = true): Promise { - return this.spectron.client.getValue(selector); - } - - async getAttribute(selector: string, attribute: string, capture: boolean = true): Promise { - return Promise.resolve(this.spectron.client.getAttribute(selector, attribute)); - } - - buttonDown(): any { - return this.spectron.client.buttonDown(); - } - - buttonUp(): any { - return this.spectron.client.buttonUp(); - } - - async isVisible(selector: string, capture: boolean = true): Promise { - return this.spectron.client.isVisible(selector); - } - async getTitle(): Promise { return this.spectron.client.getTitle(); } @@ -182,23 +115,4 @@ export class SpectronClient { this.running = false; } } - - // type(text: string): Promise { - // return new Promise((res) => { - // let textSplit = text.split(' '); - - // const type = async (i: number) => { - // if (!textSplit[i] || textSplit[i].length <= 0) { - // return res(); - // } - - // const toType = textSplit[i + 1] ? `${textSplit[i]} ` : textSplit[i]; - // await this.keys(toType); - // await this.keys(['NULL']); - // await type(i + 1); - // }; - - // return type(0); - // }); - // } } \ No newline at end of file From a1b2f26a6e66ffd95e7ebb0b833bda76d8afe790 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 11:57:03 +0200 Subject: [PATCH 032/710] more cleanup --- test/smoke/src/areas/debug/debug.ts | 12 +++--------- test/smoke/src/areas/editor/editor.ts | 2 +- test/smoke/src/spectron/client.ts | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index a77719c362a..a8187a6e9b6 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -22,6 +22,7 @@ const DEBUG_STATUS_BAR = `.statusbar.debugging`; const NOT_DEBUG_STATUS_BAR = `.statusbar:not(debugging)`; const TOOLBAR_HIDDEN = `.debug-actions-widget.monaco-builder-hidden`; const STACK_FRAME = `${VIEWLET} .monaco-tree-row .stack-frame`; +const SPECIFIC_STACK_FRAME = filename => `${STACK_FRAME} .file[title$="${filename}"]`; const VARIABLE = `${VIEWLET} .debug-variables .monaco-tree-row .expression`; const CONSOLE_OUTPUT = `.repl .output.expression`; const CONSOLE_INPUT_OUTPUT = `.repl .input-output-pair .output.expression .value`; @@ -29,7 +30,6 @@ const CONSOLE_INPUT_OUTPUT = `.repl .input-output-pair .output.expression .value const REPL_FOCUSED = '.repl-input-wrapper .monaco-editor textarea'; export interface IStackFrame { - id: string; name: string; lineNumber: number; } @@ -102,12 +102,11 @@ export class Debug extends Viewlet { } async waitForStackFrameLength(length: number): Promise { - return await this.spectron.client.waitFor(() => this.getStackFrames(), stackFrames => stackFrames.length === length); + await this.spectron.client.waitForElements(STACK_FRAME, result => result.length === length); } async focusStackFrame(name: string, message: string): Promise { - const stackFrame = await this.waitForStackFrame(sf => sf.name === name, message); - await this.spectron.client.spectron.client.elementIdClick(stackFrame.id); + await this.spectron.client.waitAndClick(SPECIFIC_STACK_FRAME(name)); await this.spectron.workbench.waitForTab(name); } @@ -130,11 +129,6 @@ export class Debug extends Viewlet { return await this.spectron.webclient.selectorExecute(VARIABLE, div => (Array.isArray(div) ? div : [div]).length); } - async getStackFramesLength(): Promise { - const stackFrames = await this.getStackFrames(); - return stackFrames.length; - } - private async getStackFrames(): Promise { const result = await this.spectron.webclient.selectorExecute(STACK_FRAME, div => (Array.isArray(div) ? div : [div]).map(element => { diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 7bb51cdc7ce..de7efb71a48 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -109,7 +109,7 @@ export class Editor { await this.spectron.client.waitForActiveElement(textarea); // https://github.com/Microsoft/vscode/issues/34203#issuecomment-334441786 - await this.spectron.client.spectron.client.selectorExecute(textarea, (elements, text) => { + await this.spectron.webclient.selectorExecute(textarea, (elements, text) => { const textarea = (Array.isArray(elements) ? elements : [elements])[0] as HTMLTextAreaElement; const start = textarea.selectionStart; const newStart = start + text.length; diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index ffa04d62d00..bbc98b3254d 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -15,7 +15,7 @@ export class SpectronClient { private readonly retryDuration = 100; // in milliseconds constructor( - readonly spectron: Application, + private spectron: Application, private application: SpectronApplication, waitTime: number ) { From d5db74696540e76dbeff9f59dd404f2de28de39c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 12:37:22 +0200 Subject: [PATCH 033/710] wip: cleanup API --- test/smoke/src/areas/workbench/workbench.ts | 81 +++++++++++++++------ test/smoke/src/spectron/application.ts | 52 ++----------- test/smoke/src/spectron/client.ts | 36 ++++----- 3 files changed, 85 insertions(+), 84 deletions(-) diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index 2208b39fed5..28200a8fabf 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; import { Explorer } from '../explorer/explorer'; import { ActivityBar } from '../activitybar/activityBar'; import { QuickOpen } from '../quickopen/quickopen'; @@ -17,6 +16,7 @@ import { Problems } from '../problems/problems'; import { SettingsEditor } from '../preferences/settings'; import { KeybindingsEditor } from '../preferences/keybindings'; import { Terminal } from '../terminal/terminal'; +import { API } from '../../spectron/client'; export class Workbench { @@ -33,30 +33,31 @@ export class Workbench { readonly settingsEditor: SettingsEditor; readonly keybindingsEditor: KeybindingsEditor; readonly terminal: Terminal; + private keybindings: any[]; - constructor(private spectron: SpectronApplication) { - this.explorer = new Explorer(spectron); - this.activitybar = new ActivityBar(spectron); - this.quickopen = new QuickOpen(spectron); - this.search = new Search(spectron); - this.extensions = new Extensions(spectron); - this.editor = new Editor(spectron); - this.scm = new SCM(spectron); - this.debug = new Debug(spectron); - this.statusbar = new StatusBar(spectron); - this.problems = new Problems(spectron); - this.settingsEditor = new SettingsEditor(spectron); - this.keybindingsEditor = new KeybindingsEditor(spectron); - this.terminal = new Terminal(spectron); + constructor(private api: API) { + this.explorer = new Explorer(api); + this.activitybar = new ActivityBar(api); + this.quickopen = new QuickOpen(api); + this.search = new Search(api); + this.extensions = new Extensions(api); + this.editor = new Editor(api); + this.scm = new SCM(api); + this.debug = new Debug(api); + this.statusbar = new StatusBar(api); + this.problems = new Problems(api); + this.settingsEditor = new SettingsEditor(api); + this.keybindingsEditor = new KeybindingsEditor(api); + this.terminal = new Terminal(api); } public async saveOpenedFile(): Promise { - await this.spectron.client.waitForElement('.tabs-container div.tab.active.dirty'); - await this.spectron.workbench.quickopen.runCommand('File: Save'); + await this.api.waitForElement('.tabs-container div.tab.active.dirty'); + await this.quickopen.runCommand('File: Save'); } public async selectTab(tabName: string, untitled: boolean = false): Promise { - await this.spectron.client.waitAndClick(`.tabs-container div.tab[aria-label="${tabName}, tab"]`); + await this.api.waitAndClick(`.tabs-container div.tab[aria-label="${tabName}, tab"]`); await this.waitForEditorFocus(tabName, untitled); } @@ -66,15 +67,53 @@ export class Workbench { } public async waitForActiveTab(fileName: string, isDirty: boolean = false): Promise { - await this.spectron.client.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); + await this.api.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); } public async waitForTab(fileName: string, isDirty: boolean = false): Promise { - await this.spectron.client.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); + await this.api.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); } public async newUntitledFile(): Promise { - await this.spectron.runCommand('workbench.action.files.newUntitledFile'); + await this.runCommand('workbench.action.files.newUntitledFile'); await this.waitForEditorFocus('Untitled-1', true); } + + /** + * Retrieves the command from keybindings file and executes it with WebdriverIO client API + * @param command command (e.g. 'workbench.action.files.newUntitledFile') + */ + runCommand(command: string): Promise { + const binding = this.keybindings.find(x => x['command'] === command); + if (!binding) { + return this.quickopen.runCommand(command); + } + + const keys: string = binding.key; + let keysToPress: string[] = []; + + const chords = keys.split(' '); + chords.forEach((chord) => { + const keys = chord.split('+'); + keys.forEach((key) => keysToPress.push(this.transliterate(key))); + keysToPress.push('NULL'); + }); + + return this.api.keys(keysToPress); + } + + /** + * Transliterates key names from keybindings file to WebdriverIO keyboard actions defined in: + * https://w3c.github.io/webdriver/webdriver-spec.html#keyboard-actions + */ + private transliterate(key: string): string { + switch (key) { + case 'ctrl': + return 'Control'; + case 'cmd': + return 'Meta'; + default: + return key.length === 1 ? key : key.charAt(0).toUpperCase() + key.slice(1); + } + } } diff --git a/test/smoke/src/spectron/application.ts b/test/smoke/src/spectron/application.ts index 91d742cd159..cfca044f82b 100644 --- a/test/smoke/src/spectron/application.ts +++ b/test/smoke/src/spectron/application.ts @@ -5,7 +5,7 @@ import { Application, SpectronClient as WebClient } from 'spectron'; import { test as testPort } from 'portastic'; -import { SpectronClient } from './client'; +import { API } from './client'; import { ScreenCapturer } from '../helpers/screenshot'; import { Workbench } from '../areas/workbench/workbench'; import * as fs from 'fs'; @@ -51,11 +51,11 @@ export class SpectronApplication { private static count = 0; - private _client: SpectronClient; + private _api: API; private _workbench: Workbench; private _screenCapturer: ScreenCapturer; private spectron: Application | undefined; - private keybindings: any[]; private stopLogCollection: (() => Promise) | undefined; + private stopLogCollection: (() => Promise) | undefined; constructor( private options: SpectronApplicationOptions @@ -65,8 +65,8 @@ export class SpectronApplication { return this.options.quality; } - get client(): SpectronClient { - return this._client; + get client(): API { + return this._api; } get webclient(): WebClient { @@ -269,8 +269,8 @@ export class SpectronApplication { } this._screenCapturer = new ScreenCapturer(this.spectron, this._suiteName, screenshotsDirPath); - this._client = new SpectronClient(this.spectron, this, this.options.waitTime); - this._workbench = new Workbench(this); + this._api = new API(this.spectron.client, this.screenCapturer, this.options.waitTime); + this._workbench = new Workbench(this._api); } private async checkWindowReady(): Promise { @@ -310,42 +310,4 @@ export class SpectronApplication { }); }); } - - /** - * Retrieves the command from keybindings file and executes it with WebdriverIO client API - * @param command command (e.g. 'workbench.action.files.newUntitledFile') - */ - runCommand(command: string): Promise { - const binding = this.keybindings.find(x => x['command'] === command); - if (!binding) { - return this.workbench.quickopen.runCommand(command); - } - - const keys: string = binding.key; - let keysToPress: string[] = []; - - const chords = keys.split(' '); - chords.forEach((chord) => { - const keys = chord.split('+'); - keys.forEach((key) => keysToPress.push(this.transliterate(key))); - keysToPress.push('NULL'); - }); - - return this.client.keys(keysToPress); - } - - /** - * Transliterates key names from keybindings file to WebdriverIO keyboard actions defined in: - * https://w3c.github.io/webdriver/webdriver-spec.html#keyboard-actions - */ - private transliterate(key: string): string { - switch (key) { - case 'ctrl': - return 'Control'; - case 'cmd': - return 'Meta'; - default: - return key.length === 1 ? key : key.charAt(0).toUpperCase() + key.slice(1); - } - } } diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index bbc98b3254d..29ece9a31ee 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -3,11 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Application } from 'spectron'; +import { SpectronClient } from 'spectron'; import { RawResult, Element } from 'webdriverio'; -import { SpectronApplication } from './application'; +import { ScreenCapturer } from '../helpers/screenshot'; -export class SpectronClient { +export class API { // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding // the time it takes for the actual retry call to complete @@ -15,67 +15,67 @@ export class SpectronClient { private readonly retryDuration = 100; // in milliseconds constructor( - private spectron: Application, - private application: SpectronApplication, + private spectronClient: SpectronClient, + private screenCapturer: ScreenCapturer, waitTime: number ) { this.retryCount = (waitTime * 1000) / this.retryDuration; } keys(keys: string[]): Promise { - this.spectron.client.keys(keys); + this.spectronClient.keys(keys); return Promise.resolve(); } async waitForText(selector: string, text?: string, accept?: (result: string) => boolean): Promise { accept = accept ? accept : result => text !== void 0 ? text === result : !!result; - return this.waitFor(() => this.spectron.client.getText(selector), accept, `getText with selector ${selector}`); + return this.waitFor(() => this.spectronClient.getText(selector), accept, `getText with selector ${selector}`); } async waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { accept = accept ? accept : (result => textContent !== void 0 ? textContent === result : !!result); - const fn = async () => await this.spectron.client.selectorExecute(selector, div => Array.isArray(div) ? div[0].textContent : div.textContent); + const fn = async () => await this.spectronClient.selectorExecute(selector, div => Array.isArray(div) ? div[0].textContent : div.textContent); return this.waitFor(fn, s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); } async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { - return this.waitFor(() => this.spectron.client.leftClick(selector, xoffset, yoffset), void 0, `click with selector ${selector}`); + return this.waitFor(() => this.spectronClient.leftClick(selector, xoffset, yoffset), void 0, `click with selector ${selector}`); } async waitAndDoubleClick(selector: string, capture: boolean = true): Promise { - return this.waitFor(() => this.spectron.client.doubleClick(selector), void 0, `doubleClick with selector ${selector}`); + return this.waitFor(() => this.spectronClient.doubleClick(selector), void 0, `doubleClick with selector ${selector}`); } async waitAndMoveToObject(selector: string): Promise { - return this.waitFor(() => this.spectron.client.moveToObject(selector), void 0, `move to object with selector ${selector}`); + return this.waitFor(() => this.spectronClient.moveToObject(selector), void 0, `move to object with selector ${selector}`); } async setValue(selector: string, text: string, capture: boolean = true): Promise { - return this.spectron.client.setValue(selector, text); + return this.spectronClient.setValue(selector, text); } async doesElementExist(selector: string): Promise { - return this.spectron.client.element(selector).then(result => !!result.value); + return this.spectronClient.element(selector).then(result => !!result.value); } async waitForElements(selector: string, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { - return this.waitFor(() => this.spectron.client.elements(selector), result => accept(result.value), `elements with selector ${selector}`) as Promise; + return this.waitFor(() => this.spectronClient.elements(selector), result => accept(result.value), `elements with selector ${selector}`) as Promise; } async waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { - return this.waitFor>(() => this.spectron.client.element(selector), result => accept(result ? result.value : void 0), `element with selector ${selector}`) as Promise; + return this.waitFor>(() => this.spectronClient.element(selector), result => accept(result ? result.value : void 0), `element with selector ${selector}`) as Promise; } async waitForActiveElement(selector: string): Promise { return this.waitFor( - () => this.spectron.client.execute(s => document.activeElement.matches(s), selector), + () => this.spectronClient.execute(s => document.activeElement.matches(s), selector), r => r.value, `wait for active element: ${selector}` ); } async getTitle(): Promise { - return this.spectron.client.getTitle(); + return this.spectronClient.getTitle(); } private running = false; @@ -93,7 +93,7 @@ export class SpectronClient { while (true) { if (trial > retryCount) { - await this.application.screenCapturer.capture('timeout'); + await this.screenCapturer.capture('timeout'); throw new Error(`${timeoutMessage}: Timed out after ${(retryCount * this.retryDuration) / 1000} seconds.`); } From 8a78515e6a95cd0dc051d0eb443151a803f78375 Mon Sep 17 00:00:00 2001 From: Pradeep Murugesan Date: Mon, 2 Apr 2018 12:45:07 +0200 Subject: [PATCH 034/710] 46785 open root folder when no file is in focus and reveal in finder is invoked via command pallate --- .../parts/files/electron-browser/fileCommands.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts index f19b8205f14..6fe81044cff 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts @@ -386,9 +386,11 @@ CommandsRegistry.registerCommand({ } }); -function revealResourcesInOS(resources: URI[], windowsService: IWindowsService, notificationService: INotificationService): void { +function revealResourcesInOS(resources: URI[], windowsService: IWindowsService, notificationService: INotificationService, workSpaceContextService: IWorkspaceContextService): void { if (resources.length) { sequence(resources.map(r => () => windowsService.showItemInFolder(paths.normalize(r.fsPath, true)))); + } else if (workSpaceContextService.getWorkspace().folders.length) { + windowsService.showItemInFolder(paths.normalize(workSpaceContextService.getWorkspace().folders[0].uri.fsPath, true)); } else { notificationService.info(nls.localize('openFileToReveal', "Open a file first to reveal")); } @@ -403,7 +405,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ }, handler: (accessor: ServicesAccessor, resource: URI | object) => { const resources = getMultiSelectedResources(resource, accessor.get(IListService), accessor.get(IWorkbenchEditorService)); - revealResourcesInOS(resources, accessor.get(IWindowsService), accessor.get(INotificationService)); + revealResourcesInOS(resources, accessor.get(IWindowsService), accessor.get(INotificationService), accessor.get(IWorkspaceContextService)); } }); KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -415,7 +417,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ const editorService = accessor.get(IWorkbenchEditorService); const activeInput = editorService.getActiveEditorInput(); const resources = activeInput && activeInput.getResource() ? [activeInput.getResource()] : []; - revealResourcesInOS(resources, accessor.get(IWindowsService), accessor.get(INotificationService)); + revealResourcesInOS(resources, accessor.get(IWindowsService), accessor.get(INotificationService), accessor.get(IWorkspaceContextService)); } }); From 7a312c1ea582632862b1542132602025d068db9e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 17:09:21 +0200 Subject: [PATCH 035/710] green! --- .../src/areas/activitybar/activityBar.ts | 6 +- test/smoke/src/areas/css/css.test.ts | 4 +- test/smoke/src/areas/debug/debug.ts | 83 ++++++------- test/smoke/src/areas/editor/editor.test.ts | 4 +- test/smoke/src/areas/editor/editor.ts | 113 +++++------------- test/smoke/src/areas/editor/editors.ts | 45 +++++++ test/smoke/src/areas/editor/peek.ts | 29 +++-- test/smoke/src/areas/editor/quickoutline.ts | 26 ---- test/smoke/src/areas/explorer/explorer.ts | 25 ++-- .../src/areas/extensions/extensions.test.ts | 2 +- test/smoke/src/areas/extensions/extensions.ts | 21 ++-- test/smoke/src/areas/git/git.test.ts | 6 +- test/smoke/src/areas/git/scm.ts | 35 +++--- .../src/areas/preferences/keybindings.ts | 23 ++-- .../src/areas/preferences/preferences.test.ts | 2 +- test/smoke/src/areas/preferences/settings.ts | 30 ++--- test/smoke/src/areas/problems/problems.ts | 17 +-- test/smoke/src/areas/quickopen/quickopen.ts | 75 +++++++----- test/smoke/src/areas/search/search.ts | 59 ++++----- test/smoke/src/areas/statusbar/statusbar.ts | 20 ++-- test/smoke/src/areas/terminal/terminal.ts | 17 +-- .../src/areas/workbench/data-loss.test.ts | 8 +- .../areas/workbench/data-migration.test.ts | 16 +-- test/smoke/src/areas/workbench/viewlet.ts | 9 +- test/smoke/src/areas/workbench/workbench.ts | 70 ++++------- test/smoke/src/spectron/application.ts | 5 +- test/smoke/src/spectron/client.ts | 43 ++++++- 27 files changed, 399 insertions(+), 394 deletions(-) create mode 100644 test/smoke/src/areas/editor/editors.ts delete mode 100644 test/smoke/src/areas/editor/quickoutline.ts diff --git a/test/smoke/src/areas/activitybar/activityBar.ts b/test/smoke/src/areas/activitybar/activityBar.ts index 2873dd26d37..f5942503146 100644 --- a/test/smoke/src/areas/activitybar/activityBar.ts +++ b/test/smoke/src/areas/activitybar/activityBar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; export enum ActivityBarPosition { LEFT = 0, @@ -12,7 +12,7 @@ export enum ActivityBarPosition { export class ActivityBar { - constructor(private spectron: SpectronApplication) { + constructor(private api: API) { // noop } @@ -27,6 +27,6 @@ export class ActivityBar { throw new Error('No such position for activity bar defined.'); } - return this.spectron.client.waitForElement(`.part.activitybar.${positionClass}`); + return this.api.waitForElement(`.part.activitybar.${positionClass}`); } } \ No newline at end of file diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index cf6f7085f4c..c0b2c768b9b 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -16,7 +16,7 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.quickopen.openFile('style.css'); - await app.workbench.editor.openOutline(); + await app.workbench.quickopen.openQuickOutline(); await app.workbench.quickopen.waitForQuickOpenElements(names => names.length === 2); }); @@ -43,7 +43,7 @@ export function setup() { await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); await app.screenCapturer.capture('CSS Error in editor'); - const problems = new Problems(app); + const problems = new Problems(app.client, app.workbench); await problems.showProblemsView(); await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); await app.screenCapturer.capture('CSS Error in probles view'); diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index a8187a6e9b6..78c1c2136a0 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -3,8 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; import { Viewlet } from '../workbench/viewlet'; +import { Commands } from '../workbench/workbench'; +import { API } from '../../spectron/client'; +import { Editors } from '../editor/editors'; +import { Editor } from '../editor/editor'; const VIEWLET = 'div[id="workbench.view.debug"]'; const DEBUG_VIEW = `${VIEWLET} .debug-view-content`; @@ -36,32 +39,32 @@ export interface IStackFrame { export class Debug extends Viewlet { - constructor(spectron: SpectronApplication) { - super(spectron); + constructor(api: API, private commands: Commands, private editors: Editors, private editor: Editor) { + super(api); } async openDebugViewlet(): Promise { - await this.spectron.runCommand('workbench.view.debug'); - await this.spectron.client.waitForElement(DEBUG_VIEW); + await this.commands.runCommand('workbench.view.debug'); + await this.api.waitForElement(DEBUG_VIEW); } async configure(): Promise { - await this.spectron.client.waitAndClick(CONFIGURE); - await this.spectron.workbench.waitForEditorFocus('launch.json'); + await this.api.waitAndClick(CONFIGURE); + await this.editors.waitForEditorFocus('launch.json'); } async setBreakpointOnLine(lineNumber: number): Promise { - await this.spectron.client.waitForElement(`${GLYPH_AREA}(${lineNumber})`); - await this.spectron.client.waitAndClick(`${GLYPH_AREA}(${lineNumber})`, 5, 5); - await this.spectron.client.waitForElement(BREAKPOINT_GLYPH); + await this.api.waitForElement(`${GLYPH_AREA}(${lineNumber})`); + await this.api.waitAndClick(`${GLYPH_AREA}(${lineNumber})`, 5, 5); + await this.api.waitForElement(BREAKPOINT_GLYPH); } async startDebugging(): Promise { - await this.spectron.client.waitAndClick(START); - await this.spectron.client.waitForElement(PAUSE); - await this.spectron.client.waitForElement(DEBUG_STATUS_BAR); + await this.api.waitAndClick(START); + await this.api.waitForElement(PAUSE); + await this.api.waitForElement(DEBUG_STATUS_BAR); const portPrefix = 'Port: '; - await this.spectron.client.waitFor(async () => { + await this.api.waitFor(async () => { const output = await this.getConsoleOutput(); return output.join(''); }, text => !!text && text.indexOf(portPrefix) >= 0); @@ -72,74 +75,73 @@ export class Debug extends Viewlet { } async stepOver(): Promise { - await this.spectron.client.waitAndClick(STEP_OVER); + await this.api.waitAndClick(STEP_OVER); } async stepIn(): Promise { - await this.spectron.client.waitAndClick(STEP_IN); + await this.api.waitAndClick(STEP_IN); } async stepOut(): Promise { - await this.spectron.client.waitAndClick(STEP_OUT); + await this.api.waitAndClick(STEP_OUT); } async continue(): Promise { - await this.spectron.client.waitAndClick(CONTINUE); + await this.api.waitAndClick(CONTINUE); await this.waitForStackFrameLength(0); } async stopDebugging(): Promise { - await this.spectron.client.waitAndClick(STOP); - await this.spectron.client.waitForElement(TOOLBAR_HIDDEN); - await this.spectron.client.waitForElement(NOT_DEBUG_STATUS_BAR); + await this.api.waitAndClick(STOP); + await this.api.waitForElement(TOOLBAR_HIDDEN); + await this.api.waitForElement(NOT_DEBUG_STATUS_BAR); } async waitForStackFrame(func: (stackFrame: IStackFrame) => boolean, message: string): Promise { - return await this.spectron.client.waitFor(async () => { + return await this.api.waitFor(async () => { const stackFrames = await this.getStackFrames(); return stackFrames.filter(func)[0]; }, void 0, `Waiting for Stack Frame: ${message}`); } async waitForStackFrameLength(length: number): Promise { - await this.spectron.client.waitForElements(STACK_FRAME, result => result.length === length); + await this.api.waitForElements(STACK_FRAME, result => result.length === length); } async focusStackFrame(name: string, message: string): Promise { - await this.spectron.client.waitAndClick(SPECIFIC_STACK_FRAME(name)); - await this.spectron.workbench.waitForTab(name); + await this.api.waitAndClick(SPECIFIC_STACK_FRAME(name)); + await this.editors.waitForTab(name); } async waitForReplCommand(text: string, accept: (result: string) => boolean): Promise { - await this.spectron.workbench.quickopen.runCommand('Debug: Focus Debug Console'); - await this.spectron.client.waitForActiveElement(REPL_FOCUSED); - await this.spectron.client.setValue(REPL_FOCUSED, text); + await this.commands.runCommand('Debug: Focus Debug Console'); + await this.api.waitForActiveElement(REPL_FOCUSED); + await this.api.setValue(REPL_FOCUSED, text); // Wait for the keys to be picked up by the editor model such that repl evalutes what just got typed - await this.spectron.workbench.editor.waitForEditorContents('debug:input', s => s.indexOf(text) >= 0); - await this.spectron.client.keys(['Enter', 'NULL']); - await this.spectron.client.waitForElement(CONSOLE_INPUT_OUTPUT); - await this.spectron.client.waitFor(async () => { + await this.editor.waitForEditorContents('debug:input', s => s.indexOf(text) >= 0); + await this.api.keys(['Enter', 'NULL']); + await this.api.waitForElement(CONSOLE_INPUT_OUTPUT); + await this.api.waitFor(async () => { const result = await this.getConsoleOutput(); return result[result.length - 1] || ''; }, accept); } async getLocalVariableCount(): Promise { - return await this.spectron.webclient.selectorExecute(VARIABLE, div => (Array.isArray(div) ? div : [div]).length); + return await this.api.getElementCount(VARIABLE); } private async getStackFrames(): Promise { - const result = await this.spectron.webclient.selectorExecute(STACK_FRAME, + const result = await this.api.selectorExecute(STACK_FRAME, div => (Array.isArray(div) ? div : [div]).map(element => { const name = element.querySelector('.file-name') as HTMLElement; const line = element.querySelector('.line-number') as HTMLElement; const lineNumber = line.textContent ? parseInt(line.textContent.split(':').shift() || '0') : 0; return { - name: name.textContent, - lineNumber, - element + name: name.textContent || '', + lineNumber }; }) ); @@ -148,16 +150,15 @@ export class Debug extends Viewlet { return []; } - return result - .map(({ name, lineNumber, element }) => ({ name, lineNumber, id: element.ELEMENT })); + return result.map(({ name, lineNumber }) => ({ name, lineNumber })); } private async getConsoleOutput(): Promise { - const result = await this.spectron.webclient.selectorExecute(CONSOLE_OUTPUT, + const result = await this.api.selectorExecute(CONSOLE_OUTPUT, div => (Array.isArray(div) ? div : [div]).map(element => { const value = element.querySelector('.value') as HTMLElement; return value && value.textContent; - }).filter(line => !!line) + }).filter(line => !!line) as string[] ); return result; diff --git a/test/smoke/src/areas/editor/editor.test.ts b/test/smoke/src/areas/editor/editor.test.ts index 0911d100100..d3be47f5747 100644 --- a/test/smoke/src/areas/editor/editor.test.ts +++ b/test/smoke/src/areas/editor/editor.test.ts @@ -15,7 +15,7 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.quickopen.openFile('www'); - await app.workbench.editor.openOutline(); + await app.workbench.quickopen.openQuickOutline(); await app.workbench.quickopen.waitForQuickOpenElements(names => names.length >= 6); }); @@ -60,7 +60,7 @@ export function setup() { await app.workbench.editor.gotoDefinition('express', 11); - await app.workbench.waitForActiveTab('index.d.ts'); + await app.workbench.editors.waitForActiveTab('index.d.ts'); }); it(`verifies that 'Peek Definition' works`, async function () { diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index de7efb71a48..34c70c65f04 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; -import { QuickOutline } from './quickoutline'; import { References } from './peek'; +import { Commands } from '../workbench/workbench'; +import { API } from '../../spectron/client'; const RENAME_BOX = '.monaco-editor .monaco-editor.rename-box'; const RENAME_INPUT = `${RENAME_BOX} .rename-input`; @@ -17,42 +17,35 @@ export class Editor { private static readonly FOLDING_EXPANDED = '.monaco-editor .margin .margin-view-overlays>:nth-child(${INDEX}) .folding'; private static readonly FOLDING_COLLAPSED = `${Editor.FOLDING_EXPANDED}.collapsed`; - constructor(private spectron: SpectronApplication) { - } - - async openOutline(): Promise { - const outline = new QuickOutline(this.spectron); - await outline.open(); - return outline; - } + constructor(private api: API, private commands: Commands) { } async findReferences(term: string, line: number): Promise { await this.clickOnTerm(term, line); - await this.spectron.workbench.quickopen.runCommand('Find All References'); - const references = new References(this.spectron); + await this.commands.runCommand('Find All References'); + const references = new References(this.api); await references.waitUntilOpen(); return references; } async rename(filename: string, line: number, from: string, to: string): Promise { await this.clickOnTerm(from, line); - await this.spectron.workbench.quickopen.runCommand('Rename Symbol'); + await this.commands.runCommand('Rename Symbol'); - await this.spectron.client.waitForActiveElement(RENAME_INPUT); - await this.spectron.client.setValue(RENAME_INPUT, to); + await this.api.waitForActiveElement(RENAME_INPUT); + await this.api.setValue(RENAME_INPUT, to); - await this.spectron.client.keys(['Enter', 'NULL']); + await this.api.keys(['Enter', 'NULL']); } async gotoDefinition(term: string, line: number): Promise { await this.clickOnTerm(term, line); - await this.spectron.workbench.quickopen.runCommand('Go to Definition'); + await this.commands.runCommand('Go to Definition'); } async peekDefinition(term: string, line: number): Promise { await this.clickOnTerm(term, line); - await this.spectron.workbench.quickopen.runCommand('Peek Definition'); - const peek = new References(this.spectron); + await this.commands.runCommand('Peek Definition'); + const peek = new References(this.api); await peek.waitUntilOpen(); return peek; } @@ -60,7 +53,7 @@ export class Editor { async waitForHighlightingLine(line: number): Promise { const currentLineIndex = await this.getViewLineIndex(line); if (currentLineIndex) { - await this.spectron.client.waitForElement(`.monaco-editor .view-overlays>:nth-child(${currentLineIndex}) .current-line`); + await this.api.waitForElement(`.monaco-editor .view-overlays>:nth-child(${currentLineIndex}) .current-line`); return; } throw new Error('Cannot find line ' + line); @@ -68,24 +61,20 @@ export class Editor { async getSelector(term: string, line: number): Promise { const lineIndex = await this.getViewLineIndex(line); - const classNames = await this.spectron.client.waitFor(() => this.getClassSelectors(term, lineIndex), classNames => classNames && !!classNames.length, 'Getting class names for editor lines'); + const classNames = await this.getClassSelectors(term, lineIndex); return `${Editor.VIEW_LINES}>:nth-child(${lineIndex}) span span.${classNames[0]}`; } async foldAtLine(line: number): Promise { const lineIndex = await this.getViewLineIndex(line); - await this.spectron.client.waitAndClick(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); - await this.spectron.client.waitForElement(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); + await this.api.waitAndClick(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); + await this.api.waitForElement(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); } async unfoldAtLine(line: number): Promise { const lineIndex = await this.getViewLineIndex(line); - await this.spectron.client.waitAndClick(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); - await this.spectron.client.waitForElement(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); - } - - async waitUntilHidden(line: number): Promise { - await this.spectron.client.waitFor(() => this.getViewLineIndexWithoutWait(line), lineNumber => lineNumber === undefined, 'Waiting until line number is hidden'); + await this.api.waitAndClick(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); + await this.api.waitForElement(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); } async waitUntilShown(line: number): Promise { @@ -94,7 +83,7 @@ export class Editor { async clickOnTerm(term: string, line: number): Promise { const selector = await this.getSelector(term, line); - await this.spectron.client.waitAndClick(selector); + await this.api.waitAndClick(selector); } async waitForTypeInEditor(filename: string, text: string, selectorPrefix = ''): Promise { @@ -103,13 +92,13 @@ export class Editor { `.monaco-editor[data-uri$="${filename}"]` ].join(' '); - await this.spectron.client.waitForElement(editor); + await this.api.waitForElement(editor); const textarea = `${editor} textarea`; - await this.spectron.client.waitForActiveElement(textarea); + await this.api.waitForActiveElement(textarea); // https://github.com/Microsoft/vscode/issues/34203#issuecomment-334441786 - await this.spectron.webclient.selectorExecute(textarea, (elements, text) => { + await this.api.selectorExecute(textarea, (elements, text) => { const textarea = (Array.isArray(elements) ? elements : [elements])[0] as HTMLTextAreaElement; const start = textarea.selectionStart; const newStart = start + text.length; @@ -132,64 +121,26 @@ export class Editor { `.monaco-editor[data-uri$="${filename}"] .view-lines` ].join(' '); - return this.spectron.client.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' '))); + return this.api.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' '))); } - async waitForActiveEditor(filename: string): Promise { - const selector = `.editor-container .monaco-editor[data-uri$="${filename}"] textarea`; - return this.spectron.client.waitForActiveElement(selector); - } - - // async waitForActiveEditorFirstLineText(filename: string): Promise { - // const selector = `.editor-container .monaco-editor[data-uri$="${filename}"] textarea`; - // const result = await this.spectron.client.waitFor( - // () => this.spectron.client.spectron.client.execute(s => { - // if (!document.activeElement.matches(s)) { - // return undefined; - // } - - // let element: Element | null = document.activeElement; - // while (element && !/monaco-editor/.test(element.className) && element !== document.body) { - // element = element.parentElement; - // } - - // if (element && /monaco-editor/.test(element.className)) { - // const firstLine = element.querySelector('.view-lines span span:nth-child(1)'); - - // if (firstLine) { - // return (firstLine.textContent || '').replace(/\u00a0/g, ' '); // DAMN - // } - // } - - // return undefined; - // }, selector), - // r => typeof r.value === 'string', - // `wait for active editor first line: ${selector}` - // ); - - // return result.value; - // } - private async getClassSelectors(term: string, viewline: number): Promise { - const result: { text: string, className: string }[] = await this.spectron.webclient.selectorExecute(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, - elements => (Array.isArray(elements) ? elements : [elements]) - .map(element => ({ text: element.textContent, className: element.className }))); - const { className } = result.filter(r => r.text === term)[0]; + const elements = await this.api.waitForElements(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, els => els.some(el => el.textContent === term)); + const { className } = elements.filter(r => r.textContent === term)[0]; return className.split(/\s/g); } private async getViewLineIndex(line: number): Promise { - return await this.spectron.client.waitFor(() => this.getViewLineIndexWithoutWait(line), void 0, 'Getting line index'); - } + const elements = await this.api.waitForElements(Editor.LINE_NUMBERS, els => { + return els.some(el => el.textContent === `${line}`); + }); - private async getViewLineIndexWithoutWait(line: number): Promise { - const lineNumbers = await this.spectron.webclient.selectorExecute(Editor.LINE_NUMBERS, - elements => (Array.isArray(elements) ? elements : [elements]).map(element => element.textContent)); - for (let index = 0; index < lineNumbers.length; index++) { - if (lineNumbers[index] === `${line}`) { + for (let index = 0; index < elements.length; index++) { + if (elements[index].textContent === `${line}`) { return index + 1; } } - return undefined; + + throw new Error('Line not found'); } } \ No newline at end of file diff --git a/test/smoke/src/areas/editor/editors.ts b/test/smoke/src/areas/editor/editors.ts new file mode 100644 index 00000000000..6c708367e3b --- /dev/null +++ b/test/smoke/src/areas/editor/editors.ts @@ -0,0 +1,45 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; + +export class Editors { + + constructor(private api: API, private commands: Commands) { } + + async saveOpenedFile(): Promise { + await this.api.waitForElement('.tabs-container div.tab.active.dirty'); + await this.commands.runCommand('File: Save'); + } + + async selectTab(tabName: string, untitled: boolean = false): Promise { + await this.api.waitAndClick(`.tabs-container div.tab[aria-label="${tabName}, tab"]`); + await this.waitForEditorFocus(tabName, untitled); + } + + async waitForActiveEditor(filename: string): Promise { + const selector = `.editor-container .monaco-editor[data-uri$="${filename}"] textarea`; + return this.api.waitForActiveElement(selector); + } + + async waitForEditorFocus(fileName: string, untitled: boolean = false): Promise { + await this.waitForActiveTab(fileName); + await this.waitForActiveEditor(fileName); + } + + async waitForActiveTab(fileName: string, isDirty: boolean = false): Promise { + await this.api.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); + } + + async waitForTab(fileName: string, isDirty: boolean = false): Promise { + await this.api.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); + } + + async newUntitledFile(): Promise { + await this.commands.runCommand('workbench.action.files.newUntitledFile'); + await this.waitForEditorFocus('Untitled-1', true); + } +} \ No newline at end of file diff --git a/test/smoke/src/areas/editor/peek.ts b/test/smoke/src/areas/editor/peek.ts index 9c912821270..7a9f9af316b 100644 --- a/test/smoke/src/areas/editor/peek.ts +++ b/test/smoke/src/areas/editor/peek.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; export class References { @@ -12,30 +12,29 @@ export class References { private static readonly REFERENCES_TITLE_COUNT = `${References.REFERENCES_WIDGET} .head .peekview-title .meta`; private static readonly REFERENCES = `${References.REFERENCES_WIDGET} .body .ref-tree.inline .monaco-tree-row .reference`; - constructor(private spectron: SpectronApplication) { + constructor(private api: API) { } + + async waitUntilOpen(): Promise { + await this.api.waitForElement(References.REFERENCES_WIDGET); } - public async waitUntilOpen(): Promise { - await this.spectron.client.waitForElement(References.REFERENCES_WIDGET); - } - - public async waitForReferencesCountInTitle(count: number): Promise { - await this.spectron.client.waitForText(References.REFERENCES_TITLE_COUNT, void 0, titleCount => { + async waitForReferencesCountInTitle(count: number): Promise { + await this.api.waitForText(References.REFERENCES_TITLE_COUNT, void 0, titleCount => { const matches = titleCount.match(/\d+/); return matches ? parseInt(matches[0]) === count : false; }); } - public async waitForReferencesCount(count: number): Promise { - await this.spectron.client.waitForElements(References.REFERENCES, result => result && result.length === count); + async waitForReferencesCount(count: number): Promise { + await this.api.waitForElements(References.REFERENCES, result => result && result.length === count); } - public async waitForFile(file: string): Promise { - await this.spectron.client.waitForText(References.REFERENCES_TITLE_FILE_NAME, file); + async waitForFile(file: string): Promise { + await this.api.waitForText(References.REFERENCES_TITLE_FILE_NAME, file); } - public async close(): Promise { - await this.spectron.client.keys(['Escape', 'NULL']); - await this.spectron.client.waitForElement(References.REFERENCES_WIDGET, element => !element); + async close(): Promise { + await this.api.keys(['Escape', 'NULL']); + await this.api.waitForElement(References.REFERENCES_WIDGET, element => !element); } } \ No newline at end of file diff --git a/test/smoke/src/areas/editor/quickoutline.ts b/test/smoke/src/areas/editor/quickoutline.ts deleted file mode 100644 index de21d887701..00000000000 --- a/test/smoke/src/areas/editor/quickoutline.ts +++ /dev/null @@ -1,26 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { QuickOpen } from '../quickopen/quickopen'; - -export class QuickOutline extends QuickOpen { - - public async open(): Promise { - let retries = 0; - - while (++retries < 10) { - await this.spectron.runCommand('workbench.action.gotoSymbol'); - - const text = await this.spectron.client.waitForText('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); - - if (text !== 'No symbol information for the file') { - return; - } - - await this.closeQuickOpen(); - await new Promise(c => setTimeout(c, 250)); - } - } -} diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index 3ba320d1af6..e4408149686 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -3,33 +3,34 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; import { Viewlet } from '../workbench/viewlet'; - +import { API } from '../../spectron/client'; +import { Editors } from '../editor/editors'; +import { Commands } from '../workbench/workbench'; export class Explorer extends Viewlet { private static readonly EXPLORER_VIEWLET = 'div[id="workbench.view.explorer"]'; private static readonly OPEN_EDITORS_VIEW = `${Explorer.EXPLORER_VIEWLET} .split-view-view:nth-child(1) .title`; - constructor(spectron: SpectronApplication) { - super(spectron); + constructor(api: API, private commands: Commands, private editors: Editors) { + super(api); } - public openExplorerView(): Promise { - return this.spectron.runCommand('workbench.view.explorer'); + openExplorerView(): Promise { + return this.commands.runCommand('workbench.view.explorer'); } - public getOpenEditorsViewTitle(): Promise { - return this.spectron.client.waitForText(Explorer.OPEN_EDITORS_VIEW); + getOpenEditorsViewTitle(): Promise { + return this.api.waitForText(Explorer.OPEN_EDITORS_VIEW); } - public async openFile(fileName: string): Promise { - await this.spectron.client.waitAndDoubleClick(`div[class="monaco-icon-label file-icon ${fileName}-name-file-icon ${this.getExtensionSelector(fileName)} explorer-item"]`); - await this.spectron.workbench.waitForEditorFocus(fileName); + async openFile(fileName: string): Promise { + await this.api.waitAndDoubleClick(`div[class="monaco-icon-label file-icon ${fileName}-name-file-icon ${this.getExtensionSelector(fileName)} explorer-item"]`); + await this.editors.waitForEditorFocus(fileName); } - public getExtensionSelector(fileName: string): string { + getExtensionSelector(fileName: string): string { const extension = fileName.split('.')[1]; if (extension === 'js') { return 'js-ext-file-icon ext-file-icon javascript-lang-file-icon'; diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index 33776a25405..74aafec003a 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -28,7 +28,7 @@ export function setup() { await app.reload(); await app.workbench.extensions.waitForExtensionsViewlet(); - await app.workbench.quickopen.runCommand('Smoke Test Check'); + await app.workbench.runCommand('Smoke Test Check'); const statusbarText = await app.workbench.statusbar.getStatusbarTextByTitle('smoke test'); await app.screenCapturer.capture('Statusbar'); diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index 55646637461..0a90538be34 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -3,30 +3,31 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; import { Viewlet } from '../workbench/viewlet'; +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; const SEARCH_BOX = 'div.extensions-viewlet[id="workbench.view.extensions"] input.search-box'; export class Extensions extends Viewlet { - constructor(spectron: SpectronApplication) { - super(spectron); + constructor(api: API, private commands: Commands) { + super(api); } async openExtensionsViewlet(): Promise { - await this.spectron.runCommand('workbench.view.extensions'); + await this.commands.runCommand('workbench.view.extensions'); await this.waitForExtensionsViewlet(); } async waitForExtensionsViewlet(): Promise { - await this.spectron.client.waitForActiveElement(SEARCH_BOX); + await this.api.waitForActiveElement(SEARCH_BOX); } async searchForExtension(name: string): Promise { - await this.spectron.client.waitAndClick(SEARCH_BOX); - await this.spectron.client.waitForActiveElement(SEARCH_BOX); - await this.spectron.client.setValue(SEARCH_BOX, name); + await this.api.waitAndClick(SEARCH_BOX); + await this.api.waitForActiveElement(SEARCH_BOX); + await this.api.setValue(SEARCH_BOX, name); } async installExtension(name: string): Promise { @@ -34,9 +35,9 @@ export class Extensions extends Viewlet { // we might want to wait for a while longer since the Marketplace can be slow // a minute should do - await this.spectron.client.waitFor(() => this.spectron.client.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`), void 0, 'waiting for install button', 600); + await this.api.waitFor(() => this.api.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`), void 0, 'waiting for install button', 600); - await this.spectron.client.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.reload`); + await this.api.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.reload`); return true; } } \ No newline at end of file diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index cc383b9b8c5..9e69360da0d 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -23,11 +23,11 @@ export function setup() { await app.workbench.quickopen.openFile('app.js'); await app.workbench.editor.waitForTypeInEditor('app.js', '.foo{}'); - await app.workbench.saveOpenedFile(); + await app.workbench.editors.saveOpenedFile(); await app.workbench.quickopen.openFile('index.jade'); await app.workbench.editor.waitForTypeInEditor('index.jade', 'hello world'); - await app.workbench.saveOpenedFile(); + await app.workbench.editors.saveOpenedFile(); await app.workbench.scm.refreshSCMViewlet(); await app.workbench.scm.waitForChange('app.js', 'Modified'); @@ -69,7 +69,7 @@ export function setup() { await app.workbench.scm.commit('first commit'); await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 1↑'); - await app.workbench.quickopen.runCommand('Git: Stage All Changes'); + await app.workbench.runCommand('Git: Stage All Changes'); await app.workbench.scm.waitForChange('index.jade', 'Index Modified'); await app.workbench.scm.commit('second commit'); diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index c3eb3c1a71f..b988b1b2249 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -3,8 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; import { Viewlet } from '../workbench/viewlet'; +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; const VIEWLET = 'div[id="workbench.view.scm"]'; const SCM_INPUT = `${VIEWLET} .scm-editor textarea`; @@ -24,28 +25,28 @@ interface Change { export class SCM extends Viewlet { - constructor(spectron: SpectronApplication) { - super(spectron); + constructor(api: API, private commands: Commands) { + super(api); } async openSCMViewlet(): Promise { - await this.spectron.runCommand('workbench.view.scm'); - await this.spectron.client.waitForElement(SCM_INPUT); + await this.commands.runCommand('workbench.view.scm'); + await this.api.waitForElement(SCM_INPUT); } waitForChange(name: string, type?: string): Promise { - return this.spectron.client.waitFor(async () => { + return this.api.waitFor(async () => { const changes = await this.queryChanges(name, type); return changes.length; }, l => l > 0, 'Getting SCM changes') as Promise as Promise; } async refreshSCMViewlet(): Promise { - await this.spectron.client.waitAndClick(REFRESH_COMMAND); + await this.api.waitAndClick(REFRESH_COMMAND); } private async queryChanges(name: string, type?: string): Promise { - const result = await this.spectron.webclient.selectorExecute(SCM_RESOURCE, (div, name, type) => { + const result = await this.api.selectorExecute(SCM_RESOURCE, (div, name, type) => { return (Array.isArray(div) ? div : [div]) .map(element => { const name = element.querySelector('.label-name') as HTMLElement; @@ -59,7 +60,7 @@ export class SCM extends Viewlet { } return { - name: name.textContent, + name: name.textContent || '', type, actions }; @@ -81,25 +82,25 @@ export class SCM extends Viewlet { } async openChange(name: string): Promise { - await this.spectron.client.waitAndClick(SCM_RESOURCE_CLICK(name)); + await this.api.waitAndClick(SCM_RESOURCE_CLICK(name)); } async stage(name: string): Promise { - await this.spectron.client.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Stage Changes')); + await this.api.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Stage Changes')); } async stageAll(): Promise { - await this.spectron.client.waitAndClick(SCM_RESOURCE_GROUP_COMMAND_CLICK('Stage All Changes')); + await this.api.waitAndClick(SCM_RESOURCE_GROUP_COMMAND_CLICK('Stage All Changes')); } async unstage(name: string): Promise { - await this.spectron.client.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Unstage Changes')); + await this.api.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Unstage Changes')); } async commit(message: string): Promise { - await this.spectron.client.waitAndClick(SCM_INPUT); - await this.spectron.client.waitForActiveElement(SCM_INPUT); - await this.spectron.client.setValue(SCM_INPUT, message); - await this.spectron.client.waitAndClick(COMMIT_COMMAND); + await this.api.waitAndClick(SCM_INPUT); + await this.api.waitForActiveElement(SCM_INPUT); + await this.api.setValue(SCM_INPUT, message); + await this.api.waitAndClick(COMMIT_COMMAND); } } \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/keybindings.ts b/test/smoke/src/areas/preferences/keybindings.ts index 1de2eba3470..bec4324e71e 100644 --- a/test/smoke/src/areas/preferences/keybindings.ts +++ b/test/smoke/src/areas/preferences/keybindings.ts @@ -3,26 +3,27 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; const SEARCH_INPUT = '.settings-search-input input'; export class KeybindingsEditor { - constructor(private spectron: SpectronApplication) { } + constructor(private api: API, private commands: Commands) { } async updateKeybinding(command: string, keys: string[], ariaLabel: string): Promise { - await this.spectron.runCommand('workbench.action.openGlobalKeybindings'); - await this.spectron.client.waitForActiveElement(SEARCH_INPUT); - await this.spectron.client.setValue(SEARCH_INPUT, command); + await this.commands.runCommand('workbench.action.openGlobalKeybindings'); + await this.api.waitForActiveElement(SEARCH_INPUT); + await this.api.setValue(SEARCH_INPUT, command); - await this.spectron.client.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item'); - await this.spectron.client.waitForElement('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item.focused.selected'); + await this.api.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item'); + await this.api.waitForElement('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item.focused.selected'); - await this.spectron.client.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item .action-item .icon.add'); - await this.spectron.client.waitForElement('.defineKeybindingWidget .monaco-inputbox.synthetic-focus'); + await this.api.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item .action-item .icon.add'); + await this.api.waitForElement('.defineKeybindingWidget .monaco-inputbox.synthetic-focus'); - await this.spectron.client.keys([...keys, 'NULL', 'Enter', 'NULL']); - await this.spectron.client.waitForElement(`div[aria-label="Keybindings"] div[aria-label="Keybinding is ${ariaLabel}."]`); + await this.api.keys([...keys, 'NULL', 'Enter', 'NULL']); + await this.api.waitForElement(`div[aria-label="Keybindings"] div[aria-label="Keybinding is ${ariaLabel}."]`); } } \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index e1e7bf76b0e..c9d8a989cd9 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -22,7 +22,7 @@ export function setup() { await app.screenCapturer.capture('app.js has line numbers'); await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); - await app.workbench.selectTab('app.js'); + await app.workbench.editors.selectTab('app.js'); await app.client.waitForElements('.line-numbers', result => !result || result.length === 0); await app.screenCapturer.capture('line numbers hidden'); diff --git a/test/smoke/src/areas/preferences/settings.ts b/test/smoke/src/areas/preferences/settings.ts index 657d71357e9..b1b35ab991d 100644 --- a/test/smoke/src/areas/preferences/settings.ts +++ b/test/smoke/src/areas/preferences/settings.ts @@ -5,7 +5,10 @@ import * as fs from 'fs'; import * as path from 'path'; -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; +import { Editor } from '../editor/editor'; +import { Editors } from '../editor/editors'; export enum ActivityBarPosition { LEFT = 0, @@ -17,29 +20,26 @@ const EDITOR = '.editable-preferences-editor-container .monaco-editor textarea'; export class SettingsEditor { - constructor(private spectron: SpectronApplication) { } + constructor(private api: API, private userDataPath: string, private commands: Commands, private editors: Editors, private editor: Editor) { } async addUserSetting(setting: string, value: string): Promise { - await this.spectron.runCommand('workbench.action.openGlobalSettings'); - await this.spectron.client.waitAndClick(SEARCH_INPUT); - await this.spectron.client.waitForActiveElement(SEARCH_INPUT); + await this.commands.runCommand('workbench.action.openGlobalSettings'); + await this.api.waitAndClick(SEARCH_INPUT); + await this.api.waitForActiveElement(SEARCH_INPUT); - await this.spectron.client.keys(['ArrowDown', 'NULL']); - await this.spectron.client.waitForActiveElement(EDITOR); + await this.api.keys(['ArrowDown', 'NULL']); + await this.api.waitForActiveElement(EDITOR); - await this.spectron.client.keys(['ArrowRight', 'NULL']); - await this.spectron.screenCapturer.capture('user settings is open and focused'); + await this.api.keys(['ArrowRight', 'NULL']); - await this.spectron.workbench.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value}`, '.editable-preferences-editor-container'); - await this.spectron.workbench.saveOpenedFile(); - - await this.spectron.screenCapturer.capture('user settings has changed'); + await this.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value}`, '.editable-preferences-editor-container'); + await this.editors.saveOpenedFile(); } async clearUserSettings(): Promise { - const settingsPath = path.join(this.spectron.userDataPath, 'User', 'settings.json'); + const settingsPath = path.join(this.userDataPath, 'User', 'settings.json'); await new Promise((c, e) => fs.writeFile(settingsPath, '{}', 'utf8', err => err ? e(err) : c())); - await this.spectron.workbench.editor.waitForEditorContents('settings.json', c => c.length === 0, '.editable-preferences-editor-container'); + await this.editor.waitForEditorContents('settings.json', c => c.length === 0, '.editable-preferences-editor-container'); } } \ No newline at end of file diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index d40d103c269..00e2230eed8 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; export enum ProblemSeverity { WARNING = 0, @@ -14,30 +15,30 @@ export class Problems { static PROBLEMS_VIEW_SELECTOR = '.panel.markers-panel'; - constructor(private spectron: SpectronApplication) { + constructor(private api: API, private commands: Commands) { // noop } public async showProblemsView(): Promise { if (!await this.isVisible()) { - await this.spectron.runCommand('workbench.actions.view.problems'); + await this.commands.runCommand('workbench.actions.view.problems'); await this.waitForProblemsView(); } } public async hideProblemsView(): Promise { if (await this.isVisible()) { - await this.spectron.runCommand('workbench.actions.view.problems'); - await this.spectron.client.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR, el => !el); + await this.commands.runCommand('workbench.actions.view.problems'); + await this.api.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR, el => !el); } } isVisible(): Promise { - return this.spectron.client.doesElementExist(Problems.PROBLEMS_VIEW_SELECTOR); + return this.api.doesElementExist(Problems.PROBLEMS_VIEW_SELECTOR); } public async waitForProblemsView(): Promise { - await this.spectron.client.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR); + await this.api.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR); } public static getSelectorInProblemsView(problemType: ProblemSeverity): string { @@ -46,7 +47,7 @@ export class Problems { } public static getSelectorInEditor(problemType: ProblemSeverity): string { - let selector = problemType === ProblemSeverity.WARNING ? 'squiggly-c-warning' : 'squiggly-d-error'; + let selector = problemType === ProblemSeverity.WARNING ? 'squiggly-warning' : 'squiggly-error'; return `.view-overlays .cdr.${selector}`; } } diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index 9d76495c81f..754627ff21f 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -3,7 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; +import { Editors } from '../editor/editors'; +import { Commands } from '../workbench/workbench'; export class QuickOpen { @@ -12,20 +14,21 @@ export class QuickOpen { static QUICK_OPEN_INPUT = `${QuickOpen.QUICK_OPEN} .quick-open-input input`; static QUICK_OPEN_FOCUSED_ELEMENT = `${QuickOpen.QUICK_OPEN} .quick-open-tree .monaco-tree-row.focused .monaco-highlighted-label`; static QUICK_OPEN_ENTRY_SELECTOR = 'div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties .monaco-tree-row .quick-open-entry'; + static QUICK_OPEN_ENTRY_LABEL_SELECTOR = 'div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties .monaco-tree-row .quick-open-entry .label-name'; - constructor(readonly spectron: SpectronApplication) { } + constructor(private api: API, private commands: Commands, private editors: Editors) { } async openQuickOpen(value: string): Promise { - await this.spectron.runCommand('workbench.action.quickOpen'); + await this.commands.runCommand('workbench.action.quickOpen'); await this.waitForQuickOpenOpened(); if (value) { - await this.spectron.client.setValue(QuickOpen.QUICK_OPEN_INPUT, value); + await this.api.setValue(QuickOpen.QUICK_OPEN_INPUT, value); } } async closeQuickOpen(): Promise { - await this.spectron.runCommand('workbench.action.closeQuickOpen'); + await this.commands.runCommand('workbench.action.closeQuickOpen'); await this.waitForQuickOpenClosed(); } @@ -33,56 +36,62 @@ export class QuickOpen { await this.openQuickOpen(fileName); await this.waitForQuickOpenElements(names => names.some(n => n === fileName)); - await this.spectron.client.keys(['Enter', 'NULL']); - await this.spectron.workbench.waitForActiveTab(fileName); - await this.spectron.workbench.waitForEditorFocus(fileName); - } - - async runCommand(commandText: string): Promise { - await this.openQuickOpen(`> ${commandText}`); - - // wait for best choice to be focused - await this.spectron.client.waitForTextContent(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT, commandText); - - // wait and click on best choice - await this.spectron.client.waitAndClick(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT); + await this.api.keys(['Enter', 'NULL']); + await this.editors.waitForActiveTab(fileName); + await this.editors.waitForEditorFocus(fileName); } async waitForQuickOpenOpened(): Promise { - await this.spectron.client.waitForActiveElement(QuickOpen.QUICK_OPEN_INPUT); + await this.api.waitForActiveElement(QuickOpen.QUICK_OPEN_INPUT); } private async waitForQuickOpenClosed(): Promise { - await this.spectron.client.waitForElement(QuickOpen.QUICK_OPEN_HIDDEN); + await this.api.waitForElement(QuickOpen.QUICK_OPEN_HIDDEN); } async submit(text: string): Promise { - await this.spectron.client.setValue(QuickOpen.QUICK_OPEN_INPUT, text); - await this.spectron.client.keys(['Enter', 'NULL']); + await this.api.setValue(QuickOpen.QUICK_OPEN_INPUT, text); + await this.api.keys(['Enter', 'NULL']); await this.waitForQuickOpenClosed(); } async selectQuickOpenElement(index: number): Promise { await this.waitForQuickOpenOpened(); for (let from = 0; from < index; from++) { - await this.spectron.client.keys(['ArrowDown', 'NULL']); + await this.api.keys(['ArrowDown', 'NULL']); } - await this.spectron.client.keys(['Enter', 'NULL']); + await this.api.keys(['Enter', 'NULL']); await this.waitForQuickOpenClosed(); } async waitForQuickOpenElements(accept: (names: string[]) => boolean): Promise { - await this.spectron.client.waitFor(() => this.getQuickOpenElements(), accept); + await this.api.waitForElements(QuickOpen.QUICK_OPEN_ENTRY_LABEL_SELECTOR, els => accept(els.map(e => e.textContent))); } - private async getQuickOpenElements(): Promise { - const result = await this.spectron.webclient.selectorExecute(QuickOpen.QUICK_OPEN_ENTRY_SELECTOR, - div => (Array.isArray(div) ? div : [div]).map(element => { - const name = element.querySelector('.label-name') as HTMLElement; - return name.textContent; - }) - ); + async runCommand(command: string): Promise { + await this.openQuickOpen(`> ${command}`); - return Array.isArray(result) ? result : []; + // wait for best choice to be focused + await this.api.waitForTextContent(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT, command); + + // wait and click on best choice + await this.api.waitAndClick(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT); + } + + async openQuickOutline(): Promise { + let retries = 0; + + while (++retries < 10) { + await this.commands.runCommand('workbench.action.gotoSymbol'); + + const text = await this.api.waitForText('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); + + if (text !== 'No symbol information for the file') { + return; + } + + await this.closeQuickOpen(); + await new Promise(c => setTimeout(c, 250)); + } } } diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index e28182761d7..9698e3f8534 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -3,8 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; import { Viewlet } from '../workbench/viewlet'; +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; const VIEWLET = 'div[id="workbench.view.search"] .search-view'; const INPUT = `${VIEWLET} .search-widget .search-container .monaco-inputbox input`; @@ -12,75 +13,75 @@ const INCLUDE_INPUT = `${VIEWLET} .query-details .monaco-inputbox input[aria-lab export class Search extends Viewlet { - constructor(spectron: SpectronApplication) { - super(spectron); + constructor(api: API, private commands: Commands) { + super(api); } async openSearchViewlet(): Promise { - await this.spectron.runCommand('workbench.view.search'); - await this.spectron.client.waitForActiveElement(INPUT); + await this.commands.runCommand('workbench.view.search'); + await this.api.waitForActiveElement(INPUT); } async searchFor(text: string): Promise { - await this.spectron.client.waitAndClick(INPUT); - await this.spectron.client.waitForActiveElement(INPUT); - await this.spectron.client.setValue(INPUT, text); + await this.api.waitAndClick(INPUT); + await this.api.waitForActiveElement(INPUT); + await this.api.setValue(INPUT, text); await this.submitSearch(); } async submitSearch(): Promise { - await this.spectron.client.waitAndClick(INPUT); - await this.spectron.client.waitForActiveElement(INPUT); + await this.api.waitAndClick(INPUT); + await this.api.waitForActiveElement(INPUT); - await this.spectron.client.keys(['Enter', 'NULL']); - await this.spectron.client.waitForElement(`${VIEWLET} .messages[aria-hidden="false"]`); + await this.api.keys(['Enter', 'NULL']); + await this.api.waitForElement(`${VIEWLET} .messages[aria-hidden="false"]`); } async setFilesToIncludeText(text: string): Promise { - await this.spectron.client.waitAndClick(INCLUDE_INPUT); - await this.spectron.client.waitForActiveElement(INCLUDE_INPUT); - await this.spectron.client.setValue(INCLUDE_INPUT, text || ''); + await this.api.waitAndClick(INCLUDE_INPUT); + await this.api.waitForActiveElement(INCLUDE_INPUT); + await this.api.setValue(INCLUDE_INPUT, text || ''); } async showQueryDetails(): Promise { if (!await this.areDetailsVisible()) { - await this.spectron.client.waitAndClick(`${VIEWLET} .query-details .more`); + await this.api.waitAndClick(`${VIEWLET} .query-details .more`); } } async hideQueryDetails(): Promise { if (await this.areDetailsVisible()) { - await this.spectron.client.waitAndClick(`${VIEWLET} .query-details.more .more`); + await this.api.waitAndClick(`${VIEWLET} .query-details.more .more`); } } areDetailsVisible(): Promise { - return this.spectron.client.doesElementExist(`${VIEWLET} .query-details.more`); + return this.api.doesElementExist(`${VIEWLET} .query-details.more`); } async removeFileMatch(index: number): Promise { - await this.spectron.client.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); - const file = await this.spectron.client.waitForText(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`); - await this.spectron.client.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-remove`); - await this.spectron.client.waitForText(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`, void 0, result => result !== file); + await this.api.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); + const file = await this.api.waitForText(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`); + await this.api.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-remove`); + await this.api.waitForText(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`, void 0, result => result !== file); } async expandReplace(): Promise { - await this.spectron.client.waitAndClick(`${VIEWLET} .search-widget .monaco-button.toggle-replace-button.collapse`); + await this.api.waitAndClick(`${VIEWLET} .search-widget .monaco-button.toggle-replace-button.collapse`); } async setReplaceText(text: string): Promise { - await this.spectron.client.waitAndClick(`${VIEWLET} .search-widget .replace-container .monaco-inputbox input[title="Replace"]`); - await this.spectron.client.waitForElement(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`); - await this.spectron.client.setValue(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`, text); + await this.api.waitAndClick(`${VIEWLET} .search-widget .replace-container .monaco-inputbox input[title="Replace"]`); + await this.api.waitForElement(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`); + await this.api.setValue(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`, text); } async replaceFileMatch(index: number): Promise { - await this.spectron.client.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); - await this.spectron.client.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-replace-all`); + await this.api.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); + await this.api.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-replace-all`); } async waitForResultText(text: string): Promise { - await this.spectron.client.waitForText(`${VIEWLET} .messages[aria-hidden="false"] .message>p`, text); + await this.api.waitForText(`${VIEWLET} .messages[aria-hidden="false"] .message>p`, text); } } diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index b33121994d6..9c1b91f611d 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; export enum StatusBarElement { BRANCH_STATUS = 0, @@ -23,23 +23,23 @@ export class StatusBar { private readonly leftSelector = '.statusbar-item.left'; private readonly rightSelector = '.statusbar-item.right'; - constructor(private spectron: SpectronApplication) { + constructor(private api: API) { } - public async waitForStatusbarElement(element: StatusBarElement): Promise { - await this.spectron.client.waitForElement(this.getSelector(element)); + async waitForStatusbarElement(element: StatusBarElement): Promise { + await this.api.waitForElement(this.getSelector(element)); } - public async clickOn(element: StatusBarElement): Promise { - await this.spectron.client.waitAndClick(this.getSelector(element)); + async clickOn(element: StatusBarElement): Promise { + await this.api.waitAndClick(this.getSelector(element)); } - public async waitForEOL(eol: string): Promise { - return this.spectron.client.waitForText(this.getSelector(StatusBarElement.EOL_STATUS), eol); + async waitForEOL(eol: string): Promise { + return this.api.waitForText(this.getSelector(StatusBarElement.EOL_STATUS), eol); } - public async getStatusbarTextByTitle(title: string): Promise { - return await this.spectron.client.waitForText(`${this.mainSelector} span[title="smoke test"]`); + async getStatusbarTextByTitle(title: string): Promise { + return await this.api.waitForText(`${this.mainSelector} span[title="smoke test"]`); } private getSelector(element: StatusBarElement): string { diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts index 79c2a82bf59..2149bedc208 100644 --- a/test/smoke/src/areas/terminal/terminal.ts +++ b/test/smoke/src/areas/terminal/terminal.ts @@ -3,35 +3,36 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; +import { Commands } from '../workbench/workbench'; const PANEL_SELECTOR = 'div[id="workbench.panel.terminal"]'; const XTERM_SELECTOR = `${PANEL_SELECTOR} .terminal-wrapper`; export class Terminal { - constructor(private spectron: SpectronApplication) { } + constructor(private api: API, private commands: Commands) { } async showTerminal(): Promise { if (!await this.isVisible()) { - await this.spectron.workbench.quickopen.runCommand('View: Toggle Integrated Terminal'); - await this.spectron.client.waitForElement(XTERM_SELECTOR); + await this.commands.runCommand('View: Toggle Integrated Terminal'); + await this.api.waitForElement(XTERM_SELECTOR); await this.waitForTerminalText(text => text.length > 0, 'Waiting for Terminal to be ready'); } } isVisible(): Promise { - return this.spectron.client.doesElementExist(PANEL_SELECTOR); + return this.api.doesElementExist(PANEL_SELECTOR); } async runCommand(commandText: string): Promise { // TODO@Tyriar fix this. we should not use type but setValue // await this.spectron.client.type(commandText); - await this.spectron.client.keys(['Enter', 'NULL']); + await this.api.keys(['Enter', 'NULL']); } async waitForTerminalText(fn: (text: string[]) => boolean, timeOutDescription: string = 'Getting Terminal Text'): Promise { - return this.spectron.client.waitFor(async () => { + return this.api.waitFor(async () => { const terminalText = await this.getTerminalText(); if (fn(terminalText)) { return terminalText; @@ -45,7 +46,7 @@ export class Terminal { } private async getTerminalText(): Promise { - return await this.spectron.webclient.selectorExecute(XTERM_SELECTOR, + return await this.api.selectorExecute(XTERM_SELECTOR, div => { const xterm = ((Array.isArray(div) ? div[0] : div)).xterm; const buffer = xterm.buffer; diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index 8e6cb42d4ab..b06dd647ad8 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -13,7 +13,7 @@ export function setup() { it(`verifies that 'hot exit' works for dirty files`, async function () { const app = this.app as SpectronApplication; - await app.workbench.newUntitledFile(); + await app.workbench.editors.newUntitledFile(); const untitled = 'Untitled-1'; const textToTypeInUntitled = 'Hello, Unitled Code'; @@ -29,12 +29,12 @@ export function setup() { await app.reload(); await app.screenCapturer.capture('After reload'); - await app.workbench.waitForActiveTab(readmeMd, true); + await app.workbench.editors.waitForActiveTab(readmeMd, true); await app.screenCapturer.capture(`${readmeMd} after reload`); await app.workbench.editor.waitForEditorContents(readmeMd, c => c.indexOf(textToType) > -1); - await app.workbench.waitForTab(untitled, true); - await app.workbench.selectTab(untitled, true); + await app.workbench.editors.waitForTab(untitled, true); + await app.workbench.editors.selectTab(untitled, true); await app.screenCapturer.capture('Untitled file after reload'); await app.workbench.editor.waitForEditorContents(untitled, c => c.indexOf(textToTypeInUntitled) > -1); }); diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 7a2877ab4ad..1d30c1bb7a4 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -32,7 +32,7 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { const textToType = 'Very dirty file'; - await stableApp.workbench.newUntitledFile(); + await stableApp.workbench.editors.newUntitledFile(); await stableApp.workbench.editor.waitForTypeInEditor('Untitled-1', textToType); await stableApp.stop(); @@ -48,7 +48,7 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { await app.start(false); app.suiteName = 'Data Migration'; - assert.ok(await app.workbench.waitForActiveTab('Untitled-1', true), `Untitled-1 tab is not present after migration.`); + assert.ok(await app.workbench.editors.waitForActiveTab('Untitled-1', true), `Untitled-1 tab is not present after migration.`); await app.workbench.editor.waitForEditorContents('Untitled-1', c => c.indexOf(textToType) > -1); await app.screenCapturer.capture('Untitled file text'); @@ -87,7 +87,7 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { await app.start(false); app.suiteName = 'Data Migration'; - assert.ok(await app.workbench.waitForActiveTab(fileName), `dirty file tab is not present after migration.`); + assert.ok(await app.workbench.editors.waitForActiveTab(fileName), `dirty file tab is not present after migration.`); await app.workbench.editor.waitForEditorContents(fileName, c => c.indexOf(textPart) > -1); await app.stop(); @@ -107,9 +107,9 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { const fileName1 = 'app.js', fileName2 = 'jsconfig.json', fileName3 = 'readme.md'; await stableApp.workbench.quickopen.openFile(fileName1); - await stableApp.workbench.quickopen.runCommand('View: Keep Editor'); + await stableApp.workbench.runCommand('View: Keep Editor'); await stableApp.workbench.quickopen.openFile(fileName2); - await stableApp.workbench.quickopen.runCommand('View: Keep Editor'); + await stableApp.workbench.runCommand('View: Keep Editor'); await stableApp.workbench.quickopen.openFile(fileName3); await stableApp.stop(); @@ -122,9 +122,9 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { await app.start(false); app.suiteName = 'Data Migration'; - assert.ok(await app.workbench.waitForTab(fileName1), `${fileName1} tab was not restored after migration.`); - assert.ok(await app.workbench.waitForTab(fileName2), `${fileName2} tab was not restored after migration.`); - assert.ok(await app.workbench.waitForTab(fileName3), `${fileName3} tab was not restored after migration.`); + assert.ok(await app.workbench.editors.waitForTab(fileName1), `${fileName1} tab was not restored after migration.`); + assert.ok(await app.workbench.editors.waitForTab(fileName2), `${fileName2} tab was not restored after migration.`); + assert.ok(await app.workbench.editors.waitForTab(fileName3), `${fileName3} tab was not restored after migration.`); await app.stop(); }); diff --git a/test/smoke/src/areas/workbench/viewlet.ts b/test/smoke/src/areas/workbench/viewlet.ts index 7eb114edaaf..53aba762e51 100644 --- a/test/smoke/src/areas/workbench/viewlet.ts +++ b/test/smoke/src/areas/workbench/viewlet.ts @@ -3,16 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { API } from '../../spectron/client'; export abstract class Viewlet { - constructor(protected spectron: SpectronApplication) { + constructor(protected api: API) { // noop } - public async getTitle(): Promise { - return this.spectron.client.waitForText('.monaco-workbench-container .part.sidebar > .title > .title-label > span'); + async getTitle(): Promise { + return this.api.waitForText('.monaco-workbench-container .part.sidebar > .title > .title-label > span'); } - } \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index 28200a8fabf..c8779240bc6 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -17,12 +17,18 @@ import { SettingsEditor } from '../preferences/settings'; import { KeybindingsEditor } from '../preferences/keybindings'; import { Terminal } from '../terminal/terminal'; import { API } from '../../spectron/client'; +import { Editors } from '../editor/editors'; -export class Workbench { +export interface Commands { + runCommand(command: string): Promise; +} +export class Workbench implements Commands { + + readonly quickopen: QuickOpen; + readonly editors: Editors; readonly explorer: Explorer; readonly activitybar: ActivityBar; - readonly quickopen: QuickOpen; readonly search: Search; readonly extensions: Extensions; readonly editor: Editor; @@ -33,60 +39,33 @@ export class Workbench { readonly settingsEditor: SettingsEditor; readonly keybindingsEditor: KeybindingsEditor; readonly terminal: Terminal; - private keybindings: any[]; - constructor(private api: API) { - this.explorer = new Explorer(api); + constructor(private api: API, private keybindings: any[], userDataPath: string) { + this.editors = new Editors(api, this); + this.quickopen = new QuickOpen(api, this, this.editors); + this.explorer = new Explorer(api, this.quickopen, this.editors); this.activitybar = new ActivityBar(api); - this.quickopen = new QuickOpen(api); - this.search = new Search(api); - this.extensions = new Extensions(api); - this.editor = new Editor(api); - this.scm = new SCM(api); - this.debug = new Debug(api); + this.search = new Search(api, this); + this.extensions = new Extensions(api, this); + this.editor = new Editor(api, this); + this.scm = new SCM(api, this); + this.debug = new Debug(api, this, this.editors, this.editor); this.statusbar = new StatusBar(api); - this.problems = new Problems(api); - this.settingsEditor = new SettingsEditor(api); - this.keybindingsEditor = new KeybindingsEditor(api); - this.terminal = new Terminal(api); - } - - public async saveOpenedFile(): Promise { - await this.api.waitForElement('.tabs-container div.tab.active.dirty'); - await this.quickopen.runCommand('File: Save'); - } - - public async selectTab(tabName: string, untitled: boolean = false): Promise { - await this.api.waitAndClick(`.tabs-container div.tab[aria-label="${tabName}, tab"]`); - await this.waitForEditorFocus(tabName, untitled); - } - - public async waitForEditorFocus(fileName: string, untitled: boolean = false): Promise { - await this.waitForActiveTab(fileName); - await this.editor.waitForActiveEditor(fileName); - } - - public async waitForActiveTab(fileName: string, isDirty: boolean = false): Promise { - await this.api.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); - } - - public async waitForTab(fileName: string, isDirty: boolean = false): Promise { - await this.api.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); - } - - public async newUntitledFile(): Promise { - await this.runCommand('workbench.action.files.newUntitledFile'); - await this.waitForEditorFocus('Untitled-1', true); + this.problems = new Problems(api, this); + this.settingsEditor = new SettingsEditor(api, userDataPath, this, this.editors, this.editor); + this.keybindingsEditor = new KeybindingsEditor(api, this); + this.terminal = new Terminal(api, this); } /** * Retrieves the command from keybindings file and executes it with WebdriverIO client API * @param command command (e.g. 'workbench.action.files.newUntitledFile') */ - runCommand(command: string): Promise { + async runCommand(command: string): Promise { const binding = this.keybindings.find(x => x['command'] === command); if (!binding) { - return this.quickopen.runCommand(command); + await this.quickopen.runCommand(command); + return; } const keys: string = binding.key; @@ -117,3 +96,4 @@ export class Workbench { } } } + diff --git a/test/smoke/src/spectron/application.ts b/test/smoke/src/spectron/application.ts index cfca044f82b..d544b2ead8b 100644 --- a/test/smoke/src/spectron/application.ts +++ b/test/smoke/src/spectron/application.ts @@ -55,6 +55,7 @@ export class SpectronApplication { private _workbench: Workbench; private _screenCapturer: ScreenCapturer; private spectron: Application | undefined; + private keybindings: any[]; private stopLogCollection: (() => Promise) | undefined; constructor( @@ -130,7 +131,7 @@ export class SpectronApplication { } async reload(): Promise { - await this.workbench.quickopen.runCommand('Reload Window'); + await this.workbench.runCommand('Reload Window'); // TODO @sandy: Find a proper condition to wait for reload await new Promise(c => setTimeout(c, 1500)); await this.checkWindowReady(); @@ -270,7 +271,7 @@ export class SpectronApplication { this._screenCapturer = new ScreenCapturer(this.spectron, this._suiteName, screenshotsDirPath); this._api = new API(this.spectron.client, this.screenCapturer, this.options.waitTime); - this._workbench = new Workbench(this._api); + this._workbench = new Workbench(this._api, this.keybindings, this.userDataPath); } private async checkWindowReady(): Promise { diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 29ece9a31ee..ce427a5a42a 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -7,6 +7,12 @@ import { SpectronClient } from 'spectron'; import { RawResult, Element } from 'webdriverio'; import { ScreenCapturer } from '../helpers/screenshot'; +export interface APIElement { + tagName: string; + className: string; + textContent: string; +} + export class API { // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding @@ -58,8 +64,33 @@ export class API { return this.spectronClient.element(selector).then(result => !!result.value); } - async waitForElements(selector: string, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { - return this.waitFor(() => this.spectronClient.elements(selector), result => accept(result.value), `elements with selector ${selector}`) as Promise; + async getElementCount(selector: string): Promise { + const result = await this.spectronClient.elements(selector); + return result.value.length; + } + + async waitForElements(selector: string, accept: (result: APIElement[]) => boolean = result => result.length > 0): Promise { + const _fn: any = () => { + return this.spectronClient.execute(selector => { + const query = document.querySelectorAll(selector); + const result: APIElement[] = []; + + for (let i = 0; i < query.length; i++) { + const element: HTMLElement = query.item(i); + + result.push({ + tagName: element.tagName, + className: element.className, + textContent: element.textContent || '' + }); + } + + return result; + }, selector) + .then(result => result.value); + }; + + return this.waitFor(_fn, accept, `elements with selector ${selector}`) as Promise; } async waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { @@ -78,6 +109,14 @@ export class API { return this.spectronClient.getTitle(); } + selectorExecute

( + selectors: string | string[], + script: (elements: HTMLElement | HTMLElement[], ...args: any[]) => P, + ...args: any[] + ): Promise

{ + return this.spectronClient.selectorExecute(selectors, script, ...args); + } + private running = false; async waitFor(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; async waitFor(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { From 6651dd5e16cd8b5fe30109c8bd7915322b004d63 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 17:27:59 +0200 Subject: [PATCH 036/710] clean API --- test/smoke/src/areas/editor/peek.ts | 4 ++-- test/smoke/src/areas/explorer/explorer.ts | 2 +- test/smoke/src/areas/git/git.test.ts | 4 ++-- test/smoke/src/areas/quickopen/quickopen.ts | 2 +- test/smoke/src/areas/search/search.ts | 6 +++--- test/smoke/src/areas/statusbar/statusbar.ts | 4 ++-- test/smoke/src/areas/workbench/viewlet.ts | 2 +- test/smoke/src/spectron/client.ts | 5 ----- 8 files changed, 12 insertions(+), 17 deletions(-) diff --git a/test/smoke/src/areas/editor/peek.ts b/test/smoke/src/areas/editor/peek.ts index 7a9f9af316b..e95b7ccd2b5 100644 --- a/test/smoke/src/areas/editor/peek.ts +++ b/test/smoke/src/areas/editor/peek.ts @@ -19,7 +19,7 @@ export class References { } async waitForReferencesCountInTitle(count: number): Promise { - await this.api.waitForText(References.REFERENCES_TITLE_COUNT, void 0, titleCount => { + await this.api.waitForTextContent(References.REFERENCES_TITLE_COUNT, void 0, titleCount => { const matches = titleCount.match(/\d+/); return matches ? parseInt(matches[0]) === count : false; }); @@ -30,7 +30,7 @@ export class References { } async waitForFile(file: string): Promise { - await this.api.waitForText(References.REFERENCES_TITLE_FILE_NAME, file); + await this.api.waitForTextContent(References.REFERENCES_TITLE_FILE_NAME, file); } async close(): Promise { diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index e4408149686..d8da8ee2411 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -22,7 +22,7 @@ export class Explorer extends Viewlet { } getOpenEditorsViewTitle(): Promise { - return this.api.waitForText(Explorer.OPEN_EDITORS_VIEW); + return this.api.waitForTextContent(Explorer.OPEN_EDITORS_VIEW); } async openFile(fileName: string): Promise { diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 9e69360da0d..15eac7b3aa2 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -67,13 +67,13 @@ export function setup() { await app.workbench.scm.waitForChange('app.js', 'Index Modified'); await app.workbench.scm.commit('first commit'); - await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 1↑'); + await app.client.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 1↑'); await app.workbench.runCommand('Git: Stage All Changes'); await app.workbench.scm.waitForChange('index.jade', 'Index Modified'); await app.workbench.scm.commit('second commit'); - await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 2↑'); + await app.client.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 2↑'); cp.execSync('git reset --hard origin/master', { cwd: app.workspacePath }); }); diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index 754627ff21f..00c1096c63d 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -84,7 +84,7 @@ export class QuickOpen { while (++retries < 10) { await this.commands.runCommand('workbench.action.gotoSymbol'); - const text = await this.api.waitForText('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); + const text = await this.api.waitForTextContent('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); if (text !== 'No symbol information for the file') { return; diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index 9698e3f8534..aafb104883c 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -61,9 +61,9 @@ export class Search extends Viewlet { async removeFileMatch(index: number): Promise { await this.api.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); - const file = await this.api.waitForText(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`); + const file = await this.api.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`); await this.api.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-remove`); - await this.api.waitForText(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`, void 0, result => result !== file); + await this.api.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`, void 0, result => result !== file); } async expandReplace(): Promise { @@ -82,6 +82,6 @@ export class Search extends Viewlet { } async waitForResultText(text: string): Promise { - await this.api.waitForText(`${VIEWLET} .messages[aria-hidden="false"] .message>p`, text); + await this.api.waitForTextContent(`${VIEWLET} .messages[aria-hidden="false"] .message>p`, text); } } diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index 9c1b91f611d..897deae869a 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -35,11 +35,11 @@ export class StatusBar { } async waitForEOL(eol: string): Promise { - return this.api.waitForText(this.getSelector(StatusBarElement.EOL_STATUS), eol); + return this.api.waitForTextContent(this.getSelector(StatusBarElement.EOL_STATUS), eol); } async getStatusbarTextByTitle(title: string): Promise { - return await this.api.waitForText(`${this.mainSelector} span[title="smoke test"]`); + return await this.api.waitForTextContent(`${this.mainSelector} span[title="smoke test"]`); } private getSelector(element: StatusBarElement): string { diff --git a/test/smoke/src/areas/workbench/viewlet.ts b/test/smoke/src/areas/workbench/viewlet.ts index 53aba762e51..92139c3eafc 100644 --- a/test/smoke/src/areas/workbench/viewlet.ts +++ b/test/smoke/src/areas/workbench/viewlet.ts @@ -12,6 +12,6 @@ export abstract class Viewlet { } async getTitle(): Promise { - return this.api.waitForText('.monaco-workbench-container .part.sidebar > .title > .title-label > span'); + return this.api.waitForTextContent('.monaco-workbench-container .part.sidebar > .title > .title-label > span'); } } \ No newline at end of file diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index ce427a5a42a..8f0bad9e762 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -33,11 +33,6 @@ export class API { return Promise.resolve(); } - async waitForText(selector: string, text?: string, accept?: (result: string) => boolean): Promise { - accept = accept ? accept : result => text !== void 0 ? text === result : !!result; - return this.waitFor(() => this.spectronClient.getText(selector), accept, `getText with selector ${selector}`); - } - async waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { accept = accept ? accept : (result => textContent !== void 0 ? textContent === result : !!result); const fn = async () => await this.spectronClient.selectorExecute(selector, div => Array.isArray(div) ? div[0].textContent : div.textContent); From 86fe750a56986c7980d9691c2ffc8a52e42d49a2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 17:40:08 +0200 Subject: [PATCH 037/710] slim down driver API --- test/smoke/src/areas/search/search.ts | 4 +- test/smoke/src/spectron/client.ts | 93 ++++++++++++++++----------- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index aafb104883c..f0c4a47f507 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -60,7 +60,7 @@ export class Search extends Viewlet { } async removeFileMatch(index: number): Promise { - await this.api.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); + await this.api.waitAndMove(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); const file = await this.api.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`); await this.api.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-remove`); await this.api.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`, void 0, result => result !== file); @@ -77,7 +77,7 @@ export class Search extends Viewlet { } async replaceFileMatch(index: number): Promise { - await this.api.waitAndMoveToObject(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); + await this.api.waitAndMove(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); await this.api.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-replace-all`); } diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 8f0bad9e762..1d3d1c821c4 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { SpectronClient } from 'spectron'; -import { RawResult, Element } from 'webdriverio'; import { ScreenCapturer } from '../helpers/screenshot'; export interface APIElement { @@ -13,30 +12,66 @@ export interface APIElement { textContent: string; } -export class API { +export interface Driver { + keys(keys: string[]): Promise; + getElements(selector: string): Promise; +} - // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding - // the time it takes for the actual retry call to complete - private retryCount: number; - private readonly retryDuration = 100; // in milliseconds +export class SpectronDriver implements Driver { - constructor( - private spectronClient: SpectronClient, - private screenCapturer: ScreenCapturer, - waitTime: number - ) { - this.retryCount = (waitTime * 1000) / this.retryDuration; - } + constructor(private spectronClient: SpectronClient) { } keys(keys: string[]): Promise { this.spectronClient.keys(keys); return Promise.resolve(); } + async getElements(selector: string): Promise { + const result = await (this.spectronClient.execute(selector => { + const query = document.querySelectorAll(selector); + const result: APIElement[] = []; + + for (let i = 0; i < query.length; i++) { + const element: HTMLElement = query.item(i); + + result.push({ + tagName: element.tagName, + className: element.className, + textContent: element.textContent || '' + }); + } + + return result; + }, selector) as any as Promise<{ value: APIElement[]; }>); + + return result.value; + } +} + +export class API { + + // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding + // the time it takes for the actual retry call to complete + private retryCount: number; + private readonly retryDuration = 100; // in milliseconds + private driver: Driver; + + constructor( + private spectronClient: SpectronClient, + private screenCapturer: ScreenCapturer, + waitTime: number + ) { + this.driver = new SpectronDriver(spectronClient); + this.retryCount = (waitTime * 1000) / this.retryDuration; + } + + keys(keys: string[]): Promise { + return this.driver.keys(keys); + } + async waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { accept = accept ? accept : (result => textContent !== void 0 ? textContent === result : !!result); - const fn = async () => await this.spectronClient.selectorExecute(selector, div => Array.isArray(div) ? div[0].textContent : div.textContent); - return this.waitFor(fn, s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); + return this.waitFor(() => this.driver.getElements(selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); } async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { @@ -47,7 +82,7 @@ export class API { return this.waitFor(() => this.spectronClient.doubleClick(selector), void 0, `doubleClick with selector ${selector}`); } - async waitAndMoveToObject(selector: string): Promise { + async waitAndMove(selector: string): Promise { return this.waitFor(() => this.spectronClient.moveToObject(selector), void 0, `move to object with selector ${selector}`); } @@ -65,31 +100,11 @@ export class API { } async waitForElements(selector: string, accept: (result: APIElement[]) => boolean = result => result.length > 0): Promise { - const _fn: any = () => { - return this.spectronClient.execute(selector => { - const query = document.querySelectorAll(selector); - const result: APIElement[] = []; - - for (let i = 0; i < query.length; i++) { - const element: HTMLElement = query.item(i); - - result.push({ - tagName: element.tagName, - className: element.className, - textContent: element.textContent || '' - }); - } - - return result; - }, selector) - .then(result => result.value); - }; - - return this.waitFor(_fn, accept, `elements with selector ${selector}`) as Promise; + return this.waitFor(() => this.driver.getElements(selector), accept, `elements with selector ${selector}`) as Promise; } - async waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { - return this.waitFor>(() => this.spectronClient.element(selector), result => accept(result ? result.value : void 0), `element with selector ${selector}`) as Promise; + async waitForElement(selector: string, accept: (result: APIElement | undefined) => boolean = result => !!result): Promise { + return this.waitFor(() => this.driver.getElements(selector).then(els => els[0]), accept, `element with selector ${selector}`) as Promise; } async waitForActiveElement(selector: string): Promise { From 9da0f472dd9f6f92ba513c0ee914ce3aa41feeb2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 22:46:45 +0200 Subject: [PATCH 038/710] offline smoketests --- test/smoke/src/main.ts | 117 +++++++++++++++++++++++++---------------- 1 file changed, 72 insertions(+), 45 deletions(-) diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 8adeab24a78..a61c191753d 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -38,7 +38,9 @@ const opts = minimist(args, { 'build', 'stable-build', 'log', - 'wait-time' + 'wait-time', + 'test-repo', + 'keybindings' ] }); @@ -147,54 +149,79 @@ function toUri(path: string): string { return `${path}`; } +async function getKeybindings(): Promise { + if (opts.keybindings) { + console.log('*** Using keybindings: ', opts.keybindings); + const rawKeybindings = fs.readFileSync(opts.keybindings); + fs.writeFileSync(keybindingsPath, rawKeybindings); + } else { + const keybindingsUrl = `https://raw.githubusercontent.com/Microsoft/vscode-docs/master/build/keybindings/doc.keybindings.${getKeybindingPlatform()}.json`; + console.log('*** Fetching keybindings...'); + + await new Promise((c, e) => { + https.get(keybindingsUrl, res => { + const output = fs.createWriteStream(keybindingsPath); + res.on('error', e); + output.on('error', e); + output.on('close', c); + res.pipe(output); + }).on('error', e); + }); + } +} + +async function createWorkspaceFile(): Promise { + if (fs.existsSync(workspaceFilePath)) { + return; + } + + console.log('*** Creating workspace file...'); + const workspace = { + folders: [ + { + path: toUri(path.join(workspacePath, 'public')) + }, + { + path: toUri(path.join(workspacePath, 'routes')) + }, + { + path: toUri(path.join(workspacePath, 'views')) + } + ] + }; + + fs.writeFileSync(workspaceFilePath, JSON.stringify(workspace, null, '\t')); +} + +async function setupRepository(): Promise { + if (opts['test-repo']) { + console.log('*** Copying test project repository:', opts['test-repo']); + rimraf.sync(workspacePath); + // not platform friendly + cp.execSync(`cp -R "${opts['test-repo']}" "${workspacePath}"`); + } else { + if (!fs.existsSync(workspacePath)) { + console.log('*** Cloning test project repository...'); + cp.spawnSync('git', ['clone', testRepoUrl, workspacePath]); + } else { + console.log('*** Cleaning test project repository...'); + cp.spawnSync('git', ['fetch'], { cwd: workspacePath }); + cp.spawnSync('git', ['reset', '--hard', 'FETCH_HEAD'], { cwd: workspacePath }); + cp.spawnSync('git', ['clean', '-xdf'], { cwd: workspacePath }); + } + + console.log('*** Running npm install...'); + cp.execSync('npm install', { cwd: workspacePath, stdio: 'inherit' }); + } +} + async function setup(): Promise { console.log('*** Test data:', testDataPath); console.log('*** Preparing smoketest setup...'); - const keybindingsUrl = `https://raw.githubusercontent.com/Microsoft/vscode-docs/master/build/keybindings/doc.keybindings.${getKeybindingPlatform()}.json`; - console.log('*** Fetching keybindings...'); - - await new Promise((c, e) => { - https.get(keybindingsUrl, res => { - const output = fs.createWriteStream(keybindingsPath); - res.on('error', e); - output.on('error', e); - output.on('close', c); - res.pipe(output); - }).on('error', e); - }); - - if (!fs.existsSync(workspaceFilePath)) { - console.log('*** Creating workspace file...'); - const workspace = { - folders: [ - { - path: toUri(path.join(workspacePath, 'public')) - }, - { - path: toUri(path.join(workspacePath, 'routes')) - }, - { - path: toUri(path.join(workspacePath, 'views')) - } - ] - }; - - fs.writeFileSync(workspaceFilePath, JSON.stringify(workspace, null, '\t')); - } - - if (!fs.existsSync(workspacePath)) { - console.log('*** Cloning test project repository...'); - cp.spawnSync('git', ['clone', testRepoUrl, workspacePath]); - } else { - console.log('*** Cleaning test project repository...'); - cp.spawnSync('git', ['fetch'], { cwd: workspacePath }); - cp.spawnSync('git', ['reset', '--hard', 'FETCH_HEAD'], { cwd: workspacePath }); - cp.spawnSync('git', ['clean', '-xdf'], { cwd: workspacePath }); - } - - console.log('*** Running npm install...'); - cp.execSync('npm install', { cwd: workspacePath, stdio: 'inherit' }); + await getKeybindings(); + await createWorkspaceFile(); + await setupRepository(); console.log('*** Smoketest setup done!\n'); } From d25c6c4121b77bb8aeb5548bfb811d5d5523c3cb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 22:55:26 +0200 Subject: [PATCH 039/710] more api cleanup --- test/smoke/src/spectron/client.ts | 55 +++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 1d3d1c821c4..325757feb3f 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -14,6 +14,13 @@ export interface APIElement { export interface Driver { keys(keys: string[]): Promise; + click(selector: string, xoffset?: number, yoffset?: number): Promise; + doubleClick(selector: string): Promise; + move(selector: string): Promise; + setValue(selector: string, text: string): Promise; + getTitle(): Promise; + + isActiveElement(selector: string): Promise; getElements(selector: string): Promise; } @@ -26,6 +33,31 @@ export class SpectronDriver implements Driver { return Promise.resolve(); } + async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { + await this.spectronClient.leftClick(selector, xoffset, yoffset); + } + + async doubleClick(selector: string): Promise { + await this.spectronClient.doubleClick(selector); + } + + async move(selector: string): Promise { + await this.spectronClient.moveToObject(selector); + } + + async setValue(selector: string, text: string): Promise { + await this.spectronClient.setValue(selector, text); + } + + async getTitle(): Promise { + return await this.spectronClient.getTitle(); + } + + async isActiveElement(selector: string): Promise { + const result = await (this.spectronClient.execute(s => document.activeElement.matches(s), selector) as any as Promise<{ value: boolean; }>); + return result.value; + } + async getElements(selector: string): Promise { const result = await (this.spectronClient.execute(selector => { const query = document.querySelectorAll(selector); @@ -75,28 +107,29 @@ export class API { } async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { - return this.waitFor(() => this.spectronClient.leftClick(selector, xoffset, yoffset), void 0, `click with selector ${selector}`); + return this.waitFor(() => this.driver.click(selector, xoffset, yoffset), () => true, `click with selector ${selector}`); } async waitAndDoubleClick(selector: string, capture: boolean = true): Promise { - return this.waitFor(() => this.spectronClient.doubleClick(selector), void 0, `doubleClick with selector ${selector}`); + return this.waitFor(() => this.driver.doubleClick(selector), () => true, `doubleClick with selector ${selector}`); } async waitAndMove(selector: string): Promise { - return this.waitFor(() => this.spectronClient.moveToObject(selector), void 0, `move to object with selector ${selector}`); + return this.waitFor(() => this.driver.move(selector), () => true, `move to object with selector ${selector}`); } async setValue(selector: string, text: string, capture: boolean = true): Promise { - return this.spectronClient.setValue(selector, text); + return this.driver.setValue(selector, text); } async doesElementExist(selector: string): Promise { - return this.spectronClient.element(selector).then(result => !!result.value); + const elements = await this.driver.getElements(selector); + return elements.length > 0; } async getElementCount(selector: string): Promise { - const result = await this.spectronClient.elements(selector); - return result.value.length; + const elements = await this.driver.getElements(selector); + return elements.length; } async waitForElements(selector: string, accept: (result: APIElement[]) => boolean = result => result.length > 0): Promise { @@ -108,15 +141,11 @@ export class API { } async waitForActiveElement(selector: string): Promise { - return this.waitFor( - () => this.spectronClient.execute(s => document.activeElement.matches(s), selector), - r => r.value, - `wait for active element: ${selector}` - ); + return this.waitFor(() => this.driver.isActiveElement(selector), undefined, `wait for active element: ${selector}`); } async getTitle(): Promise { - return this.spectronClient.getTitle(); + return this.driver.getTitle(); } selectorExecute

( From 5be3af25dc237573fa062587ae005a0bc295367c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 23:29:46 +0200 Subject: [PATCH 040/710] verbose, cleanup --- test/smoke/src/main.ts | 11 ++- test/smoke/src/spectron/application.ts | 3 +- test/smoke/src/spectron/client.ts | 92 ++++++++++++++++++++------ 3 files changed, 82 insertions(+), 24 deletions(-) diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index a61c191753d..eccf18849fa 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -41,7 +41,13 @@ const opts = minimist(args, { 'wait-time', 'test-repo', 'keybindings' - ] + ], + boolean: [ + 'verbose' + ], + default: { + verbose: false + } }); const artifactsPath = opts.log || ''; @@ -261,7 +267,8 @@ function createApp(quality: Quality): SpectronApplication | null { extensionsPath, artifactsPath, workspaceFilePath, - waitTime: parseInt(opts['wait-time'] || '0') || 20 + waitTime: parseInt(opts['wait-time'] || '0') || 20, + verbose: opts.verbose }); } before(async function () { diff --git a/test/smoke/src/spectron/application.ts b/test/smoke/src/spectron/application.ts index d544b2ead8b..75bad411cf5 100644 --- a/test/smoke/src/spectron/application.ts +++ b/test/smoke/src/spectron/application.ts @@ -42,6 +42,7 @@ export interface SpectronApplicationOptions { artifactsPath: string; workspaceFilePath: string; waitTime: number; + verbose: boolean; } /** @@ -270,7 +271,7 @@ export class SpectronApplication { } this._screenCapturer = new ScreenCapturer(this.spectron, this._suiteName, screenshotsDirPath); - this._api = new API(this.spectron.client, this.screenCapturer, this.options.waitTime); + this._api = new API(this.spectron.client, this.screenCapturer, this.options.waitTime, this.options.verbose); this._workbench = new Workbench(this._api, this.keybindings, this.userDataPath); } diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 325757feb3f..3f30785a084 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -22,43 +22,83 @@ export interface Driver { isActiveElement(selector: string): Promise; getElements(selector: string): Promise; + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; } export class SpectronDriver implements Driver { - constructor(private spectronClient: SpectronClient) { } + constructor( + private spectronClient: SpectronClient, + private verbose: boolean + ) { } keys(keys: string[]): Promise { + if (this.verbose) { + console.log('- keys:', keys); + } + this.spectronClient.keys(keys); return Promise.resolve(); } async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { + if (this.verbose) { + console.log('- click:', selector, xoffset, yoffset); + } + await this.spectronClient.leftClick(selector, xoffset, yoffset); + + if (this.verbose) { + console.log('- click DONE'); + } } async doubleClick(selector: string): Promise { + if (this.verbose) { + console.log('- doubleClick:', selector); + } + await this.spectronClient.doubleClick(selector); } async move(selector: string): Promise { + if (this.verbose) { + console.log('- move:', selector); + } + await this.spectronClient.moveToObject(selector); } async setValue(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- setValue:', selector, text); + } + await this.spectronClient.setValue(selector, text); } async getTitle(): Promise { + if (this.verbose) { + console.log('- getTitle'); + } + return await this.spectronClient.getTitle(); } async isActiveElement(selector: string): Promise { + if (this.verbose) { + console.log('- isActiveElement:', selector); + } + const result = await (this.spectronClient.execute(s => document.activeElement.matches(s), selector) as any as Promise<{ value: boolean; }>); return result.value; } async getElements(selector: string): Promise { + if (this.verbose) { + console.log('- getElements:', selector); + } + const result = await (this.spectronClient.execute(selector => { const query = document.querySelectorAll(selector); const result: APIElement[] = []; @@ -78,6 +118,15 @@ export class SpectronDriver implements Driver { return result.value; } + + async selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ + if (this.verbose) { + console.log('- selectorExecute:', selector); + } + + let _script = (element, script, ...args) => script(Array.isArray(element) ? element : [element], ...args); + return this.spectronClient.selectorExecute(selector, _script, script, ...args); + } } export class API { @@ -89,11 +138,12 @@ export class API { private driver: Driver; constructor( - private spectronClient: SpectronClient, + spectronClient: SpectronClient, private screenCapturer: ScreenCapturer, - waitTime: number + waitTime: number, + verbose: boolean ) { - this.driver = new SpectronDriver(spectronClient); + this.driver = new SpectronDriver(spectronClient, verbose); this.retryCount = (waitTime * 1000) / this.retryDuration; } @@ -101,25 +151,29 @@ export class API { return this.driver.keys(keys); } - async waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { + waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { accept = accept ? accept : (result => textContent !== void 0 ? textContent === result : !!result); return this.waitFor(() => this.driver.getElements(selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); } async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { - return this.waitFor(() => this.driver.click(selector, xoffset, yoffset), () => true, `click with selector ${selector}`); + await this.waitForElement(selector); + return await this.driver.click(selector, xoffset, yoffset); } - async waitAndDoubleClick(selector: string, capture: boolean = true): Promise { - return this.waitFor(() => this.driver.doubleClick(selector), () => true, `doubleClick with selector ${selector}`); + async waitAndDoubleClick(selector: string): Promise { + await this.waitForElement(selector); + return await this.driver.doubleClick(selector); } async waitAndMove(selector: string): Promise { - return this.waitFor(() => this.driver.move(selector), () => true, `move to object with selector ${selector}`); + await this.waitForElement(selector); + return await this.driver.move(selector); } - async setValue(selector: string, text: string, capture: boolean = true): Promise { - return this.driver.setValue(selector, text); + async setValue(selector: string, text: string): Promise { + await this.waitForElement(selector); + return await this.driver.setValue(selector, text); } async doesElementExist(selector: string): Promise { @@ -132,28 +186,24 @@ export class API { return elements.length; } - async waitForElements(selector: string, accept: (result: APIElement[]) => boolean = result => result.length > 0): Promise { + waitForElements(selector: string, accept: (result: APIElement[]) => boolean = result => result.length > 0): Promise { return this.waitFor(() => this.driver.getElements(selector), accept, `elements with selector ${selector}`) as Promise; } - async waitForElement(selector: string, accept: (result: APIElement | undefined) => boolean = result => !!result): Promise { + waitForElement(selector: string, accept: (result: APIElement | undefined) => boolean = result => !!result): Promise { return this.waitFor(() => this.driver.getElements(selector).then(els => els[0]), accept, `element with selector ${selector}`) as Promise; } - async waitForActiveElement(selector: string): Promise { + waitForActiveElement(selector: string): Promise { return this.waitFor(() => this.driver.isActiveElement(selector), undefined, `wait for active element: ${selector}`); } - async getTitle(): Promise { + getTitle(): Promise { return this.driver.getTitle(); } - selectorExecute

( - selectors: string | string[], - script: (elements: HTMLElement | HTMLElement[], ...args: any[]) => P, - ...args: any[] - ): Promise

{ - return this.spectronClient.selectorExecute(selectors, script, ...args); + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ + return this.driver.selectorExecute(selector, script, ...args); } private running = false; From 3fe4ed9dbb6988dbc5ee818cd2fe15ed06bf2f59 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 23:35:44 +0200 Subject: [PATCH 041/710] extract driver --- test/smoke/src/{spectron => }/application.ts | 11 +- .../src/areas/activitybar/activityBar.ts | 2 +- test/smoke/src/areas/css/css.test.ts | 2 +- test/smoke/src/areas/debug/debug.test.ts | 2 +- test/smoke/src/areas/debug/debug.ts | 2 +- test/smoke/src/areas/editor/editor.test.ts | 2 +- test/smoke/src/areas/editor/editor.ts | 2 +- test/smoke/src/areas/editor/editors.ts | 2 +- test/smoke/src/areas/editor/peek.ts | 2 +- .../smoke/src/areas/explorer/explorer.test.ts | 2 +- test/smoke/src/areas/explorer/explorer.ts | 2 +- .../src/areas/extensions/extensions.test.ts | 2 +- test/smoke/src/areas/extensions/extensions.ts | 2 +- test/smoke/src/areas/git/git.test.ts | 2 +- test/smoke/src/areas/git/scm.ts | 2 +- .../src/areas/multiroot/multiroot.test.ts | 2 +- .../src/areas/preferences/keybindings.ts | 2 +- .../src/areas/preferences/preferences.test.ts | 2 +- test/smoke/src/areas/preferences/settings.ts | 2 +- test/smoke/src/areas/problems/problems.ts | 2 +- test/smoke/src/areas/quickopen/quickopen.ts | 2 +- test/smoke/src/areas/search/search.test.ts | 2 +- test/smoke/src/areas/search/search.ts | 2 +- .../src/areas/statusbar/statusbar.test.ts | 2 +- test/smoke/src/areas/statusbar/statusbar.ts | 2 +- .../smoke/src/areas/terminal/terminal.test.ts | 2 +- test/smoke/src/areas/terminal/terminal.ts | 2 +- .../src/areas/workbench/data-loss.test.ts | 2 +- .../areas/workbench/data-migration.test.ts | 2 +- .../src/areas/workbench/localization.test.ts | 2 +- test/smoke/src/areas/workbench/viewlet.ts | 2 +- test/smoke/src/areas/workbench/workbench.ts | 2 +- test/smoke/src/{spectron => }/client.ts | 138 +----------------- test/smoke/src/driver.ts | 129 ++++++++++++++++ test/smoke/src/main.ts | 2 +- 35 files changed, 174 insertions(+), 168 deletions(-) rename test/smoke/src/{spectron => }/application.ts (96%) rename test/smoke/src/{spectron => }/client.ts (51%) create mode 100644 test/smoke/src/driver.ts diff --git a/test/smoke/src/spectron/application.ts b/test/smoke/src/application.ts similarity index 96% rename from test/smoke/src/spectron/application.ts rename to test/smoke/src/application.ts index 75bad411cf5..e503b66cbae 100644 --- a/test/smoke/src/spectron/application.ts +++ b/test/smoke/src/application.ts @@ -6,13 +6,14 @@ import { Application, SpectronClient as WebClient } from 'spectron'; import { test as testPort } from 'portastic'; import { API } from './client'; -import { ScreenCapturer } from '../helpers/screenshot'; -import { Workbench } from '../areas/workbench/workbench'; +import { ScreenCapturer } from './helpers/screenshot'; +import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; import * as cp from 'child_process'; import * as path from 'path'; import * as mkdirp from 'mkdirp'; -import { sanitize } from '../helpers/utilities'; +import { sanitize } from './helpers/utilities'; +import { SpectronDriver } from './driver'; // Just hope random helps us here, cross your fingers! export async function findFreePort(): Promise { @@ -271,7 +272,9 @@ export class SpectronApplication { } this._screenCapturer = new ScreenCapturer(this.spectron, this._suiteName, screenshotsDirPath); - this._api = new API(this.spectron.client, this.screenCapturer, this.options.waitTime, this.options.verbose); + + const driver = new SpectronDriver(this.spectron.client, this.options.verbose); + this._api = new API(driver, this.screenCapturer, this.options.waitTime); this._workbench = new Workbench(this._api, this.keybindings, this.userDataPath); } diff --git a/test/smoke/src/areas/activitybar/activityBar.ts b/test/smoke/src/areas/activitybar/activityBar.ts index f5942503146..5334408fb52 100644 --- a/test/smoke/src/areas/activitybar/activityBar.ts +++ b/test/smoke/src/areas/activitybar/activityBar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; export enum ActivityBarPosition { LEFT = 0, diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index c0b2c768b9b..2cb9b18e4cf 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; import { ProblemSeverity, Problems } from '../problems/problems'; export function setup() { diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index 7e924b95b62..e29ed42267f 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -8,7 +8,7 @@ import * as http from 'http'; import * as path from 'path'; import * as fs from 'fs'; import * as stripJsonComments from 'strip-json-comments'; -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; export function setup() { describe('Debug', () => { diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 78c1c2136a0..3cda1dcb4e7 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -5,7 +5,7 @@ import { Viewlet } from '../workbench/viewlet'; import { Commands } from '../workbench/workbench'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Editors } from '../editor/editors'; import { Editor } from '../editor/editor'; diff --git a/test/smoke/src/areas/editor/editor.test.ts b/test/smoke/src/areas/editor/editor.test.ts index d3be47f5747..257905b1289 100644 --- a/test/smoke/src/areas/editor/editor.test.ts +++ b/test/smoke/src/areas/editor/editor.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; export function setup() { describe('Editor', () => { diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 34c70c65f04..d2f8dee110a 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -5,7 +5,7 @@ import { References } from './peek'; import { Commands } from '../workbench/workbench'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; const RENAME_BOX = '.monaco-editor .monaco-editor.rename-box'; const RENAME_INPUT = `${RENAME_BOX} .rename-input`; diff --git a/test/smoke/src/areas/editor/editors.ts b/test/smoke/src/areas/editor/editors.ts index 6c708367e3b..870b7ef86c3 100644 --- a/test/smoke/src/areas/editor/editors.ts +++ b/test/smoke/src/areas/editor/editors.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; export class Editors { diff --git a/test/smoke/src/areas/editor/peek.ts b/test/smoke/src/areas/editor/peek.ts index e95b7ccd2b5..e2e34f5a220 100644 --- a/test/smoke/src/areas/editor/peek.ts +++ b/test/smoke/src/areas/editor/peek.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; export class References { diff --git a/test/smoke/src/areas/explorer/explorer.test.ts b/test/smoke/src/areas/explorer/explorer.test.ts index ab77642f6dd..28bf22ca847 100644 --- a/test/smoke/src/areas/explorer/explorer.test.ts +++ b/test/smoke/src/areas/explorer/explorer.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; export function setup() { describe('Explorer', () => { diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index d8da8ee2411..f30d9c9ce30 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Editors } from '../editor/editors'; import { Commands } from '../workbench/workbench'; diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index 74aafec003a..703581dc99e 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SpectronApplication, Quality } from '../../spectron/application'; +import { SpectronApplication, Quality } from '../../application'; export function setup() { describe('Extensions', () => { diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index 0a90538be34..e404bb95251 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; const SEARCH_BOX = 'div.extensions-viewlet[id="workbench.view.extensions"] input.search-box'; diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 15eac7b3aa2..5fce52650f2 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index b988b1b2249..f28187bddf4 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; const VIEWLET = 'div[id="workbench.view.scm"]'; diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index b81df706cf3..22cfdbb0f8a 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; export function setup() { describe('Multiroot', () => { diff --git a/test/smoke/src/areas/preferences/keybindings.ts b/test/smoke/src/areas/preferences/keybindings.ts index bec4324e71e..b6ca0f08fd0 100644 --- a/test/smoke/src/areas/preferences/keybindings.ts +++ b/test/smoke/src/areas/preferences/keybindings.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; const SEARCH_INPUT = '.settings-search-input input'; diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index c9d8a989cd9..9f0c0bb3c09 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; import { ActivityBarPosition } from '../activitybar/activityBar'; export function setup() { diff --git a/test/smoke/src/areas/preferences/settings.ts b/test/smoke/src/areas/preferences/settings.ts index b1b35ab991d..49262d5228e 100644 --- a/test/smoke/src/areas/preferences/settings.ts +++ b/test/smoke/src/areas/preferences/settings.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; import { Editor } from '../editor/editor'; import { Editors } from '../editor/editors'; diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index 00e2230eed8..39086fd390a 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; export enum ProblemSeverity { diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index 00c1096c63d..289e60e3ba4 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Editors } from '../editor/editors'; import { Commands } from '../workbench/workbench'; diff --git a/test/smoke/src/areas/search/search.test.ts b/test/smoke/src/areas/search/search.test.ts index 4b0a5e837d9..caa3444efe4 100644 --- a/test/smoke/src/areas/search/search.test.ts +++ b/test/smoke/src/areas/search/search.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; export function setup() { describe('Search', () => { diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index f0c4a47f507..a6002d7fa35 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; const VIEWLET = 'div[id="workbench.view.search"] .search-view'; diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 28e4aac969e..64b04e95280 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication, Quality } from '../../spectron/application'; +import { SpectronApplication, Quality } from '../../application'; import { StatusBarElement } from './statusbar'; export function setup() { diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index 897deae869a..b1217296d97 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; export enum StatusBarElement { BRANCH_STATUS = 0, diff --git a/test/smoke/src/areas/terminal/terminal.test.ts b/test/smoke/src/areas/terminal/terminal.test.ts index abbb77e61d5..5713e281cc7 100644 --- a/test/smoke/src/areas/terminal/terminal.test.ts +++ b/test/smoke/src/areas/terminal/terminal.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// import { SpectronApplication } from '../../spectron/application'; +// import { SpectronApplication } from '../../application'; describe('Terminal', () => { // let app: SpectronApplication; diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts index 2149bedc208..511d1d114d9 100644 --- a/test/smoke/src/areas/terminal/terminal.ts +++ b/test/smoke/src/areas/terminal/terminal.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Commands } from '../workbench/workbench'; const PANEL_SELECTOR = 'div[id="workbench.panel.terminal"]'; diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index b06dd647ad8..9d5298bbed8 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../spectron/application'; +import { SpectronApplication } from '../../application'; export function setup() { describe('Dataloss', () => { diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 1d30c1bb7a4..582331b6aa9 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; -import { SpectronApplication, Quality } from '../../spectron/application'; +import { SpectronApplication, Quality } from '../../application'; import * as rimraf from 'rimraf'; export interface ICreateAppFn { diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index 0251a9bf964..ed1f88b0cf1 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; -import { SpectronApplication, Quality } from '../../spectron/application'; +import { SpectronApplication, Quality } from '../../application'; export function setup() { describe('Localization', () => { diff --git a/test/smoke/src/areas/workbench/viewlet.ts b/test/smoke/src/areas/workbench/viewlet.ts index 92139c3eafc..3c369b9c6ce 100644 --- a/test/smoke/src/areas/workbench/viewlet.ts +++ b/test/smoke/src/areas/workbench/viewlet.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../spectron/client'; +import { API } from '../../client'; export abstract class Viewlet { diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index c8779240bc6..987d6763ddd 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -16,7 +16,7 @@ import { Problems } from '../problems/problems'; import { SettingsEditor } from '../preferences/settings'; import { KeybindingsEditor } from '../preferences/keybindings'; import { Terminal } from '../terminal/terminal'; -import { API } from '../../spectron/client'; +import { API } from '../../client'; import { Editors } from '../editor/editors'; export interface Commands { diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/client.ts similarity index 51% rename from test/smoke/src/spectron/client.ts rename to test/smoke/src/client.ts index 3f30785a084..a6d14b5350c 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/client.ts @@ -3,131 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronClient } from 'spectron'; -import { ScreenCapturer } from '../helpers/screenshot'; - -export interface APIElement { - tagName: string; - className: string; - textContent: string; -} - -export interface Driver { - keys(keys: string[]): Promise; - click(selector: string, xoffset?: number, yoffset?: number): Promise; - doubleClick(selector: string): Promise; - move(selector: string): Promise; - setValue(selector: string, text: string): Promise; - getTitle(): Promise; - - isActiveElement(selector: string): Promise; - getElements(selector: string): Promise; - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; -} - -export class SpectronDriver implements Driver { - - constructor( - private spectronClient: SpectronClient, - private verbose: boolean - ) { } - - keys(keys: string[]): Promise { - if (this.verbose) { - console.log('- keys:', keys); - } - - this.spectronClient.keys(keys); - return Promise.resolve(); - } - - async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { - if (this.verbose) { - console.log('- click:', selector, xoffset, yoffset); - } - - await this.spectronClient.leftClick(selector, xoffset, yoffset); - - if (this.verbose) { - console.log('- click DONE'); - } - } - - async doubleClick(selector: string): Promise { - if (this.verbose) { - console.log('- doubleClick:', selector); - } - - await this.spectronClient.doubleClick(selector); - } - - async move(selector: string): Promise { - if (this.verbose) { - console.log('- move:', selector); - } - - await this.spectronClient.moveToObject(selector); - } - - async setValue(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- setValue:', selector, text); - } - - await this.spectronClient.setValue(selector, text); - } - - async getTitle(): Promise { - if (this.verbose) { - console.log('- getTitle'); - } - - return await this.spectronClient.getTitle(); - } - - async isActiveElement(selector: string): Promise { - if (this.verbose) { - console.log('- isActiveElement:', selector); - } - - const result = await (this.spectronClient.execute(s => document.activeElement.matches(s), selector) as any as Promise<{ value: boolean; }>); - return result.value; - } - - async getElements(selector: string): Promise { - if (this.verbose) { - console.log('- getElements:', selector); - } - - const result = await (this.spectronClient.execute(selector => { - const query = document.querySelectorAll(selector); - const result: APIElement[] = []; - - for (let i = 0; i < query.length; i++) { - const element: HTMLElement = query.item(i); - - result.push({ - tagName: element.tagName, - className: element.className, - textContent: element.textContent || '' - }); - } - - return result; - }, selector) as any as Promise<{ value: APIElement[]; }>); - - return result.value; - } - - async selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ - if (this.verbose) { - console.log('- selectorExecute:', selector); - } - - let _script = (element, script, ...args) => script(Array.isArray(element) ? element : [element], ...args); - return this.spectronClient.selectorExecute(selector, _script, script, ...args); - } -} +import { ScreenCapturer } from './helpers/screenshot'; +import { Driver, Element } from './driver'; export class API { @@ -135,15 +12,12 @@ export class API { // the time it takes for the actual retry call to complete private retryCount: number; private readonly retryDuration = 100; // in milliseconds - private driver: Driver; constructor( - spectronClient: SpectronClient, + private driver: Driver, private screenCapturer: ScreenCapturer, - waitTime: number, - verbose: boolean + waitTime: number ) { - this.driver = new SpectronDriver(spectronClient, verbose); this.retryCount = (waitTime * 1000) / this.retryDuration; } @@ -186,11 +60,11 @@ export class API { return elements.length; } - waitForElements(selector: string, accept: (result: APIElement[]) => boolean = result => result.length > 0): Promise { + waitForElements(selector: string, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { return this.waitFor(() => this.driver.getElements(selector), accept, `elements with selector ${selector}`) as Promise; } - waitForElement(selector: string, accept: (result: APIElement | undefined) => boolean = result => !!result): Promise { + waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { return this.waitFor(() => this.driver.getElements(selector).then(els => els[0]), accept, `element with selector ${selector}`) as Promise; } diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts new file mode 100644 index 00000000000..3cd753c1ac5 --- /dev/null +++ b/test/smoke/src/driver.ts @@ -0,0 +1,129 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { SpectronClient } from 'spectron'; + +export interface Element { + tagName: string; + className: string; + textContent: string; +} + +export interface Driver { + keys(keys: string[]): Promise; + click(selector: string, xoffset?: number, yoffset?: number): Promise; + doubleClick(selector: string): Promise; + move(selector: string): Promise; + setValue(selector: string, text: string): Promise; + getTitle(): Promise; + + isActiveElement(selector: string): Promise; + getElements(selector: string): Promise; + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; +} + +export class SpectronDriver implements Driver { + + constructor( + private spectronClient: SpectronClient, + private verbose: boolean + ) { } + + keys(keys: string[]): Promise { + if (this.verbose) { + console.log('- keys:', keys); + } + + this.spectronClient.keys(keys); + return Promise.resolve(); + } + + async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { + if (this.verbose) { + console.log('- click:', selector, xoffset, yoffset); + } + + await this.spectronClient.leftClick(selector, xoffset, yoffset); + + if (this.verbose) { + console.log('- click DONE'); + } + } + + async doubleClick(selector: string): Promise { + if (this.verbose) { + console.log('- doubleClick:', selector); + } + + await this.spectronClient.doubleClick(selector); + } + + async move(selector: string): Promise { + if (this.verbose) { + console.log('- move:', selector); + } + + await this.spectronClient.moveToObject(selector); + } + + async setValue(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- setValue:', selector, text); + } + + await this.spectronClient.setValue(selector, text); + } + + async getTitle(): Promise { + if (this.verbose) { + console.log('- getTitle'); + } + + return await this.spectronClient.getTitle(); + } + + async isActiveElement(selector: string): Promise { + if (this.verbose) { + console.log('- isActiveElement:', selector); + } + + const result = await (this.spectronClient.execute(s => document.activeElement.matches(s), selector) as any as Promise<{ value: boolean; }>); + return result.value; + } + + async getElements(selector: string): Promise { + if (this.verbose) { + console.log('- getElements:', selector); + } + + const result = await (this.spectronClient.execute(selector => { + const query = document.querySelectorAll(selector); + const result: Element[] = []; + + for (let i = 0; i < query.length; i++) { + const element: HTMLElement = query.item(i); + + result.push({ + tagName: element.tagName, + className: element.className, + textContent: element.textContent || '' + }); + } + + return result; + }, selector) as any as Promise<{ value: Element[]; }>); + + return result.value; + } + + async selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ + if (this.verbose) { + console.log('- selectorExecute:', selector); + } + + let _script = (element, script, ...args) => script(Array.isArray(element) ? element : [element], ...args); + return this.spectronClient.selectorExecute(selector, _script, script, ...args); + } +} diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index eccf18849fa..8d860488309 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -11,7 +11,7 @@ import * as minimist from 'minimist'; import * as tmp from 'tmp'; import * as rimraf from 'rimraf'; import * as mkdirp from 'mkdirp'; -import { SpectronApplication, Quality } from './spectron/application'; +import { SpectronApplication, Quality } from './application'; import { setup as setupDataMigrationTests } from './areas/workbench/data-migration.test'; import { setup as setupDataLossTests } from './areas/workbench/data-loss.test'; From 0d7cc203246521d3a36e84aa42737f60d1649543 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 23:36:58 +0200 Subject: [PATCH 042/710] :lipstick: --- test/smoke/src/application.ts | 10 +++++----- test/smoke/src/areas/css/css.test.ts | 10 +++++----- test/smoke/src/areas/debug/debug.test.ts | 8 ++++---- test/smoke/src/areas/explorer/explorer.test.ts | 4 ++-- test/smoke/src/areas/git/git.test.ts | 6 +++--- test/smoke/src/areas/multiroot/multiroot.test.ts | 2 +- test/smoke/src/areas/preferences/preferences.test.ts | 6 +++--- test/smoke/src/areas/statusbar/statusbar.test.ts | 2 +- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index e503b66cbae..c4991368b48 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -68,11 +68,11 @@ export class SpectronApplication { return this.options.quality; } - get client(): API { + get api(): API { return this._api; } - get webclient(): WebClient { + private get webclient(): WebClient { if (!this.spectron) { throw new Error('Application not started'); } @@ -292,12 +292,12 @@ export class SpectronApplication { } } - await this.client.waitForElement('.monaco-workbench'); + await this.api.waitForElement('.monaco-workbench'); } private async waitForWelcome(): Promise { - await this.client.waitForElement('.explorer-folders-view'); - await this.client.waitForElement(`.editor-container[id="workbench.editor.walkThroughPart"] .welcomePage`); + await this.api.waitForElement('.explorer-folders-view'); + await this.api.waitForElement(`.editor-container[id="workbench.editor.walkThroughPart"] .welcomePage`); } private retrieveKeybindings(): Promise { diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index 2cb9b18e4cf..6b187d53a28 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -25,11 +25,11 @@ export function setup() { await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); + await app.api.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); await app.screenCapturer.capture('CSS Warning in editor'); await app.workbench.problems.showProblemsView(); - await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); + await app.api.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); await app.screenCapturer.capture('CSS Warning in problems view'); await app.workbench.problems.hideProblemsView(); }); @@ -40,12 +40,12 @@ export function setup() { await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - await app.client.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); + await app.api.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); await app.screenCapturer.capture('CSS Error in editor'); - const problems = new Problems(app.client, app.workbench); + const problems = new Problems(app.api, app.workbench); await problems.showProblemsView(); - await app.client.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); + await app.api.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); await app.screenCapturer.capture('CSS Error in probles view'); await problems.hideProblemsView(); }); diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index e29ed42267f..05633988f67 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -69,16 +69,16 @@ export function setup() { it('focus stack frames and variables', async function () { const app = this.app as SpectronApplication; - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); + await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); await app.workbench.debug.focusStackFrame('layer.js', 'looking for layer.js'); - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 5, 'there should be 5 local variables'); + await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 5, 'there should be 5 local variables'); await app.workbench.debug.focusStackFrame('route.js', 'looking for route.js'); - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 3, 'there should be 3 local variables'); + await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 3, 'there should be 3 local variables'); await app.workbench.debug.focusStackFrame('index.js', 'looking for index.js'); - await app.client.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); + await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); }); it('stepOver, stepIn, stepOut', async function () { diff --git a/test/smoke/src/areas/explorer/explorer.test.ts b/test/smoke/src/areas/explorer/explorer.test.ts index 28bf22ca847..9829cff95f8 100644 --- a/test/smoke/src/areas/explorer/explorer.test.ts +++ b/test/smoke/src/areas/explorer/explorer.test.ts @@ -25,7 +25,7 @@ export function setup() { await app.workbench.quickopen.openQuickOpen('.js'); await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.client.keys(['Escape', 'NULL']); + await app.api.keys(['Escape', 'NULL']); }); it('quick open respects fuzzy matching', async function () { @@ -38,7 +38,7 @@ export function setup() { await app.workbench.quickopen.openQuickOpen('a.s'); await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.client.keys(['Escape', 'NULL']); + await app.api.keys(['Escape', 'NULL']); }); }); } \ No newline at end of file diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 5fce52650f2..1be1f6c3a41 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -40,7 +40,7 @@ export function setup() { await app.workbench.scm.openSCMViewlet(); await app.workbench.scm.openChange('app.js'); - await app.client.waitForElement(DIFF_EDITOR_LINE_INSERT); + await app.api.waitForElement(DIFF_EDITOR_LINE_INSERT); }); it('stages correctly', async function () { @@ -67,13 +67,13 @@ export function setup() { await app.workbench.scm.waitForChange('app.js', 'Index Modified'); await app.workbench.scm.commit('first commit'); - await app.client.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 1↑'); + await app.api.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 1↑'); await app.workbench.runCommand('Git: Stage All Changes'); await app.workbench.scm.waitForChange('index.jade', 'Index Modified'); await app.workbench.scm.commit('second commit'); - await app.client.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 2↑'); + await app.api.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 2↑'); cp.execSync('git reset --hard origin/master', { cwd: app.workspacePath }); }); diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index 22cfdbb0f8a..750845ded80 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -29,7 +29,7 @@ export function setup() { it('shows workspace name in title', async function () { const app = this.app as SpectronApplication; - const title = await app.client.getTitle(); + const title = await app.api.getTitle(); await app.screenCapturer.capture('window title'); assert.ok(title.indexOf('smoketest (Workspace)') >= 0); }); diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index 9f0c0bb3c09..8d59aa7799e 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -18,12 +18,12 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.explorer.openFile('app.js'); - await app.client.waitForElements('.line-numbers', elements => !!elements.length); + await app.api.waitForElements('.line-numbers', elements => !!elements.length); await app.screenCapturer.capture('app.js has line numbers'); await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); await app.workbench.editors.selectTab('app.js'); - await app.client.waitForElements('.line-numbers', result => !result || result.length === 0); + await app.api.waitForElements('.line-numbers', result => !result || result.length === 0); await app.screenCapturer.capture('line numbers hidden'); }); @@ -34,7 +34,7 @@ export function setup() { await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', ['Control', 'u'], 'Control+U'); - await app.client.keys(['Control', 'u', 'NULL']); + await app.api.keys(['Control', 'u', 'NULL']); assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.RIGHT), 'Activity bar was not moved to right after toggling its position.'); }); diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 64b04e95280..24dce071f6c 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -67,7 +67,7 @@ export function setup() { } await app.workbench.statusbar.clickOn(StatusBarElement.FEEDBACK_ICON); - await app.client.waitForElement('.feedback-form'); + await app.api.waitForElement('.feedback-form'); }); it(`checks if 'Go to Line' works if called from the status bar`, async function () { From 3df1991168e9a5b1f47a331273f6fe25168e1ae1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Apr 2018 23:38:11 +0200 Subject: [PATCH 043/710] client -> api --- test/smoke/src/{client.ts => api.ts} | 0 test/smoke/src/application.ts | 2 +- test/smoke/src/areas/activitybar/activityBar.ts | 2 +- test/smoke/src/areas/debug/debug.ts | 2 +- test/smoke/src/areas/editor/editor.ts | 2 +- test/smoke/src/areas/editor/editors.ts | 2 +- test/smoke/src/areas/editor/peek.ts | 2 +- test/smoke/src/areas/explorer/explorer.ts | 2 +- test/smoke/src/areas/extensions/extensions.ts | 2 +- test/smoke/src/areas/git/scm.ts | 2 +- test/smoke/src/areas/preferences/keybindings.ts | 2 +- test/smoke/src/areas/preferences/settings.ts | 2 +- test/smoke/src/areas/problems/problems.ts | 2 +- test/smoke/src/areas/quickopen/quickopen.ts | 2 +- test/smoke/src/areas/search/search.ts | 2 +- test/smoke/src/areas/statusbar/statusbar.ts | 2 +- test/smoke/src/areas/terminal/terminal.ts | 2 +- test/smoke/src/areas/workbench/viewlet.ts | 2 +- test/smoke/src/areas/workbench/workbench.ts | 2 +- 19 files changed, 18 insertions(+), 18 deletions(-) rename test/smoke/src/{client.ts => api.ts} (100%) diff --git a/test/smoke/src/client.ts b/test/smoke/src/api.ts similarity index 100% rename from test/smoke/src/client.ts rename to test/smoke/src/api.ts diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index c4991368b48..a71ab85b80a 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -5,7 +5,7 @@ import { Application, SpectronClient as WebClient } from 'spectron'; import { test as testPort } from 'portastic'; -import { API } from './client'; +import { API } from './api'; import { ScreenCapturer } from './helpers/screenshot'; import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; diff --git a/test/smoke/src/areas/activitybar/activityBar.ts b/test/smoke/src/areas/activitybar/activityBar.ts index 5334408fb52..46665d64009 100644 --- a/test/smoke/src/areas/activitybar/activityBar.ts +++ b/test/smoke/src/areas/activitybar/activityBar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; export enum ActivityBarPosition { LEFT = 0, diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 3cda1dcb4e7..67d4224e15f 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -5,7 +5,7 @@ import { Viewlet } from '../workbench/viewlet'; import { Commands } from '../workbench/workbench'; -import { API } from '../../client'; +import { API } from '../../api'; import { Editors } from '../editor/editors'; import { Editor } from '../editor/editor'; diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index d2f8dee110a..26f6e2ed8eb 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -5,7 +5,7 @@ import { References } from './peek'; import { Commands } from '../workbench/workbench'; -import { API } from '../../client'; +import { API } from '../../api'; const RENAME_BOX = '.monaco-editor .monaco-editor.rename-box'; const RENAME_INPUT = `${RENAME_BOX} .rename-input`; diff --git a/test/smoke/src/areas/editor/editors.ts b/test/smoke/src/areas/editor/editors.ts index 870b7ef86c3..574b1b48aec 100644 --- a/test/smoke/src/areas/editor/editors.ts +++ b/test/smoke/src/areas/editor/editors.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; export class Editors { diff --git a/test/smoke/src/areas/editor/peek.ts b/test/smoke/src/areas/editor/peek.ts index e2e34f5a220..5d68eb38c1b 100644 --- a/test/smoke/src/areas/editor/peek.ts +++ b/test/smoke/src/areas/editor/peek.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; export class References { diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index f30d9c9ce30..956b29b488f 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../client'; +import { API } from '../../api'; import { Editors } from '../editor/editors'; import { Commands } from '../workbench/workbench'; diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index e404bb95251..dc9bdf976ac 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; const SEARCH_BOX = 'div.extensions-viewlet[id="workbench.view.extensions"] input.search-box'; diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index f28187bddf4..ce5e6a6bb4c 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; const VIEWLET = 'div[id="workbench.view.scm"]'; diff --git a/test/smoke/src/areas/preferences/keybindings.ts b/test/smoke/src/areas/preferences/keybindings.ts index b6ca0f08fd0..ef50ff850dc 100644 --- a/test/smoke/src/areas/preferences/keybindings.ts +++ b/test/smoke/src/areas/preferences/keybindings.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; const SEARCH_INPUT = '.settings-search-input input'; diff --git a/test/smoke/src/areas/preferences/settings.ts b/test/smoke/src/areas/preferences/settings.ts index 49262d5228e..97182736c5a 100644 --- a/test/smoke/src/areas/preferences/settings.ts +++ b/test/smoke/src/areas/preferences/settings.ts @@ -5,7 +5,7 @@ import * as fs from 'fs'; import * as path from 'path'; -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; import { Editor } from '../editor/editor'; import { Editors } from '../editor/editors'; diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index 39086fd390a..84a0b92c244 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; export enum ProblemSeverity { diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index 289e60e3ba4..f379d398247 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; import { Editors } from '../editor/editors'; import { Commands } from '../workbench/workbench'; diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index a6002d7fa35..f0fed76a813 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; const VIEWLET = 'div[id="workbench.view.search"] .search-view'; diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index b1217296d97..20ab92c96e3 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; export enum StatusBarElement { BRANCH_STATUS = 0, diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts index 511d1d114d9..7dabb26e627 100644 --- a/test/smoke/src/areas/terminal/terminal.ts +++ b/test/smoke/src/areas/terminal/terminal.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; import { Commands } from '../workbench/workbench'; const PANEL_SELECTOR = 'div[id="workbench.panel.terminal"]'; diff --git a/test/smoke/src/areas/workbench/viewlet.ts b/test/smoke/src/areas/workbench/viewlet.ts index 3c369b9c6ce..c76ddb6e41c 100644 --- a/test/smoke/src/areas/workbench/viewlet.ts +++ b/test/smoke/src/areas/workbench/viewlet.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../client'; +import { API } from '../../api'; export abstract class Viewlet { diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index 987d6763ddd..c87ea5a779a 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -16,7 +16,7 @@ import { Problems } from '../problems/problems'; import { SettingsEditor } from '../preferences/settings'; import { KeybindingsEditor } from '../preferences/keybindings'; import { Terminal } from '../terminal/terminal'; -import { API } from '../../client'; +import { API } from '../../api'; import { Editors } from '../editor/editors'; export interface Commands { From f1e1fc41e6193bd1565eebe2a1c40adf804000e3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 6 Apr 2018 00:03:57 +0200 Subject: [PATCH 044/710] wip: launch code without spectron --- test/smoke/package.json | 3 +- test/smoke/src/api.ts | 6 +- test/smoke/src/application.ts | 216 ++++++++++------------ test/smoke/src/driver.ts | 34 ++++ test/smoke/src/main.ts | 1 + test/smoke/src/vscode/code.ts | 124 +++++++++++++ test/smoke/src/vscode/driver.d.ts | 19 ++ test/smoke/src/vscode/driver.js | 12 ++ test/smoke/test/mocha.opts | 4 +- test/{smoke2 => smoke}/tools/postbuild.js | 4 +- test/{smoke2 => smoke}/tools/prebuild.js | 2 +- 11 files changed, 301 insertions(+), 124 deletions(-) create mode 100644 test/smoke/src/vscode/code.ts create mode 100644 test/smoke/src/vscode/driver.d.ts create mode 100644 test/smoke/src/vscode/driver.js rename test/{smoke2 => smoke}/tools/postbuild.js (81%) rename test/{smoke2 => smoke}/tools/prebuild.js (95%) diff --git a/test/smoke/package.json b/test/smoke/package.json index 97d8c0b3c3e..63f6cec4818 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -4,7 +4,8 @@ "main": "./src/main.js", "scripts": { "postinstall": "tsc", - "watch": "tsc --watch", + "compile": "node tools/prebuild && tsc && node tools/postbuild", + "watch": "node tools/prebuild && node tools/postbuild && tsc --watch", "mocha": "mocha" }, "devDependencies": { diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index a6d14b5350c..b6d29b07f4f 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -103,7 +103,11 @@ export class API { try { result = await func(); } catch (e) { - // console.log(e); + // console.warn(e); + + if (/Method not implemented/.test(e.message)) { + throw e; + } } if (accept(result)) { diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index a71ab85b80a..8abd445baeb 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -3,17 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Application, SpectronClient as WebClient } from 'spectron'; import { test as testPort } from 'portastic'; import { API } from './api'; import { ScreenCapturer } from './helpers/screenshot'; import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; import * as cp from 'child_process'; -import * as path from 'path'; -import * as mkdirp from 'mkdirp'; -import { sanitize } from './helpers/utilities'; -import { SpectronDriver } from './driver'; +import * as assert from 'assert'; +import { CodeDriver } from './driver'; +import { Code, spawn, SpawnOptions } from './vscode/code'; // Just hope random helps us here, cross your fingers! export async function findFreePort(): Promise { @@ -34,12 +32,10 @@ export enum Quality { Stable } -export interface SpectronApplicationOptions { +export interface SpectronApplicationOptions extends SpawnOptions { quality: Quality; electronPath: string; workspacePath: string; - userDataDir: string; - extensionsPath: string; artifactsPath: string; workspaceFilePath: string; waitTime: number; @@ -51,12 +47,12 @@ export interface SpectronApplicationOptions { */ export class SpectronApplication { - private static count = 0; + // private static count = 0; private _api: API; private _workbench: Workbench; private _screenCapturer: ScreenCapturer; - private spectron: Application | undefined; + private codeInstance: Code | undefined; private keybindings: any[]; private stopLogCollection: (() => Promise) | undefined; @@ -72,14 +68,6 @@ export class SpectronApplication { return this._api; } - private get webclient(): WebClient { - if (!this.spectron) { - throw new Error('Application not started'); - } - - return this.spectron.client; - } - get screenCapturer(): ScreenCapturer { return this._screenCapturer; } @@ -145,153 +133,147 @@ export class SpectronApplication { this.stopLogCollection = undefined; } - if (this.spectron && this.spectron.isRunning()) { - await this.spectron.stop(); - this.spectron = undefined; + if (this.codeInstance) { + this.codeInstance.dispose(); + this.codeInstance = undefined; } } private async startApplication(workspaceOrFolder: string, extraArgs: string[] = []): Promise { - let args: string[] = []; - let chromeDriverArgs: string[] = []; + // let args: string[] = []; + // let chromeDriverArgs: string[] = []; - if (process.env.VSCODE_REPOSITORY) { - args.push(process.env.VSCODE_REPOSITORY as string); - } + // if (process.env.VSCODE_REPOSITORY) { + // args.push(process.env.VSCODE_REPOSITORY as string); + // } - args.push(workspaceOrFolder); + // args.push(workspaceOrFolder); - // Prevent 'Getting Started' web page from opening on clean user-data-dir - args.push('--skip-getting-started'); + // // Prevent 'Getting Started' web page from opening on clean user-data-dir + // args.push('--skip-getting-started'); - // Prevent 'Getting Started' web page from opening on clean user-data-dir - args.push('--skip-release-notes'); + // // Prevent 'Getting Started' web page from opening on clean user-data-dir + // args.push('--skip-release-notes'); - // Prevent Quick Open from closing when focus is stolen, this allows concurrent smoketest suite running - args.push('--sticky-quickopen'); + // // Prevent Quick Open from closing when focus is stolen, this allows concurrent smoketest suite running + // args.push('--sticky-quickopen'); - // Disable telemetry - args.push('--disable-telemetry'); + // // Disable telemetry + // args.push('--disable-telemetry'); - // Disable updates - args.push('--disable-updates'); + // // Disable updates + // args.push('--disable-updates'); - // Disable crash reporter - // This seems to be the fix for the strange hangups in which Code stays unresponsive - // and tests finish badly with timeouts, leaving Code running in the background forever - args.push('--disable-crash-reporter'); + // // Disable crash reporter + // // This seems to be the fix for the strange hangups in which Code stays unresponsive + // // and tests finish badly with timeouts, leaving Code running in the background forever + // args.push('--disable-crash-reporter'); - // Ensure that running over custom extensions directory, rather than picking up the one that was used by a tester previously - args.push(`--extensions-dir=${this.options.extensionsPath}`); + // // Ensure that running over custom extensions directory, rather than picking up the one that was used by a tester previously + // args.push(`--extensions-dir=${this.options.extensionsPath}`); - args.push(...extraArgs); + // args.push(...extraArgs); - chromeDriverArgs.push(`--user-data-dir=${this.options.userDataDir}`); + // chromeDriverArgs.push(`--user-data-dir=${this.options.userDataDir}`); // Spectron always uses the same port number for the chrome driver // and it handles gracefully when two instances use the same port number // This works, but when one of the instances quits, it takes down // chrome driver with it, leaving the other instance in DISPAIR!!! :( - const port = await findFreePort(); + // const port = await findFreePort(); // We must get a different port for debugging the smoketest express app // otherwise concurrent test runs will clash on those ports - const env = { PORT: String(await findFreePort()), ...process.env }; + // const env = { PORT: String(await findFreePort()), ...process.env }; - const opts: any = { - path: this.options.electronPath, - port, - args, - env, - chromeDriverArgs, - startTimeout: 10000, - requireName: 'nodeRequire' - }; + // const opts = { + // path: this.options.electronPath, + // port, + // args, + // env, + // chromeDriverArgs, + // startTimeout: 10000, + // requireName: 'nodeRequire' + // }; - const runName = String(SpectronApplication.count++); - let testsuiteRootPath: string | undefined = undefined; - let screenshotsDirPath: string | undefined = undefined; + // const runName = String(SpectronApplication.count++); + // let testsuiteRootPath: string | undefined = undefined; + // let screenshotsDirPath: string | undefined = undefined; - if (this.options.artifactsPath) { - testsuiteRootPath = path.join(this.options.artifactsPath, sanitize(runName)); - mkdirp.sync(testsuiteRootPath); + // if (this.options.artifactsPath) { + // testsuiteRootPath = path.join(this.options.artifactsPath, sanitize(runName)); + // mkdirp.sync(testsuiteRootPath); - // Collect screenshots - screenshotsDirPath = path.join(testsuiteRootPath, 'screenshots'); - mkdirp.sync(screenshotsDirPath); + // // Collect screenshots + // screenshotsDirPath = path.join(testsuiteRootPath, 'screenshots'); + // mkdirp.sync(screenshotsDirPath); - // Collect chromedriver logs - const chromedriverLogPath = path.join(testsuiteRootPath, 'chromedriver.log'); - opts.chromeDriverLogPath = chromedriverLogPath; + // // Collect chromedriver logs + // const chromedriverLogPath = path.join(testsuiteRootPath, 'chromedriver.log'); + // opts.chromeDriverLogPath = chromedriverLogPath; - // Collect webdriver logs - const webdriverLogsPath = path.join(testsuiteRootPath, 'webdriver'); - mkdirp.sync(webdriverLogsPath); - opts.webdriverLogPath = webdriverLogsPath; - } + // // Collect webdriver logs + // const webdriverLogsPath = path.join(testsuiteRootPath, 'webdriver'); + // mkdirp.sync(webdriverLogsPath); + // opts.webdriverLogPath = webdriverLogsPath; + // } - this.spectron = new Application(opts); - await this.spectron.start(); + this.codeInstance = await spawn(this.options); - if (testsuiteRootPath) { - // Collect logs - const mainProcessLogPath = path.join(testsuiteRootPath, 'main.log'); - const rendererProcessLogPath = path.join(testsuiteRootPath, 'renderer.log'); + // if (testsuiteRootPath) { + // // Collect logs + // const mainProcessLogPath = path.join(testsuiteRootPath, 'main.log'); + // const rendererProcessLogPath = path.join(testsuiteRootPath, 'renderer.log'); - const flush = async () => { - if (!this.spectron) { - return; - } + // const flush = async () => { + // if (!this.spectron) { + // return; + // } - const mainLogs = await this.spectron.client.getMainProcessLogs(); - await new Promise((c, e) => fs.appendFile(mainProcessLogPath, mainLogs.join('\n'), { encoding: 'utf8' }, err => err ? e(err) : c())); + // const mainLogs = await this.spectron.client.getMainProcessLogs(); + // await new Promise((c, e) => fs.appendFile(mainProcessLogPath, mainLogs.join('\n'), { encoding: 'utf8' }, err => err ? e(err) : c())); - const rendererLogs = (await this.spectron.client.getRenderProcessLogs()).map(m => `${m.timestamp} - ${m.level} - ${m.message}`); - await new Promise((c, e) => fs.appendFile(rendererProcessLogPath, rendererLogs.join('\n'), { encoding: 'utf8' }, err => err ? e(err) : c())); - }; + // const rendererLogs = (await this.spectron.client.getRenderProcessLogs()).map(m => `${m.timestamp} - ${m.level} - ${m.message}`); + // await new Promise((c, e) => fs.appendFile(rendererProcessLogPath, rendererLogs.join('\n'), { encoding: 'utf8' }, err => err ? e(err) : c())); + // }; - let running = true; - const loopFlush = async () => { - while (true) { - await flush(); + // let running = true; + // const loopFlush = async () => { + // while (true) { + // await flush(); - if (!running) { - return; - } + // if (!running) { + // return; + // } - await new Promise(c => setTimeout(c, 1000)); - } - }; + // await new Promise(c => setTimeout(c, 1000)); + // } + // }; - const loopPromise = loopFlush(); - this.stopLogCollection = () => { - running = false; - return loopPromise; - }; - } + // const loopPromise = loopFlush(); + // this.stopLogCollection = () => { + // running = false; + // return loopPromise; + // }; + // } - this._screenCapturer = new ScreenCapturer(this.spectron, this._suiteName, screenshotsDirPath); + this._screenCapturer = new ScreenCapturer(null as any, this._suiteName, ''); - const driver = new SpectronDriver(this.spectron.client, this.options.verbose); + const driver = new CodeDriver(this.codeInstance.driver); this._api = new API(driver, this.screenCapturer, this.options.waitTime); this._workbench = new Workbench(this._api, this.keybindings, this.userDataPath); } private async checkWindowReady(): Promise { - await this.webclient.waitUntilWindowLoaded(); - - // Pick the first workbench window here - const count = await this.webclient.getWindowCount(); - - for (let i = 0; i < count; i++) { - await this.webclient.windowByIndex(i); - - if (/bootstrap\/index\.html/.test(await this.webclient.getUrl())) { - break; - } + if (!this.codeInstance) { + console.error('No code instance found'); + return; } + const windows = await this.codeInstance.driver.getWindows(); + assert.ok(windows.length > 0, 'theres more than one window'); + await this.api.waitForElement('.monaco-workbench'); } diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index 3cd753c1ac5..409c73097c7 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { SpectronClient } from 'spectron'; +import { IDriver } from './vscode/driver'; export interface Element { tagName: string; @@ -127,3 +128,36 @@ export class SpectronDriver implements Driver { return this.spectronClient.selectorExecute(selector, _script, script, ...args); } } + +export class CodeDriver implements Driver { + + constructor(driver: IDriver) { } + + keys(keys: string[]): Promise { + throw new Error('Method not implemented.'); + } + click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { + throw new Error('Method not implemented.'); + } + doubleClick(selector: string): Promise { + throw new Error('Method not implemented.'); + } + move(selector: string): Promise { + throw new Error('Method not implemented.'); + } + setValue(selector: string, text: string): Promise { + throw new Error('Method not implemented.'); + } + getTitle(): Promise { + throw new Error('Method not implemented.'); + } + isActiveElement(selector: string): Promise { + throw new Error('Method not implemented.'); + } + getElements(selector: string): Promise { + throw new Error('Method not implemented.'); + } + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ + throw new Error('Method not implemented.'); + } +} \ No newline at end of file diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 8d860488309..c4221af778d 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -261,6 +261,7 @@ function createApp(quality: Quality): SpectronApplication | null { return new SpectronApplication({ quality, + codePath: opts.build, electronPath: path, workspacePath, userDataDir, diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts new file mode 100644 index 00000000000..aac9ec564ca --- /dev/null +++ b/test/smoke/src/vscode/code.ts @@ -0,0 +1,124 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as path from 'path'; +import * as cp from 'child_process'; +import { tmpName } from 'tmp'; +import { IDriver, connect as connectDriver, IDisposable } from './driver'; + +const repoPath = path.join(__dirname, '../../../..'); + +function getDevElectronPath(): string { + const buildPath = path.join(repoPath, '.build'); + const product = require(path.join(repoPath, 'product.json')); + + switch (process.platform) { + case 'darwin': + return path.join(buildPath, 'electron', `${product.nameLong}.app`, 'Contents', 'MacOS', 'Electron'); + case 'linux': + return path.join(buildPath, 'electron', `${product.applicationName}`); + case 'win32': + return path.join(buildPath, 'electron', `${product.nameShort}.exe`); + default: + throw new Error('Unsupported platform.'); + } +} + +function getBuildElectronPath(root: string): string { + switch (process.platform) { + case 'darwin': + return path.join(root, 'Contents', 'MacOS', 'Electron'); + case 'linux': { + const product = require(path.join(root, 'resources', 'app', 'product.json')); + return path.join(root, product.applicationName); + } + case 'win32': { + const product = require(path.join(root, 'resources', 'app', 'product.json')); + return path.join(root, `${product.nameShort}.exe`); + } + default: + throw new Error('Unsupported platform.'); + } +} + +function getDevOutPath(): string { + return path.join(repoPath, 'out'); +} + +function getBuildOutPath(root: string): string { + switch (process.platform) { + case 'darwin': + return path.join(root, 'Contents', 'Resources', 'app', 'out'); + default: + return path.join(root, 'resources', 'app', 'out'); + } +} + +export class Code { + + constructor( + private process: cp.ChildProcess, + private client: IDisposable, + readonly driver: IDriver + ) { + + } + + dispose(): void { + this.client.dispose(); + this.process.kill(); + } +} + +export interface SpawnOptions { + codePath?: string; + userDataDir: string; + extensionsPath: string; +} + +export async function connect(child: cp.ChildProcess, outPath: string, handlePath: string): Promise { + let errCount = 0; + + while (true) { + try { + const { client, driver } = await connectDriver(outPath, handlePath); + return new Code(child, client, driver); + } catch (err) { + if (++errCount > 50) { + child.kill(); + throw err; + } + + // retry + await new Promise(c => setTimeout(c, 100)); + } + } +} + +export async function spawn(options: SpawnOptions): Promise { + const codePath = options.codePath; + const electronPath = codePath ? getBuildElectronPath(codePath) : getDevElectronPath(); + const outPath = codePath ? getBuildOutPath(codePath) : getDevOutPath(); + const handlePath = await new Promise((c, e) => tmpName((err, handlePath) => err ? e(err) : c(handlePath))); + + const args = [ + '--skip-getting-started', + '--skip-release-notes', + '--sticky-quickopen', + '--disable-telemetry', + '--disable-updates', + '--disable-crash-reporter', + `--extensions-dir=${options.extensionsPath}`, + `--user-data-dir=${options.userDataDir}`, + '--driver', handlePath + ]; + + if (!codePath) { + args.unshift(repoPath); + } + + const child = cp.spawn(electronPath, args); + return connect(child, outPath, handlePath); +} \ No newline at end of file diff --git a/test/smoke/src/vscode/driver.d.ts b/test/smoke/src/vscode/driver.d.ts new file mode 100644 index 00000000000..6d417e693df --- /dev/null +++ b/test/smoke/src/vscode/driver.d.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface IWindow { + id: string; +} + +export interface IDriver { + _serviceBrand: any; + getWindows(): Promise; +} + +export interface IDisposable { + dispose(): void; +} + +export function connect(outPath: string, handle: string): Promise<{ client: IDisposable, driver: IDriver }>; diff --git a/test/smoke/src/vscode/driver.js b/test/smoke/src/vscode/driver.js new file mode 100644 index 00000000000..7ff3b7964f0 --- /dev/null +++ b/test/smoke/src/vscode/driver.js @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const path = require('path'); + +exports.connect = function (outPath, handle) { + const bootstrapPath = path.join(outPath, 'bootstrap-amd.js'); + const { bootstrap } = require(bootstrapPath); + return new Promise((c, e) => bootstrap('vs/code/node/driver', ({ connect }) => connect(handle).then(c, e), e)); +}; \ No newline at end of file diff --git a/test/smoke/test/mocha.opts b/test/smoke/test/mocha.opts index 102d5b65ade..abe0700d60d 100644 --- a/test/smoke/test/mocha.opts +++ b/test/smoke/test/mocha.opts @@ -1,3 +1,3 @@ ---timeout 60000 ---slow 20000 +--timeout 5000 +--slow 2000 out/main.js \ No newline at end of file diff --git a/test/smoke2/tools/postbuild.js b/test/smoke/tools/postbuild.js similarity index 81% rename from test/smoke2/tools/postbuild.js rename to test/smoke/tools/postbuild.js index 86b408b55f6..ab71b92633d 100644 --- a/test/smoke2/tools/postbuild.js +++ b/test/smoke/tools/postbuild.js @@ -7,8 +7,8 @@ const fs = require('fs'); const path = require('path'); const root = path.dirname(__dirname); -const driverPath = path.join(root, 'src/driver.js'); +const driverPath = path.join(root, 'src/vscode/driver.js'); const driver = fs.readFileSync(driverPath); -const outDriverPath = path.join(root, 'out/driver.js'); +const outDriverPath = path.join(root, 'out/vscode/driver.js'); fs.writeFileSync(outDriverPath, driver); diff --git a/test/smoke2/tools/prebuild.js b/test/smoke/tools/prebuild.js similarity index 95% rename from test/smoke2/tools/prebuild.js rename to test/smoke/tools/prebuild.js index 155dec4fa78..16b1a3f4f3d 100644 --- a/test/smoke2/tools/prebuild.js +++ b/test/smoke/tools/prebuild.js @@ -27,7 +27,7 @@ export interface IDisposable { export function connect(outPath: string, handle: string): Promise<{ client: IDisposable, driver: IDriver }>; `; -const srcPath = path.join(path.dirname(__dirname), 'src'); +const srcPath = path.join(path.dirname(__dirname), 'src/vscode'); const outDriverPath = path.join(srcPath, 'driver.d.ts'); fs.writeFileSync(outDriverPath, contents); \ No newline at end of file From f246e6fab8e26887f175acbefe5a84ac48d2a29c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 6 Apr 2018 00:06:56 +0200 Subject: [PATCH 045/710] collect and kill loose code instances --- test/smoke/src/vscode/code.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index aac9ec564ca..3eb37072a1c 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -97,6 +97,10 @@ export async function connect(child: cp.ChildProcess, outPath: string, handlePat } } +// Kill all running instances, when dead +const instances = new Set(); +process.once('exit', () => instances.forEach(code => code.kill())); + export async function spawn(options: SpawnOptions): Promise { const codePath = options.codePath; const electronPath = codePath ? getBuildElectronPath(codePath) : getDevElectronPath(); @@ -120,5 +124,9 @@ export async function spawn(options: SpawnOptions): Promise { } const child = cp.spawn(electronPath, args); + + instances.add(child); + child.once('exit', () => instances.delete(child)); + return connect(child, outPath, handlePath); } \ No newline at end of file From 8421745dee95f1d20c99b21c78845a5ccde8a0a0 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 6 Apr 2018 18:07:29 +0200 Subject: [PATCH 046/710] driver all the way to the windows --- src/vs/code/common/driver.ts | 53 -------- src/vs/code/electron-main/app.ts | 26 ++-- src/vs/code/electron-main/driver.ts | 31 ----- src/vs/platform/driver/common/driver.ts | 128 ++++++++++++++++++ .../driver/electron-browser/driver.ts | 44 ++++++ .../platform/driver/electron-main/driver.ts | 71 ++++++++++ .../{code => platform/driver}/node/driver.ts | 2 +- src/vs/workbench/electron-browser/main.ts | 2 +- src/vs/workbench/electron-browser/shell.ts | 10 +- test/smoke/src/application.ts | 16 ++- test/smoke/src/driver.ts | 66 ++++++++- test/smoke/src/vscode/code.ts | 9 +- test/smoke/src/vscode/driver.d.ts | 9 +- test/smoke/src/vscode/driver.js | 2 +- test/smoke/test/mocha.opts | 2 +- test/smoke/tools/prebuild.js | 2 +- 16 files changed, 358 insertions(+), 115 deletions(-) delete mode 100644 src/vs/code/common/driver.ts delete mode 100644 src/vs/code/electron-main/driver.ts create mode 100644 src/vs/platform/driver/common/driver.ts create mode 100644 src/vs/platform/driver/electron-browser/driver.ts create mode 100644 src/vs/platform/driver/electron-main/driver.ts rename src/vs/{code => platform/driver}/node/driver.ts (90%) diff --git a/src/vs/code/common/driver.ts b/src/vs/code/common/driver.ts deleted file mode 100644 index 0cf868b3549..00000000000 --- a/src/vs/code/common/driver.ts +++ /dev/null @@ -1,53 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IChannel } from 'vs/base/parts/ipc/common/ipc'; - -export const ID = 'driverService'; -export const IDriver = createDecorator(ID); - -//*START -export interface IWindow { - id: string; -} - -export interface IDriver { - _serviceBrand: any; - getWindows(): TPromise; -} -//*END - -export interface IDriverChannel extends IChannel { - call(command: 'getWindows'): TPromise; - call(command: string, arg: any): TPromise; -} - -export class DriverChannel implements IDriverChannel { - - constructor(private service: IDriver) { } - - call(command: string, arg?: any): TPromise { - switch (command) { - case 'getWindows': return this.service.getWindows(); - } - - return undefined; - } -} - -export class DriverChannelClient implements IDriver { - - _serviceBrand: any; - - constructor(private channel: IDriverChannel) { } - - getWindows(): TPromise { - return this.channel.call('getWindows'); - } -} diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 2f310039371..da5313bcb5f 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -62,7 +62,7 @@ import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { join } from 'path'; import { copy } from 'vs/base/node/pfs'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; -import { serve, Driver } from './driver'; +import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; export class CodeApplication { @@ -292,27 +292,27 @@ export class CodeApplication { // Services const appInstantiationService = this.initServices(machineId); + let promise: TPromise = TPromise.as(null); + // Create driver if (this.environmentService.driverHandle) { - const driver = appInstantiationService.createInstance(Driver); - - serve(this.environmentService.driverHandle, driver).then(server => { + serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { this.logService.info('Driver started at:', this.environmentService.driverHandle); this.toDispose.push(server); - }, err => { - this.logService.error('Failed to start driver running at:', this.environmentService.driverHandle); }); } - // Setup Auth Handler - const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); - this.toDispose.push(authHandler); + return promise.then(() => { + // Setup Auth Handler + const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); + this.toDispose.push(authHandler); - // Open Windows - appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); + // Open Windows + appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); - // Post Open Windows Tasks - appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + // Post Open Windows Tasks + appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + }); }); }); } diff --git a/src/vs/code/electron-main/driver.ts b/src/vs/code/electron-main/driver.ts deleted file mode 100644 index e7c6018af87..00000000000 --- a/src/vs/code/electron-main/driver.ts +++ /dev/null @@ -1,31 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { IDriver, IWindow, DriverChannel } from 'vs/code/common/driver'; -import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; -import { serve as serveNet, Server } from 'vs/base/parts/ipc/node/ipc.net'; - -export class Driver implements IDriver { - - _serviceBrand: any; - - constructor( - @IWindowsMainService protected windowsService: IWindowsMainService - ) { } - - getWindows(): TPromise { - return TPromise.as(this.windowsService.getWindows().map(w => ({ id: `${w.id}` }))); - } -} - -export async function serve(handle: string, driver: IDriver): TPromise { - const server = await serveNet(handle); - const channel = new DriverChannel(driver); - server.registerChannel('driver', channel); - return server; -} \ No newline at end of file diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts new file mode 100644 index 00000000000..6c7b6705d9e --- /dev/null +++ b/src/vs/platform/driver/common/driver.ts @@ -0,0 +1,128 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; + +export const ID = 'driverService'; +export const IDriver = createDecorator(ID); + +//*START +export interface IElement { + tagName: string; + className: string; + textContent: string; +} + +export interface IDriver { + _serviceBrand: any; + getWindowIds(): TPromise; + getElements(windowId: number, selector: string): TPromise; +} +//*END + +export interface IDriverChannel extends IChannel { + call(command: 'getWindowIds'): TPromise; + call(command: 'getElements', arg: [number, string]): TPromise; + call(command: string, arg: any): TPromise; +} + +export class DriverChannel implements IDriverChannel { + + constructor(private driver: IDriver) { } + + call(command: string, arg?: any): TPromise { + switch (command) { + case 'getWindowIds': return this.driver.getWindowIds(); + case 'getElements': return this.driver.getElements(arg[0], arg[1]); + } + + return undefined; + } +} + +export class DriverChannelClient implements IDriver { + + _serviceBrand: any; + + constructor(private channel: IDriverChannel) { } + + getWindowIds(): TPromise { + return this.channel.call('getWindowIds'); + } + + getElements(windowId: number, selector: string): TPromise { + return this.channel.call('getElements', [windowId, selector]); + } +} + +export interface IWindowDriverRegistry { + registerWindowDriver(windowId: number): TPromise; +} + +export interface IWindowDriverRegistryChannel extends IChannel { + call(command: 'registerWindowDriver', arg: number): TPromise; + call(command: string, arg: any): TPromise; +} + +export class WindowDriverRegistryChannel implements IWindowDriverRegistryChannel { + + constructor(private registry: IWindowDriverRegistry) { } + + call(command: string, arg?: any): TPromise { + switch (command) { + case 'registerWindowDriver': return this.registry.registerWindowDriver(arg); + } + + return undefined; + } +} + +export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry { + + _serviceBrand: any; + + constructor(private channel: IWindowDriverRegistryChannel) { } + + registerWindowDriver(windowId: number): TPromise { + return this.channel.call('registerWindowDriver', windowId); + } +} + +export interface IWindowDriver { + getElements(selector: string): TPromise; +} + +export interface IWindowDriverChannel extends IChannel { + call(command: 'getElements', arg: string): TPromise; + call(command: string, arg: any): TPromise; +} + +export class WindowDriverChannel implements IWindowDriverChannel { + + constructor(private driver: IWindowDriver) { } + + call(command: string, arg?: any): TPromise { + switch (command) { + case 'getElements': return this.driver.getElements(arg); + } + + return undefined; + } +} + +export class WindowDriverChannelClient implements IWindowDriver { + + _serviceBrand: any; + + constructor(private channel: IWindowDriverChannel) { } + + getElements(selector: string): TPromise { + return this.channel.call('getElements', selector); + } +} \ No newline at end of file diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts new file mode 100644 index 00000000000..55949acb636 --- /dev/null +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -0,0 +1,44 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/common/driver'; +import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; + +class WindowDriver implements IWindowDriver { + + async getElements(selector: string): TPromise { + const query = document.querySelectorAll(selector); + const result: IElement[] = []; + + for (let i = 0; i < query.length; i++) { + const element = query.item(i); + + result.push({ + tagName: element.tagName, + className: element.className, + textContent: element.textContent || '' + }); + } + + return result; + } +} + +export async function registerWindowDriver(client: IPCClient, windowId: number): TPromise { + const windowDriver = new WindowDriver(); + const windowDriverChannel = new WindowDriverChannel(windowDriver); + client.registerChannel('windowDriver', windowDriverChannel); + + const windowDriverRegistryChannel = client.getChannel('windowDriverRegistry'); + const windowDriverRegistry = new WindowDriverRegistryChannelClient(windowDriverRegistryChannel); + + await windowDriverRegistry.registerWindowDriver(windowId); + + return client; +} \ No newline at end of file diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts new file mode 100644 index 00000000000..36bc9753135 --- /dev/null +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -0,0 +1,71 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { TPromise } from 'vs/base/common/winjs.base'; +import { IDriver, DriverChannel, IElement, IWindowDriverChannel, WindowDriverChannelClient, IWindowDriverRegistry, WindowDriverRegistryChannel } from 'vs/platform/driver/common/driver'; +import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; +import { serve as serveNet } from 'vs/base/parts/ipc/node/ipc.net'; +import { combinedDisposable, IDisposable } from 'vs/base/common/lifecycle'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IPCServer, IClientRouter } from 'vs/base/parts/ipc/common/ipc'; + +class WindowRouter implements IClientRouter { + + constructor(private windowId: number) { } + + route(command: string, arg: any): string { + return `window:${this.windowId}`; + } +} + +export class Driver implements IDriver, IWindowDriverRegistry { + + _serviceBrand: any; + + private registeredWindowIds = new Set(); + + constructor( + private windowServer: IPCServer, + @IWindowsMainService private windowsService: IWindowsMainService + ) { } + + registerWindowDriver(windowId: number): TPromise { + this.registeredWindowIds.add(windowId); + return TPromise.as(null); + } + + async getWindowIds(): TPromise { + return this.windowsService.getWindows() + .map(w => w.id) + .filter(id => this.registeredWindowIds.has(id)); + } + + getElements(windowId: number, selector: string): TPromise { + const router = new WindowRouter(windowId); + const windowDriverChannel = this.windowServer.getChannel('windowDriver', router); + const windowDriver = new WindowDriverChannelClient(windowDriverChannel); + + return windowDriver.getElements(selector); + } +} + +export async function serve( + windowServer: IPCServer, + handle: string, + instantiationService: IInstantiationService +): TPromise { + const driver = instantiationService.createInstance(Driver, windowServer); + + const windowDriverRegistryChannel = new WindowDriverRegistryChannel(driver); + windowServer.registerChannel('windowDriverRegistry', windowDriverRegistryChannel); + + const server = await serveNet(handle); + const channel = new DriverChannel(driver); + server.registerChannel('driver', channel); + + return combinedDisposable([server, windowServer]); +} \ No newline at end of file diff --git a/src/vs/code/node/driver.ts b/src/vs/platform/driver/node/driver.ts similarity index 90% rename from src/vs/code/node/driver.ts rename to src/vs/platform/driver/node/driver.ts index 9ac3c7936fb..fb61d1d1fa6 100644 --- a/src/vs/code/node/driver.ts +++ b/src/vs/platform/driver/node/driver.ts @@ -6,7 +6,7 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IDriver, DriverChannelClient } from 'vs/code/common/driver'; +import { IDriver, DriverChannelClient } from 'vs/platform/driver/common/driver'; import { connect as connectNet, Client } from 'vs/base/parts/ipc/node/ipc.net'; export async function connect(handle: string): TPromise<{ client: Client, driver: IDriver }> { diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index b5d1817b211..087bbe40d24 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -97,7 +97,7 @@ function openWorkbench(configuration: IWindowConfiguration): TPromise { logService, timerService, storageService - }, mainServices, configuration); + }, mainServices, mainProcessClient, configuration); shell.open(); // Inform user about loading issues from the loader diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 93112309b92..e2312c32a62 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -60,7 +60,7 @@ import { WorkbenchModeServiceImpl } from 'vs/workbench/services/mode/common/work import { IModeService } from 'vs/editor/common/services/modeService'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { ICrashReporterService, NullCrashReporterService, CrashReporterService } from 'vs/workbench/services/crashReporter/electron-browser/crashReporterService'; -import { getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; +import { getDelayedChannel, IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; import { IExtensionManagementChannel, ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; import { IExtensionManagementService, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -95,6 +95,7 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { DialogService } from 'vs/workbench/services/dialogs/electron-browser/dialogService'; import { DialogChannel } from 'vs/platform/dialogs/common/dialogIpc'; import { EventType, addDisposableListener, addClass, getClientArea } from 'vs/base/browser/dom'; +import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; /** * Services that we require for the Shell @@ -139,7 +140,7 @@ export class WorkbenchShell { private configuration: IWindowConfiguration; private workbench: Workbench; - constructor(container: HTMLElement, coreServices: ICoreServices, mainProcessServices: ServiceCollection, configuration: IWindowConfiguration) { + constructor(container: HTMLElement, coreServices: ICoreServices, mainProcessServices: ServiceCollection, mainProcessClient: IPCClient, configuration: IWindowConfiguration) { this.container = container; this.configuration = configuration; @@ -155,6 +156,11 @@ export class WorkbenchShell { this.toUnbind = []; this.previousErrorTime = 0; + + if (coreServices.environmentService.driverHandle) { + registerWindowDriver(mainProcessClient, configuration.windowId) + .then(disposable => this.toUnbind.push(disposable)); + } } private createContents(parent: HTMLElement): HTMLElement { diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 8abd445baeb..59b6f83cee9 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -9,7 +9,6 @@ import { ScreenCapturer } from './helpers/screenshot'; import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; import * as cp from 'child_process'; -import * as assert from 'assert'; import { CodeDriver } from './driver'; import { Code, spawn, SpawnOptions } from './vscode/code'; @@ -260,7 +259,7 @@ export class SpectronApplication { this._screenCapturer = new ScreenCapturer(null as any, this._suiteName, ''); - const driver = new CodeDriver(this.codeInstance.driver); + const driver = new CodeDriver(this.codeInstance.driver, this.options.verbose); this._api = new API(driver, this.screenCapturer, this.options.waitTime); this._workbench = new Workbench(this._api, this.keybindings, this.userDataPath); } @@ -271,8 +270,17 @@ export class SpectronApplication { return; } - const windows = await this.codeInstance.driver.getWindows(); - assert.ok(windows.length > 0, 'theres more than one window'); + let retries = 0; + + while (++retries < 50) { + const ids = await this.codeInstance.driver.getWindowIds(); + + if (ids.length > 0) { + break; + } + + await new Promise(c => setTimeout(c, 100)); + } await this.api.waitForElement('.monaco-workbench'); } diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index 409c73097c7..00789e1abf6 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -131,33 +131,93 @@ export class SpectronDriver implements Driver { export class CodeDriver implements Driver { - constructor(driver: IDriver) { } + constructor( + private driver: IDriver, + private verbose: boolean + ) { } + + private _activeWindowId: number | undefined = undefined; + + private async getWindowId(): Promise { + if (typeof this._activeWindowId !== 'number') { + const windows = await this.driver.getWindowIds(); + this._activeWindowId = windows[0]; + } + + return this._activeWindowId; + } keys(keys: string[]): Promise { + if (this.verbose) { + console.log('- keys:', keys); + } + throw new Error('Method not implemented.'); } + click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { + if (this.verbose) { + console.log('- click:', selector); + } + throw new Error('Method not implemented.'); } + doubleClick(selector: string): Promise { + if (this.verbose) { + console.log('- doubleClick:', selector); + } + throw new Error('Method not implemented.'); } + move(selector: string): Promise { + if (this.verbose) { + console.log('- move:', selector); + } + throw new Error('Method not implemented.'); } + setValue(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- setValue:', selector, text); + } + throw new Error('Method not implemented.'); } + getTitle(): Promise { + if (this.verbose) { + console.log('- getTitle:'); + } + throw new Error('Method not implemented.'); } + isActiveElement(selector: string): Promise { + if (this.verbose) { + console.log('- isActiveElement:', selector); + } + throw new Error('Method not implemented.'); } - getElements(selector: string): Promise { - throw new Error('Method not implemented.'); + + async getElements(selector: string): Promise { + if (this.verbose) { + console.log('- getElements:', selector); + } + + const windowId = await this.getWindowId(); + const result = await this.driver.getElements(windowId, selector); + return result; } + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ + if (this.verbose) { + console.log('- selectorExecute:', selector); + } + throw new Error('Method not implemented.'); } } \ No newline at end of file diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index 3eb37072a1c..a2223ca7938 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -76,6 +76,7 @@ export interface SpawnOptions { codePath?: string; userDataDir: string; extensionsPath: string; + verbose: boolean; } export async function connect(child: cp.ChildProcess, outPath: string, handlePath: string): Promise { @@ -123,7 +124,13 @@ export async function spawn(options: SpawnOptions): Promise { args.unshift(repoPath); } - const child = cp.spawn(electronPath, args); + const spawnOptions: cp.SpawnOptions = {}; + + if (options.verbose) { + spawnOptions.stdio = 'inherit'; + } + + const child = cp.spawn(electronPath, args, spawnOptions); instances.add(child); child.once('exit', () => instances.delete(child)); diff --git a/test/smoke/src/vscode/driver.d.ts b/test/smoke/src/vscode/driver.d.ts index 6d417e693df..d405e1181a6 100644 --- a/test/smoke/src/vscode/driver.d.ts +++ b/test/smoke/src/vscode/driver.d.ts @@ -3,13 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -export interface IWindow { - id: string; +export interface IElement { + tagName: string; + className: string; + textContent: string; } export interface IDriver { _serviceBrand: any; - getWindows(): Promise; + getWindowIds(): Promise; + getElements(windowId: number, selector: string): Promise; } export interface IDisposable { diff --git a/test/smoke/src/vscode/driver.js b/test/smoke/src/vscode/driver.js index 7ff3b7964f0..24af32d436f 100644 --- a/test/smoke/src/vscode/driver.js +++ b/test/smoke/src/vscode/driver.js @@ -8,5 +8,5 @@ const path = require('path'); exports.connect = function (outPath, handle) { const bootstrapPath = path.join(outPath, 'bootstrap-amd.js'); const { bootstrap } = require(bootstrapPath); - return new Promise((c, e) => bootstrap('vs/code/node/driver', ({ connect }) => connect(handle).then(c, e), e)); + return new Promise((c, e) => bootstrap('vs/platform/driver/node/driver', ({ connect }) => connect(handle).then(c, e), e)); }; \ No newline at end of file diff --git a/test/smoke/test/mocha.opts b/test/smoke/test/mocha.opts index abe0700d60d..ce88473e86b 100644 --- a/test/smoke/test/mocha.opts +++ b/test/smoke/test/mocha.opts @@ -1,3 +1,3 @@ ---timeout 5000 +--timeout 20000 --slow 2000 out/main.js \ No newline at end of file diff --git a/test/smoke/tools/prebuild.js b/test/smoke/tools/prebuild.js index 16b1a3f4f3d..fedf0c28432 100644 --- a/test/smoke/tools/prebuild.js +++ b/test/smoke/tools/prebuild.js @@ -7,7 +7,7 @@ const fs = require('fs'); const path = require('path'); const root = path.dirname(path.dirname(path.dirname(__dirname))); -const driverPath = path.join(root, 'src/vs/code/common/driver.ts'); +const driverPath = path.join(root, 'src/vs/platform/driver/common/driver.ts'); let contents = fs.readFileSync(driverPath, 'utf8'); contents = /\/\/\*START([\s\S]*)\/\/\*END/mi.exec(contents)[1].trim(); From f53e87d70bc6d6c87ef3b09b0d3af6c3c6476cf5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 6 Apr 2018 18:17:55 +0200 Subject: [PATCH 047/710] open correct workspace --- test/smoke/src/application.ts | 8 +++++++- test/smoke/src/vscode/code.ts | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 59b6f83cee9..1d7294c1ed0 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -218,7 +218,13 @@ export class SpectronApplication { // opts.webdriverLogPath = webdriverLogsPath; // } - this.codeInstance = await spawn(this.options); + this.codeInstance = await spawn({ + codePath: this.options.codePath, + workspacePath: workspaceOrFolder, + userDataDir: this.options.userDataDir, + extensionsPath: this.options.extensionsPath, + verbose: this.options.verbose + }); // if (testsuiteRootPath) { // // Collect logs diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index a2223ca7938..b7604d04e4a 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -74,6 +74,7 @@ export class Code { export interface SpawnOptions { codePath?: string; + workspacePath: string; userDataDir: string; extensionsPath: string; verbose: boolean; @@ -109,6 +110,7 @@ export async function spawn(options: SpawnOptions): Promise { const handlePath = await new Promise((c, e) => tmpName((err, handlePath) => err ? e(err) : c(handlePath))); const args = [ + options.workspacePath, '--skip-getting-started', '--skip-release-notes', '--sticky-quickopen', From 9a5268564a682b8f9c9106432e5f844180981af6 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Sun, 8 Apr 2018 09:46:59 -0400 Subject: [PATCH 048/710] Fixed isInsalled typo in source --- .../parts/extensions/electron-browser/extensionsViewlet.ts | 2 +- .../parts/extensions/electron-browser/extensionsViews.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 1a3afdd8357..ea9dc91ed78 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -376,7 +376,7 @@ export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtens private async doSearch(): TPromise { const value = this.searchBox.value || ''; this.searchExtensionsContextKey.set(!!value); - this.searchInstalledExtensionsContextKey.set(InstalledExtensionsView.isInsalledExtensionsQuery(value)); + this.searchInstalledExtensionsContextKey.set(InstalledExtensionsView.isInstalledExtensionsQuery(value)); this.searchBuiltInExtensionsContextKey.set(ExtensionsListView.isBuiltInExtensionsQuery(value)); this.recommendedExtensionsContextKey.set(ExtensionsListView.isRecommendedExtensionsQuery(value)); this.nonEmptyWorkspaceContextKey.set(this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts index 07dd776deb6..4254ca51b1e 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts @@ -559,7 +559,7 @@ export class ExtensionsListView extends ViewsViewletPanel { export class InstalledExtensionsView extends ExtensionsListView { - public static isInsalledExtensionsQuery(query: string): boolean { + public static isInstalledExtensionsQuery(query: string): boolean { return ExtensionsListView.isInstalledExtensionsQuery(query) || ExtensionsListView.isOutdatedExtensionsQuery(query) || ExtensionsListView.isDisabledExtensionsQuery(query) @@ -567,7 +567,7 @@ export class InstalledExtensionsView extends ExtensionsListView { } async show(query: string): TPromise> { - if (InstalledExtensionsView.isInsalledExtensionsQuery(query)) { + if (InstalledExtensionsView.isInstalledExtensionsQuery(query)) { return super.show(query); } let searchInstalledQuery = '@installed'; From 5d9d2d127fd13d691d0e0730070ba72b37b68bfe Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 9 Apr 2018 07:38:08 -0700 Subject: [PATCH 049/710] Work in progress for exposing all terminals via API --- src/vs/vscode.proposed.d.ts | 8 ++++ .../mainThreadTerminalService.ts | 5 +++ src/vs/workbench/api/node/extHost.api.impl.ts | 3 ++ src/vs/workbench/api/node/extHost.protocol.ts | 1 + .../api/node/extHostTerminalService.ts | 38 ++++++++++++++----- .../parts/terminal/common/terminal.ts | 1 + .../parts/terminal/common/terminalService.ts | 3 ++ .../electron-browser/terminalService.ts | 1 + .../terminal/electron-browser/terminalTab.ts | 2 + 9 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b4a2aabc165..3328a19eabe 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -769,4 +769,12 @@ declare module 'vscode' { } //#endregion + + //#region Terminal + + export namespace window { + export const onDidOpenTerminal: Event; + } + + //#endregion } diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index ee934a107b5..3911dc347bd 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -22,6 +22,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalService); this._toDispose = []; + this._toDispose.push(terminalService.onInstanceCreated((terminalInstance) => this._onTerminalOpened(terminalInstance))); this._toDispose.push(terminalService.onInstanceDisposed((terminalInstance) => this._onTerminalDisposed(terminalInstance))); this._toDispose.push(terminalService.onInstanceProcessIdReady((terminalInstance) => this._onTerminalProcessIdReady(terminalInstance))); } @@ -78,6 +79,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy.$acceptTerminalClosed(terminalInstance.id); } + private _onTerminalOpened(terminalInstance: ITerminalInstance): void { + this._proxy.$acceptTerminalOpened(terminalInstance.id, terminalInstance.title); + } + private _onTerminalProcessIdReady(terminalInstance: ITerminalInstance): void { this._proxy.$acceptTerminalProcessId(terminalInstance.id, terminalInstance.processId); } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index da7a17f7d25..3ccab97e133 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -351,6 +351,9 @@ export function createApiFactory( onDidCloseTerminal(listener, thisArg?, disposables?) { return extHostTerminalService.onDidCloseTerminal(listener, thisArg, disposables); }, + onDidOpenTerminal(listener, thisArg?, disposables?) { + return extHostTerminalService.onDidOpenTerminal(listener, thisArg, disposables); + }, get state() { return extHostWindow.state; }, diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 44e0ba2ce5b..c2902a8e204 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -728,6 +728,7 @@ export interface ExtHostQuickOpenShape { export interface ExtHostTerminalServiceShape { $acceptTerminalClosed(id: number): void; + $acceptTerminalOpened(id: number, name: string): void; $acceptTerminalProcessId(id: number, processId: number): void; } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 2a0f3081e2b..c0331705cf5 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -20,12 +20,7 @@ export class ExtHostTerminal implements vscode.Terminal { constructor( proxy: MainThreadTerminalServiceShape, - name?: string, - shellPath?: string, - shellArgs?: string[], - cwd?: string, - env?: { [key: string]: string }, - waitOnExit?: boolean + name?: string ) { this._name = name; this._queuedRequests = []; @@ -33,8 +28,16 @@ export class ExtHostTerminal implements vscode.Terminal { this._pidPromise = new Promise(c => { this._pidPromiseComplete = c; }); + } - this._proxy.$createTerminal(name, shellPath, shellArgs, cwd, env, waitOnExit).then((id) => { + public create( + shellPath?: string, + shellArgs?: string[], + cwd?: string, + env?: { [key: string]: string }, + waitOnExit?: boolean + ): void { + this._proxy.$createTerminal(this._name, shellPath, shellArgs, cwd, env, waitOnExit).then((id) => { this._id = id; this._queuedRequests.forEach((r) => { r.run(this._proxy, this._id); @@ -99,23 +102,27 @@ export class ExtHostTerminal implements vscode.Terminal { export class ExtHostTerminalService implements ExtHostTerminalServiceShape { private readonly _onDidCloseTerminal: Emitter; + private readonly _onDidOpenTerminal: Emitter; private _proxy: MainThreadTerminalServiceShape; private _terminals: ExtHostTerminal[]; constructor(mainContext: IMainContext) { this._onDidCloseTerminal = new Emitter(); + this._onDidOpenTerminal = new Emitter(); this._proxy = mainContext.getProxy(MainContext.MainThreadTerminalService); this._terminals = []; } public createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): vscode.Terminal { - let terminal = new ExtHostTerminal(this._proxy, name, shellPath, shellArgs); + let terminal = new ExtHostTerminal(this._proxy, name); + terminal.create(shellPath, shellArgs); this._terminals.push(terminal); return terminal; } public createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal { - let terminal = new ExtHostTerminal(this._proxy, options.name, options.shellPath, options.shellArgs, options.cwd, options.env /*, options.waitOnExit*/); + let terminal = new ExtHostTerminal(this._proxy, options.name); + terminal.create(options.shellPath, options.shellArgs, options.cwd, options.env /*, options.waitOnExit*/); this._terminals.push(terminal); return terminal; } @@ -124,6 +131,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return this._onDidCloseTerminal && this._onDidCloseTerminal.event; } + public get onDidOpenTerminal(): Event { + return this._onDidOpenTerminal && this._onDidOpenTerminal.event; + } + public $acceptTerminalClosed(id: number): void { let index = this._getTerminalIndexById(id); if (index === null) { @@ -134,6 +145,15 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { this._onDidCloseTerminal.fire(terminal); } + // TOOD: How do we set PID + // TODO: Make sure both API terminals and non-API terminals are created correctly + public $acceptTerminalOpened(id: number, name: string): void { + // TODO: Only create a terminal if it doesn't already exist for the ID + let terminal = new ExtHostTerminal(this._proxy, name); + this._terminals.push(terminal); + this._onDidOpenTerminal.fire(terminal); + } + public $acceptTerminalProcessId(id: number, processId: number): void { let terminal = this._getTerminalById(id); if (terminal) { diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index ed019f21ef7..2fcfe1c89b7 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -149,6 +149,7 @@ export interface ITerminalService { configHelper: ITerminalConfigHelper; onActiveTabChanged: Event; onTabDisposed: Event; + onInstanceCreated: Event; onInstanceDisposed: Event; onInstanceProcessIdReady: Event; onInstancesChanged: Event; diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index 104182733c6..a3534b05ff0 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -24,6 +24,7 @@ export abstract class TerminalService implements ITerminalService { protected _terminalContainer: HTMLElement; protected _onInstancesChanged: Emitter; protected _onTabDisposed: Emitter; + protected _onInstanceCreated: Emitter; protected _onInstanceDisposed: Emitter; protected _onInstanceProcessIdReady: Emitter; protected _onInstanceTitleChanged: Emitter; @@ -36,6 +37,7 @@ export abstract class TerminalService implements ITerminalService { public get activeTabIndex(): number { return this._activeTabIndex; } public get onActiveTabChanged(): Event { return this._onActiveTabChanged.event; } public get onTabDisposed(): Event { return this._onTabDisposed.event; } + public get onInstanceCreated(): Event { return this._onInstanceCreated.event; } public get onInstanceDisposed(): Event { return this._onInstanceDisposed.event; } public get onInstanceProcessIdReady(): Event { return this._onInstanceProcessIdReady.event; } public get onInstanceTitleChanged(): Event { return this._onInstanceTitleChanged.event; } @@ -57,6 +59,7 @@ export abstract class TerminalService implements ITerminalService { this._onActiveTabChanged = new Emitter(); this._onTabDisposed = new Emitter(); + this._onInstanceCreated = new Emitter(); this._onInstanceDisposed = new Emitter(); this._onInstanceProcessIdReady = new Emitter(); this._onInstanceTitleChanged = new Emitter(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index a09efd1925d..715cf6d3609 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -82,6 +82,7 @@ export class TerminalService extends AbstractTerminalService implements ITermina // It's the first instance so it should be made active automatically this.setActiveInstanceByIndex(0); } + this._onInstanceCreated.fire(instance); this._onInstancesChanged.fire(); this._suggestShellChange(wasNewTerminalAction); return instance; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts index 55eb0c497b3..30b324f6b3d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts @@ -402,6 +402,8 @@ export class TerminalTab extends Disposable implements ITerminalTab { shellLaunchConfig); this._terminalInstances.splice(this._activeInstanceIndex + 1, 0, instance); this._initInstanceListeners(instance); + // TODO: Ensure change event is fired + // TODO: Fire create event on service this._setActiveInstance(instance); if (this._splitPaneContainer) { From cae4b9d2157028c56b2aadc3b3a884ae669a7dca Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 9 Apr 2018 10:48:29 -0400 Subject: [PATCH 050/710] Allowed preceding spaces in fileActions.ts file names --- .../parts/files/electron-browser/fileActions.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 7832bc03939..22743868e6a 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1414,13 +1414,12 @@ export function getWellFormedFileName(filename: string): string { return filename; } - // Trim whitespaces - filename = strings.trim(strings.trim(filename, ' '), '\t'); + // Trim tabs + filename = strings.trim(filename, '\t'); - // Remove trailing dots + // Remove trailing dots, slashes, and spaces filename = strings.rtrim(filename, '.'); - - // Remove trailing slashes + filename = strings.rtrim(filename, ' '); filename = strings.rtrim(filename, '/'); filename = strings.rtrim(filename, '\\'); From 056db45213860f6098cdebf5058e894925c7ba4c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 9 Apr 2018 18:56:50 +0200 Subject: [PATCH 051/710] driver: dispatchKeybindings --- .../standalone/browser/simpleServices.ts | 2 +- .../test/browser/simpleServices.test.ts | 2 +- src/vs/platform/driver/common/driver.ts | 14 +++++ .../driver/electron-browser/driver.ts | 52 ++++++++++++++++++- .../platform/driver/electron-main/driver.ts | 16 ++++-- .../common/abstractKeybindingService.ts | 2 +- .../platform/keybinding/common/keybinding.ts | 5 ++ .../common/abstractKeybindingService.test.ts | 2 +- .../test/common/mockKeybindingService.ts | 4 ++ src/vs/workbench/electron-browser/shell.ts | 10 +--- .../workbench/electron-browser/workbench.ts | 11 +++- .../electron-browser/keybindingService.ts | 2 +- test/smoke/src/api.ts | 6 +-- test/smoke/src/areas/debug/debug.ts | 2 +- test/smoke/src/areas/editor/editor.ts | 2 +- test/smoke/src/areas/editor/peek.ts | 2 +- .../smoke/src/areas/explorer/explorer.test.ts | 4 +- .../src/areas/preferences/keybindings.ts | 5 +- .../src/areas/preferences/preferences.test.ts | 4 +- test/smoke/src/areas/preferences/settings.ts | 5 +- test/smoke/src/areas/quickopen/quickopen.ts | 8 +-- test/smoke/src/areas/search/search.ts | 2 +- test/smoke/src/areas/terminal/terminal.ts | 2 +- test/smoke/src/areas/workbench/workbench.ts | 27 +--------- test/smoke/src/driver.ts | 18 +++---- test/smoke/src/vscode/driver.d.ts | 1 + 26 files changed, 132 insertions(+), 78 deletions(-) diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index a09429f1137..e928613fb9b 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -360,7 +360,7 @@ export class StandaloneKeybindingService extends AbstractKeybindingService { this.toDispose.push(dom.addDisposableListener(domNode, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { let keyEvent = new StandardKeyboardEvent(e); - let shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target); + let shouldPreventDefault = this.dispatchEvent(keyEvent, keyEvent.target); if (shouldPreventDefault) { keyEvent.preventDefault(); } diff --git a/src/vs/editor/standalone/test/browser/simpleServices.test.ts b/src/vs/editor/standalone/test/browser/simpleServices.test.ts index e13eab64aa9..ef3756c76c8 100644 --- a/src/vs/editor/standalone/test/browser/simpleServices.test.ts +++ b/src/vs/editor/standalone/test/browser/simpleServices.test.ts @@ -17,7 +17,7 @@ suite('StandaloneKeybindingService', () => { class TestStandaloneKeybindingService extends StandaloneKeybindingService { public testDispatch(e: IKeyboardEvent): void { - super._dispatch(e, null); + super.dispatchEvent(e, null); } } diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 6c7b6705d9e..826415b59f3 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -23,12 +23,14 @@ export interface IDriver { _serviceBrand: any; getWindowIds(): TPromise; getElements(windowId: number, selector: string): TPromise; + dispatchKeybinding(windowId: number, keybinding: string): TPromise; } //*END export interface IDriverChannel extends IChannel { call(command: 'getWindowIds'): TPromise; call(command: 'getElements', arg: [number, string]): TPromise; + call(command: 'dispatchKeybinding', arg: [number, string]): TPromise; call(command: string, arg: any): TPromise; } @@ -40,6 +42,7 @@ export class DriverChannel implements IDriverChannel { switch (command) { case 'getWindowIds': return this.driver.getWindowIds(); case 'getElements': return this.driver.getElements(arg[0], arg[1]); + case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg[0], arg[1]); } return undefined; @@ -59,6 +62,10 @@ export class DriverChannelClient implements IDriver { getElements(windowId: number, selector: string): TPromise { return this.channel.call('getElements', [windowId, selector]); } + + dispatchKeybinding(windowId: number, keybinding: string): TPromise { + return this.channel.call('dispatchKeybinding', [windowId, keybinding]); + } } export interface IWindowDriverRegistry { @@ -96,10 +103,12 @@ export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry export interface IWindowDriver { getElements(selector: string): TPromise; + dispatchKeybinding(keybinding: string): TPromise; } export interface IWindowDriverChannel extends IChannel { call(command: 'getElements', arg: string): TPromise; + call(command: 'dispatchKeybinding', arg: string): TPromise; call(command: string, arg: any): TPromise; } @@ -110,6 +119,7 @@ export class WindowDriverChannel implements IWindowDriverChannel { call(command: string, arg?: any): TPromise { switch (command) { case 'getElements': return this.driver.getElements(arg); + case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg); } return undefined; @@ -125,4 +135,8 @@ export class WindowDriverChannelClient implements IWindowDriver { getElements(selector: string): TPromise { return this.channel.call('getElements', selector); } + + dispatchKeybinding(keybinding: string): TPromise { + return this.channel.call('dispatchKeybinding', keybinding); + } } \ No newline at end of file diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 55949acb636..2e6d60b0903 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -9,9 +9,53 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/common/driver'; import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; +import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; +import { SimpleKeybinding } from 'vs/base/common/keyCodes'; +import { ScanCodeBinding, IMMUTABLE_KEY_CODE_TO_CODE, ScanCodeUtils } from 'vs/workbench/services/keybinding/common/scanCode'; +import { IKeybindingService, IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; class WindowDriver implements IWindowDriver { + constructor( + @IKeybindingService private keybindingService: IKeybindingService + ) { } + + async dispatchKeybinding(rawKeybinding: string): TPromise { + const [first, second] = KeybindingIO._readUserBinding(rawKeybinding); + + this._dispatchKeybinding(first); + + if (second) { + this._dispatchKeybinding(second); + } + } + + private _dispatchKeybinding(keybinding: SimpleKeybinding | ScanCodeBinding): void { + if (keybinding instanceof ScanCodeBinding) { + throw new Error('ScanCodeBindings not supported'); + } + + const scanCode = IMMUTABLE_KEY_CODE_TO_CODE[keybinding.keyCode]; + const event: IKeyboardEvent = { + ctrlKey: keybinding.ctrlKey, + altKey: keybinding.altKey, + shiftKey: keybinding.shiftKey, + metaKey: keybinding.metaKey, + keyCode: keybinding.keyCode, + code: ScanCodeUtils.toString(scanCode) + }; + + this.keybindingService.dispatchEvent(event, document.activeElement); + + // console.log(keybinding); + + // const e = new KeyboardEvent('keydown', event); + // console.log('dispatching', e); + // document.activeElement.dispatchEvent(e); + // document.activeElement.dispatchEvent(new KeyboardEvent('keyup', event)); + } + async getElements(selector: string): TPromise { const query = document.querySelectorAll(selector); const result: IElement[] = []; @@ -30,8 +74,12 @@ class WindowDriver implements IWindowDriver { } } -export async function registerWindowDriver(client: IPCClient, windowId: number): TPromise { - const windowDriver = new WindowDriver(); +export async function registerWindowDriver( + client: IPCClient, + windowId: number, + instantiationService: IInstantiationService +): TPromise { + const windowDriver = instantiationService.createInstance(WindowDriver); const windowDriverChannel = new WindowDriverChannel(windowDriver); client.registerChannel('windowDriver', windowDriverChannel); diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 36bc9753135..f456136c777 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -6,7 +6,7 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IDriver, DriverChannel, IElement, IWindowDriverChannel, WindowDriverChannelClient, IWindowDriverRegistry, WindowDriverRegistryChannel } from 'vs/platform/driver/common/driver'; +import { IDriver, DriverChannel, IElement, IWindowDriverChannel, WindowDriverChannelClient, IWindowDriverRegistry, WindowDriverRegistryChannel, IWindowDriver } from 'vs/platform/driver/common/driver'; import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; import { serve as serveNet } from 'vs/base/parts/ipc/node/ipc.net'; import { combinedDisposable, IDisposable } from 'vs/base/common/lifecycle'; @@ -45,11 +45,19 @@ export class Driver implements IDriver, IWindowDriverRegistry { } getElements(windowId: number, selector: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.getElements(selector); + } + + dispatchKeybinding(windowId: number, keybinding: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.dispatchKeybinding(keybinding); + } + + private getWindowDriver(windowId: number): IWindowDriver { const router = new WindowRouter(windowId); const windowDriverChannel = this.windowServer.getChannel('windowDriver', router); - const windowDriver = new WindowDriverChannelClient(windowDriverChannel); - - return windowDriver.getElements(selector); + return new WindowDriverChannelClient(windowDriverChannel); } } diff --git a/src/vs/platform/keybinding/common/abstractKeybindingService.ts b/src/vs/platform/keybinding/common/abstractKeybindingService.ts index 8e41b285347..abf8f7246f6 100644 --- a/src/vs/platform/keybinding/common/abstractKeybindingService.ts +++ b/src/vs/platform/keybinding/common/abstractKeybindingService.ts @@ -114,7 +114,7 @@ export abstract class AbstractKeybindingService implements IKeybindingService { return this._getResolver().resolve(contextValue, currentChord, firstPart); } - protected _dispatch(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean { + dispatchEvent(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean { let shouldPreventDefault = false; const keybinding = this.resolveKeyboardEvent(e); diff --git a/src/vs/platform/keybinding/common/keybinding.ts b/src/vs/platform/keybinding/common/keybinding.ts index c491ec7a8d0..dde18ad1da3 100644 --- a/src/vs/platform/keybinding/common/keybinding.ts +++ b/src/vs/platform/keybinding/common/keybinding.ts @@ -77,5 +77,10 @@ export interface IKeybindingService { getKeybindings(): ResolvedKeybindingItem[]; customKeybindingsCount(): number; + + /** + * For simulation purposes (eg, smoke test) + */ + dispatchEvent(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean; } diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index 44ea5de8c5d..032e9138c9c 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -70,7 +70,7 @@ suite('AbstractKeybindingService', () => { public testDispatch(kb: number): boolean { const keybinding = createSimpleKeybinding(kb, OS); - return this._dispatch({ + return this.dispatchEvent({ ctrlKey: keybinding.ctrlKey, shiftKey: keybinding.shiftKey, altKey: keybinding.altKey, diff --git a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts index 99c88c4fa06..8a44c7bd8db 100644 --- a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts +++ b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts @@ -120,4 +120,8 @@ export class MockKeybindingService implements IKeybindingService { public softDispatch(keybinding: IKeyboardEvent, target: IContextKeyServiceTarget): IResolveResult { return null; } + + dispatchEvent(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean { + return false; + } } diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index e2312c32a62..932e9288f43 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -95,7 +95,6 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { DialogService } from 'vs/workbench/services/dialogs/electron-browser/dialogService'; import { DialogChannel } from 'vs/platform/dialogs/common/dialogIpc'; import { EventType, addDisposableListener, addClass, getClientArea } from 'vs/base/browser/dom'; -import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; /** * Services that we require for the Shell @@ -140,7 +139,7 @@ export class WorkbenchShell { private configuration: IWindowConfiguration; private workbench: Workbench; - constructor(container: HTMLElement, coreServices: ICoreServices, mainProcessServices: ServiceCollection, mainProcessClient: IPCClient, configuration: IWindowConfiguration) { + constructor(container: HTMLElement, coreServices: ICoreServices, mainProcessServices: ServiceCollection, private mainProcessClient: IPCClient, configuration: IWindowConfiguration) { this.container = container; this.configuration = configuration; @@ -156,11 +155,6 @@ export class WorkbenchShell { this.toUnbind = []; this.previousErrorTime = 0; - - if (coreServices.environmentService.driverHandle) { - registerWindowDriver(mainProcessClient, configuration.windowId) - .then(disposable => this.toUnbind.push(disposable)); - } } private createContents(parent: HTMLElement): HTMLElement { @@ -195,7 +189,7 @@ export class WorkbenchShell { private createWorkbench(instantiationService: IInstantiationService, serviceCollection: ServiceCollection, parent: HTMLElement, workbenchContainer: HTMLElement): Workbench { try { - const workbench = instantiationService.createInstance(Workbench, parent, workbenchContainer, this.configuration, serviceCollection, this.lifecycleService); + const workbench = instantiationService.createInstance(Workbench, parent, workbenchContainer, this.configuration, serviceCollection, this.lifecycleService, this.mainProcessClient); // Set lifecycle phase to `Restoring` this.lifecycleService.phase = LifecyclePhase.Restoring; diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index e4e9cc79e7f..d799f2c7136 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -106,6 +106,8 @@ import { NotificationsAlerts } from 'vs/workbench/browser/parts/notifications/no import { NotificationsStatus } from 'vs/workbench/browser/parts/notifications/notificationsStatus'; import { registerNotificationCommands } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { NotificationsToasts } from 'vs/workbench/browser/parts/notifications/notificationsToasts'; +import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; +import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); export const InZenModeContext = new RawContextKey('inZenMode', false); @@ -231,9 +233,10 @@ export class Workbench implements IPartService { constructor( parent: HTMLElement, container: HTMLElement, - configuration: IWindowConfiguration, + private configuration: IWindowConfiguration, serviceCollection: ServiceCollection, private lifecycleService: LifecycleService, + private mainProcessClient: IPCClient, @IInstantiationService private instantiationService: IInstantiationService, @IWorkspaceContextService private contextService: IWorkspaceContextService, @IStorageService private storageService: IStorageService, @@ -318,6 +321,12 @@ export class Workbench implements IPartService { // Workbench Layout this.createWorkbenchLayout(); + // Driver + if (this.environmentService.driverHandle) { + registerWindowDriver(this.mainProcessClient, this.configuration.windowId, this.instantiationService) + .then(disposable => this.toUnbind.push(disposable)); + } + // Restore Parts return this.restoreParts(); } diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index 94cce17a1d0..53a383766df 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -313,7 +313,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { this.toDispose.push(dom.addDisposableListener(windowElement, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { let keyEvent = new StandardKeyboardEvent(e); - let shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target); + let shouldPreventDefault = this.dispatchEvent(keyEvent, keyEvent.target); if (shouldPreventDefault) { keyEvent.preventDefault(); } diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index b6d29b07f4f..a2f8b5ce21d 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -11,7 +11,7 @@ export class API { // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding // the time it takes for the actual retry call to complete private retryCount: number; - private readonly retryDuration = 100; // in milliseconds + private readonly retryDuration = 1000; // in milliseconds constructor( private driver: Driver, @@ -21,8 +21,8 @@ export class API { this.retryCount = (waitTime * 1000) / this.retryDuration; } - keys(keys: string[]): Promise { - return this.driver.keys(keys); + dispatchKeybinding(keybinding: string): Promise { + return this.driver.dispatchKeybinding(keybinding); } waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 67d4224e15f..b346f7395c9 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -120,7 +120,7 @@ export class Debug extends Viewlet { // Wait for the keys to be picked up by the editor model such that repl evalutes what just got typed await this.editor.waitForEditorContents('debug:input', s => s.indexOf(text) >= 0); - await this.api.keys(['Enter', 'NULL']); + await this.api.dispatchKeybinding('enter'); await this.api.waitForElement(CONSOLE_INPUT_OUTPUT); await this.api.waitFor(async () => { const result = await this.getConsoleOutput(); diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 26f6e2ed8eb..74486d947b3 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -34,7 +34,7 @@ export class Editor { await this.api.waitForActiveElement(RENAME_INPUT); await this.api.setValue(RENAME_INPUT, to); - await this.api.keys(['Enter', 'NULL']); + await this.api.dispatchKeybinding('enter'); } async gotoDefinition(term: string, line: number): Promise { diff --git a/test/smoke/src/areas/editor/peek.ts b/test/smoke/src/areas/editor/peek.ts index 5d68eb38c1b..fe094cdb683 100644 --- a/test/smoke/src/areas/editor/peek.ts +++ b/test/smoke/src/areas/editor/peek.ts @@ -34,7 +34,7 @@ export class References { } async close(): Promise { - await this.api.keys(['Escape', 'NULL']); + await this.api.dispatchKeybinding('escape'); await this.api.waitForElement(References.REFERENCES_WIDGET, element => !element); } } \ No newline at end of file diff --git a/test/smoke/src/areas/explorer/explorer.test.ts b/test/smoke/src/areas/explorer/explorer.test.ts index 9829cff95f8..a18c7ec6f0c 100644 --- a/test/smoke/src/areas/explorer/explorer.test.ts +++ b/test/smoke/src/areas/explorer/explorer.test.ts @@ -25,7 +25,7 @@ export function setup() { await app.workbench.quickopen.openQuickOpen('.js'); await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.api.keys(['Escape', 'NULL']); + await app.api.dispatchKeybinding('escape'); }); it('quick open respects fuzzy matching', async function () { @@ -38,7 +38,7 @@ export function setup() { await app.workbench.quickopen.openQuickOpen('a.s'); await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.api.keys(['Escape', 'NULL']); + await app.api.dispatchKeybinding('escape'); }); }); } \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/keybindings.ts b/test/smoke/src/areas/preferences/keybindings.ts index ef50ff850dc..014dff290a3 100644 --- a/test/smoke/src/areas/preferences/keybindings.ts +++ b/test/smoke/src/areas/preferences/keybindings.ts @@ -12,7 +12,7 @@ export class KeybindingsEditor { constructor(private api: API, private commands: Commands) { } - async updateKeybinding(command: string, keys: string[], ariaLabel: string): Promise { + async updateKeybinding(command: string, keybinding: string, ariaLabel: string): Promise { await this.commands.runCommand('workbench.action.openGlobalKeybindings'); await this.api.waitForActiveElement(SEARCH_INPUT); await this.api.setValue(SEARCH_INPUT, command); @@ -23,7 +23,8 @@ export class KeybindingsEditor { await this.api.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item .action-item .icon.add'); await this.api.waitForElement('.defineKeybindingWidget .monaco-inputbox.synthetic-focus'); - await this.api.keys([...keys, 'NULL', 'Enter', 'NULL']); + await this.api.dispatchKeybinding(keybinding); + await this.api.dispatchKeybinding('enter'); await this.api.waitForElement(`div[aria-label="Keybindings"] div[aria-label="Keybinding is ${ariaLabel}."]`); } } \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index 8d59aa7799e..fc1dccb8d6d 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -32,9 +32,9 @@ export function setup() { const app = this.app as SpectronApplication; assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.LEFT), 'Activity bar should be positioned on the left.'); - await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', ['Control', 'u'], 'Control+U'); + await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', 'ctrl+u', 'Control+U'); - await app.api.keys(['Control', 'u', 'NULL']); + await app.api.dispatchKeybinding('ctrl+u'); assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.RIGHT), 'Activity bar was not moved to right after toggling its position.'); }); diff --git a/test/smoke/src/areas/preferences/settings.ts b/test/smoke/src/areas/preferences/settings.ts index 97182736c5a..915af0873ea 100644 --- a/test/smoke/src/areas/preferences/settings.ts +++ b/test/smoke/src/areas/preferences/settings.ts @@ -27,11 +27,10 @@ export class SettingsEditor { await this.api.waitAndClick(SEARCH_INPUT); await this.api.waitForActiveElement(SEARCH_INPUT); - await this.api.keys(['ArrowDown', 'NULL']); + await this.api.dispatchKeybinding('down'); await this.api.waitForActiveElement(EDITOR); - await this.api.keys(['ArrowRight', 'NULL']); - + await this.api.dispatchKeybinding('right'); await this.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value}`, '.editable-preferences-editor-container'); await this.editors.saveOpenedFile(); } diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index f379d398247..a4a14ee2cf3 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -36,7 +36,7 @@ export class QuickOpen { await this.openQuickOpen(fileName); await this.waitForQuickOpenElements(names => names.some(n => n === fileName)); - await this.api.keys(['Enter', 'NULL']); + await this.api.dispatchKeybinding('enter'); await this.editors.waitForActiveTab(fileName); await this.editors.waitForEditorFocus(fileName); } @@ -51,16 +51,16 @@ export class QuickOpen { async submit(text: string): Promise { await this.api.setValue(QuickOpen.QUICK_OPEN_INPUT, text); - await this.api.keys(['Enter', 'NULL']); + await this.api.dispatchKeybinding('enter'); await this.waitForQuickOpenClosed(); } async selectQuickOpenElement(index: number): Promise { await this.waitForQuickOpenOpened(); for (let from = 0; from < index; from++) { - await this.api.keys(['ArrowDown', 'NULL']); + await this.api.dispatchKeybinding('down'); } - await this.api.keys(['Enter', 'NULL']); + await this.api.dispatchKeybinding('enter'); await this.waitForQuickOpenClosed(); } diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index f0fed76a813..3976d4e64c6 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -33,7 +33,7 @@ export class Search extends Viewlet { await this.api.waitAndClick(INPUT); await this.api.waitForActiveElement(INPUT); - await this.api.keys(['Enter', 'NULL']); + await this.api.dispatchKeybinding('enter'); await this.api.waitForElement(`${VIEWLET} .messages[aria-hidden="false"]`); } diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts index 7dabb26e627..231a90b5bfa 100644 --- a/test/smoke/src/areas/terminal/terminal.ts +++ b/test/smoke/src/areas/terminal/terminal.ts @@ -28,7 +28,7 @@ export class Terminal { async runCommand(commandText: string): Promise { // TODO@Tyriar fix this. we should not use type but setValue // await this.spectron.client.type(commandText); - await this.api.keys(['Enter', 'NULL']); + await this.api.dispatchKeybinding('enter'); } async waitForTerminalText(fn: (text: string[]) => boolean, timeOutDescription: string = 'Getting Terminal Text'): Promise { diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index c87ea5a779a..01760d509a0 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -68,32 +68,7 @@ export class Workbench implements Commands { return; } - const keys: string = binding.key; - let keysToPress: string[] = []; - - const chords = keys.split(' '); - chords.forEach((chord) => { - const keys = chord.split('+'); - keys.forEach((key) => keysToPress.push(this.transliterate(key))); - keysToPress.push('NULL'); - }); - - return this.api.keys(keysToPress); - } - - /** - * Transliterates key names from keybindings file to WebdriverIO keyboard actions defined in: - * https://w3c.github.io/webdriver/webdriver-spec.html#keyboard-actions - */ - private transliterate(key: string): string { - switch (key) { - case 'ctrl': - return 'Control'; - case 'cmd': - return 'Meta'; - default: - return key.length === 1 ? key : key.charAt(0).toUpperCase() + key.slice(1); - } + return this.api.dispatchKeybinding(binding.key); } } diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index 00789e1abf6..b3f0e72c77f 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -13,7 +13,7 @@ export interface Element { } export interface Driver { - keys(keys: string[]): Promise; + dispatchKeybinding(keybinding: string): Promise; click(selector: string, xoffset?: number, yoffset?: number): Promise; doubleClick(selector: string): Promise; move(selector: string): Promise; @@ -32,13 +32,8 @@ export class SpectronDriver implements Driver { private verbose: boolean ) { } - keys(keys: string[]): Promise { - if (this.verbose) { - console.log('- keys:', keys); - } - - this.spectronClient.keys(keys); - return Promise.resolve(); + dispatchKeybinding(keybinding: string): Promise { + return Promise.reject(new Error('not implemented')); } async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { @@ -147,12 +142,13 @@ export class CodeDriver implements Driver { return this._activeWindowId; } - keys(keys: string[]): Promise { + async dispatchKeybinding(keybinding: string): Promise { if (this.verbose) { - console.log('- keys:', keys); + console.log('- dispatchKeybinding:', keybinding); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + await this.driver.dispatchKeybinding(windowId, keybinding); } click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { diff --git a/test/smoke/src/vscode/driver.d.ts b/test/smoke/src/vscode/driver.d.ts index d405e1181a6..dce79062e31 100644 --- a/test/smoke/src/vscode/driver.d.ts +++ b/test/smoke/src/vscode/driver.d.ts @@ -13,6 +13,7 @@ export interface IDriver { _serviceBrand: any; getWindowIds(): Promise; getElements(windowId: number, selector: string): Promise; + dispatchKeybinding(windowId: number, keybinding: string): Promise; } export interface IDisposable { From b1435c13f6f4bf8a1eedb40a07cf6452a3216fde Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 9 Apr 2018 10:28:38 -0700 Subject: [PATCH 052/710] Add terminals --- src/vs/vscode.proposed.d.ts | 5 +++++ src/vs/workbench/api/node/extHost.api.impl.ts | 3 +++ src/vs/workbench/api/node/extHostTerminalService.ts | 2 ++ 3 files changed, 10 insertions(+) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 3328a19eabe..0647789fcf5 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -773,6 +773,11 @@ declare module 'vscode' { //#region Terminal export namespace window { + /** + * @readonly + */ + export let terminals: Terminal[]; + export const onDidOpenTerminal: Event; } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 3ccab97e133..b016a227a71 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -316,6 +316,9 @@ export function createApiFactory( get visibleTextEditors() { return extHostEditors.getVisibleTextEditors(); }, + get terminals() { + return extHostTerminalService.terminals; + }, showTextDocument(documentOrUri: vscode.TextDocument | vscode.Uri, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, preserveFocus?: boolean): TPromise { let documentPromise: TPromise; if (URI.isUri(documentOrUri)) { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index c0331705cf5..4950f7cab38 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -106,6 +106,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { private _proxy: MainThreadTerminalServiceShape; private _terminals: ExtHostTerminal[]; + public get terminals(): ExtHostTerminal[] { return this._terminals; } + constructor(mainContext: IMainContext) { this._onDidCloseTerminal = new Emitter(); this._onDidOpenTerminal = new Emitter(); From e1b6a8c11f160fd0baa408d9370fab6a4c8839b1 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 9 Apr 2018 11:41:05 -0700 Subject: [PATCH 053/710] Fix terminals showing up twice in new API --- .../mainThreadTerminalService.ts | 7 ++++++- .../api/node/extHostTerminalService.ts | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 3911dc347bd..51cd24cb54c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -22,7 +22,12 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalService); this._toDispose = []; - this._toDispose.push(terminalService.onInstanceCreated((terminalInstance) => this._onTerminalOpened(terminalInstance))); + this._toDispose.push(terminalService.onInstanceCreated((terminalInstance) => { + // Delay this message so the TerminalInstance constructor has a change to finish and + // return the ID normally to the extension host. The ID that is passed here will be used + // to register non-extension API terminals in the extension host. + setTimeout(() => this._onTerminalOpened(terminalInstance), 100); + })); this._toDispose.push(terminalService.onInstanceDisposed((terminalInstance) => this._onTerminalDisposed(terminalInstance))); this._toDispose.push(terminalService.onInstanceProcessIdReady((terminalInstance) => this._onTerminalProcessIdReady(terminalInstance))); } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 4950f7cab38..b6026d73c0c 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -20,11 +20,15 @@ export class ExtHostTerminal implements vscode.Terminal { constructor( proxy: MainThreadTerminalServiceShape, - name?: string + name: string = '', + id?: number ) { - this._name = name; - this._queuedRequests = []; this._proxy = proxy; + this._name = name; + if (id) { + this._id = id; + } + this._queuedRequests = []; this._pidPromise = new Promise(c => { this._pidPromiseComplete = c; }); @@ -149,9 +153,16 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // TOOD: How do we set PID // TODO: Make sure both API terminals and non-API terminals are created correctly + // TODO: Ensure the terminal that is opened when first launched gets added, I think it's set before the ext host is ready for it public $acceptTerminalOpened(id: number, name: string): void { + let index = this._getTerminalIndexById(id); + if (index !== null) { + // The terminal has already been created (via createTerminal*), only fire the event + this._onDidOpenTerminal.fire(this.terminals[index]); + return; + } // TODO: Only create a terminal if it doesn't already exist for the ID - let terminal = new ExtHostTerminal(this._proxy, name); + let terminal = new ExtHostTerminal(this._proxy, name, id); this._terminals.push(terminal); this._onDidOpenTerminal.fire(terminal); } From 96143f924c8a3b0094ccee2d0d398d2a6dfeb7ed Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 9 Apr 2018 21:36:43 +0200 Subject: [PATCH 054/710] wip: driver ipc --- src/vs/platform/driver/common/driver.ts | 87 ++++++++++++++++++++++--- test/smoke/src/driver.ts | 18 ++--- test/smoke/src/vscode/driver.d.ts | 9 ++- 3 files changed, 96 insertions(+), 18 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 826415b59f3..998b5c4d648 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -21,16 +21,31 @@ export interface IElement { export interface IDriver { _serviceBrand: any; + getWindowIds(): TPromise; - getElements(windowId: number, selector: string): TPromise; dispatchKeybinding(windowId: number, keybinding: string): TPromise; + click(windowId: number, selector: string, xoffset?: number | undefined, yoffset?: number | undefined): TPromise; + doubleClick(windowId: number, selector: string): TPromise; + move(windowId: number, selector: string): TPromise; + setValue(windowId: number, selector: string, text: string): TPromise; + getTitle(windowId: number): TPromise; + isActiveElement(windowId: number, selector: string): TPromise; + getElements(windowId: number, selector: string): TPromise; + selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } //*END export interface IDriverChannel extends IChannel { call(command: 'getWindowIds'): TPromise; - call(command: 'getElements', arg: [number, string]): TPromise; call(command: 'dispatchKeybinding', arg: [number, string]): TPromise; + call(command: 'click', arg: [number, string, number | undefined, number | undefined]): TPromise; + call(command: 'doubleClick', arg: [number, string]): TPromise; + call(command: 'move', arg: [number, string]): TPromise; + call(command: 'setValue', arg: [number, string, string]): TPromise; + call(command: 'getTitle', arg: [number]): TPromise; + call(command: 'isActiveElement', arg: [number, string]): TPromise; + call(command: 'getElements', arg: [number, string]): TPromise; + call(command: 'selectorExecute', arg: [number, string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; } @@ -41,8 +56,15 @@ export class DriverChannel implements IDriverChannel { call(command: string, arg?: any): TPromise { switch (command) { case 'getWindowIds': return this.driver.getWindowIds(); - case 'getElements': return this.driver.getElements(arg[0], arg[1]); case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg[0], arg[1]); + case 'click': return this.driver.click(arg[0], arg[1], arg[2], arg[3]); + case 'doubleClick': return this.driver.doubleClick(arg[0], arg[1]); + case 'move': return this.driver.move(arg[0], arg[1]); + case 'setValue': return this.driver.setValue(arg[0], arg[1], arg[2]); + case 'getTitle': return this.driver.getTitle(arg[0]); + case 'isActiveElement': return this.driver.isActiveElement(arg[0], arg[1]); + case 'getElements': return this.driver.getElements(arg[0], arg[1]); + case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], new Function(arg[2]), ...arg[2]); } return undefined; @@ -59,12 +81,40 @@ export class DriverChannelClient implements IDriver { return this.channel.call('getWindowIds'); } + dispatchKeybinding(windowId: number, keybinding: string): TPromise { + return this.channel.call('dispatchKeybinding', [windowId, keybinding]); + } + + click(windowId: number, selector: string, xoffset: number | undefined, yoffset: number | undefined): TPromise { + return this.channel.call('click', [windowId, selector, xoffset, yoffset]); + } + + doubleClick(windowId: number, selector: string): TPromise { + return this.channel.call('doubleClick', [windowId, selector]); + } + + move(windowId: number, selector: string): TPromise { + return this.channel.call('move', [windowId, selector]); + } + + setValue(windowId: number, selector: string, text: string): TPromise { + return this.channel.call('setValue', [windowId, selector, text]); + } + + getTitle(windowId: number): TPromise { + return this.channel.call('getTitle', [windowId]); + } + + isActiveElement(windowId: number, selector: string): TPromise { + return this.channel.call('isActiveElement', [windowId, selector]); + } + getElements(windowId: number, selector: string): TPromise { return this.channel.call('getElements', [windowId, selector]); } - dispatchKeybinding(windowId: number, keybinding: string): TPromise { - return this.channel.call('dispatchKeybinding', [windowId, keybinding]); + selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ + return this.channel.call('selectorExecute', [windowId, selector, script.toString(), args]); } } @@ -102,13 +152,27 @@ export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry } export interface IWindowDriver { - getElements(selector: string): TPromise; dispatchKeybinding(keybinding: string): TPromise; + click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): TPromise; + doubleClick(selector: string): TPromise; + move(selector: string): TPromise; + setValue(selector: string, text: string): TPromise; + getTitle(): TPromise; + isActiveElement(selector: string): TPromise; + getElements(selector: string): TPromise; + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } export interface IWindowDriverChannel extends IChannel { - call(command: 'getElements', arg: string): TPromise; call(command: 'dispatchKeybinding', arg: string): TPromise; + call(command: 'click', arg: [string, number | undefined, number | undefined]): TPromise; + call(command: 'doubleClick', arg: string): TPromise; + call(command: 'move', arg: string): TPromise; + call(command: 'setValue', arg: [string, string]): TPromise; + call(command: 'getTitle'): TPromise; + call(command: 'isActiveElement', arg: string): TPromise; + call(command: 'getElements', arg: string): TPromise; + call(command: 'selectorExecute', arg: [string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; } @@ -118,8 +182,15 @@ export class WindowDriverChannel implements IWindowDriverChannel { call(command: string, arg?: any): TPromise { switch (command) { - case 'getElements': return this.driver.getElements(arg); case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg); + case 'click': return this.driver.click(arg[0], arg[1], arg[2]); + case 'doubleClick': return this.driver.doubleClick(arg); + case 'move': return this.driver.move(arg); + case 'setValue': return this.driver.setValue(arg[0], arg[1]); + case 'getTitle': return this.driver.getTitle(); + case 'isActiveElement': return this.driver.isActiveElement(arg); + case 'getElements': return this.driver.getElements(arg); + case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], arg[2], ...arg[2]); } return undefined; diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index b3f0e72c77f..5c4652a46d5 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -133,15 +133,6 @@ export class CodeDriver implements Driver { private _activeWindowId: number | undefined = undefined; - private async getWindowId(): Promise { - if (typeof this._activeWindowId !== 'number') { - const windows = await this.driver.getWindowIds(); - this._activeWindowId = windows[0]; - } - - return this._activeWindowId; - } - async dispatchKeybinding(keybinding: string): Promise { if (this.verbose) { console.log('- dispatchKeybinding:', keybinding); @@ -216,4 +207,13 @@ export class CodeDriver implements Driver { throw new Error('Method not implemented.'); } + + private async getWindowId(): Promise { + if (typeof this._activeWindowId !== 'number') { + const windows = await this.driver.getWindowIds(); + this._activeWindowId = windows[0]; + } + + return this._activeWindowId; + } } \ No newline at end of file diff --git a/test/smoke/src/vscode/driver.d.ts b/test/smoke/src/vscode/driver.d.ts index dce79062e31..c51f9b5b248 100644 --- a/test/smoke/src/vscode/driver.d.ts +++ b/test/smoke/src/vscode/driver.d.ts @@ -12,8 +12,15 @@ export interface IElement { export interface IDriver { _serviceBrand: any; getWindowIds(): Promise; - getElements(windowId: number, selector: string): Promise; dispatchKeybinding(windowId: number, keybinding: string): Promise; + click(windowId: number, selector: string, xoffset: number | undefined, yoffset: number | undefined): Promise; + doubleClick(windowId: number, selector: string): Promise; + move(windowId: number, selector: string): Promise; + setValue(windowId: number, selector: string, text: string): Promise; + getTitle(windowId: number): Promise; + isActiveElement(windowId: number, selector: string): Promise; + getElements(windowId: number, selector: string): Promise; + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; } export interface IDisposable { From 39e3073bf94e190a6e02335702afa5a8ce363779 Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Mon, 9 Apr 2018 12:48:20 -0700 Subject: [PATCH 055/710] Update C# TextMate grammar with latest bug fixes This PR includes the following fixes for the C# TextMate grammar: * Comments are now allowed after checked and unchecked statements (https://github.com/dotnet/csharp-tmLanguage/issues/104) * 'dynamic' is now highlighted as a built-in type keyword (https://github.com/dotnet/csharp-tmLanguage/issues/26) * Single-line comments with four slashes (i.e. ////) are now highlighted properly (https://github.com/dotnet/csharp-tmLanguage/issues/100) Thanks to (@Muchiachio](https://github.com/Muchiachio) for contributing these fixes! --- extensions/csharp/syntaxes/csharp.tmLanguage.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extensions/csharp/syntaxes/csharp.tmLanguage.json b/extensions/csharp/syntaxes/csharp.tmLanguage.json index fb3f667f5b1..397c2712e03 100644 --- a/extensions/csharp/syntaxes/csharp.tmLanguage.json +++ b/extensions/csharp/syntaxes/csharp.tmLanguage.json @@ -4,7 +4,7 @@ "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/dotnet/csharp-tmLanguage/commit/ca22c5211b87a6a1a8fd5356895237bb821df728", + "version": "https://github.com/dotnet/csharp-tmLanguage/commit/7689494edad006eafb9025aa6d72f8a634011a00", "name": "C#", "scopeName": "source.cs", "patterns": [ @@ -2050,6 +2050,9 @@ "patterns": [ { "include": "#block" + }, + { + "include": "#comment" } ] }, @@ -3670,7 +3673,7 @@ } }, "type-builtin": { - "match": "\\b(bool|byte|char|decimal|double|float|int|long|object|sbyte|short|string|uint|ulong|ushort|void)\\b", + "match": "\\b(bool|byte|char|decimal|double|float|int|long|object|sbyte|short|string|uint|ulong|ushort|void|dynamic)\\b", "captures": { "1": { "name": "keyword.type.cs" @@ -4131,7 +4134,7 @@ }, { "name": "comment.line.double-slash.cs", - "begin": "(? Date: Mon, 9 Apr 2018 16:52:25 -0700 Subject: [PATCH 056/710] Update GDPR annotations for error telemetry --- .../telemetry/browser/errorTelemetry.ts | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/src/vs/platform/telemetry/browser/errorTelemetry.ts b/src/vs/platform/telemetry/browser/errorTelemetry.ts index abc5a96d207..f63e8381e53 100644 --- a/src/vs/platform/telemetry/browser/errorTelemetry.ts +++ b/src/vs/platform/telemetry/browser/errorTelemetry.ts @@ -12,22 +12,35 @@ import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; import * as Errors from 'vs/base/common/errors'; import { safeStringify } from 'vs/base/common/objects'; +/* __GDPR__FRAGMENT__ + "ErrorEvent" : { + "stack": { "classification": "CustomerContent", "purpose": "PerformanceAndHealth" }, + "message" : { "classification": "CustomerContent", "purpose": "PerformanceAndHealth" }, + "filename" : { "classification": "CustomerContent", "purpose": "PerformanceAndHealth" }, + "callstack": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, + "msg" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, + "file" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, + "line": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, + "column": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, + "name": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, + "count": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true } + } + */ interface ErrorEvent { - stack: string; - message?: string; - filename?: string; + callstack: string; + msg?: string; + file?: string; line?: number; column?: number; - error?: { name: string; message: string; }; - + name?: string; count?: number; } namespace ErrorEvent { export function compare(a: ErrorEvent, b: ErrorEvent) { - if (a.stack < b.stack) { + if (a.callstack < b.callstack) { return -1; - } else if (a.stack > b.stack) { + } else if (a.callstack > b.callstack) { return 1; } return 0; @@ -89,32 +102,35 @@ export default class ErrorTelemetry { } // work around behavior in workerServer.ts that breaks up Error.stack - let stack = Array.isArray(err.stack) ? err.stack.join('\n') : err.stack; - let message = err.message ? err.message : safeStringify(err); + let callstack = Array.isArray(err.stack) ? err.stack.join('\n') : err.stack; + let msg = err.message ? err.message : safeStringify(err); // errors without a stack are not useful telemetry - if (!stack) { + if (!callstack) { return; } - this._enqueue({ message, stack }); + this._enqueue({ msg, callstack }); } - private _onUncaughtError(message: string, filename: string, line: number, column?: number, err?: any): void { + private _onUncaughtError(msg: string, file: string, line: number, column?: number, err?: any): void { let data: ErrorEvent = { - stack: message, - message, - filename, + callstack: msg, + msg, + file, line, column }; if (err) { let { name, message, stack } = err; - data.error = { name, message }; + data.name = name; + if (message) { + data.msg = message; + } if (stack) { - data.stack = Array.isArray(err.stack) + data.callstack = Array.isArray(err.stack) ? err.stack = err.stack.join('\n') : err.stack; } @@ -145,17 +161,9 @@ export default class ErrorTelemetry { for (let error of this._buffer) { /* __GDPR__ "UnhandledError" : { - "filename" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "message" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "name": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "stack": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "id": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "line": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "column": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "count": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true } + "${include}": [ "${ErrorEvent}" ] } */ - // __GDPR__TODO__ what's the complete set of properties? this._telemetryService.publicLog('UnhandledError', error); } this._buffer.length = 0; From ab5e5d002897d8249ede2cfd583b46c384f905f7 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Mon, 9 Apr 2018 17:09:50 -0700 Subject: [PATCH 057/710] Update telemetry tests for GDPR related changes --- .../telemetry/browser/errorTelemetry.ts | 10 +- .../electron-browser/telemetryService.test.ts | 188 +++++++++--------- 2 files changed, 100 insertions(+), 98 deletions(-) diff --git a/src/vs/platform/telemetry/browser/errorTelemetry.ts b/src/vs/platform/telemetry/browser/errorTelemetry.ts index f63e8381e53..3bab84d8bf7 100644 --- a/src/vs/platform/telemetry/browser/errorTelemetry.ts +++ b/src/vs/platform/telemetry/browser/errorTelemetry.ts @@ -22,7 +22,8 @@ import { safeStringify } from 'vs/base/common/objects'; "file" : { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, "line": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, "column": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "name": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, + "uncaught_error_name": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, + "uncaught_error_msg": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, "count": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth", "isMeasurement": true } } */ @@ -32,7 +33,8 @@ interface ErrorEvent { file?: string; line?: number; column?: number; - name?: string; + uncaught_error_name?: string; + uncaught_error_msg?: string; count?: number; } @@ -125,9 +127,9 @@ export default class ErrorTelemetry { if (err) { let { name, message, stack } = err; - data.name = name; + data.uncaught_error_name = name; if (message) { - data.msg = message; + data.uncaught_error_msg = message; } if (stack) { data.callstack = Array.isArray(err.stack) diff --git a/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts b/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts index 39fe577f0e5..d0b935f401d 100644 --- a/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/telemetryService.test.ts @@ -228,7 +228,7 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); assert.equal(testAppender.getEventsCount(), 1); assert.equal(testAppender.events[0].eventName, 'UnhandledError'); - assert.equal(testAppender.events[0].data.message, 'This is a test.'); + assert.equal(testAppender.events[0].data.msg, 'This is a test.'); errorTelemetry.dispose(); service.dispose(); @@ -258,7 +258,7 @@ suite('TelemetryService', () => { // // assert.equal(testAppender.getEventsCount(), 1); // assert.equal(testAppender.events[0].eventName, 'UnhandledError'); - // assert.equal(testAppender.events[0].data.message, 'This should get logged'); + // assert.equal(testAppender.events[0].data.msg, 'This should get logged'); // // service.dispose(); // } finally { @@ -283,11 +283,11 @@ suite('TelemetryService', () => { assert.equal(testAppender.getEventsCount(), 1); assert.equal(testAppender.events[0].eventName, 'UnhandledError'); - assert.equal(testAppender.events[0].data.message, 'Error Message'); - assert.equal(testAppender.events[0].data.filename, 'file.js'); + assert.equal(testAppender.events[0].data.msg, 'Error Message'); + assert.equal(testAppender.events[0].data.file, 'file.js'); assert.equal(testAppender.events[0].data.line, 2); assert.equal(testAppender.events[0].data.column, 42); - assert.equal(testAppender.events[0].data.error.message, 'test'); + assert.equal(testAppender.events[0].data.uncaught_error_msg, 'test'); errorTelemetry.dispose(); service.dispose(); @@ -308,8 +308,8 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); assert.equal(errorStub.callCount, 1); - assert.equal(testAppender.events[0].data.filename.indexOf(settings.dangerousPathWithImportantInfo.replace(settings.personalInfo, personInfoWithSpaces)), -1); - assert.equal(testAppender.events[0].data.filename, settings.importantInfo + '/test.js'); + assert.equal(testAppender.events[0].data.file.indexOf(settings.dangerousPathWithImportantInfo.replace(settings.personalInfo, personInfoWithSpaces)), -1); + assert.equal(testAppender.events[0].data.file, settings.importantInfo + '/test.js'); errorTelemetry.dispose(); service.dispose(); @@ -329,7 +329,7 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); assert.equal(errorStub.callCount, 1); - assert.equal(testAppender.events[0].data.filename.indexOf(settings.dangerousPathWithImportantInfo), -1); + assert.equal(testAppender.events[0].data.file.indexOf(settings.dangerousPathWithImportantInfo), -1); dangerousFilenameError = new Error('dangerousFilename'); dangerousFilenameError.stack = settings.stack; @@ -337,8 +337,8 @@ suite('TelemetryService', () => { this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); assert.equal(errorStub.callCount, 2); - assert.equal(testAppender.events[0].data.filename.indexOf(settings.dangerousPathWithImportantInfo), -1); - assert.equal(testAppender.events[0].data.filename, settings.importantInfo + '/test.js'); + assert.equal(testAppender.events[0].data.file.indexOf(settings.dangerousPathWithImportantInfo), -1); + assert.equal(testAppender.events[0].data.file, settings.importantInfo + '/test.js'); errorTelemetry.dispose(); service.dispose(); @@ -358,13 +358,13 @@ suite('TelemetryService', () => { Errors.onUnexpectedError(dangerousPathWithoutImportantInfoError); this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -389,12 +389,12 @@ suite('TelemetryService', () => { assert.equal(errorStub.callCount, 1); // Test that no file information remains, esp. personal info - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -418,14 +418,14 @@ suite('TelemetryService', () => { Errors.onUnexpectedError(dangerousPathWithImportantInfoError); this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -450,14 +450,14 @@ suite('TelemetryService', () => { assert.equal(errorStub.callCount, 1); // Test that important information remains but personal info does not - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -481,10 +481,10 @@ suite('TelemetryService', () => { Errors.onUnexpectedError(dangerousPathWithImportantInfoError); this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(' + settings.nodeModulePathToRetain), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(/' + settings.nodeModulePathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModulePathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModulePathToRetain), -1); errorTelemetry.dispose(); service.dispose(); @@ -509,10 +509,10 @@ suite('TelemetryService', () => { assert.equal(errorStub.callCount, 1); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(' + settings.nodeModulePathToRetain), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf('(/' + settings.nodeModulePathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModuleAsarPathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(' + settings.nodeModulePathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModuleAsarPathToRetain), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf('(/' + settings.nodeModulePathToRetain), -1); errorTelemetry.dispose(); service.dispose(); @@ -537,14 +537,14 @@ suite('TelemetryService', () => { Errors.onUnexpectedError(dangerousPathWithImportantInfoError); this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -569,14 +569,14 @@ suite('TelemetryService', () => { assert.equal(errorStub.callCount, 1); // Test that important information remains but personal info does not - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.importantInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.importantInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -601,14 +601,14 @@ suite('TelemetryService', () => { Errors.onUnexpectedError(missingModelError); this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.missingModelPrefix), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.missingModelPrefix), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.missingModelPrefix), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.missingModelPrefix), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -633,14 +633,14 @@ suite('TelemetryService', () => { assert.equal(errorStub.callCount, 1); // Test that no file information remains, but this particular // error message does (Received model events for missing model) - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.missingModelPrefix), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.missingModelPrefix), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.missingModelPrefix), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.missingModelPrefix), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -665,14 +665,14 @@ suite('TelemetryService', () => { Errors.onUnexpectedError(noSuchFileError); this.clock.tick(ErrorTelemetry.ERROR_FLUSH_TIMEOUT); - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.noSuchFilePrefix), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.noSuchFilePrefix), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.noSuchFilePrefix), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.noSuchFilePrefix), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); @@ -702,14 +702,14 @@ suite('TelemetryService', () => { // Test that no file information remains, but this particular // error message does (ENOENT: no such file or directory) Errors.onUnexpectedError(noSuchFileError); - assert.notEqual(testAppender.events[0].data.message.indexOf(settings.noSuchFilePrefix), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.message.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.noSuchFilePrefix), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.personalInfo), -1); - assert.equal(testAppender.events[0].data.stack.indexOf(settings.filePrefix), -1); - assert.notEqual(testAppender.events[0].data.stack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); - assert.equal(testAppender.events[0].data.stack.split('\n').length, settings.stack.length); + assert.notEqual(testAppender.events[0].data.msg.indexOf(settings.noSuchFilePrefix), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.msg.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.noSuchFilePrefix), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.personalInfo), -1); + assert.equal(testAppender.events[0].data.callstack.indexOf(settings.filePrefix), -1); + assert.notEqual(testAppender.events[0].data.callstack.indexOf(settings.stack[4].replace(settings.randomUserFile, settings.anonymizedRandomUserFile)), -1); + assert.equal(testAppender.events[0].data.callstack.split('\n').length, settings.stack.length); errorTelemetry.dispose(); service.dispose(); From 609c4ba1e7abc39952ef5fb7f3a22c0be0349efe Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane Date: Mon, 9 Apr 2018 17:35:17 -0700 Subject: [PATCH 058/710] Add process explorer, #41045 (#47530) --- build/gulpfile.vscode.js | 1 + src/vs/code/buildfile.js | 7 +- .../processExplorer/media/processExplorer.css | 63 ++++++ .../processExplorer/processExplorer.html | 17 ++ .../processExplorer/processExplorer.js | 175 +++++++++++++++++ .../processExplorer/processExplorerMain.ts | 184 ++++++++++++++++++ src/vs/code/electron-main/menus.ts | 7 +- src/vs/platform/issue/common/issue.ts | 27 ++- src/vs/platform/issue/common/issueIpc.ts | 8 +- .../issue/electron-main/issueService.ts | 68 ++++++- src/vs/workbench/electron-browser/actions.ts | 18 ++ .../electron-browser/main.contribution.ts | 3 +- .../workbench/services/issue/common/issue.ts | 1 + .../electron-browser/workbenchIssueService.ts | 17 +- tslint.json | 12 ++ 15 files changed, 585 insertions(+), 23 deletions(-) create mode 100644 src/vs/code/electron-browser/processExplorer/media/processExplorer.css create mode 100644 src/vs/code/electron-browser/processExplorer/processExplorer.html create mode 100644 src/vs/code/electron-browser/processExplorer/processExplorer.js create mode 100644 src/vs/code/electron-browser/processExplorer/processExplorerMain.ts diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index ff35e0a5a6f..9fa7fc9f28f 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -87,6 +87,7 @@ const vscodeResources = [ 'out-build/vs/workbench/services/files/**/*.md', 'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js', 'out-build/vs/code/electron-browser/issue/issueReporter.js', + 'out-build/vs/code/electron-browser/processExplorer/processExplorer.js', '!**/test/**' ]; diff --git a/src/vs/code/buildfile.js b/src/vs/code/buildfile.js index 0293acbb5be..2ff372605b7 100644 --- a/src/vs/code/buildfile.js +++ b/src/vs/code/buildfile.js @@ -12,7 +12,7 @@ function createModuleDescription(name, exclude) { excludes = excludes.concat(exclude); } result.exclude= excludes; - + return result; } @@ -21,7 +21,8 @@ exports.collectModules= function() { createModuleDescription('vs/code/electron-main/main', []), createModuleDescription('vs/code/node/cli', []), createModuleDescription('vs/code/node/cliProcessMain', ['vs/code/node/cli']), + createModuleDescription('vs/code/electron-browser/issue/issueReporterMain', []), createModuleDescription('vs/code/electron-browser/sharedProcess/sharedProcessMain', []), - createModuleDescription('vs/code/electron-browser/issue/issueReporterMain', []) + createModuleDescription('vs/code/electron-browser/processExplorer/processExplorerMain', []) ]; -}; \ No newline at end of file +}; diff --git a/src/vs/code/electron-browser/processExplorer/media/processExplorer.css b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css new file mode 100644 index 00000000000..6f38b441592 --- /dev/null +++ b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css @@ -0,0 +1,63 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +html, +body { + margin: 0; + padding: 0; + height: 100%; + width: 100%; + -webkit-touch-callout: none; + -webkit-user-select: none; + user-select: none; + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; + font-size: 13px; + color: #cccccc; +} + +.cpu { + width: 45px; +} + +.pid { + width: 50px +} + +.memory { + width: 90px; +} + +.process-item { + line-height: 22px; +} + +table { + border-collapse: collapse; + width: 100%; + table-layout: fixed; +} +th { + vertical-align: bottom; + border-bottom: 1px solid #cccccc; + padding: .5rem; + border-top: 1px solid #cccccc; + text-align: center; +} +td { + padding: .25rem; + vertical-align: top; +} + +.centered { + text-align: center; +} + +.data { + white-space: pre; +} + +tbody > tr:hover { + background-color: #2A2D2E; +} diff --git a/src/vs/code/electron-browser/processExplorer/processExplorer.html b/src/vs/code/electron-browser/processExplorer/processExplorer.html new file mode 100644 index 00000000000..4d6930d9987 --- /dev/null +++ b/src/vs/code/electron-browser/processExplorer/processExplorer.html @@ -0,0 +1,17 @@ + + + + + + + + + + +

+ + + + + + \ No newline at end of file diff --git a/src/vs/code/electron-browser/processExplorer/processExplorer.js b/src/vs/code/electron-browser/processExplorer/processExplorer.js new file mode 100644 index 00000000000..1fdb4bb8296 --- /dev/null +++ b/src/vs/code/electron-browser/processExplorer/processExplorer.js @@ -0,0 +1,175 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const remote = require('electron').remote; + +function assign(destination, source) { + return Object.keys(source) + .reduce(function (r, key) { r[key] = source[key]; return r; }, destination); +} + +function parseURLQueryArgs() { + const search = window.location.search || ''; + + return search.split(/[?&]/) + .filter(function (param) { return !!param; }) + .map(function (param) { return param.split('='); }) + .filter(function (param) { return param.length === 2; }) + .reduce(function (r, param) { r[param[0]] = decodeURIComponent(param[1]); return r; }, {}); +} + +function uriFromPath(_path) { + var pathName = path.resolve(_path).replace(/\\/g, '/'); + if (pathName.length > 0 && pathName.charAt(0) !== '/') { + pathName = '/' + pathName; + } + + return encodeURI('file://' + pathName); +} + +function readFile(file) { + return new Promise(function(resolve, reject) { + fs.readFile(file, 'utf8', function(err, data) { + if (err) { + reject(err); + return; + } + resolve(data); + }); + }); +} + +function main() { + const args = parseURLQueryArgs(); + const configuration = JSON.parse(args['config'] || '{}') || {}; + + assign(process.env, configuration.userEnv); + + //#region Add support for using node_modules.asar + (function () { + const path = require('path'); + const Module = require('module'); + let NODE_MODULES_PATH = path.join(configuration.appRoot, 'node_modules'); + if (/[a-z]\:/.test(NODE_MODULES_PATH)) { + // Make drive letter uppercase + NODE_MODULES_PATH = NODE_MODULES_PATH.charAt(0).toUpperCase() + NODE_MODULES_PATH.substr(1); + } + const NODE_MODULES_ASAR_PATH = NODE_MODULES_PATH + '.asar'; + + const originalResolveLookupPaths = Module._resolveLookupPaths; + Module._resolveLookupPaths = function (request, parent, newReturn) { + const result = originalResolveLookupPaths(request, parent, newReturn); + + const paths = newReturn ? result : result[1]; + for (let i = 0, len = paths.length; i < len; i++) { + if (paths[i] === NODE_MODULES_PATH) { + paths.splice(i, 0, NODE_MODULES_ASAR_PATH); + break; + } + } + + return result; + }; + })(); + //#endregion + + // Get the nls configuration into the process.env as early as possible. + var nlsConfig = { availableLanguages: {} }; + const config = process.env['VSCODE_NLS_CONFIG']; + if (config) { + process.env['VSCODE_NLS_CONFIG'] = config; + try { + nlsConfig = JSON.parse(config); + } catch (e) { /*noop*/ } + } + + if (nlsConfig._resolvedLanguagePackCoreLocation) { + let bundles = Object.create(null); + nlsConfig.loadBundle = function(bundle, language, cb) { + let result = bundles[bundle]; + if (result) { + cb(undefined, result); + return; + } + let bundleFile = path.join(nlsConfig._resolvedLanguagePackCoreLocation, bundle.replace(/\//g, '!') + '.nls.json'); + readFile(bundleFile).then(function (content) { + let json = JSON.parse(content); + bundles[bundle] = json; + cb(undefined, json); + }) + .catch(cb); + }; + } + + var locale = nlsConfig.availableLanguages['*'] || 'en'; + if (locale === 'zh-tw') { + locale = 'zh-Hant'; + } else if (locale === 'zh-cn') { + locale = 'zh-Hans'; + } + + window.document.documentElement.setAttribute('lang', locale); + + const extractKey = function (e) { + return [ + e.ctrlKey ? 'ctrl-' : '', + e.metaKey ? 'meta-' : '', + e.altKey ? 'alt-' : '', + e.shiftKey ? 'shift-' : '', + e.keyCode + ].join(''); + }; + + const TOGGLE_DEV_TOOLS_KB = (process.platform === 'darwin' ? 'meta-alt-73' : 'ctrl-shift-73'); // mac: Cmd-Alt-I, rest: Ctrl-Shift-I + const RELOAD_KB = (process.platform === 'darwin' ? 'meta-82' : 'ctrl-82'); // mac: Cmd-R, rest: Ctrl-R + + window.addEventListener('keydown', function (e) { + const key = extractKey(e); + if (key === TOGGLE_DEV_TOOLS_KB) { + remote.getCurrentWebContents().toggleDevTools(); + } else if (key === RELOAD_KB) { + remote.getCurrentWindow().reload(); + } + }); + + // Load the loader + const loaderFilename = configuration.appRoot + '/out/vs/loader.js'; + const loaderSource = fs.readFileSync(loaderFilename); + require('vm').runInThisContext(loaderSource, { filename: loaderFilename }); + var define = global.define; + global.define = undefined; + + window.nodeRequire = require.__$__nodeRequire; + + define('fs', ['original-fs'], function (originalFS) { return originalFS; }); // replace the patched electron fs with the original node fs for all AMD code + + window.MonacoEnvironment = {}; + const rootUrl = uriFromPath(configuration.appRoot) + '/out'; + + require.config({ + baseUrl: rootUrl, + 'vs/nls': nlsConfig, + nodeCachedDataDir: configuration.nodeCachedDataDir, + nodeModules: [/*BUILD->INSERT_NODE_MODULES*/] + }); + + if (nlsConfig.pseudo) { + require(['vs/nls'], function (nlsPlugin) { + nlsPlugin.setPseudoTranslation(nlsConfig.pseudo); + }); + } + + require([ + 'vs/code/electron-browser/processExplorer/processExplorerMain' + ], function (processExplorer) { + processExplorer.startup(configuration.data); + }); +} + +main(); diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts new file mode 100644 index 00000000000..1fb3ca60b3b --- /dev/null +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -0,0 +1,184 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./media/processExplorer'; +import { listProcesses, ProcessItem } from 'vs/base/node/ps'; +import { remote, webFrame } from 'electron'; +import { repeat } from 'vs/base/common/strings'; +import { totalmem } from 'os'; +import product from 'vs/platform/node/product'; +import { localize } from 'vs/nls'; +import { ProcessExplorerData, ProcessExplorerStyles } from '../../../platform/issue/common/issue'; +import * as browser from 'vs/base/browser/browser'; +import * as platform from 'vs/base/common/platform'; + +let processList: any[]; + +function getProcessList(rootProcess: ProcessItem) { + const processes: any[] = []; + + if (rootProcess) { + getProcessItem(processes, rootProcess, 0); + } + + return processes; +} + +function getProcessItem(processes: any[], item: ProcessItem, indent: number): void { + const isRoot = (indent === 0); + + const MB = 1024 * 1024; + + // Format name with indent + const name = isRoot ? `${product.applicationName} main` : item.name; + const formattedName = isRoot ? name : `${repeat(' ', indent)} ${name}`; + const memory = process.platform === 'win32' ? item.mem : (totalmem() * (item.mem / 100)); + processes.push({ + cpu: Number(item.load.toFixed(0)), + memory: Number((memory / MB).toFixed(0)), + pid: Number((item.pid).toFixed(0)), + name, + formattedName, + cmd: item.cmd + }); + + // Recurse into children if any + if (Array.isArray(item.children)) { + item.children.forEach(child => getProcessItem(processes, child, indent + 1)); + } +} + +function getProcessIdWithHighestProperty(processList, propertyName: string) { + let max = 0; + let maxProcessId; + processList.forEach(process => { + if (process[propertyName] > max) { + max = process[propertyName]; + maxProcessId = process.pid; + } + }); + + return maxProcessId; +} + +function updateProcessInfo(processList): void { + const target = document.getElementById('process-list'); + const highestCPUProcess = getProcessIdWithHighestProperty(processList, 'cpu'); + const highestMemoryProcess = getProcessIdWithHighestProperty(processList, 'memory'); + + let tableHtml = ` + + ${localize('cpu', "CPU %")} + ${localize('memory', "Memory (MB)")} + ${localize('pid', "pid")} + ${localize('name', "Name")} + `; + + processList.forEach(p => { + const cpuClass = p.pid === highestCPUProcess ? 'highest' : ''; + const memoryClass = p.pid === highestMemoryProcess ? 'highest' : ''; + + tableHtml += ` + + ${p.cpu} + ${p.memory} + ${p.pid} + ${p.formattedName} + `; + }); + + target.innerHTML = `${tableHtml}
`; +} + +function applyStyles(styles: ProcessExplorerStyles): void { + const styleTag = document.createElement('style'); + const content: string[] = []; + + if (styles.hoverBackground) { + content.push(`tbody > tr:hover { background-color: ${styles.hoverBackground}; }`); + } + + if (styles.hoverForeground) { + content.push(`tbody > tr:hover{ color: ${styles.hoverForeground}; }`); + } + + if (styles.highlightForeground) { + content.push(`.highest { color: ${styles.highlightForeground}; }`); + } + + styleTag.innerHTML = content.join('\n'); + document.head.appendChild(styleTag); + document.body.style.color = styles.color; +} + +function applyZoom(zoomLevel: number): void { + webFrame.setZoomLevel(zoomLevel); + browser.setZoomFactor(webFrame.getZoomFactor()); + // See https://github.com/Microsoft/vscode/issues/26151 + // Cannot be trusted because the webFrame might take some time + // until it really applies the new zoom level + browser.setZoomLevel(webFrame.getZoomLevel(), /*isTrusted*/false); +} + +function showContextMenu(e) { + e.preventDefault(); + + const pid = parseInt(e.currentTarget.id); + if (pid && typeof pid === 'number') { + const menu = new remote.Menu(); + menu.append(new remote.MenuItem({ + label: localize('killProcess', "Kill Process"), + click() { + process.kill(pid, 'SIGTERM'); + } + }) + ); + + menu.append(new remote.MenuItem({ + label: localize('forceKillProcess', "Force Kill Process"), + click() { + process.kill(pid, 'SIGKILL'); + } + }) + ); + + menu.popup(remote.getCurrentWindow()); + } +} + +export function startup(data: ProcessExplorerData): void { + applyStyles(data.styles); + applyZoom(data.zoomLevel); + + setInterval(() => listProcesses(remote.process.pid).then(processes => { + processList = getProcessList(processes); + updateProcessInfo(processList); + + const tableRows = document.getElementsByTagName('tr'); + for (let i = 0; i < tableRows.length; i++) { + const tableRow = tableRows[i]; + tableRow.addEventListener('click', (e) => { + showContextMenu(e); + }); + } + }), 1200); + + + document.onkeydown = (e: KeyboardEvent) => { + const cmdOrCtrlKey = platform.isMacintosh ? e.metaKey : e.ctrlKey; + + // Cmd/Ctrl + zooms in + if (cmdOrCtrlKey && e.keyCode === 187) { + applyZoom(webFrame.getZoomLevel() + 1); + } + + // Cmd/Ctrl - zooms out + if (cmdOrCtrlKey && e.keyCode === 189) { + applyZoom(webFrame.getZoomLevel() - 1); + } + }; +} \ No newline at end of file diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 46d965ac212..dad88c4fc00 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -942,6 +942,8 @@ export class CodeMenu { } }, false)); + const openProcessExplorer = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miOpenProcessExplorerer', comment: ['&& denotes a mnemonic'] }, "Open &&Process Explorer")), click: () => this.runActionInRenderer('workbench.action.openProcessExplorer') }); + let reportIssuesItem: Electron.MenuItem = null; if (product.reportIssueUrl) { const label = nls.localize({ key: 'miReportIssue', comment: ['&& denotes a mnemonic', 'Translate this to "Report Issue in English" in all languages please!'] }, "Report &&Issue"); @@ -990,7 +992,8 @@ export class CodeMenu { }) : null, (product.licenseUrl || product.privacyStatementUrl) ? __separator__() : null, toggleDevToolsItem, - isWindows && product.quality !== 'stable' ? showAccessibilityOptions : null + openProcessExplorer, + isWindows && product.quality !== 'stable' ? showAccessibilityOptions : null, ]).forEach(item => helpMenu.append(item)); if (!isMacintosh) { @@ -1029,7 +1032,7 @@ export class CodeMenu { } private openAccessibilityOptions(): void { - let win = new BrowserWindow({ + const win = new BrowserWindow({ alwaysOnTop: true, skipTaskbar: true, resizable: false, diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 8955b50b076..228bcdfefb1 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -11,6 +11,15 @@ import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensio export const IIssueService = createDecorator('issueService'); +export interface WindowStyles { + backgroundColor: string; + color: string; +} +export interface WindowData { + styles: WindowStyles; + zoomLevel: number; +} + export enum IssueType { Bug, PerformanceIssue, @@ -18,9 +27,7 @@ export enum IssueType { SettingsSearchIssue } -export interface IssueReporterStyles { - backgroundColor: string; - color: string; +export interface IssueReporterStyles extends WindowStyles { textLinkColor: string; inputBackground: string; inputForeground: string; @@ -35,9 +42,8 @@ export interface IssueReporterStyles { sliderActiveColor: string; } -export interface IssueReporterData { +export interface IssueReporterData extends WindowData { styles: IssueReporterStyles; - zoomLevel: number; enabledExtensions: ILocalExtension[]; issueType?: IssueType; } @@ -58,7 +64,18 @@ export interface ISettingsSearchIssueReporterData extends IssueReporterData { export interface IssueReporterFeatures { } +export interface ProcessExplorerStyles extends WindowStyles { + hoverBackground: string; + hoverForeground: string; + highlightForeground: string; +} + +export interface ProcessExplorerData extends WindowData { + styles: ProcessExplorerStyles; +} + export interface IIssueService { _serviceBrand: any; openReporter(data: IssueReporterData): TPromise; + openProcessExplorer(data: ProcessExplorerData): TPromise; } diff --git a/src/vs/platform/issue/common/issueIpc.ts b/src/vs/platform/issue/common/issueIpc.ts index 99d73534b5e..d804c6579fe 100644 --- a/src/vs/platform/issue/common/issueIpc.ts +++ b/src/vs/platform/issue/common/issueIpc.ts @@ -7,7 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IIssueService, IssueReporterData } from './issue'; +import { IIssueService, IssueReporterData, ProcessExplorerData } from './issue'; export interface IIssueChannel extends IChannel { call(command: 'openIssueReporter', arg: IssueReporterData): TPromise; @@ -23,6 +23,8 @@ export class IssueChannel implements IIssueChannel { switch (command) { case 'openIssueReporter': return this.service.openReporter(arg); + case 'openProcessExplorer': + return this.service.openProcessExplorer(arg); } return undefined; } @@ -37,4 +39,8 @@ export class IssueChannelClient implements IIssueService { openReporter(data: IssueReporterData): TPromise { return this.channel.call('openIssueReporter', data); } + + openProcessExplorer(data: ProcessExplorerData): TPromise { + return this.channel.call('openProcessExplorer', data); + } } \ No newline at end of file diff --git a/src/vs/platform/issue/electron-main/issueService.ts b/src/vs/platform/issue/electron-main/issueService.ts index 7232efc90fb..1d589bf8f16 100644 --- a/src/vs/platform/issue/electron-main/issueService.ts +++ b/src/vs/platform/issue/electron-main/issueService.ts @@ -9,7 +9,7 @@ import { TPromise, Promise } from 'vs/base/common/winjs.base'; import { localize } from 'vs/nls'; import * as objects from 'vs/base/common/objects'; import { parseArgs } from 'vs/platform/environment/node/argv'; -import { IIssueService, IssueReporterData, IssueReporterFeatures } from 'vs/platform/issue/common/issue'; +import { IIssueService, IssueReporterData, IssueReporterFeatures, ProcessExplorerData } from 'vs/platform/issue/common/issue'; import { BrowserWindow, ipcMain, screen } from 'electron'; import { ILaunchService } from 'vs/code/electron-main/launch'; import { getPerformanceInfo, PerformanceInfo, getSystemInfo, SystemInfo } from 'vs/code/electron-main/diagnostics'; @@ -22,7 +22,8 @@ const DEFAULT_BACKGROUND_COLOR = '#1E1E1E'; export class IssueService implements IIssueService { _serviceBrand: any; _issueWindow: BrowserWindow; - _parentWindow: BrowserWindow; + _issueParentWindow: BrowserWindow; + _processExplorerWindow: BrowserWindow; constructor( private machineId: string, @@ -46,11 +47,11 @@ export class IssueService implements IIssueService { }); ipcMain.on('workbenchCommand', (event, arg) => { - this._parentWindow.webContents.send('vscode:runAction', { id: arg, from: 'issueReporter' }); + this._issueParentWindow.webContents.send('vscode:runAction', { id: arg, from: 'issueReporter' }); }); - this._parentWindow = BrowserWindow.getFocusedWindow(); - const position = this.getWindowPosition(); + this._issueParentWindow = BrowserWindow.getFocusedWindow(); + const position = this.getWindowPosition(this._issueParentWindow, 800, 900); this._issueWindow = new BrowserWindow({ width: position.width, height: position.height, @@ -73,7 +74,54 @@ export class IssueService implements IIssueService { return TPromise.as(null); } - private getWindowPosition() { + openProcessExplorer(data: ProcessExplorerData): TPromise { + // Create as singleton + if (!this._processExplorerWindow) { + const position = this.getWindowPosition(BrowserWindow.getFocusedWindow(), 800, 300); + this._processExplorerWindow = new BrowserWindow({ + skipTaskbar: true, + resizable: true, + width: position.width, + height: position.height, + minWidth: 300, + minHeight: 200, + x: position.x, + y: position.y, + backgroundColor: data.styles.backgroundColor, + title: localize('processExplorer', "Process Explorer") + }); + + this._processExplorerWindow.setMenuBarVisibility(false); + + const windowConfiguration = { + appRoot: this.environmentService.appRoot, + nodeCachedDataDir: this.environmentService.nodeCachedDataDir, + windowId: this._processExplorerWindow.id, + userEnv: this.userEnv, + machineId: this.machineId, + data + }; + + const environment = parseArgs(process.argv); + const config = objects.assign(environment, windowConfiguration); + for (let key in config) { + if (config[key] === void 0 || config[key] === null || config[key] === '') { + delete config[key]; // only send over properties that have a true value + } + } + + this._processExplorerWindow.loadURL(`${require.toUrl('vs/code/electron-browser/processExplorer/processExplorer.html')}?config=${encodeURIComponent(JSON.stringify(config))}`); + + this._processExplorerWindow.on('close', () => this._processExplorerWindow = void 0); + } + + // Focus + this._processExplorerWindow.focus(); + + return TPromise.as(null); + } + + private getWindowPosition(parentWindow: BrowserWindow, defaultWidth: number, defaultHeight: number) { // We want the new window to open on the same display that the parent is in let displayToUse: Electron.Display; const displays = screen.getAllDisplays(); @@ -93,8 +141,8 @@ export class IssueService implements IIssueService { } // if we have a last active window, use that display for the new window - if (!displayToUse && this._parentWindow) { - displayToUse = screen.getDisplayMatching(this._parentWindow.getBounds()); + if (!displayToUse && parentWindow) { + displayToUse = screen.getDisplayMatching(parentWindow.getBounds()); } // fallback to primary display or first display @@ -104,8 +152,8 @@ export class IssueService implements IIssueService { } let state = { - width: 800, - height: 900, + width: defaultWidth, + height: defaultHeight, x: undefined, y: undefined }; diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 3e0b42414db..7abd5ddb6b1 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -871,6 +871,24 @@ export class OpenIssueReporterAction extends Action { } } +export class OpenProcessExplorer extends Action { + public static readonly ID = 'workbench.action.openProcessExplorer'; + public static readonly LABEL = nls.localize('openProcessExplorer', "Open Process Explorer"); + + constructor( + id: string, + label: string, + @IWorkbenchIssueService private issueService: IWorkbenchIssueService + ) { + super(id, label); + } + + public run(): TPromise { + return this.issueService.openProcessExplorer() + .then(() => true); + } +} + export class ReportPerformanceIssueUsingReporterAction extends Action { public static readonly ID = 'workbench.action.reportPerformanceIssueUsingReporter'; public static readonly LABEL = nls.localize('reportPerformanceIssue', "Report Performance Issue"); diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index c57c28d3c1b..26d69e90739 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -14,7 +14,7 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions, Configur import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; -import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenIssueReporterAction, ReportPerformanceIssueUsingReporterAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseWorkspaceAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, ShowAboutDialogAction, InspectContextKeysAction } from 'vs/workbench/electron-browser/actions'; +import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenIssueReporterAction, ReportPerformanceIssueUsingReporterAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseWorkspaceAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, ShowAboutDialogAction, InspectContextKeysAction, OpenProcessExplorer } from 'vs/workbench/electron-browser/actions'; import { registerCommands } from 'vs/workbench/electron-browser/commands'; import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, OpenFolderAsWorkspaceInNewWindowAction, OpenFileFolderAction, OpenFileAction, OpenFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -111,6 +111,7 @@ const developerCategory = nls.localize('developer', "Developer"); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowStartupPerformance, ShowStartupPerformance.ID, ShowStartupPerformance.LABEL), 'Developer: Startup Performance', developerCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleSharedProcessAction, ToggleSharedProcessAction.ID, ToggleSharedProcessAction.LABEL), 'Developer: Toggle Shared Process', developerCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(InspectContextKeysAction, InspectContextKeysAction.ID, InspectContextKeysAction.LABEL), 'Developer: Inspect Context Keys', developerCategory); +workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenProcessExplorer, OpenProcessExplorer.ID, OpenProcessExplorer.LABEL), 'Developer: Open Process Explorer', developerCategory); const recentFilesPickerContext = ContextKeyExpr.and(inQuickOpenContext, ContextKeyExpr.has(inRecentFilesPickerContextKey)); diff --git a/src/vs/workbench/services/issue/common/issue.ts b/src/vs/workbench/services/issue/common/issue.ts index b998241ce1c..e97d68ea091 100644 --- a/src/vs/workbench/services/issue/common/issue.ts +++ b/src/vs/workbench/services/issue/common/issue.ts @@ -14,4 +14,5 @@ export const IWorkbenchIssueService = createDecorator('w export interface IWorkbenchIssueService { _serviceBrand: any; openReporter(dataOverrides?: Partial): TPromise; + openProcessExplorer(): TPromise; } diff --git a/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts b/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts index 7e78f2904a5..80d5a39cad2 100644 --- a/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts +++ b/src/vs/workbench/services/issue/electron-browser/workbenchIssueService.ts @@ -8,7 +8,7 @@ import { IssueReporterStyles, IIssueService, IssueReporterData } from 'vs/platform/issue/common/issue'; import { TPromise } from 'vs/base/common/winjs.base'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { textLinkForeground, inputBackground, inputBorder, inputForeground, buttonBackground, buttonHoverBackground, buttonForeground, inputValidationErrorBorder, foreground, inputActiveOptionBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; +import { textLinkForeground, inputBackground, inputBorder, inputForeground, buttonBackground, buttonHoverBackground, buttonForeground, inputValidationErrorBorder, foreground, inputActiveOptionBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, editorBackground, editorForeground, listHoverBackground, listHoverForeground, listHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { IExtensionManagementService, IExtensionEnablementService, LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; import { webFrame } from 'electron'; @@ -41,6 +41,21 @@ export class WorkbenchIssueService implements IWorkbenchIssueService { return this.issueService.openReporter(issueReporterData); }); } + + openProcessExplorer(): TPromise { + const theme = this.themeService.getTheme(); + const data = { + zoomLevel: webFrame.getZoomLevel(), + styles: { + backgroundColor: theme.getColor(editorBackground) && theme.getColor(editorBackground).toString(), + color: theme.getColor(editorForeground).toString(), + hoverBackground: theme.getColor(listHoverBackground) && theme.getColor(listHoverBackground).toString(), + hoverForeground: theme.getColor(listHoverForeground) && theme.getColor(listHoverForeground).toString(), + highlightForeground: theme.getColor(listHighlightForeground) && theme.getColor(listHighlightForeground).toString() + } + }; + return this.issueService.openProcessExplorer(data); + } } export function getIssueReporterStyles(theme: ITheme): IssueReporterStyles { diff --git a/tslint.json b/tslint.json index 31396c2aa56..9a59614556e 100644 --- a/tslint.json +++ b/tslint.json @@ -409,6 +409,18 @@ "*" // node modules ] }, + { + "target": "**/vs/code/electron-browser/**", + "restrictions": [ + "vs/nls", + "vs/css!./**/*", + "vs/nls", + "**/vs/base/**", + "**/vs/platform/**", + "**/vs/code/**", + "*" // node modules + ] + }, { "target": "**/vs/code/**", "restrictions": [ From d59362a4b3d9d245e7a525f5f30aa5df64d55c80 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 9 Apr 2018 19:29:53 -0700 Subject: [PATCH 059/710] Add opacity decoration option Adds a new opacity option for text decorations. This controls the opacity of the text (it does not effect the border or background added by the decoration since those already have alpha channels) Fixes #43004 --- src/vs/editor/browser/services/codeEditorServiceImpl.ts | 5 +++-- src/vs/editor/common/editorCommon.ts | 1 + src/vs/vscode.d.ts | 5 +++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 6f2bde8d93c..99999ad1cab 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -194,6 +194,7 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { const _CSS_MAP = { color: 'color:{0} !important;', + opacity: 'opacity:{0};', backgroundColor: 'background-color:{0};', outline: 'outline:{0};', @@ -357,7 +358,7 @@ class DecorationCSSRules { return ''; } let cssTextArr: string[] = []; - this.collectCSSText(opts, ['fontStyle', 'fontWeight', 'textDecoration', 'cursor', 'color', 'letterSpacing'], cssTextArr); + this.collectCSSText(opts, ['fontStyle', 'fontWeight', 'textDecoration', 'cursor', 'color', 'opacity', 'letterSpacing'], cssTextArr); return cssTextArr.join(''); } @@ -385,7 +386,7 @@ class DecorationCSSRules { cssTextArr.push(strings.format(_CSS_MAP.contentText, escaped)); } - this.collectCSSText(opts, ['fontStyle', 'fontWeight', 'textDecoration', 'color', 'backgroundColor', 'margin'], cssTextArr); + this.collectCSSText(opts, ['fontStyle', 'fontWeight', 'textDecoration', 'color', 'opacity', 'backgroundColor', 'margin'], cssTextArr); if (this.collectCSSText(opts, ['width', 'height'], cssTextArr)) { cssTextArr.push('display:inline-block;'); } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 5ad6a70a0f6..8be479866df 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -509,6 +509,7 @@ export interface IThemeDecorationRenderOptions { textDecoration?: string; cursor?: string; color?: string | ThemeColor; + opacity?: number; letterSpacing?: string; gutterIconPath?: string | UriComponents; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 92b14c0281b..8ab2ed8baec 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -893,6 +893,11 @@ declare module 'vscode' { */ color?: string | ThemeColor; + /** + * CSS styling property that will be applied to text enclosed by a decoration. + */ + opacity?: string; + /** * CSS styling property that will be applied to text enclosed by a decoration. */ From ce3051621638366cb125fba6fd63b7199424eab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=81=E9=A6=99?= Date: Tue, 10 Apr 2018 11:49:36 +0800 Subject: [PATCH 060/710] monaco-editor: web ide app `worksapce/symbol` Reuse document/symbol search ui --- src/vs/editor/standalone/browser/quickOpen/quickOutline.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts b/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts index a4923404f39..39aa87917c3 100644 --- a/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts +++ b/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts @@ -25,7 +25,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; let SCOPE_PREFIX = ':'; -class SymbolEntry extends QuickOpenEntryGroup { +export class SymbolEntry extends QuickOpenEntryGroup { private name: string; private type: string; private description: string; From 5fca20a96c3e9b37f340ccd51c9a663472c16e0c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Apr 2018 09:58:18 +0200 Subject: [PATCH 061/710] :lipstick: symbols upload --- build/lib/compilation.js | 2 +- build/lib/i18n.js | 2 +- build/lib/nls.js | 3 --- build/tfs/common/symbols.ts | 45 +++++++++++++++++++++---------------- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/build/lib/compilation.js b/build/lib/compilation.js index 998ebb4f379..61c178b392e 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -22,7 +22,7 @@ var rootDir = path.join(__dirname, '../../src'); var options = require('../../src/tsconfig.json').compilerOptions; options.verbose = false; options.sourceMap = true; -if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry +if (process.env['VSCODE_NO_SOURCEMAP']) { options.sourceMap = false; } options.rootDir = rootDir; diff --git a/build/lib/i18n.js b/build/lib/i18n.js index 61893ed8b1d..6f5558001c4 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -1083,7 +1083,7 @@ function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pse extPack = extensionsPacks[resource] = { version: i18nPackVersion, contents: {} }; } var externalId = externalExtensions[resource]; - if (!externalId) { // internal extension: remove 'extensions/extensionId/' segnent + if (!externalId) { var secondSlash = path.indexOf('/', firstSlash + 1); extPack.contents[path.substr(secondSlash + 1)] = file.messages; } diff --git a/build/lib/nls.js b/build/lib/nls.js index a63d3699014..7f2730ec891 100644 --- a/build/lib/nls.js +++ b/build/lib/nls.js @@ -150,16 +150,13 @@ function isImportNode(node) { .filter(function (d) { return d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport; }) .map(function (d) { return d.importClause.namedBindings.name; }) .concat(importEqualsDeclarations.map(function (d) { return d.name; })) - // find read-only references to `nls` .map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); }) .flatten() .filter(function (r) { return !r.isWriteAccess; }) - // find the deepest call expressions AST nodes that contain those references .map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); }) .map(function (a) { return lazy(a).last(); }) .filter(function (n) { return !!n; }) .map(function (n) { return n; }) - // only `localize` calls .filter(function (n) { return n.expression.kind === ts.SyntaxKind.PropertyAccessExpression && n.expression.name.getText() === 'localize'; }); // `localize` named imports var allLocalizeImportDeclarations = importDeclarations diff --git a/build/tfs/common/symbols.ts b/build/tfs/common/symbols.ts index 5e4ebbd1a03..858ddbd5d3d 100644 --- a/build/tfs/common/symbols.ts +++ b/build/tfs/common/symbols.ts @@ -136,6 +136,7 @@ async function downloadAsset(repository, assetName: string, targetPath: string, } interface IOptions { + repository: string; platform: Platform; versions: { code: string; insiders: boolean; electron: string; }; access: { hockeyAppToken: string; hockeyAppId: string; githubToken: string }; @@ -147,7 +148,7 @@ async function ensureVersionAndSymbols(options: IOptions) { console.log(`HockeyApp: checking for existing version ${options.versions.code} (${options.platform})`); const versions = await getVersions({ accessToken: options.access.hockeyAppToken, appId: options.access.hockeyAppId }); if (versions.app_versions.some(v => v.version === options.versions.code)) { - console.log(`Returning without uploading symbols because version ${options.versions.code} (${options.platform}) was already found`); + console.log(`HockeyApp: Returning without uploading symbols because version ${options.versions.code} (${options.platform}) was already found`); return; } @@ -155,7 +156,7 @@ async function ensureVersionAndSymbols(options: IOptions) { const symbolsName = symbolsZipName(options.platform, options.versions.electron, options.versions.insiders); const symbolsPath = await tmpFile('symbols.zip'); console.log(`HockeyApp: downloading symbols ${symbolsName} for electron ${options.versions.electron} (${options.platform}) into ${symbolsPath}`); - await downloadAsset(new github({ repo: 'Microsoft/vscode-electron-prebuilt', token: options.access.githubToken }), symbolsName, symbolsPath, options.versions.electron); + await downloadAsset(new github({ repo: options.repository, token: options.access.githubToken }), symbolsName, symbolsPath, options.versions.electron); // Create version console.log(`HockeyApp: creating new version ${options.versions.code} (${options.platform})`); @@ -172,6 +173,7 @@ async function ensureVersionAndSymbols(options: IOptions) { // Environment const pakage = require('../../../package.json'); const product = require('../../../product.json'); +const repository = product.electronRepository; const codeVersion = pakage.version; const electronVersion = require('../../lib/electron').getElectronVersion(); const insiders = product.quality !== 'stable'; @@ -190,20 +192,25 @@ if (process.platform === 'darwin') { } // Create version and upload symbols in HockeyApp -ensureVersionAndSymbols({ - platform, - versions: { - code: codeVersion, - insiders, - electron: electronVersion - }, - access: { - githubToken, - hockeyAppToken, - hockeyAppId - } -}).then(() => { - console.log('HockeyApp: done'); -}, error => { - console.error(`HockeyApp: error (${error})`); -}); \ No newline at end of file +if (repository && codeVersion && electronVersion) { + ensureVersionAndSymbols({ + repository, + platform, + versions: { + code: codeVersion, + insiders, + electron: electronVersion + }, + access: { + githubToken, + hockeyAppToken, + hockeyAppId + } + }).then(() => { + console.log('HockeyApp: done'); + }, error => { + console.error(`HockeyApp: error (${error})`); + }); +} else { + console.log(`HockeyApp: skipping due to insufficient context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion})`); +} \ No newline at end of file From 847f159b2a0379f6c751c6a1ce00a74fae6e0369 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Apr 2018 10:03:48 +0200 Subject: [PATCH 062/710] naming, add cancellation tokens, #47475 --- src/vs/vscode.proposed.d.ts | 15 ++++++--------- src/vs/workbench/api/node/extHostFileSystem.ts | 18 +++++++++--------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b4a2aabc165..cf3768f70a3 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -224,25 +224,22 @@ declare module 'vscode' { } // todo@joh discover files etc - // todo@joh CancellationToken everywhere // todo@joh add open/close calls? export interface FileSystemProvider2 { - _version: 2; + _version: 3; - readonly onDidChange?: Event; + readonly onDidChange: Event; stat(uri: Uri, token: CancellationToken): Thenable; - readdir(uri: Uri, token: CancellationToken): Thenable<[Uri, FileStat][]>; + readDirectory(uri: Uri, token: CancellationToken): Thenable<[Uri, FileStat][]>; readFile(uri: Uri, token: CancellationToken): Thenable; writeFile(uri: Uri, content: Uint8Array, token: CancellationToken): Thenable; - // todo@remote - // Thenable - rename(oldUri: Uri, newUri: Uri): Thenable; + rename(oldUri: Uri, newUri: Uri, token: CancellationToken): Thenable; // todo@remote // helps with performance bigly @@ -250,10 +247,10 @@ declare module 'vscode' { // todo@remote // ? useTrash, expose trash - delete(resource: Uri, options: { recursive?: boolean; }): Thenable; + delete(uri: Uri, token: CancellationToken): Thenable; // todo@remote - create(resource: Uri, options: { type: FileType }): Thenable; + create(uri: Uri, options: { type: FileType }, token: CancellationToken): Thenable; } export namespace workspace { diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index aa5115926ea..a11efa15833 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -58,9 +58,9 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { class FileSystemProviderShim implements vscode.FileSystemProvider2 { - _version: 2; + _version: 3; - onDidChange?: vscode.Event; + onDidChange: vscode.Event; constructor(private readonly _delegate: vscode.FileSystemProvider) { this.onDidChange = this._delegate.onDidChange; @@ -72,13 +72,13 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { return this._delegate.move(oldUri, newUri); } - readdir(resource: vscode.Uri): Thenable<[vscode.Uri, vscode.FileStat][]> { + readDirectory(resource: vscode.Uri): Thenable<[vscode.Uri, vscode.FileStat][]> { return this._delegate.readdir(resource); } // --- delete/create file or folder - delete(resource: vscode.Uri, options: { recursive: boolean; }): Thenable { + delete(resource: vscode.Uri): Thenable { return this.stat(resource).then(stat => { if (stat.type === FileType.Dir) { return this._delegate.rmdir(resource); @@ -127,7 +127,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 2) { + if (newProvider && newProvider._version === 3) { return this._doRegisterFileSystemProvider(scheme, newProvider); } else { return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); @@ -171,7 +171,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), token)); } $readdir(handle: number, resource: UriComponents): TPromise<[UriComponents, IStat][], any> { - return asWinJsPromise(token => this._fsProvider.get(handle).readdir(URI.revive(resource), token)); + return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), token)); } $readFile(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => { @@ -184,13 +184,13 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return asWinJsPromise(token => this._fsProvider.get(handle).writeFile(URI.revive(resource), Buffer.from(base64Content, 'base64'), token)); } $delete(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), { recursive: true })); + return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), token)); } $move(handle: number, oldUri: UriComponents, newUri: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri))); + return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), token)); } $mkdir(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).create(URI.revive(resource), { type: FileType.Dir })); + return asWinJsPromise(token => this._fsProvider.get(handle).create(URI.revive(resource), { type: FileType.Dir }, token)); } $provideFileSearchResults(handle: number, session: number, query: string): TPromise { From 49bf3deee378a7da05913ddd5a61b0efe9319477 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Apr 2018 10:44:27 +0200 Subject: [PATCH 063/710] symbols - fix version --- build/tfs/common/symbols.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/build/tfs/common/symbols.ts b/build/tfs/common/symbols.ts index 858ddbd5d3d..55641544c27 100644 --- a/build/tfs/common/symbols.ts +++ b/build/tfs/common/symbols.ts @@ -174,9 +174,12 @@ async function ensureVersionAndSymbols(options: IOptions) { const pakage = require('../../../package.json'); const product = require('../../../product.json'); const repository = product.electronRepository; -const codeVersion = pakage.version; const electronVersion = require('../../lib/electron').getElectronVersion(); const insiders = product.quality !== 'stable'; +let codeVersion = pakage.version; +if (insiders) { + codeVersion = `${codeVersion}-insider`; +} const githubToken = process.argv[2]; const hockeyAppToken = process.argv[3]; const is64 = process.argv[4] === 'x64'; @@ -192,7 +195,7 @@ if (process.platform === 'darwin') { } // Create version and upload symbols in HockeyApp -if (repository && codeVersion && electronVersion) { +if (repository && codeVersion && electronVersion && (product.quality === 'stable' || product.quality === 'insider')) { ensureVersionAndSymbols({ repository, platform, @@ -212,5 +215,5 @@ if (repository && codeVersion && electronVersion) { console.error(`HockeyApp: error (${error})`); }); } else { - console.log(`HockeyApp: skipping due to insufficient context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion})`); + console.log(`HockeyApp: skipping due to unexpected context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion}, quality: ${product.quality})`); } \ No newline at end of file From 5b5427b0c67eb89dc7a1fbb7a60aa600da44e680 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 10:57:11 +0200 Subject: [PATCH 064/710] ignore generated d.ts --- test/smoke/.gitignore | 3 ++- test/smoke/src/vscode/driver.d.ts | 30 ------------------------------ 2 files changed, 2 insertions(+), 31 deletions(-) delete mode 100644 test/smoke/src/vscode/driver.d.ts diff --git a/test/smoke/.gitignore b/test/smoke/.gitignore index 532798d3ea9..6601bb4c588 100644 --- a/test/smoke/.gitignore +++ b/test/smoke/.gitignore @@ -4,4 +4,5 @@ Thumbs.db node_modules/ out/ keybindings.*.json -test_data/ \ No newline at end of file +test_data/ +src/vscode/driver.d.ts \ No newline at end of file diff --git a/test/smoke/src/vscode/driver.d.ts b/test/smoke/src/vscode/driver.d.ts deleted file mode 100644 index c51f9b5b248..00000000000 --- a/test/smoke/src/vscode/driver.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -export interface IElement { - tagName: string; - className: string; - textContent: string; -} - -export interface IDriver { - _serviceBrand: any; - getWindowIds(): Promise; - dispatchKeybinding(windowId: number, keybinding: string): Promise; - click(windowId: number, selector: string, xoffset: number | undefined, yoffset: number | undefined): Promise; - doubleClick(windowId: number, selector: string): Promise; - move(windowId: number, selector: string): Promise; - setValue(windowId: number, selector: string, text: string): Promise; - getTitle(windowId: number): Promise; - isActiveElement(windowId: number, selector: string): Promise; - getElements(windowId: number, selector: string): Promise; - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; -} - -export interface IDisposable { - dispose(): void; -} - -export function connect(outPath: string, handle: string): Promise<{ client: IDisposable, driver: IDriver }>; From e8d6490fca58b6912517ac57d62c975f6d577b6d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 10:57:44 +0200 Subject: [PATCH 065/710] smoke: run compile on postinstall --- test/smoke/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/package.json b/test/smoke/package.json index 63f6cec4818..64a3c955faa 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "main": "./src/main.js", "scripts": { - "postinstall": "tsc", + "postinstall": "npm run compile", "compile": "node tools/prebuild && tsc && node tools/postbuild", "watch": "node tools/prebuild && node tools/postbuild && tsc --watch", "mocha": "mocha" From f8afb1a18c00afcca7f1569783522e439cb95b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Weinand?= Date: Tue, 10 Apr 2018 10:47:27 +0200 Subject: [PATCH 066/710] rename IRawAdapter to IDebuggerContribution --- src/vs/workbench/parts/debug/common/debug.ts | 2 +- .../debug/electron-browser/debugConfigurationManager.ts | 4 ++-- src/vs/workbench/parts/debug/node/debugAdapter.ts | 8 ++++---- src/vs/workbench/parts/debug/node/debugger.ts | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 3b3e4856a4f..2597cf19560 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -412,7 +412,7 @@ export interface IRawEnvAdapter { runtimeArgs?: string[]; } -export interface IRawAdapter extends IRawEnvAdapter { +export interface IDebuggerContribution extends IRawEnvAdapter { adapterExecutableCommand?: string; enableBreakpointsFor?: { languageIds: string[] }; configurationAttributes?: any; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index 65284696d54..ce741cd3008 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -26,7 +26,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IDebugConfigurationProvider, IRawAdapter, ICompound, IDebugConfiguration, IConfig, IEnvConfig, IGlobalConfig, IConfigurationManager, ILaunch, IAdapterExecutable, IDebugAdapterProvider, IDebugAdapter } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugConfigurationProvider, IDebuggerContribution, ICompound, IDebugConfiguration, IConfig, IEnvConfig, IGlobalConfig, IConfigurationManager, ILaunch, IAdapterExecutable, IDebugAdapterProvider, IDebugAdapter } from 'vs/workbench/parts/debug/common/debug'; import { Debugger } from 'vs/workbench/parts/debug/node/debugger'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; @@ -36,7 +36,7 @@ import { launchSchemaId } from 'vs/workbench/services/configuration/common/confi import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; // debuggers extension point -export const debuggersExtPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint('debuggers', [], { +export const debuggersExtPoint = extensionsRegistry.ExtensionsRegistry.registerExtensionPoint('debuggers', [], { description: nls.localize('vscode.extension.contributes.debuggers', 'Contributes debug adapters.'), type: 'array', defaultSnippets: [{ body: [{ type: '', extensions: [] }] }], diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index afcb5eb7d9e..23859007bf6 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -304,11 +304,11 @@ export class DebugAdapter extends StreamDebugAdapter { } } - private static extract(dbg: debug.IRawAdapter, extensionFolderPath: string) { + private static extract(dbg: debug.IDebuggerContribution, extensionFolderPath: string) { if (!dbg) { return undefined; } - let x: debug.IRawAdapter = {}; + let x: debug.IDebuggerContribution = {}; if (dbg.runtime) { if (dbg.runtime.indexOf('./') === 0) { // TODO @@ -351,14 +351,14 @@ export class DebugAdapter extends StreamDebugAdapter { static platformAdapterExecutable(extensionDescriptions: IExtensionDescription[], debugType: string): debug.IAdapterExecutable { - let result: debug.IRawAdapter = {}; + let result: debug.IDebuggerContribution = {}; debugType = debugType.toLowerCase(); // merge all contributions into one for (const ed of extensionDescriptions) { if (ed.contributes) { - const debuggers = ed.contributes['debuggers']; + const debuggers = ed.contributes['debuggers']; if (debuggers && debuggers.length > 0) { const dbgs = debuggers.filter(d => strings.equalsIgnoreCase(d.type, debugType)); for (const dbg of dbgs) { diff --git a/src/vs/workbench/parts/debug/node/debugger.ts b/src/vs/workbench/parts/debug/node/debugger.ts index e9e08f8fc2e..1b5075f90f7 100644 --- a/src/vs/workbench/parts/debug/node/debugger.ts +++ b/src/vs/workbench/parts/debug/node/debugger.ts @@ -9,7 +9,7 @@ import * as strings from 'vs/base/common/strings'; import * as objects from 'vs/base/common/objects'; import { IJSONSchema, IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { IConfig, IRawAdapter, IAdapterExecutable, INTERNAL_CONSOLE_OPTIONS_SCHEMA, IConfigurationManager, IDebugAdapter, IDebugConfiguration } from 'vs/workbench/parts/debug/common/debug'; +import { IConfig, IDebuggerContribution, IAdapterExecutable, INTERNAL_CONSOLE_OPTIONS_SCHEMA, IConfigurationManager, IDebugAdapter, IDebugConfiguration } from 'vs/workbench/parts/debug/common/debug'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -21,7 +21,7 @@ export class Debugger { private _mergedExtensionDescriptions: IExtensionDescription[]; - constructor(private configurationManager: IConfigurationManager, private rawAdapter: IRawAdapter, public extensionDescription: IExtensionDescription, + constructor(private configurationManager: IConfigurationManager, private rawAdapter: IDebuggerContribution, public extensionDescription: IExtensionDescription, @IConfigurationService private configurationService: IConfigurationService, @ICommandService private commandService: ICommandService ) { @@ -82,7 +82,7 @@ export class Debugger { return this.rawAdapter.languages; } - public merge(secondRawAdapter: IRawAdapter, extensionDescription: IExtensionDescription): void { + public merge(secondRawAdapter: IDebuggerContribution, extensionDescription: IExtensionDescription): void { // remember all ext descriptions that are the source of this debugger this._mergedExtensionDescriptions.push(extensionDescription); From e08945a4c28c76d69cfdad7237f6d5b13ac1c2d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Weinand?= Date: Tue, 10 Apr 2018 10:55:23 +0200 Subject: [PATCH 067/710] rename IRawEnvAdapter to IPlatformSpecificAdapterContribution --- src/vs/workbench/parts/debug/common/debug.ts | 20 ++++++++++--------- .../parts/debug/node/debugAdapter.ts | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 2597cf19560..143bd568a3e 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -403,16 +403,18 @@ export interface IAdapterExecutable { args?: string[]; } -export interface IRawEnvAdapter { - type?: string; - label?: string; +export interface IPlatformSpecificAdapterContribution { + type?: string; // TODO: doesn't belong here + label?: string; // TODO: doesn't belong here program?: string; args?: string[]; runtime?: string; runtimeArgs?: string[]; } -export interface IDebuggerContribution extends IRawEnvAdapter { +export interface IDebuggerContribution extends IPlatformSpecificAdapterContribution { + // type: string; // TODO: host from IPlatformSpecificAdapterContribution + // label?: string; // TODO: host from IPlatformSpecificAdapterContribution adapterExecutableCommand?: string; enableBreakpointsFor?: { languageIds: string[] }; configurationAttributes?: any; @@ -421,11 +423,11 @@ export interface IDebuggerContribution extends IRawEnvAdapter { languages?: string[]; variables?: { [key: string]: string }; aiKey?: string; - win?: IRawEnvAdapter; - winx86?: IRawEnvAdapter; - windows?: IRawEnvAdapter; - osx?: IRawEnvAdapter; - linux?: IRawEnvAdapter; + win?: IPlatformSpecificAdapterContribution; + winx86?: IPlatformSpecificAdapterContribution; + windows?: IPlatformSpecificAdapterContribution; + osx?: IPlatformSpecificAdapterContribution; + linux?: IPlatformSpecificAdapterContribution; } export interface IDebugConfigurationProvider { diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index 23859007bf6..9e91bf4cf00 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -374,7 +374,7 @@ export class DebugAdapter extends StreamDebugAdapter { } // select the right platform - let platformInfo: debug.IRawEnvAdapter; + let platformInfo: debug.IPlatformSpecificAdapterContribution; if (platform.isWindows && !process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432')) { platformInfo = result.winx86 || result.win || result.windows; } else if (platform.isWindows) { From 89902f4718422e8ed24c94f487eaea2e10793c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Weinand?= Date: Tue, 10 Apr 2018 10:59:36 +0200 Subject: [PATCH 068/710] arrange IDebuggerContribution attributes logically --- src/vs/workbench/parts/debug/common/debug.ts | 22 +++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 143bd568a3e..69c7e554891 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -415,19 +415,27 @@ export interface IPlatformSpecificAdapterContribution { export interface IDebuggerContribution extends IPlatformSpecificAdapterContribution { // type: string; // TODO: host from IPlatformSpecificAdapterContribution // label?: string; // TODO: host from IPlatformSpecificAdapterContribution + + // debug adapter executable adapterExecutableCommand?: string; - enableBreakpointsFor?: { languageIds: string[] }; - configurationAttributes?: any; - configurationSnippets?: IJSONSchemaSnippet[]; - initialConfigurations?: any[]; - languages?: string[]; - variables?: { [key: string]: string }; - aiKey?: string; win?: IPlatformSpecificAdapterContribution; winx86?: IPlatformSpecificAdapterContribution; windows?: IPlatformSpecificAdapterContribution; osx?: IPlatformSpecificAdapterContribution; linux?: IPlatformSpecificAdapterContribution; + + // internal + aiKey?: string; + + // supported languages + languages?: string[]; + enableBreakpointsFor?: { languageIds: string[] }; + + // debug configuration support + configurationAttributes?: any; + initialConfigurations?: any[]; + configurationSnippets?: IJSONSchemaSnippet[]; + variables?: { [key: string]: string }; } export interface IDebugConfigurationProvider { From 7ac4385c1d8fdad55276921e12d5d4a797c10ef8 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Apr 2018 11:09:07 +0200 Subject: [PATCH 069/710] enums starting at 1, add more xyz2-types, #35449 #47475 --- src/vs/platform/files/common/files.ts | 13 ++- src/vs/vscode.proposed.d.ts | 36 +++++-- src/vs/workbench/api/node/extHost.api.impl.ts | 2 + .../workbench/api/node/extHostFileSystem.ts | 102 ++++++++++++++---- src/vs/workbench/api/node/extHostTypes.ts | 12 +++ .../electron-browser/remoteFileService.ts | 12 +-- 6 files changed, 137 insertions(+), 40 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 51f62ad470e..38114652f14 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -156,17 +156,16 @@ export interface IFileService { dispose(): void; } - -export enum FileType { - File = 0, - Dir = 1, - Symlink = 2 +export enum FileType2 { + File = 1, + Directory = 2, + SymbolicLink = 4, } + export interface IStat { - id: number | string; mtime: number; size: number; - type: FileType; + type: FileType2; } export interface IFileSystemProvider { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index cf3768f70a3..63095a4b66b 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -223,34 +223,58 @@ declare module 'vscode' { // create(resource: Uri): Thenable; } + export enum FileChangeType2 { + Changed = 1, + Created = 2, + Deleted = 3, + } + + export interface FileChange2 { + type: FileChangeType2; + resource: Uri; + } + + export enum FileType2 { + File = 0b001, + Directory = 0b010, + SymbolicLink = 0b100, + } + + export interface FileStat2 { + type: FileType2; + mtime: number; + size: number; + } + + // todo@joh discover files etc // todo@joh add open/close calls? export interface FileSystemProvider2 { _version: 3; - readonly onDidChange: Event; + readonly onDidChange: Event; - stat(uri: Uri, token: CancellationToken): Thenable; + stat(uri: Uri, token: CancellationToken): Thenable; - readDirectory(uri: Uri, token: CancellationToken): Thenable<[Uri, FileStat][]>; + readDirectory(uri: Uri, token: CancellationToken): Thenable<[Uri, FileStat2][]>; readFile(uri: Uri, token: CancellationToken): Thenable; writeFile(uri: Uri, content: Uint8Array, token: CancellationToken): Thenable; - rename(oldUri: Uri, newUri: Uri, token: CancellationToken): Thenable; + rename(oldUri: Uri, newUri: Uri, token: CancellationToken): Thenable; // todo@remote // helps with performance bigly - // copy?(from: Uri, to: Uri): Thenable; + // copy?(from: Uri, to: Uri): Thenable; // todo@remote // ? useTrash, expose trash delete(uri: Uri, token: CancellationToken): Thenable; // todo@remote - create(uri: Uri, options: { type: FileType }, token: CancellationToken): Thenable; + create(uri: Uri, options: { type: FileType }, token: CancellationToken): Thenable; } export namespace workspace { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index da7a17f7d25..fb844f52ef5 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -679,6 +679,8 @@ export function createApiFactory( FileChangeType: extHostTypes.FileChangeType, FileType: extHostTypes.FileType, + FileChangeType2: extHostTypes.FileChangeType2, + FileType2: extHostTypes.FileType2, FoldingRangeList: extHostTypes.FoldingRangeList, FoldingRange: extHostTypes.FoldingRange, FoldingRangeType: extHostTypes.FoldingRangeType diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index a11efa15833..109c18061b1 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -6,14 +6,15 @@ import URI, { UriComponents } from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; +import { Event, mapEvent } from 'vs/base/common/event'; import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystemShape } from './extHost.protocol'; import * as vscode from 'vscode'; -import { IStat } from 'vs/platform/files/common/files'; +import * as files from 'vs/platform/files/common/files'; import { IDisposable } from 'vs/base/common/lifecycle'; import { asWinJsPromise } from 'vs/base/common/async'; import { IPatternInfo } from 'vs/platform/search/common/search'; import { values } from 'vs/base/common/map'; -import { Range, FileType } from 'vs/workbench/api/node/extHostTypes'; +import { Range, FileType, FileChangeType, FileChangeType2, FileType2 } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; class FsLinkProvider implements vscode.DocumentLinkProvider { @@ -60,26 +61,69 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { _version: 3; - onDidChange: vscode.Event; + onDidChange: vscode.Event; constructor(private readonly _delegate: vscode.FileSystemProvider) { - this.onDidChange = this._delegate.onDidChange; + if (!this._delegate.onDidChange) { + this.onDidChange = Event.None; + } else { + this.onDidChange = mapEvent(this._delegate.onDidChange, old => old.map(FileSystemProviderShim._modernizeFileChange)); + } } - stat(resource: vscode.Uri): Thenable { - return this._delegate.stat(resource); + stat(resource: vscode.Uri): Thenable { + return this._delegate.stat(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { - return this._delegate.move(oldUri, newUri); + rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { + return this._delegate.move(oldUri, newUri).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - readDirectory(resource: vscode.Uri): Thenable<[vscode.Uri, vscode.FileStat][]> { - return this._delegate.readdir(resource); + readDirectory(resource: vscode.Uri): Thenable<[vscode.Uri, vscode.FileStat2][]> { + return this._delegate.readdir(resource).then(tuples => { + return tuples.map(tuple => <[vscode.Uri, vscode.FileStat2]>[tuple[0], FileSystemProviderShim._modernizeFileStat(tuple[1])]); + }); + } + + private static _modernizeFileStat(stat: vscode.FileStat): vscode.FileStat2 { + let { mtime, size, type } = stat; + let newType: vscode.FileType2; + + // no support for bitmask, effectively no support for symlinks + switch (type) { + case FileType.Dir: + newType = FileType2.Directory; + break; + case FileType.File: + newType = FileType2.File; + break; + case FileType.Symlink: + newType = FileType2.SymbolicLink; + break; + } + return { mtime, size, type: newType }; + } + + private static _modernizeFileChange(e: vscode.FileChange): vscode.FileChange2 { + let { resource, type } = e; + let newType: vscode.FileChangeType2; + switch (type) { + case FileChangeType.Updated: + newType = FileChangeType2.Changed; + break; + case FileChangeType.Added: + newType = FileChangeType2.Created; + break; + case FileChangeType.Deleted: + newType = FileChangeType2.Deleted; + break; + + } + return { resource, type: newType }; } // --- delete/create file or folder delete(resource: vscode.Uri): Thenable { - return this.stat(resource).then(stat => { + return this._delegate.stat(resource).then(stat => { if (stat.type === FileType.Dir) { return this._delegate.rmdir(resource); } else { @@ -87,11 +131,13 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { } }); } - create(resource: vscode.Uri, options: { type: vscode.FileType; }): Thenable { + create(resource: vscode.Uri, options: { type: vscode.FileType; }): Thenable { if (options.type === FileType.Dir) { - return this._delegate.mkdir(resource); + return this._delegate.mkdir(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } else { - return this._delegate.write(resource, Buffer.from([])).then(() => this._delegate.stat(resource)); + return this._delegate.write(resource, Buffer.from([])) + .then(() => this._delegate.stat(resource)) + .then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } } @@ -141,7 +187,25 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._proxy.$registerFileSystemProvider(handle, scheme); let reg: IDisposable; if (provider.onDidChange) { - reg = provider.onDidChange(event => this._proxy.$onFileSystemChange(handle, event)); + reg = provider.onDidChange(event => { + let newEvent = event.map(e => { + let { resource, type } = e; + let newType: files.FileChangeType; + switch (type) { + case FileChangeType2.Changed: + newType = files.FileChangeType.UPDATED; + break; + case FileChangeType2.Created: + newType = files.FileChangeType.ADDED; + break; + case FileChangeType2.Deleted: + newType = files.FileChangeType.DELETED; + break; + } + return { resource, type: newType }; + }); + this._proxy.$onFileSystemChange(handle, newEvent); + }); } return { dispose: () => { @@ -167,10 +231,10 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { }; } - $stat(handle: number, resource: UriComponents): TPromise { + $stat(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), token)); } - $readdir(handle: number, resource: UriComponents): TPromise<[UriComponents, IStat][], any> { + $readdir(handle: number, resource: UriComponents): TPromise<[UriComponents, files.IStat][], any> { return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), token)); } $readFile(handle: number, resource: UriComponents): TPromise { @@ -186,10 +250,10 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { $delete(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), token)); } - $move(handle: number, oldUri: UriComponents, newUri: UriComponents): TPromise { + $move(handle: number, oldUri: UriComponents, newUri: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), token)); } - $mkdir(handle: number, resource: UriComponents): TPromise { + $mkdir(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).create(URI.revive(resource), { type: FileType.Dir }, token)); } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index def9661a41d..1fe1b5bd13b 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1818,12 +1818,24 @@ export enum FileChangeType { Deleted = 2 } +export enum FileChangeType2 { + Changed = 1, + Created = 2, + Deleted = 3, +} + export enum FileType { File = 0, Dir = 1, Symlink = 2 } +export enum FileType2 { + File = 1, + Directory = 2, + SymbolicLink = 4, +} + //#endregion //#region folding api diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index b486a7180f5..84097d96331 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -6,7 +6,7 @@ import URI from 'vs/base/common/uri'; import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; -import { IContent, IStreamContent, IFileStat, IResolveContentOptions, IUpdateContentOptions, IResolveFileOptions, IResolveFileResult, FileOperationEvent, FileOperation, IFileSystemProvider, IStat, FileType, IImportResult, FileChangesEvent, ICreateFileOptions, FileOperationError, FileOperationResult, ITextSnapshot, snapshotToString } from 'vs/platform/files/common/files'; +import { IContent, IStreamContent, IFileStat, IResolveContentOptions, IUpdateContentOptions, IResolveFileOptions, IResolveFileResult, FileOperationEvent, FileOperation, IFileSystemProvider, IStat, FileType2, IImportResult, FileChangesEvent, ICreateFileOptions, FileOperationError, FileOperationResult, ITextSnapshot, snapshotToString } from 'vs/platform/files/common/files'; import { TPromise } from 'vs/base/common/winjs.base'; import { posix } from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -27,8 +27,8 @@ import { INotificationService } from 'vs/platform/notification/common/notificati function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse?: (tuple: [URI, IStat]) => boolean): TPromise { const [resource, stat] = tuple; const fileStat: IFileStat = { - isDirectory: false, - isSymbolicLink: stat.type === FileType.Symlink, + isDirectory: (stat.type & FileType2.Directory) !== 0, + isSymbolicLink: (stat.type & FileType2.SymbolicLink) !== 0, resource: resource, name: posix.basename(resource.path), mtime: stat.mtime, @@ -36,14 +36,10 @@ function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse etag: stat.mtime.toString(29) + stat.size.toString(31), }; - if (stat.type === FileType.Dir) { - fileStat.isDirectory = true; - + if (fileStat.isDirectory) { if (recurse && recurse([resource, stat])) { // dir -> resolve return provider.readdir(resource).then(entries => { - fileStat.isDirectory = true; - // resolve children if requested return TPromise.join(entries.map(stat => toIFileStat(provider, stat, recurse))).then(children => { fileStat.children = children; From 03f983af2753daa35fc49b06ddfe4496eefef0ae Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 11:14:10 +0200 Subject: [PATCH 070/710] stub out more methods --- src/vs/platform/driver/common/driver.ts | 61 ++++++++++++++----- .../driver/electron-browser/driver.ts | 36 +++++++++++ .../platform/driver/electron-main/driver.ts | 41 ++++++++++++- 3 files changed, 121 insertions(+), 17 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 998b5c4d648..d22ba362654 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -28,8 +28,8 @@ export interface IDriver { doubleClick(windowId: number, selector: string): TPromise; move(windowId: number, selector: string): TPromise; setValue(windowId: number, selector: string, text: string): TPromise; - getTitle(windowId: number): TPromise; - isActiveElement(windowId: number, selector: string): TPromise; + getTitle(windowId: number): TPromise; + isActiveElement(windowId: number, selector: string): TPromise; getElements(windowId: number, selector: string): TPromise; selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } @@ -42,8 +42,8 @@ export interface IDriverChannel extends IChannel { call(command: 'doubleClick', arg: [number, string]): TPromise; call(command: 'move', arg: [number, string]): TPromise; call(command: 'setValue', arg: [number, string, string]): TPromise; - call(command: 'getTitle', arg: [number]): TPromise; - call(command: 'isActiveElement', arg: [number, string]): TPromise; + call(command: 'getTitle', arg: [number]): TPromise; + call(command: 'isActiveElement', arg: [number, string]): TPromise; call(command: 'getElements', arg: [number, string]): TPromise; call(command: 'selectorExecute', arg: [number, string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; @@ -64,7 +64,9 @@ export class DriverChannel implements IDriverChannel { case 'getTitle': return this.driver.getTitle(arg[0]); case 'isActiveElement': return this.driver.isActiveElement(arg[0], arg[1]); case 'getElements': return this.driver.getElements(arg[0], arg[1]); - case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], new Function(arg[2]), ...arg[2]); + + // TODO@joao + case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], arg[1], ...arg[2]); } return undefined; @@ -101,11 +103,11 @@ export class DriverChannelClient implements IDriver { return this.channel.call('setValue', [windowId, selector, text]); } - getTitle(windowId: number): TPromise { + getTitle(windowId: number): TPromise { return this.channel.call('getTitle', [windowId]); } - isActiveElement(windowId: number, selector: string): TPromise { + isActiveElement(windowId: number, selector: string): TPromise { return this.channel.call('isActiveElement', [windowId, selector]); } @@ -114,6 +116,7 @@ export class DriverChannelClient implements IDriver { } selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ + // TODO@joao return this.channel.call('selectorExecute', [windowId, selector, script.toString(), args]); } } @@ -157,8 +160,8 @@ export interface IWindowDriver { doubleClick(selector: string): TPromise; move(selector: string): TPromise; setValue(selector: string, text: string): TPromise; - getTitle(): TPromise; - isActiveElement(selector: string): TPromise; + getTitle(): TPromise; + isActiveElement(selector: string): TPromise; getElements(selector: string): TPromise; selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } @@ -169,8 +172,8 @@ export interface IWindowDriverChannel extends IChannel { call(command: 'doubleClick', arg: string): TPromise; call(command: 'move', arg: string): TPromise; call(command: 'setValue', arg: [string, string]): TPromise; - call(command: 'getTitle'): TPromise; - call(command: 'isActiveElement', arg: string): TPromise; + call(command: 'getTitle'): TPromise; + call(command: 'isActiveElement', arg: string): TPromise; call(command: 'getElements', arg: string): TPromise; call(command: 'selectorExecute', arg: [string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; @@ -190,7 +193,8 @@ export class WindowDriverChannel implements IWindowDriverChannel { case 'getTitle': return this.driver.getTitle(); case 'isActiveElement': return this.driver.isActiveElement(arg); case 'getElements': return this.driver.getElements(arg); - case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], arg[2], ...arg[2]); + // TODO@joao + case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], ...arg[2]); } return undefined; @@ -203,11 +207,40 @@ export class WindowDriverChannelClient implements IWindowDriver { constructor(private channel: IWindowDriverChannel) { } + dispatchKeybinding(keybinding: string): TPromise { + return this.channel.call('dispatchKeybinding', keybinding); + } + + click(selector: string, xoffset?: number, yoffset?: number): TPromise { + return this.channel.call('click', [selector, xoffset, yoffset]); + } + + doubleClick(selector: string): TPromise { + return this.channel.call('doubleClick', selector); + } + + move(selector: string): TPromise { + return this.channel.call('move', selector); + } + + setValue(selector: string, text: string): TPromise { + return this.channel.call('setValue', [selector, text]); + } + + getTitle(): TPromise { + return this.channel.call('getTitle'); + } + + isActiveElement(selector: string): TPromise { + return this.channel.call('isActiveElement', selector); + } + getElements(selector: string): TPromise { return this.channel.call('getElements', selector); } - dispatchKeybinding(keybinding: string): TPromise { - return this.channel.call('dispatchKeybinding', keybinding); + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ + // TODO@joao + return this.channel.call('selectorExecute', [selector, script.toString(), args]); } } \ No newline at end of file diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 2e6d60b0903..094e607e5ee 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -56,6 +56,38 @@ class WindowDriver implements IWindowDriver { // document.activeElement.dispatchEvent(new KeyboardEvent('keyup', event)); } + + click(selector: string, xoffset?: number, yoffset?: number): TPromise { + throw new Error('Method not implemented.'); + } + + doubleClick(selector: string): TPromise { + throw new Error('Method not implemented.'); + } + + move(selector: string): TPromise { + throw new Error('Method not implemented.'); + } + + async setValue(selector: string, text: string): TPromise { + const element = document.querySelector(selector); + + if (!element) { + throw new Error('Element not found'); + } + + (element as HTMLInputElement).value = text; + } + + async getTitle(): TPromise { + return document.title; + } + + async isActiveElement(selector: string): TPromise { + const element = document.querySelector(selector); + return element === document.activeElement; + } + async getElements(selector: string): TPromise { const query = document.querySelectorAll(selector); const result: IElement[] = []; @@ -72,6 +104,10 @@ class WindowDriver implements IWindowDriver { return result; } + + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ + return TPromise.wrapError(new Error('not implemented')); + } } export async function registerWindowDriver( diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index f456136c777..8c5e7d57bc8 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -44,14 +44,49 @@ export class Driver implements IDriver, IWindowDriverRegistry { .filter(id => this.registeredWindowIds.has(id)); } - getElements(windowId: number, selector: string): TPromise { + dispatchKeybinding(windowId: number, keybinding: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.dispatchKeybinding(keybinding); + } + + click(windowId: number, selector: string, xoffset?: number, yoffset?: number): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.click(selector, xoffset, yoffset); + } + + doubleClick(windowId: number, selector: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.doubleClick(selector); + } + + move(windowId: number, selector: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.move(selector); + } + + setValue(windowId: number, selector: string, text: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.setValue(selector, text); + } + + getTitle(windowId: number): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.getTitle(); + } + + isActiveElement(windowId: number, selector: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.isActiveElement(selector); + } + + getElements(windowId: number, selector: string): TPromise { const windowDriver = this.getWindowDriver(windowId); return windowDriver.getElements(selector); } - dispatchKeybinding(windowId: number, keybinding: string): TPromise { + selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ const windowDriver = this.getWindowDriver(windowId); - return windowDriver.dispatchKeybinding(keybinding); + return windowDriver.selectorExecute(selector, script, ...args); } private getWindowDriver(windowId: number): IWindowDriver { From f1b47bf39898ceb035318ba4762d1870f41c9aeb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 11:43:13 +0200 Subject: [PATCH 071/710] dispatch keys! --- src/vs/base/browser/keyboardEvent.ts | 255 +++++++++--------- .../standalone/browser/simpleServices.ts | 2 +- .../test/browser/simpleServices.test.ts | 2 +- .../driver/electron-browser/driver.ts | 64 +++-- .../common/abstractKeybindingService.ts | 2 +- .../platform/keybinding/common/keybinding.ts | 5 - .../common/abstractKeybindingService.test.ts | 2 +- .../electron-browser/keybindingService.ts | 2 +- 8 files changed, 186 insertions(+), 148 deletions(-) diff --git a/src/vs/base/browser/keyboardEvent.ts b/src/vs/base/browser/keyboardEvent.ts index 22b92dbb28f..646964e4e33 100644 --- a/src/vs/base/browser/keyboardEvent.ts +++ b/src/vs/base/browser/keyboardEvent.ts @@ -9,149 +9,160 @@ import { KeyCode, KeyCodeUtils, KeyMod, SimpleKeybinding } from 'vs/base/common/ import * as platform from 'vs/base/common/platform'; import * as browser from 'vs/base/browser/browser'; -let KEY_CODE_MAP: { [keyCode: number]: KeyCode } = {}; +let KEY_CODE_MAP: { [keyCode: number]: KeyCode } = new Array(230); +let INVERSE_KEY_CODE_MAP: KeyCode[] = new Array(KeyCode.MAX_VALUE); + (function () { - KEY_CODE_MAP[3] = KeyCode.PauseBreak; // VK_CANCEL 0x03 Control-break processing - KEY_CODE_MAP[8] = KeyCode.Backspace; - KEY_CODE_MAP[9] = KeyCode.Tab; - KEY_CODE_MAP[13] = KeyCode.Enter; - KEY_CODE_MAP[16] = KeyCode.Shift; - KEY_CODE_MAP[17] = KeyCode.Ctrl; - KEY_CODE_MAP[18] = KeyCode.Alt; - KEY_CODE_MAP[19] = KeyCode.PauseBreak; - KEY_CODE_MAP[20] = KeyCode.CapsLock; - KEY_CODE_MAP[27] = KeyCode.Escape; - KEY_CODE_MAP[32] = KeyCode.Space; - KEY_CODE_MAP[33] = KeyCode.PageUp; - KEY_CODE_MAP[34] = KeyCode.PageDown; - KEY_CODE_MAP[35] = KeyCode.End; - KEY_CODE_MAP[36] = KeyCode.Home; - KEY_CODE_MAP[37] = KeyCode.LeftArrow; - KEY_CODE_MAP[38] = KeyCode.UpArrow; - KEY_CODE_MAP[39] = KeyCode.RightArrow; - KEY_CODE_MAP[40] = KeyCode.DownArrow; - KEY_CODE_MAP[45] = KeyCode.Insert; - KEY_CODE_MAP[46] = KeyCode.Delete; + for (let i = 0; i < INVERSE_KEY_CODE_MAP.length; i++) { + INVERSE_KEY_CODE_MAP[i] = -1; + } - KEY_CODE_MAP[48] = KeyCode.KEY_0; - KEY_CODE_MAP[49] = KeyCode.KEY_1; - KEY_CODE_MAP[50] = KeyCode.KEY_2; - KEY_CODE_MAP[51] = KeyCode.KEY_3; - KEY_CODE_MAP[52] = KeyCode.KEY_4; - KEY_CODE_MAP[53] = KeyCode.KEY_5; - KEY_CODE_MAP[54] = KeyCode.KEY_6; - KEY_CODE_MAP[55] = KeyCode.KEY_7; - KEY_CODE_MAP[56] = KeyCode.KEY_8; - KEY_CODE_MAP[57] = KeyCode.KEY_9; + function define(code: number, keyCode: KeyCode): void { + KEY_CODE_MAP[code] = keyCode; + INVERSE_KEY_CODE_MAP[keyCode] = code; + } - KEY_CODE_MAP[65] = KeyCode.KEY_A; - KEY_CODE_MAP[66] = KeyCode.KEY_B; - KEY_CODE_MAP[67] = KeyCode.KEY_C; - KEY_CODE_MAP[68] = KeyCode.KEY_D; - KEY_CODE_MAP[69] = KeyCode.KEY_E; - KEY_CODE_MAP[70] = KeyCode.KEY_F; - KEY_CODE_MAP[71] = KeyCode.KEY_G; - KEY_CODE_MAP[72] = KeyCode.KEY_H; - KEY_CODE_MAP[73] = KeyCode.KEY_I; - KEY_CODE_MAP[74] = KeyCode.KEY_J; - KEY_CODE_MAP[75] = KeyCode.KEY_K; - KEY_CODE_MAP[76] = KeyCode.KEY_L; - KEY_CODE_MAP[77] = KeyCode.KEY_M; - KEY_CODE_MAP[78] = KeyCode.KEY_N; - KEY_CODE_MAP[79] = KeyCode.KEY_O; - KEY_CODE_MAP[80] = KeyCode.KEY_P; - KEY_CODE_MAP[81] = KeyCode.KEY_Q; - KEY_CODE_MAP[82] = KeyCode.KEY_R; - KEY_CODE_MAP[83] = KeyCode.KEY_S; - KEY_CODE_MAP[84] = KeyCode.KEY_T; - KEY_CODE_MAP[85] = KeyCode.KEY_U; - KEY_CODE_MAP[86] = KeyCode.KEY_V; - KEY_CODE_MAP[87] = KeyCode.KEY_W; - KEY_CODE_MAP[88] = KeyCode.KEY_X; - KEY_CODE_MAP[89] = KeyCode.KEY_Y; - KEY_CODE_MAP[90] = KeyCode.KEY_Z; + define(3, KeyCode.PauseBreak); // VK_CANCEL 0x03 Control-break processing + define(8, KeyCode.Backspace); + define(9, KeyCode.Tab); + define(13, KeyCode.Enter); + define(16, KeyCode.Shift); + define(17, KeyCode.Ctrl); + define(18, KeyCode.Alt); + define(19, KeyCode.PauseBreak); + define(20, KeyCode.CapsLock); + define(27, KeyCode.Escape); + define(32, KeyCode.Space); + define(33, KeyCode.PageUp); + define(34, KeyCode.PageDown); + define(35, KeyCode.End); + define(36, KeyCode.Home); + define(37, KeyCode.LeftArrow); + define(38, KeyCode.UpArrow); + define(39, KeyCode.RightArrow); + define(40, KeyCode.DownArrow); + define(45, KeyCode.Insert); + define(46, KeyCode.Delete); - KEY_CODE_MAP[93] = KeyCode.ContextMenu; + define(48, KeyCode.KEY_0); + define(49, KeyCode.KEY_1); + define(50, KeyCode.KEY_2); + define(51, KeyCode.KEY_3); + define(52, KeyCode.KEY_4); + define(53, KeyCode.KEY_5); + define(54, KeyCode.KEY_6); + define(55, KeyCode.KEY_7); + define(56, KeyCode.KEY_8); + define(57, KeyCode.KEY_9); - KEY_CODE_MAP[96] = KeyCode.NUMPAD_0; - KEY_CODE_MAP[97] = KeyCode.NUMPAD_1; - KEY_CODE_MAP[98] = KeyCode.NUMPAD_2; - KEY_CODE_MAP[99] = KeyCode.NUMPAD_3; - KEY_CODE_MAP[100] = KeyCode.NUMPAD_4; - KEY_CODE_MAP[101] = KeyCode.NUMPAD_5; - KEY_CODE_MAP[102] = KeyCode.NUMPAD_6; - KEY_CODE_MAP[103] = KeyCode.NUMPAD_7; - KEY_CODE_MAP[104] = KeyCode.NUMPAD_8; - KEY_CODE_MAP[105] = KeyCode.NUMPAD_9; - KEY_CODE_MAP[106] = KeyCode.NUMPAD_MULTIPLY; - KEY_CODE_MAP[107] = KeyCode.NUMPAD_ADD; - KEY_CODE_MAP[108] = KeyCode.NUMPAD_SEPARATOR; - KEY_CODE_MAP[109] = KeyCode.NUMPAD_SUBTRACT; - KEY_CODE_MAP[110] = KeyCode.NUMPAD_DECIMAL; - KEY_CODE_MAP[111] = KeyCode.NUMPAD_DIVIDE; + define(65, KeyCode.KEY_A); + define(66, KeyCode.KEY_B); + define(67, KeyCode.KEY_C); + define(68, KeyCode.KEY_D); + define(69, KeyCode.KEY_E); + define(70, KeyCode.KEY_F); + define(71, KeyCode.KEY_G); + define(72, KeyCode.KEY_H); + define(73, KeyCode.KEY_I); + define(74, KeyCode.KEY_J); + define(75, KeyCode.KEY_K); + define(76, KeyCode.KEY_L); + define(77, KeyCode.KEY_M); + define(78, KeyCode.KEY_N); + define(79, KeyCode.KEY_O); + define(80, KeyCode.KEY_P); + define(81, KeyCode.KEY_Q); + define(82, KeyCode.KEY_R); + define(83, KeyCode.KEY_S); + define(84, KeyCode.KEY_T); + define(85, KeyCode.KEY_U); + define(86, KeyCode.KEY_V); + define(87, KeyCode.KEY_W); + define(88, KeyCode.KEY_X); + define(89, KeyCode.KEY_Y); + define(90, KeyCode.KEY_Z); - KEY_CODE_MAP[112] = KeyCode.F1; - KEY_CODE_MAP[113] = KeyCode.F2; - KEY_CODE_MAP[114] = KeyCode.F3; - KEY_CODE_MAP[115] = KeyCode.F4; - KEY_CODE_MAP[116] = KeyCode.F5; - KEY_CODE_MAP[117] = KeyCode.F6; - KEY_CODE_MAP[118] = KeyCode.F7; - KEY_CODE_MAP[119] = KeyCode.F8; - KEY_CODE_MAP[120] = KeyCode.F9; - KEY_CODE_MAP[121] = KeyCode.F10; - KEY_CODE_MAP[122] = KeyCode.F11; - KEY_CODE_MAP[123] = KeyCode.F12; - KEY_CODE_MAP[124] = KeyCode.F13; - KEY_CODE_MAP[125] = KeyCode.F14; - KEY_CODE_MAP[126] = KeyCode.F15; - KEY_CODE_MAP[127] = KeyCode.F16; - KEY_CODE_MAP[128] = KeyCode.F17; - KEY_CODE_MAP[129] = KeyCode.F18; - KEY_CODE_MAP[130] = KeyCode.F19; + define(93, KeyCode.ContextMenu); - KEY_CODE_MAP[144] = KeyCode.NumLock; - KEY_CODE_MAP[145] = KeyCode.ScrollLock; + define(96, KeyCode.NUMPAD_0); + define(97, KeyCode.NUMPAD_1); + define(98, KeyCode.NUMPAD_2); + define(99, KeyCode.NUMPAD_3); + define(100, KeyCode.NUMPAD_4); + define(101, KeyCode.NUMPAD_5); + define(102, KeyCode.NUMPAD_6); + define(103, KeyCode.NUMPAD_7); + define(104, KeyCode.NUMPAD_8); + define(105, KeyCode.NUMPAD_9); + define(106, KeyCode.NUMPAD_MULTIPLY); + define(107, KeyCode.NUMPAD_ADD); + define(108, KeyCode.NUMPAD_SEPARATOR); + define(109, KeyCode.NUMPAD_SUBTRACT); + define(110, KeyCode.NUMPAD_DECIMAL); + define(111, KeyCode.NUMPAD_DIVIDE); - KEY_CODE_MAP[186] = KeyCode.US_SEMICOLON; - KEY_CODE_MAP[187] = KeyCode.US_EQUAL; - KEY_CODE_MAP[188] = KeyCode.US_COMMA; - KEY_CODE_MAP[189] = KeyCode.US_MINUS; - KEY_CODE_MAP[190] = KeyCode.US_DOT; - KEY_CODE_MAP[191] = KeyCode.US_SLASH; - KEY_CODE_MAP[192] = KeyCode.US_BACKTICK; - KEY_CODE_MAP[193] = KeyCode.ABNT_C1; - KEY_CODE_MAP[194] = KeyCode.ABNT_C2; - KEY_CODE_MAP[219] = KeyCode.US_OPEN_SQUARE_BRACKET; - KEY_CODE_MAP[220] = KeyCode.US_BACKSLASH; - KEY_CODE_MAP[221] = KeyCode.US_CLOSE_SQUARE_BRACKET; - KEY_CODE_MAP[222] = KeyCode.US_QUOTE; - KEY_CODE_MAP[223] = KeyCode.OEM_8; + define(112, KeyCode.F1); + define(113, KeyCode.F2); + define(114, KeyCode.F3); + define(115, KeyCode.F4); + define(116, KeyCode.F5); + define(117, KeyCode.F6); + define(118, KeyCode.F7); + define(119, KeyCode.F8); + define(120, KeyCode.F9); + define(121, KeyCode.F10); + define(122, KeyCode.F11); + define(123, KeyCode.F12); + define(124, KeyCode.F13); + define(125, KeyCode.F14); + define(126, KeyCode.F15); + define(127, KeyCode.F16); + define(128, KeyCode.F17); + define(129, KeyCode.F18); + define(130, KeyCode.F19); - KEY_CODE_MAP[226] = KeyCode.OEM_102; + define(144, KeyCode.NumLock); + define(145, KeyCode.ScrollLock); + + define(186, KeyCode.US_SEMICOLON); + define(187, KeyCode.US_EQUAL); + define(188, KeyCode.US_COMMA); + define(189, KeyCode.US_MINUS); + define(190, KeyCode.US_DOT); + define(191, KeyCode.US_SLASH); + define(192, KeyCode.US_BACKTICK); + define(193, KeyCode.ABNT_C1); + define(194, KeyCode.ABNT_C2); + define(219, KeyCode.US_OPEN_SQUARE_BRACKET); + define(220, KeyCode.US_BACKSLASH); + define(221, KeyCode.US_CLOSE_SQUARE_BRACKET); + define(222, KeyCode.US_QUOTE); + define(223, KeyCode.OEM_8); + + define(226, KeyCode.OEM_102); /** * https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html * If an Input Method Editor is processing key input and the event is keydown, return 229. */ - KEY_CODE_MAP[229] = KeyCode.KEY_IN_COMPOSITION; + define(229, KeyCode.KEY_IN_COMPOSITION); if (browser.isIE) { - KEY_CODE_MAP[91] = KeyCode.Meta; + define(91, KeyCode.Meta); } else if (browser.isFirefox) { - KEY_CODE_MAP[59] = KeyCode.US_SEMICOLON; - KEY_CODE_MAP[107] = KeyCode.US_EQUAL; - KEY_CODE_MAP[109] = KeyCode.US_MINUS; + define(59, KeyCode.US_SEMICOLON); + define(107, KeyCode.US_EQUAL); + define(109, KeyCode.US_MINUS); if (platform.isMacintosh) { - KEY_CODE_MAP[224] = KeyCode.Meta; + define(224, KeyCode.Meta); } } else if (browser.isWebKit) { - KEY_CODE_MAP[91] = KeyCode.Meta; + define(91, KeyCode.Meta); if (platform.isMacintosh) { // the two meta keys in the Mac have different key codes (91 and 93) - KEY_CODE_MAP[93] = KeyCode.Meta; + define(93, KeyCode.Meta); } else { - KEY_CODE_MAP[92] = KeyCode.Meta; + define(92, KeyCode.Meta); } } })(); @@ -165,6 +176,10 @@ function extractKeyCode(e: KeyboardEvent): KeyCode { return KEY_CODE_MAP[e.keyCode] || KeyCode.Unknown; } +export function getCodeForKeyCode(keyCode: KeyCode): number { + return INVERSE_KEY_CODE_MAP[keyCode]; +} + export interface IKeyboardEvent { readonly browserEvent: KeyboardEvent; readonly target: HTMLElement; diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index e928613fb9b..a09429f1137 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -360,7 +360,7 @@ export class StandaloneKeybindingService extends AbstractKeybindingService { this.toDispose.push(dom.addDisposableListener(domNode, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { let keyEvent = new StandardKeyboardEvent(e); - let shouldPreventDefault = this.dispatchEvent(keyEvent, keyEvent.target); + let shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target); if (shouldPreventDefault) { keyEvent.preventDefault(); } diff --git a/src/vs/editor/standalone/test/browser/simpleServices.test.ts b/src/vs/editor/standalone/test/browser/simpleServices.test.ts index ef3756c76c8..e13eab64aa9 100644 --- a/src/vs/editor/standalone/test/browser/simpleServices.test.ts +++ b/src/vs/editor/standalone/test/browser/simpleServices.test.ts @@ -17,7 +17,7 @@ suite('StandaloneKeybindingService', () => { class TestStandaloneKeybindingService extends StandaloneKeybindingService { public testDispatch(e: IKeyboardEvent): void { - super.dispatchEvent(e, null); + super._dispatch(e, null); } } diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 094e607e5ee..d94d59a5afe 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -11,42 +11,70 @@ import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChann import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; import { SimpleKeybinding } from 'vs/base/common/keyCodes'; -import { ScanCodeBinding, IMMUTABLE_KEY_CODE_TO_CODE, ScanCodeUtils } from 'vs/workbench/services/keybinding/common/scanCode'; -import { IKeybindingService, IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; +import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import * as electron from 'electron'; +import { USLayoutResolvedKeybinding } from '../../keybinding/common/usLayoutResolvedKeybinding'; +import { OS } from 'vs/base/common/platform'; class WindowDriver implements IWindowDriver { - constructor( - @IKeybindingService private keybindingService: IKeybindingService - ) { } + constructor() { } async dispatchKeybinding(rawKeybinding: string): TPromise { const [first, second] = KeybindingIO._readUserBinding(rawKeybinding); - this._dispatchKeybinding(first); + await this._dispatchKeybinding(first); if (second) { - this._dispatchKeybinding(second); + await this._dispatchKeybinding(second); } } - private _dispatchKeybinding(keybinding: SimpleKeybinding | ScanCodeBinding): void { + private async _dispatchKeybinding(keybinding: SimpleKeybinding | ScanCodeBinding): TPromise { if (keybinding instanceof ScanCodeBinding) { throw new Error('ScanCodeBindings not supported'); } - const scanCode = IMMUTABLE_KEY_CODE_TO_CODE[keybinding.keyCode]; - const event: IKeyboardEvent = { - ctrlKey: keybinding.ctrlKey, - altKey: keybinding.altKey, - shiftKey: keybinding.shiftKey, - metaKey: keybinding.metaKey, - keyCode: keybinding.keyCode, - code: ScanCodeUtils.toString(scanCode) - }; + const webContents = electron.remote.getCurrentWebContents(); + const noModifiedKeybinding = new SimpleKeybinding(false, false, false, false, keybinding.keyCode); + const resolvedKeybinding = new USLayoutResolvedKeybinding(noModifiedKeybinding, OS); + const keyCode = resolvedKeybinding.getElectronAccelerator(); - this.keybindingService.dispatchEvent(event, document.activeElement); + const modifiers = []; + + if (keybinding.ctrlKey) { + modifiers.push('ctrl'); + } + + if (keybinding.metaKey) { + modifiers.push('meta'); + } + + if (keybinding.shiftKey) { + modifiers.push('shift'); + } + + if (keybinding.altKey) { + modifiers.push('alt'); + } + + webContents.sendInputEvent({ type: 'keyDown', keyCode, modifiers } as any); + webContents.sendInputEvent({ type: 'char', keyCode, modifiers } as any); + webContents.sendInputEvent({ type: 'keyUp', keyCode, modifiers } as any); + + await TPromise.timeout(100); + + // const event: IKeyboardEvent = { + // ctrlKey: keybinding.ctrlKey, + // altKey: keybinding.altKey, + // shiftKey: keybinding.shiftKey, + // metaKey: keybinding.metaKey, + // keyCode: keybinding.keyCode, + // code: ScanCodeUtils.toString(scanCode) + // }; + + // this.keybindingService.dispatchEvent(event, document.activeElement); // console.log(keybinding); diff --git a/src/vs/platform/keybinding/common/abstractKeybindingService.ts b/src/vs/platform/keybinding/common/abstractKeybindingService.ts index abf8f7246f6..8e41b285347 100644 --- a/src/vs/platform/keybinding/common/abstractKeybindingService.ts +++ b/src/vs/platform/keybinding/common/abstractKeybindingService.ts @@ -114,7 +114,7 @@ export abstract class AbstractKeybindingService implements IKeybindingService { return this._getResolver().resolve(contextValue, currentChord, firstPart); } - dispatchEvent(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean { + protected _dispatch(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean { let shouldPreventDefault = false; const keybinding = this.resolveKeyboardEvent(e); diff --git a/src/vs/platform/keybinding/common/keybinding.ts b/src/vs/platform/keybinding/common/keybinding.ts index dde18ad1da3..c491ec7a8d0 100644 --- a/src/vs/platform/keybinding/common/keybinding.ts +++ b/src/vs/platform/keybinding/common/keybinding.ts @@ -77,10 +77,5 @@ export interface IKeybindingService { getKeybindings(): ResolvedKeybindingItem[]; customKeybindingsCount(): number; - - /** - * For simulation purposes (eg, smoke test) - */ - dispatchEvent(e: IKeyboardEvent, target: IContextKeyServiceTarget): boolean; } diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index 032e9138c9c..44ea5de8c5d 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -70,7 +70,7 @@ suite('AbstractKeybindingService', () => { public testDispatch(kb: number): boolean { const keybinding = createSimpleKeybinding(kb, OS); - return this.dispatchEvent({ + return this._dispatch({ ctrlKey: keybinding.ctrlKey, shiftKey: keybinding.shiftKey, altKey: keybinding.altKey, diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index 53a383766df..94cce17a1d0 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -313,7 +313,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { this.toDispose.push(dom.addDisposableListener(windowElement, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { let keyEvent = new StandardKeyboardEvent(e); - let shouldPreventDefault = this.dispatchEvent(keyEvent, keyEvent.target); + let shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target); if (shouldPreventDefault) { keyEvent.preventDefault(); } From 48bd86b4be855b1b2929a27bdacf18c6aba8336f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 11:43:32 +0200 Subject: [PATCH 072/710] :lipstick: --- .../driver/electron-browser/driver.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index d94d59a5afe..3ca910c7113 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -64,27 +64,8 @@ class WindowDriver implements IWindowDriver { webContents.sendInputEvent({ type: 'keyUp', keyCode, modifiers } as any); await TPromise.timeout(100); - - // const event: IKeyboardEvent = { - // ctrlKey: keybinding.ctrlKey, - // altKey: keybinding.altKey, - // shiftKey: keybinding.shiftKey, - // metaKey: keybinding.metaKey, - // keyCode: keybinding.keyCode, - // code: ScanCodeUtils.toString(scanCode) - // }; - - // this.keybindingService.dispatchEvent(event, document.activeElement); - - // console.log(keybinding); - - // const e = new KeyboardEvent('keydown', event); - // console.log('dispatching', e); - // document.activeElement.dispatchEvent(e); - // document.activeElement.dispatchEvent(new KeyboardEvent('keyup', event)); } - click(selector: string, xoffset?: number, yoffset?: number): TPromise { throw new Error('Method not implemented.'); } From e47f1213f7335fb8832d364a707f63a170c174d3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 11:47:45 +0200 Subject: [PATCH 073/710] dispatchKeybinding from main --- src/vs/platform/driver/common/driver.ts | 7 --- .../driver/electron-browser/driver.ts | 51 ------------------ .../platform/driver/electron-main/driver.ts | 54 +++++++++++++++++-- 3 files changed, 51 insertions(+), 61 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index d22ba362654..4adbbd20009 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -155,7 +155,6 @@ export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry } export interface IWindowDriver { - dispatchKeybinding(keybinding: string): TPromise; click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): TPromise; doubleClick(selector: string): TPromise; move(selector: string): TPromise; @@ -167,7 +166,6 @@ export interface IWindowDriver { } export interface IWindowDriverChannel extends IChannel { - call(command: 'dispatchKeybinding', arg: string): TPromise; call(command: 'click', arg: [string, number | undefined, number | undefined]): TPromise; call(command: 'doubleClick', arg: string): TPromise; call(command: 'move', arg: string): TPromise; @@ -185,7 +183,6 @@ export class WindowDriverChannel implements IWindowDriverChannel { call(command: string, arg?: any): TPromise { switch (command) { - case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg); case 'click': return this.driver.click(arg[0], arg[1], arg[2]); case 'doubleClick': return this.driver.doubleClick(arg); case 'move': return this.driver.move(arg); @@ -207,10 +204,6 @@ export class WindowDriverChannelClient implements IWindowDriver { constructor(private channel: IWindowDriverChannel) { } - dispatchKeybinding(keybinding: string): TPromise { - return this.channel.call('dispatchKeybinding', keybinding); - } - click(selector: string, xoffset?: number, yoffset?: number): TPromise { return this.channel.call('click', [selector, xoffset, yoffset]); } diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 3ca910c7113..e00563abcd1 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -9,63 +9,12 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/common/driver'; import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; -import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; -import { SimpleKeybinding } from 'vs/base/common/keyCodes'; -import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import * as electron from 'electron'; -import { USLayoutResolvedKeybinding } from '../../keybinding/common/usLayoutResolvedKeybinding'; -import { OS } from 'vs/base/common/platform'; class WindowDriver implements IWindowDriver { constructor() { } - async dispatchKeybinding(rawKeybinding: string): TPromise { - const [first, second] = KeybindingIO._readUserBinding(rawKeybinding); - - await this._dispatchKeybinding(first); - - if (second) { - await this._dispatchKeybinding(second); - } - } - - private async _dispatchKeybinding(keybinding: SimpleKeybinding | ScanCodeBinding): TPromise { - if (keybinding instanceof ScanCodeBinding) { - throw new Error('ScanCodeBindings not supported'); - } - - const webContents = electron.remote.getCurrentWebContents(); - const noModifiedKeybinding = new SimpleKeybinding(false, false, false, false, keybinding.keyCode); - const resolvedKeybinding = new USLayoutResolvedKeybinding(noModifiedKeybinding, OS); - const keyCode = resolvedKeybinding.getElectronAccelerator(); - - const modifiers = []; - - if (keybinding.ctrlKey) { - modifiers.push('ctrl'); - } - - if (keybinding.metaKey) { - modifiers.push('meta'); - } - - if (keybinding.shiftKey) { - modifiers.push('shift'); - } - - if (keybinding.altKey) { - modifiers.push('alt'); - } - - webContents.sendInputEvent({ type: 'keyDown', keyCode, modifiers } as any); - webContents.sendInputEvent({ type: 'char', keyCode, modifiers } as any); - webContents.sendInputEvent({ type: 'keyUp', keyCode, modifiers } as any); - - await TPromise.timeout(100); - } - click(selector: string, xoffset?: number, yoffset?: number): TPromise { throw new Error('Method not implemented.'); } diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 8c5e7d57bc8..0b971ac2632 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -12,6 +12,13 @@ import { serve as serveNet } from 'vs/base/parts/ipc/node/ipc.net'; import { combinedDisposable, IDisposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IPCServer, IClientRouter } from 'vs/base/parts/ipc/common/ipc'; +import { SimpleKeybinding } from 'vs/base/common/keyCodes'; +import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; +import { OS } from 'vs/base/common/platform'; + +// TODO@joao: bad layering! +import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; +import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; class WindowRouter implements IClientRouter { @@ -44,9 +51,50 @@ export class Driver implements IDriver, IWindowDriverRegistry { .filter(id => this.registeredWindowIds.has(id)); } - dispatchKeybinding(windowId: number, keybinding: string): TPromise { - const windowDriver = this.getWindowDriver(windowId); - return windowDriver.dispatchKeybinding(keybinding); + async dispatchKeybinding(windowId: number, keybinding: string): TPromise { + const [first, second] = KeybindingIO._readUserBinding(keybinding); + + await this._dispatchKeybinding(windowId, first); + + if (second) { + await this._dispatchKeybinding(windowId, second); + } + } + + private async _dispatchKeybinding(windowId: number, keybinding: SimpleKeybinding | ScanCodeBinding): TPromise { + if (keybinding instanceof ScanCodeBinding) { + throw new Error('ScanCodeBindings not supported'); + } + + const window = this.windowsService.getWindowById(windowId); + const webContents = window.win.webContents; + const noModifiedKeybinding = new SimpleKeybinding(false, false, false, false, keybinding.keyCode); + const resolvedKeybinding = new USLayoutResolvedKeybinding(noModifiedKeybinding, OS); + const keyCode = resolvedKeybinding.getElectronAccelerator(); + + const modifiers = []; + + if (keybinding.ctrlKey) { + modifiers.push('ctrl'); + } + + if (keybinding.metaKey) { + modifiers.push('meta'); + } + + if (keybinding.shiftKey) { + modifiers.push('shift'); + } + + if (keybinding.altKey) { + modifiers.push('alt'); + } + + webContents.sendInputEvent({ type: 'keyDown', keyCode, modifiers } as any); + webContents.sendInputEvent({ type: 'char', keyCode, modifiers } as any); + webContents.sendInputEvent({ type: 'keyUp', keyCode, modifiers } as any); + + await TPromise.timeout(100); } click(windowId: number, selector: string, xoffset?: number, yoffset?: number): TPromise { From d7981f1a0b5eef8812d43cc4d5177e15ee656f2c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 11:48:32 +0200 Subject: [PATCH 074/710] lower timeout --- test/smoke/test/mocha.opts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/test/mocha.opts b/test/smoke/test/mocha.opts index ce88473e86b..a4520575eb6 100644 --- a/test/smoke/test/mocha.opts +++ b/test/smoke/test/mocha.opts @@ -1,3 +1,3 @@ ---timeout 20000 +--timeout 10000 --slow 2000 out/main.js \ No newline at end of file From 37b566135616331d0c29bd05467c1ed56eb6a3b9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 11:52:40 +0200 Subject: [PATCH 075/710] forward driver calls --- test/smoke/src/driver.ts | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index 5c4652a46d5..e3163c6cfe1 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -142,52 +142,58 @@ export class CodeDriver implements Driver { await this.driver.dispatchKeybinding(windowId, keybinding); } - click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { + async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { if (this.verbose) { console.log('- click:', selector); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + await this.driver.click(windowId, selector, xoffset, yoffset); } - doubleClick(selector: string): Promise { + async doubleClick(selector: string): Promise { if (this.verbose) { console.log('- doubleClick:', selector); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + await this.driver.doubleClick(windowId, selector); } - move(selector: string): Promise { + async move(selector: string): Promise { if (this.verbose) { console.log('- move:', selector); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + await this.driver.move(windowId, selector); } - setValue(selector: string, text: string): Promise { + async setValue(selector: string, text: string): Promise { if (this.verbose) { console.log('- setValue:', selector, text); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + await this.driver.setValue(windowId, selector, text); } - getTitle(): Promise { + async getTitle(): Promise { if (this.verbose) { console.log('- getTitle:'); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + return await this.driver.getTitle(windowId); } - isActiveElement(selector: string): Promise { + async isActiveElement(selector: string): Promise { if (this.verbose) { console.log('- isActiveElement:', selector); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + return await this.driver.isActiveElement(windowId, selector); } async getElements(selector: string): Promise { @@ -200,12 +206,13 @@ export class CodeDriver implements Driver { return result; } - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ + async selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ if (this.verbose) { console.log('- selectorExecute:', selector); } - throw new Error('Method not implemented.'); + const windowId = await this.getWindowId(); + return await this.driver.selectorExecute(windowId, selector, script, ...args); } private async getWindowId(): Promise { From 43207efb461f75aae3b769279ef7d64391fae22f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 12:19:49 +0200 Subject: [PATCH 076/710] dispatch input event --- src/vs/platform/driver/electron-browser/driver.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index e00563abcd1..99f7a7e5cd0 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -34,7 +34,11 @@ class WindowDriver implements IWindowDriver { throw new Error('Element not found'); } - (element as HTMLInputElement).value = text; + const inputElement = element as HTMLInputElement; + inputElement.value = text; + + const event = new Event('input', { bubbles: true, cancelable: true }); + inputElement.dispatchEvent(event); } async getTitle(): TPromise { From cfb26b3d4bc55d080e822b7840f9aaf821ee0a8f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 10 Apr 2018 12:20:24 +0200 Subject: [PATCH 077/710] Remove left-over console.log --- src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts index 0fc4b4ef5ea..6dbaa2e4525 100644 --- a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +++ b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts @@ -391,7 +391,6 @@ class Widget { } if (this.allowEditorOverflow) { - console.log(`here i am: ${JSON.stringify(topLeft)}`); placement = this._layoutBoxInPage(topLeft, this._cachedDomNodeClientWidth, this._cachedDomNodeClientHeight, ctx); } else { placement = this._layoutBoxInViewport(topLeft, this._cachedDomNodeClientWidth, this._cachedDomNodeClientHeight, ctx); From 7bd69c0c86dc78329eec3a98366f3f137b558828 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 12:34:46 +0200 Subject: [PATCH 078/710] attributes, children on IElement instances --- src/vs/platform/driver/common/driver.ts | 22 ++++++------ .../driver/electron-browser/driver.ts | 34 +++++++++++++++---- .../platform/driver/electron-main/driver.ts | 4 +-- test/smoke/src/api.ts | 4 +-- test/smoke/src/areas/debug/debug.ts | 2 +- test/smoke/src/areas/editor/editor.ts | 4 +-- test/smoke/src/areas/editor/peek.ts | 2 +- .../src/areas/preferences/preferences.test.ts | 4 +-- test/smoke/src/areas/quickopen/quickopen.ts | 2 +- test/smoke/src/driver.ts | 10 +++--- 10 files changed, 56 insertions(+), 32 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 4adbbd20009..0fdcc5d46c5 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -17,6 +17,8 @@ export interface IElement { tagName: string; className: string; textContent: string; + attributes: { [name: string]: string; }; + children: IElement[]; } export interface IDriver { @@ -30,7 +32,7 @@ export interface IDriver { setValue(windowId: number, selector: string, text: string): TPromise; getTitle(windowId: number): TPromise; isActiveElement(windowId: number, selector: string): TPromise; - getElements(windowId: number, selector: string): TPromise; + getElements(windowId: number, selector: string, recursive: boolean): TPromise; selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } //*END @@ -44,7 +46,7 @@ export interface IDriverChannel extends IChannel { call(command: 'setValue', arg: [number, string, string]): TPromise; call(command: 'getTitle', arg: [number]): TPromise; call(command: 'isActiveElement', arg: [number, string]): TPromise; - call(command: 'getElements', arg: [number, string]): TPromise; + call(command: 'getElements', arg: [number, string, boolean]): TPromise; call(command: 'selectorExecute', arg: [number, string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; } @@ -63,7 +65,7 @@ export class DriverChannel implements IDriverChannel { case 'setValue': return this.driver.setValue(arg[0], arg[1], arg[2]); case 'getTitle': return this.driver.getTitle(arg[0]); case 'isActiveElement': return this.driver.isActiveElement(arg[0], arg[1]); - case 'getElements': return this.driver.getElements(arg[0], arg[1]); + case 'getElements': return this.driver.getElements(arg[0], arg[1], arg[2]); // TODO@joao case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], arg[1], ...arg[2]); @@ -111,8 +113,8 @@ export class DriverChannelClient implements IDriver { return this.channel.call('isActiveElement', [windowId, selector]); } - getElements(windowId: number, selector: string): TPromise { - return this.channel.call('getElements', [windowId, selector]); + getElements(windowId: number, selector: string, recursive: boolean): TPromise { + return this.channel.call('getElements', [windowId, selector, recursive]); } selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ @@ -161,7 +163,7 @@ export interface IWindowDriver { setValue(selector: string, text: string): TPromise; getTitle(): TPromise; isActiveElement(selector: string): TPromise; - getElements(selector: string): TPromise; + getElements(selector: string, recursive: boolean): TPromise; selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } @@ -172,7 +174,7 @@ export interface IWindowDriverChannel extends IChannel { call(command: 'setValue', arg: [string, string]): TPromise; call(command: 'getTitle'): TPromise; call(command: 'isActiveElement', arg: string): TPromise; - call(command: 'getElements', arg: string): TPromise; + call(command: 'getElements', arg: [string, boolean]): TPromise; call(command: 'selectorExecute', arg: [string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; } @@ -189,7 +191,7 @@ export class WindowDriverChannel implements IWindowDriverChannel { case 'setValue': return this.driver.setValue(arg[0], arg[1]); case 'getTitle': return this.driver.getTitle(); case 'isActiveElement': return this.driver.isActiveElement(arg); - case 'getElements': return this.driver.getElements(arg); + case 'getElements': return this.driver.getElements(arg[0], arg[1]); // TODO@joao case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], ...arg[2]); } @@ -228,8 +230,8 @@ export class WindowDriverChannelClient implements IWindowDriver { return this.channel.call('isActiveElement', selector); } - getElements(selector: string): TPromise { - return this.channel.call('getElements', selector); + getElements(selector: string, recursive: boolean): TPromise { + return this.channel.call('getElements', [selector, recursive]); } selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 99f7a7e5cd0..44100426f4f 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -11,6 +11,31 @@ import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChann import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +function serializeElement(element: Element, recursive: boolean): IElement { + const attributes = Object.create(null); + + for (let j = 0; j < element.attributes.length; j++) { + const attr = element.attributes.item(j); + attributes[attr.name] = attr.value; + } + + const children = []; + + if (recursive) { + for (let i = 0; i < element.children.length; i++) { + children.push(serializeElement(element.children.item(i), true)); + } + } + + return { + tagName: element.tagName, + className: element.className, + textContent: element.textContent || '', + attributes, + children + }; +} + class WindowDriver implements IWindowDriver { constructor() { } @@ -50,18 +75,13 @@ class WindowDriver implements IWindowDriver { return element === document.activeElement; } - async getElements(selector: string): TPromise { + async getElements(selector: string, recursive: boolean): TPromise { const query = document.querySelectorAll(selector); const result: IElement[] = []; for (let i = 0; i < query.length; i++) { const element = query.item(i); - - result.push({ - tagName: element.tagName, - className: element.className, - textContent: element.textContent || '' - }); + result.push(serializeElement(element, recursive)); } return result; diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 0b971ac2632..1676316a3a5 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -127,9 +127,9 @@ export class Driver implements IDriver, IWindowDriverRegistry { return windowDriver.isActiveElement(selector); } - getElements(windowId: number, selector: string): TPromise { + getElements(windowId: number, selector: string, recursive: boolean): TPromise { const windowDriver = this.getWindowDriver(windowId); - return windowDriver.getElements(selector); + return windowDriver.getElements(selector, recursive); } selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index a2f8b5ce21d..d93d19ff05f 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -60,8 +60,8 @@ export class API { return elements.length; } - waitForElements(selector: string, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { - return this.waitFor(() => this.driver.getElements(selector), accept, `elements with selector ${selector}`) as Promise; + waitForElements(selector: string, recursive: boolean, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { + return this.waitFor(() => this.driver.getElements(selector, recursive), accept, `elements with selector ${selector}`) as Promise; } waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index b346f7395c9..630c5c95340 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -105,7 +105,7 @@ export class Debug extends Viewlet { } async waitForStackFrameLength(length: number): Promise { - await this.api.waitForElements(STACK_FRAME, result => result.length === length); + await this.api.waitForElements(STACK_FRAME, false, result => result.length === length); } async focusStackFrame(name: string, message: string): Promise { diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 74486d947b3..552a4fc743b 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -125,13 +125,13 @@ export class Editor { } private async getClassSelectors(term: string, viewline: number): Promise { - const elements = await this.api.waitForElements(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, els => els.some(el => el.textContent === term)); + const elements = await this.api.waitForElements(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, false, els => els.some(el => el.textContent === term)); const { className } = elements.filter(r => r.textContent === term)[0]; return className.split(/\s/g); } private async getViewLineIndex(line: number): Promise { - const elements = await this.api.waitForElements(Editor.LINE_NUMBERS, els => { + const elements = await this.api.waitForElements(Editor.LINE_NUMBERS, false, els => { return els.some(el => el.textContent === `${line}`); }); diff --git a/test/smoke/src/areas/editor/peek.ts b/test/smoke/src/areas/editor/peek.ts index fe094cdb683..4f0bd9170b2 100644 --- a/test/smoke/src/areas/editor/peek.ts +++ b/test/smoke/src/areas/editor/peek.ts @@ -26,7 +26,7 @@ export class References { } async waitForReferencesCount(count: number): Promise { - await this.api.waitForElements(References.REFERENCES, result => result && result.length === count); + await this.api.waitForElements(References.REFERENCES, false, result => result && result.length === count); } async waitForFile(file: string): Promise { diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index fc1dccb8d6d..e0d0e8223ab 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -18,12 +18,12 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.explorer.openFile('app.js'); - await app.api.waitForElements('.line-numbers', elements => !!elements.length); + await app.api.waitForElements('.line-numbers', false, elements => !!elements.length); await app.screenCapturer.capture('app.js has line numbers'); await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); await app.workbench.editors.selectTab('app.js'); - await app.api.waitForElements('.line-numbers', result => !result || result.length === 0); + await app.api.waitForElements('.line-numbers', false, result => !result || result.length === 0); await app.screenCapturer.capture('line numbers hidden'); }); diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index a4a14ee2cf3..9d411f60d77 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -65,7 +65,7 @@ export class QuickOpen { } async waitForQuickOpenElements(accept: (names: string[]) => boolean): Promise { - await this.api.waitForElements(QuickOpen.QUICK_OPEN_ENTRY_LABEL_SELECTOR, els => accept(els.map(e => e.textContent))); + await this.api.waitForElements(QuickOpen.QUICK_OPEN_ENTRY_LABEL_SELECTOR, false, els => accept(els.map(e => e.textContent))); } async runCommand(command: string): Promise { diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index e3163c6cfe1..bc7d4edb503 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -10,6 +10,7 @@ export interface Element { tagName: string; className: string; textContent: string; + attributes: { [name: string]: string }; } export interface Driver { @@ -21,7 +22,7 @@ export interface Driver { getTitle(): Promise; isActiveElement(selector: string): Promise; - getElements(selector: string): Promise; + getElements(selector: string, recursive?: boolean): Promise; selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; } @@ -104,7 +105,8 @@ export class SpectronDriver implements Driver { result.push({ tagName: element.tagName, className: element.className, - textContent: element.textContent || '' + textContent: element.textContent || '', + attributes: {} }); } @@ -196,13 +198,13 @@ export class CodeDriver implements Driver { return await this.driver.isActiveElement(windowId, selector); } - async getElements(selector: string): Promise { + async getElements(selector: string, recursive = false): Promise { if (this.verbose) { console.log('- getElements:', selector); } const windowId = await this.getWindowId(); - const result = await this.driver.getElements(windowId, selector); + const result = await this.driver.getElements(windowId, selector, recursive); return result; } From 825d5f3f66d1dda8851ffa36c036db28d61c97ba Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Tue, 10 Apr 2018 12:57:39 +0200 Subject: [PATCH 079/710] Fixes #47465: Provide a method of matching TaskExecution objects --- src/vs/workbench/api/node/extHostTask.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 03e3ae433e0..7128c03fb41 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -711,6 +711,7 @@ export class ExtHostTask implements ExtHostTaskShape { private _extHostWorkspace: ExtHostWorkspace; private _handleCounter: number; private _handlers: Map; + private _taskExecutions: Map; private readonly _onDidExecuteTask: Emitter = new Emitter(); private readonly _onDidTerminateTask: Emitter = new Emitter(); @@ -720,6 +721,7 @@ export class ExtHostTask implements ExtHostTaskShape { this._extHostWorkspace = extHostWorkspace; this._handleCounter = 0; this._handlers = new Map(); + this._taskExecutions = new Map(); } public get extHostWorkspace(): ExtHostWorkspace { @@ -756,19 +758,19 @@ export class ExtHostTask implements ExtHostTaskShape { let tTask = (task as types.Task); // We have a preserved ID. So the task didn't change. if (tTask._id !== void 0) { - return this._proxy.$executeTask(TaskHandleDTO.from(tTask)).then(value => new TaskExecutionImpl(value.id, task, this)); + return this._proxy.$executeTask(TaskHandleDTO.from(tTask)).then(value => this.getTaskExecution(value, task)); } else { let dto = TaskDTO.from(task, extension); if (dto === void 0) { return Promise.reject(new Error('Task is not valid')); } - return this._proxy.$executeTask(dto).then(value => new TaskExecutionImpl(value.id, task, this)); + return this._proxy.$executeTask(dto).then(value => this.getTaskExecution(value, task)); } } public $taskStarted(execution: TaskExecutionDTO): void { this._onDidExecuteTask.fire({ - execution: TaskExecutionDTO.to(execution, this) + execution: this.getTaskExecution(execution) }); } @@ -784,8 +786,10 @@ export class ExtHostTask implements ExtHostTaskShape { } public $taskEnded(execution: TaskExecutionDTO): void { + const _execution = this.getTaskExecution(execution); + this._taskExecutions.delete(execution.id); this._onDidTerminateTask.fire({ - execution: TaskExecutionDTO.to(execution, this) + execution: _execution }); } @@ -810,4 +814,14 @@ export class ExtHostTask implements ExtHostTaskShape { private nextHandle(): number { return this._handleCounter++; } + + private getTaskExecution(execution: TaskExecutionDTO, task?: vscode.Task): TaskExecutionImpl { + let result: TaskExecutionImpl = this._taskExecutions.get(execution.id); + if (result) { + return result; + } + result = new TaskExecutionImpl(execution.id, task ? task : TaskDTO.to(execution.task, this._extHostWorkspace), this); + this._taskExecutions.set(execution.id, result); + return result; + } } From 49f03902b661c5b2aa5be5ef9a98600652e9574d Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 10 Apr 2018 15:09:29 +0200 Subject: [PATCH 080/710] Late update for 1.22.1 --- .github/calendar.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/calendar.yml b/.github/calendar.yml index 06ea947f56d..276adfcda36 100644 --- a/.github/calendar.yml +++ b/.github/calendar.yml @@ -10,4 +10,6 @@ '2018-03-15 12:00, US/Pacific': 'release', # 1.21.1 '2018-03-20 12:00, US/Pacific': 'development', '2018-03-26 18:00, US/Pacific': 'endgame', -} \ No newline at end of file + '2018-04-06 18:00, US/Pacific': 'release', # 1.22.1 + '2018-04-11 18:00, US/Pacific': 'development', +} From 8213728043b96cc6ab3157650b95a1e6f8e4f7f1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 10 Apr 2018 15:59:54 +0200 Subject: [PATCH 081/710] Fixes #47382: Don't move markers when formatting with a full model replace edit --- src/vs/editor/contrib/format/formatCommand.ts | 14 ++++++++++- .../contrib/format/test/formatCommand.test.ts | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/format/formatCommand.ts b/src/vs/editor/contrib/format/formatCommand.ts index 52f8d0c428a..5b38129e3ae 100644 --- a/src/vs/editor/contrib/format/formatCommand.ts +++ b/src/vs/editor/contrib/format/formatCommand.ts @@ -43,10 +43,22 @@ export class EditOperationsCommand implements editorCommon.ICommand { editor.pushUndoStop(); } + static isFullModelReplaceEdit(editor: ICodeEditor, edit: ISingleEditOperation): boolean { + const model = editor.getModel(); + const editRange = model.validateRange(edit.range); + const fullModelRange = model.getFullModelRange(); + return fullModelRange.equalsRange(editRange); + } + static execute(editor: ICodeEditor, _edits: TextEdit[]) { let edits = this._handleEolEdits(editor, _edits); editor.pushUndoStop(); - editor.executeEdits('formatEditsCommand', edits.map(edit => EditOperation.replaceMove(Range.lift(edit.range), edit.text))); + if (edits.length === 1 && EditOperationsCommand.isFullModelReplaceEdit(editor, edits[0])) { + // We use replace semantics and hope that markers stay put... + editor.executeEdits('formatEditsCommand', edits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text))); + } else { + editor.executeEdits('formatEditsCommand', edits.map(edit => EditOperation.replaceMove(Range.lift(edit.range), edit.text))); + } editor.pushUndoStop(); } diff --git a/src/vs/editor/contrib/format/test/formatCommand.test.ts b/src/vs/editor/contrib/format/test/formatCommand.test.ts index 048b9c35b69..0a9bbde4593 100644 --- a/src/vs/editor/contrib/format/test/formatCommand.test.ts +++ b/src/vs/editor/contrib/format/test/formatCommand.test.ts @@ -334,4 +334,29 @@ suite('FormatCommand', () => { }); }); + test('issue #47382: full model replace moves cursor to end of file', () => { + const initialText = [ + 'just some', + 'Text', + '...more text' + ]; + withTestCodeEditor(initialText, {}, (editor) => { + editor.setSelection(new Selection(2, 1, 2, 1)); + EditOperationsCommand.execute(editor, [{ + range: new Range(1, 1, 3, 13), + text: [ + 'just some', + '\tText', + '...more text' + ].join('\n') + }]); + assert.equal(editor.getValue(), [ + 'just some', + '\tText', + '...more text' + ].join('\n')); + assert.deepEqual(editor.getSelection(), new Selection(2, 1, 2, 1)); + }); + }); + }); From fc0774e44ff7cd9a7568bcd2d7e3124c227483ba Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 16:26:45 +0200 Subject: [PATCH 082/710] typeInEditor API --- src/vs/platform/driver/common/driver.ts | 14 ++++++++++ .../driver/electron-browser/driver.ts | 23 ++++++++++++++++ .../platform/driver/electron-main/driver.ts | 5 ++++ test/smoke/src/api.ts | 4 +++ test/smoke/src/areas/editor/editor.ts | 26 +++---------------- test/smoke/src/driver.ts | 14 ++++++++++ test/smoke/test/mocha.opts | 2 +- 7 files changed, 65 insertions(+), 23 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 0fdcc5d46c5..8a64621227b 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -33,6 +33,7 @@ export interface IDriver { getTitle(windowId: number): TPromise; isActiveElement(windowId: number, selector: string): TPromise; getElements(windowId: number, selector: string, recursive: boolean): TPromise; + typeInEditor(windowId: number, selector: string, text: string): TPromise; selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } //*END @@ -47,6 +48,7 @@ export interface IDriverChannel extends IChannel { call(command: 'getTitle', arg: [number]): TPromise; call(command: 'isActiveElement', arg: [number, string]): TPromise; call(command: 'getElements', arg: [number, string, boolean]): TPromise; + call(command: 'typeInEditor', arg: [number, string, string]): TPromise; call(command: 'selectorExecute', arg: [number, string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; } @@ -66,6 +68,7 @@ export class DriverChannel implements IDriverChannel { case 'getTitle': return this.driver.getTitle(arg[0]); case 'isActiveElement': return this.driver.isActiveElement(arg[0], arg[1]); case 'getElements': return this.driver.getElements(arg[0], arg[1], arg[2]); + case 'typeInEditor': return this.driver.typeInEditor(arg[0], arg[1], arg[2]); // TODO@joao case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], arg[1], ...arg[2]); @@ -117,6 +120,10 @@ export class DriverChannelClient implements IDriver { return this.channel.call('getElements', [windowId, selector, recursive]); } + typeInEditor(windowId: number, selector: string, text: string): TPromise { + return this.channel.call('typeInEditor', [windowId, selector, text]); + } + selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ // TODO@joao return this.channel.call('selectorExecute', [windowId, selector, script.toString(), args]); @@ -164,6 +171,7 @@ export interface IWindowDriver { getTitle(): TPromise; isActiveElement(selector: string): TPromise; getElements(selector: string, recursive: boolean): TPromise; + typeInEditor(selector: string, text: string): TPromise; selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; } @@ -175,6 +183,7 @@ export interface IWindowDriverChannel extends IChannel { call(command: 'getTitle'): TPromise; call(command: 'isActiveElement', arg: string): TPromise; call(command: 'getElements', arg: [string, boolean]): TPromise; + call(command: 'typeInEditor', arg: [string, string]): TPromise; call(command: 'selectorExecute', arg: [string, string, any[]]): TPromise; call(command: string, arg: any): TPromise; } @@ -192,6 +201,7 @@ export class WindowDriverChannel implements IWindowDriverChannel { case 'getTitle': return this.driver.getTitle(); case 'isActiveElement': return this.driver.isActiveElement(arg); case 'getElements': return this.driver.getElements(arg[0], arg[1]); + case 'typeInEditor': return this.driver.typeInEditor(arg[0], arg[1]); // TODO@joao case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], ...arg[2]); } @@ -234,6 +244,10 @@ export class WindowDriverChannelClient implements IWindowDriver { return this.channel.call('getElements', [selector, recursive]); } + typeInEditor(selector: string, text: string): TPromise { + return this.channel.call('typeInEditor', [selector, text]); + } + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ // TODO@joao return this.channel.call('selectorExecute', [selector, script.toString(), args]); diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 44100426f4f..7fb3fb6133b 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -87,6 +87,29 @@ class WindowDriver implements IWindowDriver { return result; } + async typeInEditor(selector: string, text: string): TPromise { + const element = document.querySelector(selector); + + if (!element) { + throw new Error('Editor not found: ' + selector); + } + + const textarea = element as HTMLTextAreaElement; + + console.log(textarea); + + const start = textarea.selectionStart; + const newStart = start + text.length; + const value = textarea.value; + const newValue = value.substr(0, start) + text + value.substr(start); + + textarea.value = newValue; + textarea.setSelectionRange(newStart, newStart); + + const event = new Event('input', { 'bubbles': true, 'cancelable': true }); + textarea.dispatchEvent(event); + } + selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ return TPromise.wrapError(new Error('not implemented')); } diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 1676316a3a5..ad32690ab27 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -137,6 +137,11 @@ export class Driver implements IDriver, IWindowDriverRegistry { return windowDriver.selectorExecute(selector, script, ...args); } + typeInEditor(windowId: number, selector: string, text: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.typeInEditor(selector, text); + } + private getWindowDriver(windowId: number): IWindowDriver { const router = new WindowRouter(windowId); const windowDriverChannel = this.windowServer.getChannel('windowDriver', router); diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index d93d19ff05f..356583997fb 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -80,6 +80,10 @@ export class API { return this.driver.selectorExecute(selector, script, ...args); } + typeInEditor(selector: string, text: string): Promise { + return this.driver.typeInEditor(selector, text); + } + private running = false; async waitFor(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; async waitFor(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 552a4fc743b..fdb5f4ca9c2 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -9,6 +9,7 @@ import { API } from '../../api'; const RENAME_BOX = '.monaco-editor .monaco-editor.rename-box'; const RENAME_INPUT = `${RENAME_BOX} .rename-input`; +const EDITOR = filename => `.monaco-editor[data-uri$="${filename}"]`; export class Editor { @@ -87,39 +88,20 @@ export class Editor { } async waitForTypeInEditor(filename: string, text: string, selectorPrefix = ''): Promise { - const editor = [ - selectorPrefix || '', - `.monaco-editor[data-uri$="${filename}"]` - ].join(' '); + const editor = [selectorPrefix || '', EDITOR(filename)].join(' '); await this.api.waitForElement(editor); const textarea = `${editor} textarea`; await this.api.waitForActiveElement(textarea); - // https://github.com/Microsoft/vscode/issues/34203#issuecomment-334441786 - await this.api.selectorExecute(textarea, (elements, text) => { - const textarea = (Array.isArray(elements) ? elements : [elements])[0] as HTMLTextAreaElement; - const start = textarea.selectionStart; - const newStart = start + text.length; - const value = textarea.value; - const newValue = value.substr(0, start) + text + value.substr(start); - - textarea.value = newValue; - textarea.setSelectionRange(newStart, newStart); - - const event = new Event('input', { 'bubbles': true, 'cancelable': true }); - textarea.dispatchEvent(event); - }, text); + await this.api.typeInEditor(textarea, text); await this.waitForEditorContents(filename, c => c.indexOf(text) > -1, selectorPrefix); } async waitForEditorContents(filename: string, accept: (contents: string) => boolean, selectorPrefix = ''): Promise { - const selector = [ - selectorPrefix || '', - `.monaco-editor[data-uri$="${filename}"] .view-lines` - ].join(' '); + const selector = [selectorPrefix || '', `${EDITOR(filename)} .view-lines`].join(' '); return this.api.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' '))); } diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index bc7d4edb503..fa661be932e 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -23,6 +23,7 @@ export interface Driver { isActiveElement(selector: string): Promise; getElements(selector: string, recursive?: boolean): Promise; + typeInEditor(selector: string, text: string): Promise; selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; } @@ -116,6 +117,10 @@ export class SpectronDriver implements Driver { return result.value; } + typeInEditor(selector: string, text: string): Promise { + throw new Error('Method not implemented.'); + } + async selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ if (this.verbose) { console.log('- selectorExecute:', selector); @@ -217,6 +222,15 @@ export class CodeDriver implements Driver { return await this.driver.selectorExecute(windowId, selector, script, ...args); } + async typeInEditor(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- typeInEditor:', selector, text); + } + + const windowId = await this.getWindowId(); + return await this.driver.typeInEditor(windowId, selector, text); + } + private async getWindowId(): Promise { if (typeof this._activeWindowId !== 'number') { const windows = await this.driver.getWindowIds(); diff --git a/test/smoke/test/mocha.opts b/test/smoke/test/mocha.opts index a4520575eb6..ce88473e86b 100644 --- a/test/smoke/test/mocha.opts +++ b/test/smoke/test/mocha.opts @@ -1,3 +1,3 @@ ---timeout 10000 +--timeout 20000 --slow 2000 out/main.js \ No newline at end of file From 36708c0f5dabfe8a7f3724833d52b466b11cea8d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Apr 2018 16:13:44 +0200 Subject: [PATCH 083/710] add `toDecodeStream` to enable seamless encoding handling, #41985 --- src/vs/base/node/encoding.ts | 82 ++++++++++++- .../base/test/node/encoding/encoding.test.ts | 114 +++++++++++++++++- 2 files changed, 194 insertions(+), 2 deletions(-) diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index e861c4048cb..6318f2cbc5f 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -10,12 +10,92 @@ import * as iconv from 'iconv-lite'; import { TPromise } from 'vs/base/common/winjs.base'; import { isLinux, isMacintosh } from 'vs/base/common/platform'; import { exec } from 'child_process'; +import { Readable, Writable, WritableOptions } from 'stream'; export const UTF8 = 'utf8'; export const UTF8_with_bom = 'utf8bom'; export const UTF16be = 'utf16be'; export const UTF16le = 'utf16le'; +export interface IDecodeStreamOptions { + minBytesRequiredForDetection: number; + guessEncoding: boolean; + overwriteEncoding(detected: string): string; +} + +export function toDecodeStream(readable: Readable, opts: IDecodeStreamOptions): TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }> { + return new TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }>((resolve, reject) => { + readable.pipe(new class extends Writable { + + private _decodeStream: NodeJS.ReadWriteStream; + private _decodeStreamConstruction: Thenable; + private _buffer: Buffer[] = []; + private _bytesBuffered = 0; + + constructor(opts?: WritableOptions) { + super(opts); + this.once('finish', () => this._finish()); + } + + _write(chunk: any, encoding: string, callback: Function): void { + if (!Buffer.isBuffer(chunk)) { + callback(new Error('data must be a buffer')); + } + + if (this._decodeStream) { + // just a forwarder now + this._decodeStream.write(chunk, callback); + return; + } + + this._buffer.push(chunk); + this._bytesBuffered += chunk.length; + + if (this._decodeStreamConstruction) { + // waiting for the decoder to be ready + this._decodeStreamConstruction.then(_ => callback(), err => callback(err)); + + } else if (this._bytesBuffered >= opts.minBytesRequiredForDetection) { + // buffered enough data, create stream and forward data + this._startDecodeStream(callback); + + } else { + // only buffering + callback(); + } + } + + _startDecodeStream(callback: Function): void { + + this._decodeStreamConstruction = TPromise.as(detectEncodingFromBuffer({ + buffer: Buffer.concat(this._buffer), bytesRead: this._bytesBuffered + }, opts.guessEncoding)).then(detected => { + detected.encoding = opts.overwriteEncoding(detected.encoding); // default encoding + this._decodeStream = decodeStream(detected.encoding); + for (const buffer of this._buffer) { + this._decodeStream.write(buffer); + } + callback(); + resolve({ detected, stream: this._decodeStream }); + + }, err => { + callback(err); + }); + } + + _finish(): void { + if (this._decodeStream) { + // normal finish + this._decodeStream.end(); + } else { + // we were still waiting for data... + this._startDecodeStream(() => this._decodeStream.end()); + } + } + }); + }); +} + export function bomLength(encoding: string): number { switch (encoding) { case UTF8: @@ -350,4 +430,4 @@ export function resolveTerminalEncoding(verbose?: boolean): TPromise { return UTF8; }); -} \ No newline at end of file +} diff --git a/src/vs/base/test/node/encoding/encoding.test.ts b/src/vs/base/test/node/encoding/encoding.test.ts index 7ade8bf5873..063912953f0 100644 --- a/src/vs/base/test/node/encoding/encoding.test.ts +++ b/src/vs/base/test/node/encoding/encoding.test.ts @@ -6,9 +6,10 @@ 'use strict'; import * as assert from 'assert'; - +import * as fs from 'fs'; import * as encoding from 'vs/base/node/encoding'; import { readExactlyByFile } from 'vs/base/node/stream'; +import { Readable } from 'stream'; suite('Encoding', () => { test('detectBOM UTF-8', () => { @@ -150,4 +151,115 @@ suite('Encoding', () => { }); }); }); + + async function readAndDecodeFromDisk(path, _encoding) { + return new Promise((resolve, reject) => { + fs.readFile(path, (err, data) => { + if (err) { + reject(err); + } else { + resolve(encoding.decode(data, _encoding)); + } + }); + }); + } + + async function readAllAsString(stream: NodeJS.ReadableStream) { + return new Promise((resolve, reject) => { + let all = ''; + stream.on('data', chunk => { + all += chunk; + assert.equal(typeof chunk, 'string'); + }); + stream.on('end', () => { + resolve(all); + }); + stream.on('error', reject); + }); + } + + test('toDecodeStream - some stream', async function () { + + let source = new Readable({ + read(size) { + this.push(Buffer.from([65, 66, 67])); + this.push(Buffer.from([65, 66, 67])); + this.push(Buffer.from([65, 66, 67])); + this.push(null); + } + }); + + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + + assert.ok(detected); + assert.ok(stream); + + const content = await readAllAsString(stream); + assert.equal(content, 'ABCABCABC'); + }); + + test('toDecodeStream - some stream, expect too much data', async function () { + + let source = new Readable({ + read(size) { + this.push(Buffer.from([65, 66, 67])); + this.push(Buffer.from([65, 66, 67])); + this.push(Buffer.from([65, 66, 67])); + this.push(null); + } + }); + + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + + assert.ok(detected); + assert.ok(stream); + + const content = await readAllAsString(stream); + assert.equal(content, 'ABCABCABC'); + }); + + test('toDecodeStream - some stream, no data', async function () { + + let source = new Readable({ + read(size) { + this.push(null); // empty + } + }); + + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 512, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + + assert.ok(detected); + assert.ok(stream); + + const content = await readAllAsString(stream); + assert.equal(content, ''); + }); + + + test('toDecodeStream - encoding, utf16be', async function () { + + let path = require.toUrl('./fixtures/some_utf16be.css'); + let source = fs.createReadStream(path); + + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: true, overwriteEncoding(detected) { return detected; } }); + + assert.equal(detected.encoding, 'utf16be'); + assert.equal(detected.seemsBinary, false); + + let expected = await readAndDecodeFromDisk(path, detected.encoding); + let actual = await readAllAsString(stream); + assert.equal(actual, expected); + }); + + + test('toDecodeStream - empty file', async function () { + + let path = require.toUrl('./fixtures/empty.txt'); + let source = fs.createReadStream(path); + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + + let expected = await readAndDecodeFromDisk(path, detected.encoding); + let actual = await readAllAsString(stream); + assert.equal(actual, expected); + }); }); From f686a20863de110239dcdc47a164fa576b2938ea Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Apr 2018 16:58:53 +0200 Subject: [PATCH 084/710] add provider to readable-stream logic, #41985 --- src/vs/base/node/encoding.ts | 34 ++++---- .../base/test/node/encoding/encoding.test.ts | 10 +-- .../electron-browser/remoteFileService.ts | 87 +++++++++++-------- 3 files changed, 72 insertions(+), 59 deletions(-) diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index 6318f2cbc5f..7a35237f3e9 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -18,12 +18,21 @@ export const UTF16be = 'utf16be'; export const UTF16le = 'utf16le'; export interface IDecodeStreamOptions { - minBytesRequiredForDetection: number; - guessEncoding: boolean; - overwriteEncoding(detected: string): string; + guessEncoding?: boolean; + minBytesRequiredForDetection?: number; + overwriteEncoding?(detected: string): string; } -export function toDecodeStream(readable: Readable, opts: IDecodeStreamOptions): TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }> { +export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions): TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }> { + + if (!options.minBytesRequiredForDetection) { + options.minBytesRequiredForDetection = options.guessEncoding ? AUTO_GUESS_BUFFER_MAX_LEN : NO_GUESS_BUFFER_MAX_LEN; + } + + if (!options.overwriteEncoding) { + options.overwriteEncoding = detected => detected || UTF8; + } + return new TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }>((resolve, reject) => { readable.pipe(new class extends Writable { @@ -55,7 +64,7 @@ export function toDecodeStream(readable: Readable, opts: IDecodeStreamOptions): // waiting for the decoder to be ready this._decodeStreamConstruction.then(_ => callback(), err => callback(err)); - } else if (this._bytesBuffered >= opts.minBytesRequiredForDetection) { + } else if (this._bytesBuffered >= options.minBytesRequiredForDetection) { // buffered enough data, create stream and forward data this._startDecodeStream(callback); @@ -69,8 +78,8 @@ export function toDecodeStream(readable: Readable, opts: IDecodeStreamOptions): this._decodeStreamConstruction = TPromise.as(detectEncodingFromBuffer({ buffer: Buffer.concat(this._buffer), bytesRead: this._bytesBuffered - }, opts.guessEncoding)).then(detected => { - detected.encoding = opts.overwriteEncoding(detected.encoding); // default encoding + }, options.guessEncoding)).then(detected => { + detected.encoding = options.overwriteEncoding(detected.encoding); // default encoding this._decodeStream = decodeStream(detected.encoding); for (const buffer of this._buffer) { this._decodeStream.write(buffer); @@ -256,17 +265,6 @@ const ZERO_BYTE_DETECTION_BUFFER_MAX_LEN = 512; // number of bytes to look at to const NO_GUESS_BUFFER_MAX_LEN = 512; // when not auto guessing the encoding, small number of bytes are enough const AUTO_GUESS_BUFFER_MAX_LEN = 512 * 8; // with auto guessing we want a lot more content to be read for guessing -export function maxEncodingDetectionBufferLen(arg1?: DetectEncodingOption | boolean): number { - let autoGuessEncoding: boolean; - if (typeof arg1 === 'boolean') { - autoGuessEncoding = arg1; - } else { - autoGuessEncoding = arg1 && arg1.autoGuessEncoding; - } - - return autoGuessEncoding ? AUTO_GUESS_BUFFER_MAX_LEN : NO_GUESS_BUFFER_MAX_LEN; -} - export interface IDetectedEncodingResult { encoding: string; seemsBinary: boolean; diff --git a/src/vs/base/test/node/encoding/encoding.test.ts b/src/vs/base/test/node/encoding/encoding.test.ts index 063912953f0..252ee281e37 100644 --- a/src/vs/base/test/node/encoding/encoding.test.ts +++ b/src/vs/base/test/node/encoding/encoding.test.ts @@ -189,7 +189,7 @@ suite('Encoding', () => { } }); - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4 }); assert.ok(detected); assert.ok(stream); @@ -209,7 +209,7 @@ suite('Encoding', () => { } }); - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64 }); assert.ok(detected); assert.ok(stream); @@ -226,7 +226,7 @@ suite('Encoding', () => { } }); - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 512, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 512 }); assert.ok(detected); assert.ok(stream); @@ -241,7 +241,7 @@ suite('Encoding', () => { let path = require.toUrl('./fixtures/some_utf16be.css'); let source = fs.createReadStream(path); - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: true, overwriteEncoding(detected) { return detected; } }); + let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64 }); assert.equal(detected.encoding, 'utf16be'); assert.equal(detected.seemsBinary, false); @@ -256,7 +256,7 @@ suite('Encoding', () => { let path = require.toUrl('./fixtures/empty.txt'); let source = fs.createReadStream(path); - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: true, overwriteEncoding() { return encoding.UTF8; } }); + let { detected, stream } = await encoding.toDecodeStream(source, {}); let expected = await readAndDecodeFromDisk(path, detected.encoding); let actual = await readAllAsString(stream); diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 84097d96331..8a4a0c41cc7 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -12,7 +12,7 @@ import { posix } from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; import { isFalsyOrEmpty, distinct } from 'vs/base/common/arrays'; import { Schemas } from 'vs/base/common/network'; -import { decodeStream, encode, UTF8, UTF8_with_bom, detectEncodingFromBuffer, maxEncodingDetectionBufferLen } from 'vs/base/node/encoding'; +import { encode, UTF8, UTF8_with_bom, toDecodeStream } from 'vs/base/node/encoding'; import { TernarySearchTree } from 'vs/base/common/map'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -23,6 +23,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { localize } from 'vs/nls'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { Readable } from 'stream'; function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse?: (tuple: [URI, IStat]) => boolean): TPromise { const [resource, stat] = tuple; @@ -220,6 +221,25 @@ export class RemoteFileService extends FileService { } } + private _createReadStream(provider: IFileSystemProvider, resource: URI): Readable { + return new class extends Readable { + _done: boolean = false; + _read(size?: number): void { + if (this._done) { + this.push(null); + return; + } + provider.readFile(resource).then(data => { + this._done = true; + this.push(data); + }, err => { + this._done = true; + this.emit('error', err); + }); + } + }; + } + private _readFile(resource: URI, options: IResolveContentOptions = Object.create(null)): TPromise { return this._withProvider(resource).then(provider => { @@ -242,15 +262,34 @@ export class RemoteFileService extends FileService { ); } - const guessEncoding = options.autoGuessEncoding; - const count = maxEncodingDetectionBufferLen(options); - let buffer: Buffer; + return toDecodeStream(this._createReadStream(provider, resource), { + guessEncoding: options.autoGuessEncoding, + overwriteEncoding: detected => { + let preferredEncoding: string; + if (options && options.encoding) { + if (detected === UTF8 && options.encoding === UTF8) { + preferredEncoding = UTF8_with_bom; // indicate the file has BOM if we are to resolve with UTF 8 + } else { + preferredEncoding = options.encoding; // give passed in encoding highest priority + } + } else if (detected) { + if (detected === UTF8) { + preferredEncoding = UTF8_with_bom; // if we detected UTF-8, it can only be because of a BOM + } else { + preferredEncoding = detected; + } + // todo@remote - encoding logic should not be kept + // hostage inside the node file service + // } else if (super.configuredEncoding(resource) === UTF8_with_bom) { + } else { + preferredEncoding = UTF8; // if we did not detect UTF 8 BOM before, this can only be UTF 8 then + } + return preferredEncoding; + } - return provider.readFile(resource).then(data => { - buffer = Buffer.from(data); - return detectEncodingFromBuffer({ bytesRead: Math.min(count, buffer.length), buffer }, guessEncoding); - }).then(detected => { - if (options.acceptTextOnly && detected.seemsBinary) { + }).then(data => { + + if (options.acceptTextOnly && data.detected.seemsBinary) { return TPromise.wrapError(new FileOperationError( localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), FileOperationResult.FILE_IS_BINARY, @@ -258,33 +297,9 @@ export class RemoteFileService extends FileService { )); } - let preferredEncoding: string; - if (options && options.encoding) { - if (detected.encoding === UTF8 && options.encoding === UTF8) { - preferredEncoding = UTF8_with_bom; // indicate the file has BOM if we are to resolve with UTF 8 - } else { - preferredEncoding = options.encoding; // give passed in encoding highest priority - } - } else if (detected.encoding) { - if (detected.encoding === UTF8) { - preferredEncoding = UTF8_with_bom; // if we detected UTF-8, it can only be because of a BOM - } else { - preferredEncoding = detected.encoding; - } - // todo@remote - encoding logic should not be kept - // hostage inside the node file service - // } else if (super.configuredEncoding(resource) === UTF8_with_bom) { - } else { - preferredEncoding = UTF8; // if we did not detect UTF 8 BOM before, this can only be UTF 8 then - } - - // const encoding = this.getEncoding(resource); - const stream = decodeStream(preferredEncoding); - stream.end(buffer); - - return { - encoding: preferredEncoding, - value: stream, + return { + encoding: data.detected.encoding, + value: data.stream, resource: fileStat.resource, name: fileStat.name, etag: fileStat.etag, From 8eae25a2bad03423fd1f5ed36e0651cb3506edcc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 17:05:14 +0200 Subject: [PATCH 085/710] remove selectorExecute --- src/vs/platform/driver/common/driver.ts | 25 +++---- .../driver/electron-browser/driver.ts | 21 ++++-- .../platform/driver/electron-main/driver.ts | 10 +-- test/smoke/src/api.ts | 8 +-- test/smoke/src/areas/debug/debug.ts | 67 ++++++------------ test/smoke/src/areas/git/scm.ts | 60 +++++----------- test/smoke/src/areas/terminal/terminal.ts | 30 ++------ test/smoke/src/driver.ts | 69 +++++++++++++------ 8 files changed, 132 insertions(+), 158 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 8a64621227b..61b98ed7714 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -34,7 +34,7 @@ export interface IDriver { isActiveElement(windowId: number, selector: string): TPromise; getElements(windowId: number, selector: string, recursive: boolean): TPromise; typeInEditor(windowId: number, selector: string, text: string): TPromise; - selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; + getTerminalBuffer(windowId: number, selector: string): TPromise; } //*END @@ -49,7 +49,7 @@ export interface IDriverChannel extends IChannel { call(command: 'isActiveElement', arg: [number, string]): TPromise; call(command: 'getElements', arg: [number, string, boolean]): TPromise; call(command: 'typeInEditor', arg: [number, string, string]): TPromise; - call(command: 'selectorExecute', arg: [number, string, string, any[]]): TPromise; + call(command: 'getTerminalBuffer', arg: [number, string]): TPromise; call(command: string, arg: any): TPromise; } @@ -69,9 +69,7 @@ export class DriverChannel implements IDriverChannel { case 'isActiveElement': return this.driver.isActiveElement(arg[0], arg[1]); case 'getElements': return this.driver.getElements(arg[0], arg[1], arg[2]); case 'typeInEditor': return this.driver.typeInEditor(arg[0], arg[1], arg[2]); - - // TODO@joao - case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], arg[1], ...arg[2]); + case 'getTerminalBuffer': return this.driver.getTerminalBuffer(arg[0], arg[1]); } return undefined; @@ -124,9 +122,8 @@ export class DriverChannelClient implements IDriver { return this.channel.call('typeInEditor', [windowId, selector, text]); } - selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ - // TODO@joao - return this.channel.call('selectorExecute', [windowId, selector, script.toString(), args]); + getTerminalBuffer(windowId: number, selector: string): TPromise { + return this.channel.call('getTerminalBuffer', [windowId, selector]); } } @@ -172,7 +169,7 @@ export interface IWindowDriver { isActiveElement(selector: string): TPromise; getElements(selector: string, recursive: boolean): TPromise; typeInEditor(selector: string, text: string): TPromise; - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

; + getTerminalBuffer(selector: string): TPromise; } export interface IWindowDriverChannel extends IChannel { @@ -184,7 +181,7 @@ export interface IWindowDriverChannel extends IChannel { call(command: 'isActiveElement', arg: string): TPromise; call(command: 'getElements', arg: [string, boolean]): TPromise; call(command: 'typeInEditor', arg: [string, string]): TPromise; - call(command: 'selectorExecute', arg: [string, string, any[]]): TPromise; + call(command: 'getTerminalBuffer', arg: string): TPromise; call(command: string, arg: any): TPromise; } @@ -202,8 +199,7 @@ export class WindowDriverChannel implements IWindowDriverChannel { case 'isActiveElement': return this.driver.isActiveElement(arg); case 'getElements': return this.driver.getElements(arg[0], arg[1]); case 'typeInEditor': return this.driver.typeInEditor(arg[0], arg[1]); - // TODO@joao - case 'selectorExecute': return this.driver.selectorExecute(arg[0], arg[1], ...arg[2]); + case 'getTerminalBuffer': return this.driver.getTerminalBuffer(arg); } return undefined; @@ -248,8 +244,7 @@ export class WindowDriverChannelClient implements IWindowDriver { return this.channel.call('typeInEditor', [selector, text]); } - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ - // TODO@joao - return this.channel.call('selectorExecute', [selector, script.toString(), args]); + getTerminalBuffer(selector: string): TPromise { + return this.channel.call('getTerminalBuffer', selector); } } \ No newline at end of file diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 7fb3fb6133b..8075f851c6b 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -95,9 +95,6 @@ class WindowDriver implements IWindowDriver { } const textarea = element as HTMLTextAreaElement; - - console.log(textarea); - const start = textarea.selectionStart; const newStart = start + text.length; const value = textarea.value; @@ -110,8 +107,22 @@ class WindowDriver implements IWindowDriver { textarea.dispatchEvent(event); } - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ - return TPromise.wrapError(new Error('not implemented')); + async getTerminalBuffer(selector: string): TPromise { + const element = document.querySelector(selector); + + if (!element) { + throw new Error('Terminal not found: ' + selector); + } + + const buffer = (element as any).xterm.buffer; + + const lines: string[] = []; + + for (let i = 0; i < buffer.lines.length; i++) { + lines.push(buffer.translateBufferLineToString(i, true)); + } + + return lines; } } diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index ad32690ab27..9aa152f8437 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -132,16 +132,16 @@ export class Driver implements IDriver, IWindowDriverRegistry { return windowDriver.getElements(selector, recursive); } - selectorExecute

(windowId: number, selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): TPromise

{ - const windowDriver = this.getWindowDriver(windowId); - return windowDriver.selectorExecute(selector, script, ...args); - } - typeInEditor(windowId: number, selector: string, text: string): TPromise { const windowDriver = this.getWindowDriver(windowId); return windowDriver.typeInEditor(selector, text); } + getTerminalBuffer(windowId: number, selector: string): TPromise { + const windowDriver = this.getWindowDriver(windowId); + return windowDriver.getTerminalBuffer(selector); + } + private getWindowDriver(windowId: number): IWindowDriver { const router = new WindowRouter(windowId); const windowDriverChannel = this.windowServer.getChannel('windowDriver', router); diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index 356583997fb..6fa23dc7862 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -76,14 +76,14 @@ export class API { return this.driver.getTitle(); } - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ - return this.driver.selectorExecute(selector, script, ...args); - } - typeInEditor(selector: string, text: string): Promise { return this.driver.typeInEditor(selector, text); } + getTerminalBuffer(selector: string): Promise { + return this.driver.getTerminalBuffer(selector); + } + private running = false; async waitFor(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; async waitFor(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 630c5c95340..013892ed931 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -8,6 +8,7 @@ import { Commands } from '../workbench/workbench'; import { API } from '../../api'; import { Editors } from '../editor/editors'; import { Editor } from '../editor/editor'; +import { findElement, Element } from '../../driver'; const VIEWLET = 'div[id="workbench.view.debug"]'; const DEBUG_VIEW = `${VIEWLET} .debug-view-content`; @@ -27,7 +28,7 @@ const TOOLBAR_HIDDEN = `.debug-actions-widget.monaco-builder-hidden`; const STACK_FRAME = `${VIEWLET} .monaco-tree-row .stack-frame`; const SPECIFIC_STACK_FRAME = filename => `${STACK_FRAME} .file[title$="${filename}"]`; const VARIABLE = `${VIEWLET} .debug-variables .monaco-tree-row .expression`; -const CONSOLE_OUTPUT = `.repl .output.expression`; +const CONSOLE_OUTPUT = `.repl .output.expression .value`; const CONSOLE_INPUT_OUTPUT = `.repl .input-output-pair .output.expression .value`; const REPL_FOCUSED = '.repl-input-wrapper .monaco-editor textarea'; @@ -37,6 +38,17 @@ export interface IStackFrame { lineNumber: number; } +function toStackFrame(element: Element): IStackFrame { + const name = findElement(element, e => /\bfile-name\b/.test(e.className))!; + const line = findElement(element, e => /\bline-number\b/.test(e.className))!; + const lineNumber = line.textContent ? parseInt(line.textContent.split(':').shift() || '0') : 0; + + return { + name: name.textContent || '', + lineNumber + }; +} + export class Debug extends Viewlet { constructor(api: API, private commands: Commands, private editors: Editors, private editor: Editor) { @@ -64,12 +76,9 @@ export class Debug extends Viewlet { await this.api.waitForElement(PAUSE); await this.api.waitForElement(DEBUG_STATUS_BAR); const portPrefix = 'Port: '; - await this.api.waitFor(async () => { - const output = await this.getConsoleOutput(); - return output.join(''); - }, text => !!text && text.indexOf(portPrefix) >= 0); - const output = await this.getConsoleOutput(); - const lastOutput = output.pop(); + + const output = await this.waitForOutput(output => output.some(line => line.indexOf(portPrefix) >= 0)); + const lastOutput = output.filter(line => line.indexOf(portPrefix) >= 0)[0]; return lastOutput ? parseInt(lastOutput.substr(portPrefix.length)) : 3000; } @@ -98,10 +107,8 @@ export class Debug extends Viewlet { } async waitForStackFrame(func: (stackFrame: IStackFrame) => boolean, message: string): Promise { - return await this.api.waitFor(async () => { - const stackFrames = await this.getStackFrames(); - return stackFrames.filter(func)[0]; - }, void 0, `Waiting for Stack Frame: ${message}`); + const elements = await this.api.waitForElements(STACK_FRAME, true, elements => elements.some(e => func(toStackFrame(e)))); + return elements.map(toStackFrame).filter(s => func(s))[0]; } async waitForStackFrameLength(length: number): Promise { @@ -122,45 +129,15 @@ export class Debug extends Viewlet { await this.editor.waitForEditorContents('debug:input', s => s.indexOf(text) >= 0); await this.api.dispatchKeybinding('enter'); await this.api.waitForElement(CONSOLE_INPUT_OUTPUT); - await this.api.waitFor(async () => { - const result = await this.getConsoleOutput(); - return result[result.length - 1] || ''; - }, accept); + await this.waitForOutput(output => accept(output[output.length - 1] || '')); } async getLocalVariableCount(): Promise { return await this.api.getElementCount(VARIABLE); } - private async getStackFrames(): Promise { - const result = await this.api.selectorExecute(STACK_FRAME, - div => (Array.isArray(div) ? div : [div]).map(element => { - const name = element.querySelector('.file-name') as HTMLElement; - const line = element.querySelector('.line-number') as HTMLElement; - const lineNumber = line.textContent ? parseInt(line.textContent.split(':').shift() || '0') : 0; - - return { - name: name.textContent || '', - lineNumber - }; - }) - ); - - if (!Array.isArray(result)) { - return []; - } - - return result.map(({ name, lineNumber }) => ({ name, lineNumber })); - } - - private async getConsoleOutput(): Promise { - const result = await this.api.selectorExecute(CONSOLE_OUTPUT, - div => (Array.isArray(div) ? div : [div]).map(element => { - const value = element.querySelector('.value') as HTMLElement; - return value && value.textContent; - }).filter(line => !!line) as string[] - ); - - return result; + private async waitForOutput(fn: (output: string[]) => boolean): Promise { + const elements = await this.api.waitForElements(CONSOLE_OUTPUT, false, elements => fn(elements.map(e => e.textContent))); + return elements.map(e => e.textContent); } } diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index ce5e6a6bb4c..b2cc5fc8baf 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -6,6 +6,7 @@ import { Viewlet } from '../workbench/viewlet'; import { API } from '../../api'; import { Commands } from '../workbench/workbench'; +import { Element, findElement, findElements } from '../../driver'; const VIEWLET = 'div[id="workbench.view.scm"]'; const SCM_INPUT = `${VIEWLET} .scm-editor textarea`; @@ -23,6 +24,21 @@ interface Change { actions: string[]; } +function toChange(element: Element): Change { + const name = findElement(element, e => /\blabel-name\b/.test(e.className))!; + const type = element.attributes['data-tooltip'] || ''; + + const actionElementList = findElements(element, e => /\baction-label\b/.test(e.className)); + const actions = actionElementList.map(e => e.attributes['title']); + + return { + name: name.textContent || '', + type, + actions + }; +} + + export class SCM extends Viewlet { constructor(api: API, private commands: Commands) { @@ -34,53 +50,15 @@ export class SCM extends Viewlet { await this.api.waitForElement(SCM_INPUT); } - waitForChange(name: string, type?: string): Promise { - return this.api.waitFor(async () => { - const changes = await this.queryChanges(name, type); - return changes.length; - }, l => l > 0, 'Getting SCM changes') as Promise as Promise; + async waitForChange(name: string, type?: string): Promise { + const func = (change: Change) => change.name === name && (!type || change.type === type); + await this.api.waitForElements(SCM_RESOURCE, true, elements => elements.some(e => func(toChange(e)))); } async refreshSCMViewlet(): Promise { await this.api.waitAndClick(REFRESH_COMMAND); } - private async queryChanges(name: string, type?: string): Promise { - const result = await this.api.selectorExecute(SCM_RESOURCE, (div, name, type) => { - return (Array.isArray(div) ? div : [div]) - .map(element => { - const name = element.querySelector('.label-name') as HTMLElement; - const type = element.getAttribute('data-tooltip') || ''; - const actionElementList = element.querySelectorAll('.actions .action-label'); - const actions: string[] = []; - - for (let i = 0; i < actionElementList.length; i++) { - const element = actionElementList.item(i) as HTMLElement; - actions.push(element.title); - } - - return { - name: name.textContent || '', - type, - actions - }; - }) - .filter(change => { - if (change.name !== name) { - return false; - } - - if (type && (change.type !== type)) { - return false; - } - - return true; - }); - }, name, type); - - return result; - } - async openChange(name: string): Promise { await this.api.waitAndClick(SCM_RESOURCE_CLICK(name)); } diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts index 231a90b5bfa..e69916b475f 100644 --- a/test/smoke/src/areas/terminal/terminal.ts +++ b/test/smoke/src/areas/terminal/terminal.ts @@ -31,31 +31,15 @@ export class Terminal { await this.api.dispatchKeybinding('enter'); } - async waitForTerminalText(fn: (text: string[]) => boolean, timeOutDescription: string = 'Getting Terminal Text'): Promise { - return this.api.waitFor(async () => { - const terminalText = await this.getTerminalText(); - if (fn(terminalText)) { - return terminalText; - } - return undefined; + async waitForTerminalText(fn: (text: string[]) => boolean, timeOutDescription: string = 'Getting Terminal Text'): Promise { + await this.api.waitFor(async () => { + const terminalText = await this.api.getTerminalBuffer(XTERM_SELECTOR); + return fn(terminalText); }, void 0, timeOutDescription); } - getCurrentLineNumber(): Promise { - return this.getTerminalText().then(text => text.length); - } - - private async getTerminalText(): Promise { - return await this.api.selectorExecute(XTERM_SELECTOR, - div => { - const xterm = ((Array.isArray(div) ? div[0] : div)).xterm; - const buffer = xterm.buffer; - const lines: string[] = []; - for (let i = 0; i < buffer.lines.length; i++) { - lines.push(buffer.translateBufferLineToString(i, true)); - } - return lines; - } - ); + async getCurrentLineNumber(): Promise { + const terminalText = await this.api.getTerminalBuffer(XTERM_SELECTOR); + return terminalText.length; } } \ No newline at end of file diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts index fa661be932e..3906cf2ad6c 100644 --- a/test/smoke/src/driver.ts +++ b/test/smoke/src/driver.ts @@ -11,6 +11,7 @@ export interface Element { className: string; textContent: string; attributes: { [name: string]: string }; + children: Element[]; } export interface Driver { @@ -24,7 +25,7 @@ export interface Driver { isActiveElement(selector: string): Promise; getElements(selector: string, recursive?: boolean): Promise; typeInEditor(selector: string, text: string): Promise; - selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

; + getTerminalBuffer(selector: string): Promise; } export class SpectronDriver implements Driver { @@ -107,7 +108,8 @@ export class SpectronDriver implements Driver { tagName: element.tagName, className: element.className, textContent: element.textContent || '', - attributes: {} + attributes: {}, + children: [] }); } @@ -121,13 +123,8 @@ export class SpectronDriver implements Driver { throw new Error('Method not implemented.'); } - async selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ - if (this.verbose) { - console.log('- selectorExecute:', selector); - } - - let _script = (element, script, ...args) => script(Array.isArray(element) ? element : [element], ...args); - return this.spectronClient.selectorExecute(selector, _script, script, ...args); + getTerminalBuffer(selector: string): Promise { + throw new Error('Method not implemented.'); } } @@ -209,17 +206,7 @@ export class CodeDriver implements Driver { } const windowId = await this.getWindowId(); - const result = await this.driver.getElements(windowId, selector, recursive); - return result; - } - - async selectorExecute

(selector: string, script: (elements: HTMLElement[], ...args: any[]) => P, ...args: any[]): Promise

{ - if (this.verbose) { - console.log('- selectorExecute:', selector); - } - - const windowId = await this.getWindowId(); - return await this.driver.selectorExecute(windowId, selector, script, ...args); + return await this.driver.getElements(windowId, selector, recursive); } async typeInEditor(selector: string, text: string): Promise { @@ -231,6 +218,15 @@ export class CodeDriver implements Driver { return await this.driver.typeInEditor(windowId, selector, text); } + async getTerminalBuffer(selector: string): Promise { + if (this.verbose) { + console.log('- getTerminalBuffer:', selector); + } + + const windowId = await this.getWindowId(); + return await this.driver.getTerminalBuffer(windowId, selector); + } + private async getWindowId(): Promise { if (typeof this._activeWindowId !== 'number') { const windows = await this.driver.getWindowIds(); @@ -239,4 +235,37 @@ export class CodeDriver implements Driver { return this._activeWindowId; } +} + +export function findElement(element: Element, fn: (element: Element) => boolean): Element | null { + const queue = [element]; + + while (queue.length > 0) { + const element = queue.shift()!; + + if (fn(element)) { + return element; + } + + queue.push(...element.children); + } + + return null; +} + +export function findElements(element: Element, fn: (element: Element) => boolean): Element[] { + const result: Element[] = []; + const queue = [element]; + + while (queue.length > 0) { + const element = queue.shift()!; + + if (fn(element)) { + result.push(element); + } + + queue.push(...element.children); + } + + return result; } \ No newline at end of file From 0cc67a183deaedbf484644c1af2eed8f846e808d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Apr 2018 17:09:10 +0200 Subject: [PATCH 086/710] catch bad stack --- src/vs/base/parts/ipc/common/ipc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/parts/ipc/common/ipc.ts b/src/vs/base/parts/ipc/common/ipc.ts index 97f8e5611c4..a3985361b63 100644 --- a/src/vs/base/parts/ipc/common/ipc.ts +++ b/src/vs/base/parts/ipc/common/ipc.ts @@ -152,7 +152,7 @@ export class ChannelServer implements IChannelServer, IDisposable { id, data: { message: data.message, name: data.name, - stack: data.stack ? data.stack.split('\n') : void 0 + stack: data.stack ? (data.stack.split ? data.stack.split('\n') : data.stack) : void 0 }, type: MessageType.ResponseError }); } else { From f2edfdc20b43602df8bbb155c988f50c0cd5ba5a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Apr 2018 17:43:08 +0200 Subject: [PATCH 087/710] fix #47346 --- .../editor/common/services/modelServiceImpl.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index b189ac8390c..98d71e09f7d 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -82,15 +82,23 @@ class ModelMarkerHandler { } private static _createDecorationRange(model: ITextModel, rawMarker: IMarker): Range { - let marker = model.validateRange(new Range(rawMarker.startLineNumber, rawMarker.startColumn, rawMarker.endLineNumber, rawMarker.endColumn)); - let ret: Range = new Range(marker.startLineNumber, marker.startColumn, marker.endLineNumber, marker.endColumn); + + let ret = Range.lift(rawMarker); + + if (rawMarker.severity === MarkerSeverity.Hint && Range.spansMultipleLines(ret)) { + // never render hints on multiple lines + ret = ret.setEndPosition(ret.startLineNumber, ret.startColumn); + } + + ret = model.validateRange(ret); + if (ret.isEmpty()) { let word = model.getWordAtPosition(ret.getStartPosition()); if (word) { ret = new Range(ret.startLineNumber, word.startColumn, ret.endLineNumber, word.endColumn); } else { - let maxColumn = model.getLineLastNonWhitespaceColumn(marker.startLineNumber) || - model.getLineMaxColumn(marker.startLineNumber); + let maxColumn = model.getLineLastNonWhitespaceColumn(ret.startLineNumber) || + model.getLineMaxColumn(ret.startLineNumber); if (maxColumn === 1) { // empty line From f17b5ad6597b830eb8089f091ff920b19c0d36c3 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Tue, 10 Apr 2018 10:15:07 -0700 Subject: [PATCH 088/710] Emmet can return empty array for css #47429 --- extensions/html-language-features/server/src/htmlServerMain.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts index aa1ce562f00..d86ecb5fd68 100644 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ b/extensions/html-language-features/server/src/htmlServerMain.ts @@ -293,8 +293,9 @@ connection.onCompletion(async (textDocumentPosition, token) => { let settings = await getDocumentSettings(document, () => doComplete.length > 2); let result = doComplete(document, textDocumentPosition.position, settings, completionParticipants); if (emmetCompletionList.isIncomplete) { + emmetCompletionList.items = emmetCompletionList.items || []; cachedCompletionList = result; - if (hexColorRegex.test(emmetCompletionList.items[0].label) && result.items.some(x => x.label === emmetCompletionList.items[0].label)) { + if (emmetCompletionList.items.length && hexColorRegex.test(emmetCompletionList.items[0].label) && result.items.some(x => x.label === emmetCompletionList.items[0].label)) { emmetCompletionList.items.shift(); } return CompletionList.create([...emmetCompletionList.items, ...result.items], emmetCompletionList.isIncomplete || result.isIncomplete); From dbe626df43dbc37412bf527329d52eb791f5d43e Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Tue, 10 Apr 2018 11:27:56 -0700 Subject: [PATCH 089/710] Use extension displayname as well when searching using custom views #47405 --- .../parts/extensions/electron-browser/extensionsViews.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts index 07dd776deb6..3c29bd90b41 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts @@ -204,7 +204,7 @@ export class ExtensionsListView extends ViewsViewletPanel { let result = await this.extensionsWorkbenchService.queryLocal(); result = result - .filter(e => e.type === LocalExtensionType.User && e.name.toLowerCase().indexOf(value) > -1); + .filter(e => e.type === LocalExtensionType.User && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1)); return new PagedModel(this.sortExtensions(result, options)); } @@ -224,7 +224,7 @@ export class ExtensionsListView extends ViewsViewletPanel { const local = await this.extensionsWorkbenchService.queryLocal(); const result = local .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) - .filter(extension => extension.outdated && extension.name.toLowerCase().indexOf(value) > -1); + .filter(extension => extension.outdated && (extension.name.toLowerCase().indexOf(value) > -1 || extension.displayName.toLowerCase().indexOf(value) > -1)); return new PagedModel(this.sortExtensions(result, options)); } @@ -237,7 +237,7 @@ export class ExtensionsListView extends ViewsViewletPanel { const result = local .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) - .filter(e => runningExtensions.every(r => !areSameExtensions(r, e)) && e.name.toLowerCase().indexOf(value) > -1); + .filter(e => runningExtensions.every(r => !areSameExtensions(r, e)) && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1)); return new PagedModel(this.sortExtensions(result, options)); } @@ -251,7 +251,7 @@ export class ExtensionsListView extends ViewsViewletPanel { .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) .filter(e => e.type === LocalExtensionType.User && (e.enablementState === EnablementState.Enabled || e.enablementState === EnablementState.WorkspaceEnabled) && - e.name.toLowerCase().indexOf(value) > -1 + (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) ); return new PagedModel(this.sortExtensions(result, options)); From f1b2b8ef3a694e63a7cfb30c489044f7cb58f565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Weinand?= Date: Tue, 10 Apr 2018 12:05:46 +0200 Subject: [PATCH 090/710] rename rawAdapter to debuggerContribution --- src/vs/workbench/parts/debug/node/debugger.ts | 40 ++++++++++--------- .../parts/debug/test/node/debugger.test.ts | 22 +++++----- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/parts/debug/node/debugger.ts b/src/vs/workbench/parts/debug/node/debugger.ts index 1b5075f90f7..d23eb5bfcac 100644 --- a/src/vs/workbench/parts/debug/node/debugger.ts +++ b/src/vs/workbench/parts/debug/node/debugger.ts @@ -21,7 +21,7 @@ export class Debugger { private _mergedExtensionDescriptions: IExtensionDescription[]; - constructor(private configurationManager: IConfigurationManager, private rawAdapter: IDebuggerContribution, public extensionDescription: IExtensionDescription, + constructor(private configurationManager: IConfigurationManager, private debuggerContribution: IDebuggerContribution, public extensionDescription: IExtensionDescription, @IConfigurationService private configurationService: IConfigurationService, @ICommandService private commandService: ICommandService ) { @@ -34,52 +34,54 @@ export class Debugger { return this.getAdapterExecutable(root).then(adapterExecutable => { const debugConfigs = this.configurationService.getValue('debug'); if (debugConfigs.extensionHostDebugAdapter) { - return this.configurationManager.createDebugAdapter(this.rawAdapter.type, adapterExecutable); + return this.configurationManager.createDebugAdapter(this.type, adapterExecutable); } else { - return new DebugAdapter(this.rawAdapter.type, adapterExecutable, this._mergedExtensionDescriptions, outputService); + return new DebugAdapter(this.type, adapterExecutable, this._mergedExtensionDescriptions, outputService); } }); } public getAdapterExecutable(root: IWorkspaceFolder): TPromise { - return this.configurationManager.debugAdapterExecutable(root ? root.uri : undefined, this.rawAdapter.type).then(adapterExecutable => { + // first try to get an executable from DebugConfigurationProvider + return this.configurationManager.debugAdapterExecutable(root ? root.uri : undefined, this.type).then(adapterExecutable => { if (adapterExecutable) { return adapterExecutable; } - // try deprecated command based extension API - if (this.rawAdapter.adapterExecutableCommand) { - return this.commandService.executeCommand(this.rawAdapter.adapterExecutableCommand, root ? root.uri.toString() : undefined); + // try deprecated command based extension API to receive an executable + if (this.debuggerContribution.adapterExecutableCommand) { + return this.commandService.executeCommand(this.debuggerContribution.adapterExecutableCommand, root ? root.uri.toString() : undefined); } + // give up and let DebugAdapter determine executable based on package.json contribution return TPromise.as(null); }); } public get aiKey(): string { - return this.rawAdapter.aiKey; + return this.debuggerContribution.aiKey; } public get label(): string { - return this.rawAdapter.label || this.rawAdapter.type; + return this.debuggerContribution.label || this.debuggerContribution.type; } public get type(): string { - return this.rawAdapter.type; + return this.debuggerContribution.type; } public get variables(): { [key: string]: string } { - return this.rawAdapter.variables; + return this.debuggerContribution.variables; } public get configurationSnippets(): IJSONSchemaSnippet[] { - return this.rawAdapter.configurationSnippets; + return this.debuggerContribution.configurationSnippets; } public get languages(): string[] { - return this.rawAdapter.languages; + return this.debuggerContribution.languages; } public merge(secondRawAdapter: IDebuggerContribution, extensionDescription: IExtensionDescription): void { @@ -91,16 +93,16 @@ export class Debugger { if (extensionDescription.isBuiltin) { this.extensionDescription = extensionDescription; } - objects.mixin(this.rawAdapter, secondRawAdapter, extensionDescription.isBuiltin); + objects.mixin(this.debuggerContribution, secondRawAdapter, extensionDescription.isBuiltin); } public hasInitialConfiguration(): boolean { - return !!this.rawAdapter.initialConfigurations; + return !!this.debuggerContribution.initialConfigurations; } public getInitialConfigurationContent(initialConfigs?: IConfig[]): TPromise { // at this point we got some configs from the package.json and/or from registered DebugConfigurationProviders - let initialConfigurations = this.rawAdapter.initialConfigurations || []; + let initialConfigurations = this.debuggerContribution.initialConfigurations || []; if (initialConfigs) { initialConfigurations = initialConfigurations.concat(initialConfigs); } @@ -130,12 +132,12 @@ export class Debugger { } public getSchemaAttributes(): IJSONSchema[] { - if (!this.rawAdapter.configurationAttributes) { + if (!this.debuggerContribution.configurationAttributes) { return null; } // fill in the default configuration attributes shared by all adapters. - return Object.keys(this.rawAdapter.configurationAttributes).map(request => { - const attributes: IJSONSchema = this.rawAdapter.configurationAttributes[request]; + return Object.keys(this.debuggerContribution.configurationAttributes).map(request => { + const attributes: IJSONSchema = this.debuggerContribution.configurationAttributes[request]; const defaultRequired = ['name', 'type', 'request']; attributes.required = attributes.required && attributes.required.length ? defaultRequired.concat(attributes.required) : defaultRequired; attributes.additionalProperties = false; diff --git a/src/vs/workbench/parts/debug/test/node/debugger.test.ts b/src/vs/workbench/parts/debug/test/node/debugger.test.ts index 8a0379957c9..9e57914a9a9 100644 --- a/src/vs/workbench/parts/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/parts/debug/test/node/debugger.test.ts @@ -18,7 +18,7 @@ suite('Debug - Debugger', () => { let _debugger: Debugger; const extensionFolderPath = 'a/b/c/'; - const rawAdapter = { + const debuggerContribution = { type: 'mock', label: 'Mock Debug', enableBreakpointsFor: { 'languageIds': ['markdown'] }, @@ -57,7 +57,7 @@ suite('Debug - Debugger', () => { engines: null, contributes: { 'debuggers': [ - rawAdapter + debuggerContribution ] } }; @@ -113,14 +113,14 @@ suite('Debug - Debugger', () => { }; - const configurationManager = { + const configurationManager = { debugAdapterExecutable(folderUri: uri | undefined, type: string): TPromise { return TPromise.as(undefined); } }; setup(() => { - _debugger = new Debugger(configurationManager, rawAdapter, extensionDescriptor0, new TestConfigurationService(), null); + _debugger = new Debugger(configurationManager, debuggerContribution, extensionDescriptor0, new TestConfigurationService(), null); }); teardown(() => { @@ -128,20 +128,20 @@ suite('Debug - Debugger', () => { }); test('attributes', () => { - assert.equal(_debugger.type, rawAdapter.type); - assert.equal(_debugger.label, rawAdapter.label); + assert.equal(_debugger.type, debuggerContribution.type); + assert.equal(_debugger.label, debuggerContribution.label); const ae = DebugAdapter.platformAdapterExecutable([extensionDescriptor0], 'mock'); - assert.equal(ae.command, paths.join(extensionFolderPath, rawAdapter.program)); - assert.deepEqual(ae.args, rawAdapter.args); + assert.equal(ae.command, paths.join(extensionFolderPath, debuggerContribution.program)); + assert.deepEqual(ae.args, debuggerContribution.args); }); test('schema attributes', () => { const schemaAttribute = _debugger.getSchemaAttributes()[0]; - assert.notDeepEqual(schemaAttribute, rawAdapter.configurationAttributes); - Object.keys(rawAdapter.configurationAttributes.launch).forEach(key => { - assert.deepEqual(schemaAttribute[key], rawAdapter.configurationAttributes.launch[key]); + assert.notDeepEqual(schemaAttribute, debuggerContribution.configurationAttributes); + Object.keys(debuggerContribution.configurationAttributes.launch).forEach(key => { + assert.deepEqual(schemaAttribute[key], debuggerContribution.configurationAttributes.launch[key]); }); assert.equal(schemaAttribute['additionalProperties'], false); From 7bd29a4f90e129923df3f39c0fbc35535cfea77b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Weinand?= Date: Tue, 10 Apr 2018 15:01:57 +0200 Subject: [PATCH 091/710] fix translation issue #47580 --- .../configurationResolverService.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts index fb77a1d5bb5..833a69b8929 100644 --- a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts @@ -93,7 +93,7 @@ class VariableResolver { return normalizeDriveLetter(context.uri.fsPath); } if (this.workspaceContextService.getWorkspace().folders.length > 1) { - throw new Error(localize('canNotResolveWorkspaceFolderMultiRoot', "'${workspaceFolder}' can not be resolved in a multi folder workspace. Scope this variables using : and a folder name.")); + throw new Error(localize('canNotResolveWorkspaceFolderMultiRoot', "'${workspaceFolder}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.")); } throw new Error(localize('canNotResolveWorkspaceFolder', "'${workspaceFolder}' can not be resolved. Please open a folder.")); @@ -105,7 +105,7 @@ class VariableResolver { return paths.basename(context.uri.fsPath); } if (this.workspaceContextService.getWorkspace().folders.length > 1) { - throw new Error(localize('canNotResolveFolderBasenameMultiRoot', "'${workspaceFolderBasename}' can not be resolved in a multi folder workspace. Scope this variables using : and a folder name.")); + throw new Error(localize('canNotResolveFolderBasenameMultiRoot', "'${workspaceFolderBasename}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.")); } throw new Error(localize('canNotResolveFolderBasename', "'${workspaceFolderBasename}' can not be resolved. Please open a folder.")); @@ -115,20 +115,20 @@ class VariableResolver { return lineNumber; } - throw new Error(localize('canNotResolveLineNumber', "'${lineNumber}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveLineNumber', "'${lineNumber}' can not be resolved. Please open an editor.")); } case 'selectedText': { const selectedText = this.getSelectedText(); if (selectedText) { return selectedText; } - throw new Error(localize('canNotResolveSelectedText', "'${selectedText}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveSelectedText', "'${selectedText}' can not be resolved. Please open an editor.")); } case 'file': { if (filePath) { return filePath; } - throw new Error(localize('canNotResolveFile', "'${file}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveFile', "'${file}' can not be resolved. Please open an editor.")); } case 'relativeFile': { if (context && filePath) { return paths.normalize(relative(context.uri.fsPath, filePath)); @@ -137,32 +137,32 @@ class VariableResolver { return filePath; } - throw new Error(localize('canNotResolveRelativeFile', "'${relativeFile}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveRelativeFile', "'${relativeFile}' can not be resolved. Please open an editor.")); } case 'fileDirname': { if (filePath) { return paths.dirname(filePath); } - throw new Error(localize('canNotResolveFileDirname', "'${fileDirname}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveFileDirname', "'${fileDirname}' can not be resolved. Please open an editor.")); } case 'fileExtname': { if (filePath) { return paths.extname(filePath); } - throw new Error(localize('canNotResolveFileExtname', "'${fileExtname}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveFileExtname', "'${fileExtname}' can not be resolved. Please open an editor.")); } case 'fileBasename': { if (filePath) { return paths.basename(filePath); } - throw new Error(localize('canNotResolveFileBasename', "'${fileBasename}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveFileBasename', "'${fileBasename}' can not be resolved. Please open an editor.")); } case 'fileBasenameNoExtension': { if (filePath) { const basename = paths.basename(filePath); return basename.slice(0, basename.length - paths.extname(basename).length); } - throw new Error(localize('canNotResolveFileBasenameNoExtension', "'${fileBasenameNoExtension}' can not be resolved, please open an editor.")); + throw new Error(localize('canNotResolveFileBasenameNoExtension', "'${fileBasenameNoExtension}' can not be resolved. Please open an editor.")); } case 'execPath': return this.environmentService.execPath; From fee0dde01287b89ffd619f0e8093c689f17df09c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 10 Apr 2018 14:34:15 -0700 Subject: [PATCH 092/710] foldering -> folding --- .../src/features/{folderingProvider.ts => foldingProvider.ts} | 0 extensions/typescript-language-features/src/languageProvider.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename extensions/typescript-language-features/src/features/{folderingProvider.ts => foldingProvider.ts} (100%) diff --git a/extensions/typescript-language-features/src/features/folderingProvider.ts b/extensions/typescript-language-features/src/features/foldingProvider.ts similarity index 100% rename from extensions/typescript-language-features/src/features/folderingProvider.ts rename to extensions/typescript-language-features/src/features/foldingProvider.ts diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index e4c4f7de60d..9da522bc284 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -154,7 +154,7 @@ export default class LanguageProvider { let enable = workspace.getConfiguration().get(foldingSetting, false); if (enable && this.client.apiVersion.has280Features()) { if (!this.foldingProviderRegistration) { - this.foldingProviderRegistration = languages.registerFoldingProvider(this.documentSelector, new (await import('./features/folderingProvider')).default(this.client)); + this.foldingProviderRegistration = languages.registerFoldingProvider(this.documentSelector, new (await import('./features/foldingProvider')).default(this.client)); } } else { if (this.foldingProviderRegistration) { From 9aef83c000525a1dd02dfc552aacdf915e84c65e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 10 Apr 2018 14:41:49 -0700 Subject: [PATCH 093/710] Make sure js/ts blocks folds show ending bracket Fixes #47240 --- .../src/features/foldingProvider.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/typescript-language-features/src/features/foldingProvider.ts b/extensions/typescript-language-features/src/features/foldingProvider.ts index 6c11adb069b..b5ad3d23199 100644 --- a/extensions/typescript-language-features/src/features/foldingProvider.ts +++ b/extensions/typescript-language-features/src/features/foldingProvider.ts @@ -36,6 +36,10 @@ export default class TypeScriptFoldingProvider implements vscode.FoldingProvider return new vscode.FoldingRangeList(response.body.map(span => { const range = typeConverters.Range.fromTextSpan(span.textSpan); + // workaround for #47240 + if (range.end.character > 0 && document.getText(new vscode.Range(range.end.translate(0, -1), range.end)) === '}') { + return new vscode.FoldingRange(range.start.line, Math.max(range.end.line - 1, range.start.line)); + } return new vscode.FoldingRange(range.start.line, range.end.line); })); } From 49ec3bc8ce42ad1a458ae7e5b1ff3c0f70b4a14e Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 10 Apr 2018 14:43:29 -0700 Subject: [PATCH 094/710] Fix #47258 - add null check --- .../parts/preferences/electron-browser/preferencesSearch.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts index b267d3164aa..3b40c62f656 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts +++ b/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts @@ -46,7 +46,7 @@ export class PreferencesSearchService extends Disposable implements IPreferences // Filter to enabled extensions that have settings return exts .filter(ext => this.extensionEnablementService.isEnabled(ext)) - .filter(ext => ext.manifest.contributes && ext.manifest.contributes.configuration) + .filter(ext => ext.manifest && ext.manifest.contributes && ext.manifest.contributes.configuration) .filter(ext => !!ext.identifier.uuid); }); } From 0940ea622f7fa953d9bedc4986b0fb49893f2836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Weinand?= Date: Wed, 11 Apr 2018 00:19:08 +0200 Subject: [PATCH 095/710] attempt to fix VSLS regression --- src/vs/workbench/parts/debug/node/debugAdapter.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index 9e91bf4cf00..9d6c1456e80 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -191,6 +191,7 @@ export abstract class StreamDebugAdapter extends AbstractDebugAdapter { continue; // there may be more complete messages to process } } else { + /* const idx = this.rawData.indexOf(StreamDebugAdapter.TWO_CRLF); if (idx !== -1) { const header = this.rawData.toString('utf8', 0, idx); @@ -204,6 +205,17 @@ export abstract class StreamDebugAdapter extends AbstractDebugAdapter { this.rawData = this.rawData.slice(idx + StreamDebugAdapter.TWO_CRLF.length); continue; } + */ + const s = this.rawData.toString('utf8', 0, this.rawData.length); + const idx = s.indexOf(StreamDebugAdapter.TWO_CRLF); + if (idx !== -1) { + const match = /Content-Length: (\d+)/.exec(s); + if (match && match[1]) { + this.contentLength = Number(match[1]); + this.rawData = this.rawData.slice(idx + StreamDebugAdapter.TWO_CRLF.length); + continue; // try to handle a complete message + } + } } break; } From e6b61067f22fd94718f7c427d9caded5514761f4 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Tue, 10 Apr 2018 16:06:57 -0700 Subject: [PATCH 096/710] Validate surrounding text before providing emmet completions in jsx/xml Fixes #47612 --- .../emmet/src/defaultCompletionProvider.ts | 2 +- .../emmet/src/test/abbreviationAction.test.ts | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/extensions/emmet/src/defaultCompletionProvider.ts b/extensions/emmet/src/defaultCompletionProvider.ts index fd48a233324..9e06041548d 100644 --- a/extensions/emmet/src/defaultCompletionProvider.ts +++ b/extensions/emmet/src/defaultCompletionProvider.ts @@ -37,7 +37,7 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi let rootNode: Stylesheet | undefined = undefined; if (context.triggerKind !== vscode.CompletionTriggerKind.TriggerForIncompleteCompletions) { - validateLocation = syntax === 'html' || isStyleSheet(document.languageId); + validateLocation = syntax === 'html' || syntax === 'jsx' || syntax === 'xml' || isStyleSheet(document.languageId); // If document can be css parsed, get currentNode if (isStyleSheet(document.languageId)) { let usePartialParsing = vscode.workspace.getConfiguration('emmet')['optimizeStylesheetParsing'] === true; diff --git a/extensions/emmet/src/test/abbreviationAction.test.ts b/extensions/emmet/src/test/abbreviationAction.test.ts index 3c85a027155..8aed9b00830 100644 --- a/extensions/emmet/src/test/abbreviationAction.test.ts +++ b/extensions/emmet/src/test/abbreviationAction.test.ts @@ -336,6 +336,46 @@ suite('Tests for jsx, xml and xsl', () => { }); }); + test('No expanding text inside open tag in completion list (jsx)', () => { + return withRandomFileEditor(htmlContents, 'jsx', (editor, doc) => { + editor.selection = new Selection(2, 4, 2, 4); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); + return Promise.resolve(); + }); + }); + + test('No expanding tag that is opened, but not closed in completion list (jsx)', () => { + return withRandomFileEditor(htmlContents, 'jsx', (editor, doc) => { + editor.selection = new Selection(9, 6, 9, 6); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); + return Promise.resolve(); + }); + }); + + test('No expanding text inside open tag when there is no closing tag in completion list (jsx)', () => { + return withRandomFileEditor(htmlContents, 'jsx', (editor, doc) => { + editor.selection = new Selection(9, 8, 9, 8); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); + return Promise.resolve(); + }); + }); + + test('No expanding text in completion list inside open tag when there is no closing tag when there is no parent node (jsx)', () => { + const fileContents = ' { + editor.selection = new Selection(0, 6, 0, 6); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); + return Promise.resolve(); + }); + }); }); function testExpandAbbreviation(syntax: string, selection: Selection, abbreviation: string, expandedText: string, shouldFail?: boolean): Thenable { From 12072da3bb9015342c3a29d6f57621af04a895ef Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 11 Apr 2018 07:48:19 +0200 Subject: [PATCH 097/710] clean up electron 2.0 localStorage remainders --- src/vs/code/electron-main/app.ts | 79 ++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 25 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index d1a8bfab221..72ccf412cb8 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -60,6 +60,8 @@ import { IssueService } from 'vs/platform/issue/electron-main/issueService'; import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; +import { join } from 'path'; +import { exists, unlink, del } from 'vs/base/node/pfs'; export class CodeApplication { @@ -261,38 +263,42 @@ export class CodeApplication { this.logService.debug(`from: ${this.environmentService.appRoot}`); this.logService.debug('args:', this.environmentService.args); - // Make sure we associate the program with the app user model id - // This will help Windows to associate the running program with - // any shortcut that is pinned to the taskbar and prevent showing - // two icons in the taskbar for the same app. - if (platform.isWindows && product.win32AppUserModelId) { - app.setAppUserModelId(product.win32AppUserModelId); - } + // Handle local storage (TODO@Ben remove me after a while) + return this.handleLocalStorage().then(() => { - // Create Electron IPC Server - this.electronIpcServer = new ElectronIPCServer(); + // Make sure we associate the program with the app user model id + // This will help Windows to associate the running program with + // any shortcut that is pinned to the taskbar and prevent showing + // two icons in the taskbar for the same app. + if (platform.isWindows && product.win32AppUserModelId) { + app.setAppUserModelId(product.win32AppUserModelId); + } - // Resolve unique machine ID - this.logService.trace('Resolving machine identifier...'); - return this.resolveMachineId().then(machineId => { - this.logService.trace(`Resolved machine identifier: ${machineId}`); + // Create Electron IPC Server + this.electronIpcServer = new ElectronIPCServer(); - // Spawn shared process - this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); - this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); + // Resolve unique machine ID + this.logService.trace('Resolving machine identifier...'); + return this.resolveMachineId().then(machineId => { + this.logService.trace(`Resolved machine identifier: ${machineId}`); - // Services - const appInstantiationService = this.initServices(machineId); + // Spawn shared process + this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); + this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); - // Setup Auth Handler - const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); - this.toDispose.push(authHandler); + // Services + const appInstantiationService = this.initServices(machineId); - // Open Windows - appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); + // Setup Auth Handler + const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); + this.toDispose.push(authHandler); - // Post Open Windows Tasks - appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + // Open Windows + appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); + + // Post Open Windows Tasks + appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + }); }); } @@ -311,6 +317,29 @@ export class CodeApplication { }); } + private handleLocalStorage(): TPromise { + const localStorageBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage.vscbak'); + const localStorageJournalBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal.vscbak'); + const localStorageLevelDB = join(this.environmentService.userDataPath, 'Local Storage', 'leveldb'); + + // Electron 1.7.12: Delete + if (product.quality === 'insider' && process.versions.electron === '1.7.12') { + return exists(localStorageBackupFile).then(localStorageBackupFileExists => { + return exists(localStorageJournalBackupFile).then(localStorageJournalBackupFileExists => { + return exists(localStorageLevelDB).then(localStorageLevelDBExists => { + return TPromise.join([ + localStorageBackupFileExists ? unlink(localStorageBackupFile) : TPromise.as(null), + localStorageJournalBackupFile ? unlink(localStorageJournalBackupFile) : TPromise.as(null), + localStorageLevelDBExists ? del(localStorageLevelDB) : TPromise.as(null) + ]); + }); + }); + }).then(() => void 0, () => void 0); + } + + return TPromise.as(null); + } + private initServices(machineId: string): IInstantiationService { const services = new ServiceCollection(); From 8150982b205cbab9ac1be19fd687386b5d18d391 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 10 Apr 2018 16:31:28 -0700 Subject: [PATCH 098/710] Organize imports --- .../electron-browser/baseWebviewEditor.ts | 8 +++---- .../electron-browser/webview.contribution.ts | 9 ++++---- .../electron-browser/webviewCommands.ts | 9 ++++---- .../webview/electron-browser/webviewEditor.ts | 22 +++++++++---------- .../electron-browser/webviewEditorInput.ts | 4 +--- .../webviewEditorInputFactory.ts | 4 +--- .../electron-browser/webviewEditorService.ts | 3 ++- .../electron-browser/webviewElement.ts | 18 +++++++-------- 8 files changed, 36 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/baseWebviewEditor.ts b/src/vs/workbench/parts/webview/electron-browser/baseWebviewEditor.ts index 047cc8bbb38..8436046783d 100644 --- a/src/vs/workbench/parts/webview/electron-browser/baseWebviewEditor.ts +++ b/src/vs/workbench/parts/webview/electron-browser/baseWebviewEditor.ts @@ -3,14 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Dimension } from 'vs/base/browser/dom'; +import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; - -import { IContextKey, RawContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; - -import { WebviewElement } from './webviewElement'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { Dimension } from 'vs/base/browser/dom'; +import { WebviewElement } from './webviewElement'; /** A context key that is set when a webview editor has focus. */ export const KEYBINDING_CONTEXT_WEBVIEWEDITOR_FOCUS = new RawContextKey('webviewEditorFocus', false); diff --git a/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts index 63f62ee1359..aa05a047266 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts @@ -2,6 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { localize } from 'vs/nls'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; @@ -10,15 +11,15 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; -import { EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { IEditorInputFactoryRegistry, Extensions as EditorInputExtensions } from 'vs/workbench/common/editor'; +import { EditorDescriptor, Extensions as EditorExtensions, IEditorRegistry } from 'vs/workbench/browser/editor'; +import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; +import { Extensions as EditorInputExtensions, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; import { WebviewEditorInputFactory } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory'; import { KEYBINDING_CONTEXT_WEBVIEWEDITOR_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_WEBVIEWEDITOR_FOCUS, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from './baseWebviewEditor'; import { HideWebViewEditorFindCommand, OpenWebviewDeveloperToolsAction, ReloadWebviewAction, ShowWebViewEditorFindTermCommand, ShowWebViewEditorFindWidgetCommand } from './webviewCommands'; import { WebviewEditor } from './webviewEditor'; -import { IWebviewEditorService, WebviewEditorService } from './webviewEditorService'; import { WebviewEditorInput } from './webviewEditorInput'; +import { IWebviewEditorService, WebviewEditorService } from './webviewEditorService'; (Registry.as(EditorExtensions.Editors)).registerEditor(new EditorDescriptor( WebviewEditor, diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts b/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts index 69077a33112..ed5542fae12 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts @@ -3,13 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; - -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { Command, ICommandOptions } from 'vs/editor/browser/editorExtensions'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Action } from 'vs/base/common/actions'; import { TPromise } from 'vs/base/common/winjs.base'; +import { Command, ICommandOptions } from 'vs/editor/browser/editorExtensions'; +import * as nls from 'vs/nls'; +import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { BaseWebviewEditor } from './baseWebviewEditor'; export class ShowWebViewEditorFindWidgetCommand extends Command { diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts index c7fba7cb817..e7debe873e0 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts @@ -3,23 +3,23 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as DOM from 'vs/base/browser/dom'; +import { Emitter, Event } from 'vs/base/common/event'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IDisposable, } from 'vs/base/common/lifecycle'; -import { EditorOptions } from 'vs/workbench/common/editor'; -import { Position } from 'vs/platform/editor/common/editor'; -import { BaseWebviewEditor as BaseWebviewEditor, KEYBINDING_CONTEXT_WEBVIEWEDITOR_FOCUS, KEYBINDING_CONTEXT_WEBVIEWEDITOR_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from './baseWebviewEditor'; -import { WebviewElement } from './webviewElement'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { Position } from 'vs/platform/editor/common/editor'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; -import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import * as DOM from 'vs/base/browser/dom'; -import { Event, Emitter } from 'vs/base/common/event'; +import { EditorOptions } from 'vs/workbench/common/editor'; import { WebviewEditorInput } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInput'; -import URI from 'vs/base/common/uri'; +import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; +import { BaseWebviewEditor, KEYBINDING_CONTEXT_WEBVIEWEDITOR_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_WEBVIEWEDITOR_FOCUS, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from './baseWebviewEditor'; +import { WebviewElement } from './webviewElement'; export class WebviewEditor extends BaseWebviewEditor { diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts index 3cd1faf584d..13bdd34b0a4 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts @@ -3,16 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { IEditorInput, IEditorModel, Position } from 'vs/platform/editor/common/editor'; import { EditorInput, EditorModel } from 'vs/workbench/common/editor'; -import { WebviewElement } from './webviewElement'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { WebviewEvents, WebviewInputOptions, WebviewReviver } from './webviewEditorService'; +import { WebviewElement } from './webviewElement'; export class WebviewEditorInput extends EditorInput { diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts index 3984cbd11d3..476db7789b1 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts @@ -3,12 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEditorInputFactory } from 'vs/workbench/common/editor'; -import { IWebviewEditorService, WebviewInputOptions } from './webviewEditorService'; import { WebviewEditorInput } from './webviewEditorInput'; +import { IWebviewEditorService, WebviewInputOptions } from './webviewEditorService'; interface SerializedWebview { readonly viewType: string; diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts index 8a4bac0a396..f271757a4f4 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts @@ -2,15 +2,16 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; import { Position } from 'vs/platform/editor/common/editor'; import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import * as vscode from 'vscode'; import { WebviewEditorInput } from './webviewEditorInput'; -import { TPromise } from 'vs/base/common/winjs.base'; export const IWebviewEditorService = createDecorator('webviewEditorService'); diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts index 0ea8ed3965e..45b9a264a5e 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts @@ -3,18 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import URI from 'vs/base/common/uri'; +import { addClass, addDisposableListener } from 'vs/base/browser/dom'; +import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Event, Emitter } from 'vs/base/common/event'; -import { addDisposableListener, addClass } from 'vs/base/browser/dom'; -import { editorBackground, editorForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; -import { ITheme, LIGHT, DARK, IThemeService } from 'vs/platform/theme/common/themeService'; -import { WebviewFindWidget } from './webviewFindWidget'; -import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { nativeSep } from 'vs/base/common/paths'; import { startsWith } from 'vs/base/common/strings'; +import URI from 'vs/base/common/uri'; +import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { editorBackground, editorForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; +import { DARK, ITheme, IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; +import { WebviewFindWidget } from './webviewFindWidget'; export interface WebviewOptions { readonly allowScripts?: boolean; From c439cca39e4649c61c2a7e99bacd5b2a201a7b99 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 10 Apr 2018 23:42:31 -0700 Subject: [PATCH 099/710] Return access denied and log on webview resource load error Fixes #47634 --- .../workbench/parts/webview/electron-browser/webviewElement.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts index 45b9a264a5e..d32384e22a9 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts @@ -432,7 +432,8 @@ function registerFileProtocol( return; } } - callback({ error: 'Cannot load resource outside of protocol root' }); + console.error('Webview: Cannot load resource outside of protocol root'); + callback({ error: -10 /* ACCESS_DENIED: https://cs.chromium.org/chromium/src/net/base/net_error_list.h */ }); }, (error) => { if (error) { console.error('Failed to register protocol ' + protocol); From c0a89004ece6b6cd6dbf7527eeb9039af1fe6372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 11 Apr 2018 09:34:17 +0200 Subject: [PATCH 100/710] remove console.log --- src/vs/base/node/zip.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index ac9b5cdfd21..a5e7abca5d8 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -60,8 +60,6 @@ function modeFromEntry(entry: Entry) { function toExtractError(err: Error): ExtractError { let type = ExtractErrorType.CorruptZip; - console.log('WHAT'); - if (/end of central directory record signature not found/.test(err.message)) { type = ExtractErrorType.CorruptZip; } From 3c0e8ba16aa447ebe385595e686df79ea028132f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 11 Apr 2018 09:37:10 +0200 Subject: [PATCH 101/710] :lipstick: --- build/tfs/common/symbols.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/build/tfs/common/symbols.ts b/build/tfs/common/symbols.ts index 55641544c27..eac0d610b73 100644 --- a/build/tfs/common/symbols.ts +++ b/build/tfs/common/symbols.ts @@ -59,8 +59,8 @@ async function tmpFile(name: string): Promise { return join(tmpParent, name); } -async function getVersions(accessor: IApplicationAccessor): Promise { - return await asyncRequest({ +function getVersions(accessor: IApplicationAccessor): Promise { + return asyncRequest({ url: `${BASE_URL}/apps/${accessor.appId}/app_versions`, method: 'GET', headers: { @@ -69,8 +69,8 @@ async function getVersions(accessor: IApplicationAccessor): Promise { }); } -async function createVersion(accessor: IApplicationAccessor, version: string): Promise { - return await asyncRequest({ +function createVersion(accessor: IApplicationAccessor, version: string): Promise { + return asyncRequest({ url: `${BASE_URL}/apps/${accessor.appId}/app_versions/new`, method: 'POST', headers: { @@ -82,8 +82,8 @@ async function createVersion(accessor: IApplicationAccessor, version: string): P }); } -async function updateVersion(accessor: IVersionAccessor, symbolsPath: string) { - return await asyncRequest({ +function updateVersion(accessor: IVersionAccessor, symbolsPath: string) { + return asyncRequest({ url: `${BASE_URL}/apps/${accessor.appId}/app_versions/${accessor.id}`, method: 'PUT', headers: { @@ -95,7 +95,7 @@ async function updateVersion(accessor: IVersionAccessor, symbolsPath: string) { }); } -async function asyncRequest(options: request.UrlOptions & request.CoreOptions): Promise { +function asyncRequest(options: request.UrlOptions & request.CoreOptions): Promise { return new Promise((resolve, reject) => { request(options, (error, response, body) => { if (error) { @@ -107,7 +107,7 @@ async function asyncRequest(options: request.UrlOptions & request.CoreOptions }); } -async function downloadAsset(repository, assetName: string, targetPath: string, electronVersion: string) { +function downloadAsset(repository, assetName: string, targetPath: string, electronVersion: string) { return new Promise((resolve, reject) => { repository.getReleases({ tag_name: `v${electronVersion}` }, (err, releases) => { if (err) { @@ -211,7 +211,7 @@ if (repository && codeVersion && electronVersion && (product.quality === 'stable } }).then(() => { console.log('HockeyApp: done'); - }, error => { + }).catch(error => { console.error(`HockeyApp: error (${error})`); }); } else { From 82e9aa491ad5f38135e149a32d146d039ca6b5db Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 09:25:00 +0200 Subject: [PATCH 102/710] some jsdoc, #47475 --- src/vs/vscode.proposed.d.ts | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 63095a4b66b..b64040df24d 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -253,16 +253,55 @@ declare module 'vscode' { _version: 3; + /** + * An event to signal that a resource has been created, changed, or deleted. + */ readonly onDidChange: Event; + /** + * Retrieve meta data about a file. + * + * @param uri The uri of the file to retrieve meta data about. + * @param token A cancellation token. + */ + // todo@remote + // ! throw error (ENOENT) when the file doesn't exist stat(uri: Uri, token: CancellationToken): Thenable; + /** + * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) + * + * @param uri The uri of the folder. + * @param token A cancellation token. + * @return A thenable that resolves to an array of tuples of resources and files stats. + */ readDirectory(uri: Uri, token: CancellationToken): Thenable<[Uri, FileStat2][]>; + /** + * Read the entire contents of a file. + * + * @param uri The uri of the file. + * @param token A cancellation token. + * @return A thenable that resolves to an array of bytes. + */ readFile(uri: Uri, token: CancellationToken): Thenable; + /** + * Write data to a file, replacing its entire contents. + * + * @param uri The uri of the file. + * @param content The new content of the file. + * @param token A cancellation token. + */ writeFile(uri: Uri, content: Uint8Array, token: CancellationToken): Thenable; + /** + * Rename a file or folder. + * + * @param oldUri The exiting file or folder + * @param newUri The target location + * @param token A cancellation token. + */ rename(oldUri: Uri, newUri: Uri, token: CancellationToken): Thenable; // todo@remote From c90991d8e7ab5aa3e1ee954aed691709769b07ec Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 10:00:44 +0200 Subject: [PATCH 103/710] remove smoke2 --- test/smoke2/package.json | 18 ------ test/smoke2/src/code.ts | 125 ------------------------------------ test/smoke2/src/driver.d.ts | 19 ------ test/smoke2/src/driver.js | 12 ---- test/smoke2/src/main.ts | 31 --------- test/smoke2/tsconfig.json | 11 ---- test/smoke2/yarn.lock | 21 ------ 7 files changed, 237 deletions(-) delete mode 100644 test/smoke2/package.json delete mode 100644 test/smoke2/src/code.ts delete mode 100644 test/smoke2/src/driver.d.ts delete mode 100644 test/smoke2/src/driver.js delete mode 100644 test/smoke2/src/main.ts delete mode 100644 test/smoke2/tsconfig.json delete mode 100644 test/smoke2/yarn.lock diff --git a/test/smoke2/package.json b/test/smoke2/package.json deleted file mode 100644 index 6e0ca026745..00000000000 --- a/test/smoke2/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "smoke2", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "compile": "node tools/prebuild && tsc && node tools/postbuild", - "watch": "tsc --watch", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "@types/tmp": "^0.0.33", - "tmp": "^0.0.33", - "typescript": "^2.8.1" - } -} diff --git a/test/smoke2/src/code.ts b/test/smoke2/src/code.ts deleted file mode 100644 index 041f9b0c42d..00000000000 --- a/test/smoke2/src/code.ts +++ /dev/null @@ -1,125 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as fs from 'fs'; -import * as path from 'path'; -import * as cp from 'child_process'; -import { tmpName } from 'tmp'; -import { IDriver, connect as connectDriver, IDisposable } from './driver'; - -const repoPath = path.join(__dirname, '../../..'); - -function getDevElectronPath(): string { - const buildPath = path.join(repoPath, '.build'); - const product = require(path.join(repoPath, 'product.json')); - - switch (process.platform) { - case 'darwin': - return path.join(buildPath, 'electron', `${product.nameLong}.app`, 'Contents', 'MacOS', 'Electron'); - case 'linux': - return path.join(buildPath, 'electron', `${product.applicationName}`); - case 'win32': - return path.join(buildPath, 'electron', `${product.nameShort}.exe`); - default: - throw new Error('Unsupported platform.'); - } -} - -function getBuildElectronPath(root: string): string { - switch (process.platform) { - case 'darwin': - return path.join(root, 'Contents', 'MacOS', 'Electron'); - case 'linux': { - const product = require(path.join(root, 'resources', 'app', 'product.json')); - return path.join(root, product.applicationName); - } - case 'win32': { - const product = require(path.join(root, 'resources', 'app', 'product.json')); - return path.join(root, `${product.nameShort}.exe`); - } - default: - throw new Error('Unsupported platform.'); - } -} - -function getDevOutPath(): string { - return path.join(repoPath, 'out'); -} - -function getBuildOutPath(root: string): string { - switch (process.platform) { - case 'darwin': - return path.join(root, 'Contents', 'Resources', 'app', 'out'); - default: - return path.join(root, 'resources', 'app', 'out'); - } -} - -export class Code { - - constructor( - private process: cp.ChildProcess, - private client: IDisposable, - readonly driver: IDriver - ) { - - } - - dispose(): void { - this.client.dispose(); - this.process.kill(); - } -} - -export interface SpawnOptions { - codePath?: string; - userDataDir: string; - extensionsPath: string; -} - -export async function connect(child: cp.ChildProcess, outPath: string, handlePath: string): Promise { - let errCount = 0; - - while (true) { - try { - const { client, driver } = await connectDriver(outPath, handlePath); - return new Code(child, client, driver); - } catch (err) { - if (++errCount > 50) { - child.kill(); - throw err; - } - - // retry - await new Promise(c => setTimeout(c, 100)); - } - } -} - -export async function spawn(options: SpawnOptions): Promise { - const codePath = options.codePath; - const electronPath = codePath ? getBuildElectronPath(codePath) : getDevElectronPath(); - const outPath = codePath ? getBuildOutPath(codePath) : getDevOutPath(); - const handlePath = await new Promise((c, e) => tmpName((err, handlePath) => err ? e(err) : c(handlePath))); - - const args = [ - '--skip-getting-started', - '--skip-release-notes', - '--sticky-quickopen', - '--disable-telemetry', - '--disable-updates', - '--disable-crash-reporter', - `--extensions-dir=${options.extensionsPath}`, - `--user-data-dir=${options.userDataDir}`, - '--driver', handlePath - ]; - - if (!codePath) { - args.unshift(repoPath); - } - - const child = cp.spawn(electronPath, args); - return connect(child, outPath, handlePath); -} \ No newline at end of file diff --git a/test/smoke2/src/driver.d.ts b/test/smoke2/src/driver.d.ts deleted file mode 100644 index 6d417e693df..00000000000 --- a/test/smoke2/src/driver.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -export interface IWindow { - id: string; -} - -export interface IDriver { - _serviceBrand: any; - getWindows(): Promise; -} - -export interface IDisposable { - dispose(): void; -} - -export function connect(outPath: string, handle: string): Promise<{ client: IDisposable, driver: IDriver }>; diff --git a/test/smoke2/src/driver.js b/test/smoke2/src/driver.js deleted file mode 100644 index 7ff3b7964f0..00000000000 --- a/test/smoke2/src/driver.js +++ /dev/null @@ -1,12 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const path = require('path'); - -exports.connect = function (outPath, handle) { - const bootstrapPath = path.join(outPath, 'bootstrap-amd.js'); - const { bootstrap } = require(bootstrapPath); - return new Promise((c, e) => bootstrap('vs/code/node/driver', ({ connect }) => connect(handle).then(c, e), e)); -}; \ No newline at end of file diff --git a/test/smoke2/src/main.ts b/test/smoke2/src/main.ts deleted file mode 100644 index 8e5024f5289..00000000000 --- a/test/smoke2/src/main.ts +++ /dev/null @@ -1,31 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as path from 'path'; -import { connect } from './driver'; -import { spawn } from './code'; - -// const rootPath = path.dirname(path.dirname(path.dirname(__dirname))); -// const outPath = path.join(rootPath, 'out'); -// const handlePath = path.join(rootPath, 'foo.sock'); - -// connect(outPath, handlePath).then(({ client, driver }) => { -// return driver.getWindows().then(w => { -// console.log(w); -// client.dispose(); -// }); -// }, err => console.error('oh no', err)); - -const opts = { - extensionsPath: '/Users/joao/Desktop/extensions', - userDataDir: '/Users/joao/Desktop/user-data-dir', -}; - -spawn(opts).then(code => { - return code.driver.getWindows().then(w => { - console.log(w); - code.dispose(); - }); -}, err => console.error('oh no', err)); \ No newline at end of file diff --git a/test/smoke2/tsconfig.json b/test/smoke2/tsconfig.json deleted file mode 100644 index 754cc8e4c46..00000000000 --- a/test/smoke2/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "outDir": "out", - "target": "es6", - "strictNullChecks": true - }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/test/smoke2/yarn.lock b/test/smoke2/yarn.lock deleted file mode 100644 index 4a70bf942ef..00000000000 --- a/test/smoke2/yarn.lock +++ /dev/null @@ -1,21 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/tmp@^0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -typescript@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" From 471425cad6e4ec06a260312b87ef7672ef4c8928 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 10:27:01 +0200 Subject: [PATCH 104/710] streamline build --- src/vs/platform/driver/common/driver.ts | 2 + test/smoke/package.json | 13 +- ...{prebuild.js => copy-driver-definition.js} | 0 test/smoke/tools/postbuild.js | 14 - test/smoke/yarn.lock | 773 +++++++++++++++++- 5 files changed, 769 insertions(+), 33 deletions(-) rename test/smoke/tools/{prebuild.js => copy-driver-definition.js} (100%) delete mode 100644 test/smoke/tools/postbuild.js diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 61b98ed7714..8bdfc666f32 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -12,6 +12,8 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; export const ID = 'driverService'; export const IDriver = createDecorator(ID); +// !! Do not remove the following START and END markers, they are parsed by the smoketest build + //*START export interface IElement { tagName: string; diff --git a/test/smoke/package.json b/test/smoke/package.json index 64a3c955faa..7ef30e22158 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -4,8 +4,12 @@ "main": "./src/main.js", "scripts": { "postinstall": "npm run compile", - "compile": "node tools/prebuild && tsc && node tools/postbuild", - "watch": "node tools/prebuild && node tools/postbuild && tsc --watch", + "compile": "npm run copy-driver && npm run copy-driver-definition && tsc", + "watch": "concurrently \"npm run watch-driver\" \"npm run watch-driver-definition\" \"tsc --watch\"", + "copy-driver": "cpx src/vscode/driver.js out/vscode", + "watch-driver": "cpx src/vscode/driver.js out/vscode -w", + "copy-driver-definition": "node tools/copy-driver-definition.js", + "watch-driver-definition": "watch \"node tools/copy-driver-definition.js\" ../../src/vs/platform/driver/common", "mocha": "mocha" }, "devDependencies": { @@ -16,6 +20,8 @@ "@types/node": "8.0.33", "@types/rimraf": "2.0.2", "@types/webdriverio": "4.6.1", + "concurrently": "^3.5.1", + "cpx": "^1.5.0", "electron": "1.7.7", "htmlparser2": "^3.9.2", "mkdirp": "^0.5.1", @@ -26,6 +32,7 @@ "spectron": "^3.7.2", "strip-json-comments": "^2.0.1", "tmp": "0.0.33", - "typescript": "2.5.2" + "typescript": "2.5.2", + "watch": "^1.0.2" } } \ No newline at end of file diff --git a/test/smoke/tools/prebuild.js b/test/smoke/tools/copy-driver-definition.js similarity index 100% rename from test/smoke/tools/prebuild.js rename to test/smoke/tools/copy-driver-definition.js diff --git a/test/smoke/tools/postbuild.js b/test/smoke/tools/postbuild.js deleted file mode 100644 index ab71b92633d..00000000000 --- a/test/smoke/tools/postbuild.js +++ /dev/null @@ -1,14 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -const fs = require('fs'); -const path = require('path'); - -const root = path.dirname(__dirname); -const driverPath = path.join(root, 'src/vscode/driver.js'); -const driver = fs.readFileSync(driverPath); - -const outDriverPath = path.join(root, 'out/vscode/driver.js'); -fs.writeFileSync(outDriverPath, driver); diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index 0508d361c3b..a6c8f689aa0 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -58,6 +58,17 @@ dependencies: "@types/node" "*" +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + ajv@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" @@ -75,6 +86,10 @@ ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -83,12 +98,27 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + ansi-styles@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: color-convert "^1.9.0" +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + archiver-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" @@ -113,10 +143,43 @@ archiver@~2.1.0: tar-stream "^1.5.0" zip-stream "^1.2.0" +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -125,6 +188,14 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + async@^2.0.0: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" @@ -139,15 +210,23 @@ atob@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" +aws4@^1.2.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-runtime@^6.26.0: +babel-runtime@^6.26.0, babel-runtime@^6.9.2: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -164,16 +243,32 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + bl@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" dependencies: readable-stream "^2.0.5" +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + bluebird@^2.9.34: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -193,6 +288,14 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" @@ -220,6 +323,16 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" +chalk@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + chalk@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" @@ -228,6 +341,21 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chokidar@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -262,6 +390,10 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +commander@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" + commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" @@ -293,6 +425,23 @@ concat-stream@1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" +concurrently@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.5.1.tgz#ee8b60018bbe86b02df13e5249453c6ececd2521" + dependencies: + chalk "0.5.1" + commander "2.6.0" + date-fns "^1.23.0" + lodash "^4.5.1" + rx "2.3.24" + spawn-command "^0.0.2-1" + supports-color "^3.2.3" + tree-kill "^1.1.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + core-js@^2.4.0: version "2.5.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" @@ -301,6 +450,22 @@ core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cpx@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" + dependencies: + babel-runtime "^6.9.2" + chokidar "^1.6.0" + duplexer "^0.1.1" + glob "^7.0.5" + glob2base "^0.0.12" + minimatch "^3.0.2" + mkdirp "^0.5.1" + resolve "^1.1.7" + safe-buffer "^5.0.1" + shell-quote "^1.6.1" + subarg "^1.0.0" + crc32-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" @@ -312,6 +477,12 @@ crc@^3.4.4: version "3.5.0" resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" @@ -349,6 +520,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +date-fns@^1.23.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + debug@2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" @@ -377,6 +552,14 @@ delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + dev-null@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" @@ -413,6 +596,10 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -490,11 +677,29 @@ es6-promise@^4.0.5: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -extend@~3.0.1: +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -506,6 +711,12 @@ external-editor@^2.0.4: jschardet "^1.4.2" tmp "^0.0.33" +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + extract-zip@^1.0.3, extract-zip@^1.6.5: version "1.6.6" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" @@ -539,6 +750,24 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -546,10 +775,28 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + form-data@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" @@ -579,6 +826,43 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" +fsevents@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gaze@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" @@ -595,6 +879,25 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" @@ -637,10 +940,21 @@ growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -648,6 +962,12 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -656,6 +976,19 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" @@ -669,6 +1002,10 @@ he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" @@ -692,6 +1029,14 @@ htmlparser2@^3.9.2: inherits "^2.0.1" readable-stream "^2.0.2" +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -717,7 +1062,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -748,12 +1093,40 @@ is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" dependencies: builtin-modules "^1.0.0" +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -770,6 +1143,32 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -786,10 +1185,16 @@ isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" -isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -810,6 +1215,12 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -824,6 +1235,10 @@ jsonfile@^2.1.0: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -833,6 +1248,18 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -906,6 +1333,10 @@ lodash@^4.14.0, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.5.1: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -932,21 +1363,53 @@ meow@^3.1.0: redent "^1.0.0" trim-newlines "^1.0.0" +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.1.5: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + mime-types@^2.1.12, mime-types@~2.1.17: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" +mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -970,7 +1433,7 @@ mkdirp@0.5.0: dependencies: minimist "0.0.8" -mkdirp@0.5.1, mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -1001,10 +1464,37 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" +nan@^2.3.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + ncp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -1014,7 +1504,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0: +normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -1024,6 +1514,15 @@ npm-install-package@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/npm-install-package/-/npm-install-package-2.1.0.tgz#d7efe3cfcd7ab00614b896ea53119dc9ab259125" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nugget@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" @@ -1040,11 +1539,11 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.8.2: +oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1052,7 +1551,14 @@ object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" -once@^1.3.0, once@^1.4.0: +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -1071,10 +1577,30 @@ optimist@~0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -os-tmpdir@~1.0.2: +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -1095,6 +1621,10 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -1107,6 +1637,10 @@ pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -1133,6 +1667,10 @@ portastic@^1.0.1: commander "^2.8.1" debug "^2.2.0" +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + pretty-bytes@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" @@ -1144,6 +1682,10 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + progress-stream@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" @@ -1163,6 +1705,10 @@ q@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -1171,6 +1717,13 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + rc@^1.1.2: version "1.2.2" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" @@ -1180,6 +1733,15 @@ rc@^1.1.2: minimist "^1.2.0" strip-json-comments "~2.0.1" +rc@^1.1.7: + version "1.2.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -1207,6 +1769,18 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@^2.0.6, readable-stream@^2.1.4: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -1216,6 +1790,15 @@ readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -1227,16 +1810,57 @@ regenerator-runtime@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" dependencies: is-finite "^1.0.0" +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + request@^2.45.0, request@^2.81.0, request@~2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -1268,6 +1892,12 @@ resolve-url@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" +resolve@^1.1.7: + version "1.7.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.0.tgz#2bdf5374811207285df0df652b78f118ab8f3c5e" + dependencies: + path-parse "^1.0.5" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -1279,7 +1909,7 @@ rgb2hex@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.0.tgz#ccd55f860ae0c5c4ea37504b958e442d8d12325b" -rimraf@^2.2.8, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -1301,6 +1931,10 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" +rx@2.3.24: + version "2.3.24" + resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" + safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -1309,6 +1943,23 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -1319,6 +1970,12 @@ single-line-log@^1.1.2: dependencies: string-width "^1.0.1" +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" @@ -1344,6 +2001,10 @@ source-map@^0.1.38: dependencies: amdefine ">=0.0.4" +spawn-command@^0.0.2-1: + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -1392,7 +2053,7 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -1417,11 +2078,23 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.5: +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@^3.0.0: +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: @@ -1449,6 +2122,12 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + sumchecker@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" @@ -1468,6 +2147,16 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" @@ -1480,6 +2169,19 @@ supports-color@~5.0.0: dependencies: has-flag "^2.0.0" +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + tar-stream@^1.5.0: version "1.5.5" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" @@ -1489,6 +2191,14 @@ tar-stream@^1.5.0: readable-stream "^2.0.0" xtend "^4.0.0" +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + throttleit@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" @@ -1510,12 +2220,22 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tough-cookie@~2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" +tree-kill@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -1538,6 +2258,10 @@ typescript@2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.2.tgz#038a95f7d9bbb420b1bf35ba31d4c5c1dd3ffe34" +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + urix@^0.1.0, urix@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -1553,6 +2277,10 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +uuid@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" @@ -1576,6 +2304,13 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +watch@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/watch/-/watch-1.0.2.tgz#340a717bde765726fa0aa07d721e0147a551df0c" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + wdio-dot-reporter@~0.0.8: version "0.0.9" resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz#929b2adafd49d6b0534fda068e87319b47e38fe5" @@ -1611,6 +2346,12 @@ wgxpath@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" From 812e5af1702a60fca1f1a574075e6f7011663b68 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 10:54:42 +0200 Subject: [PATCH 105/710] green git smoke tests! --- .../driver/electron-browser/driver.ts | 29 +++++++++++++++++-- test/smoke/src/areas/editor/editors.ts | 3 +- test/smoke/test/mocha.opts | 2 +- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 8075f851c6b..55202755fea 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -10,6 +10,8 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/common/driver'; import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { getTopLeftOffset, getClientArea } from 'vs/base/browser/dom'; +import * as electron from 'electron'; function serializeElement(element: Element, recursive: boolean): IElement { const attributes = Object.create(null); @@ -40,8 +42,31 @@ class WindowDriver implements IWindowDriver { constructor() { } - click(selector: string, xoffset?: number, yoffset?: number): TPromise { - throw new Error('Method not implemented.'); + async click(selector: string, xoffset?: number, yoffset?: number): TPromise { + const element = document.querySelector(selector); + + if (!element) { + throw new Error('Element not found'); + } + + await TPromise.timeout(500); + const { left, top } = getTopLeftOffset(element as HTMLElement); + const { width, height } = getClientArea(element as HTMLElement); + let x: number, y: number; + + if ((typeof xoffset === 'number') || (typeof yoffset === 'number')) { + x = left + xoffset; + y = top + yoffset; + } else { + x = left + (width / 2); + y = top + (height / 2); + } + + const webContents = electron.remote.getCurrentWebContents(); + webContents.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount: 1 } as any); + webContents.sendInputEvent({ type: 'mouseUp', x, y, button: 'left', clickCount: 1 } as any); + + await TPromise.timeout(100); } doubleClick(selector: string): TPromise { diff --git a/test/smoke/src/areas/editor/editors.ts b/test/smoke/src/areas/editor/editors.ts index 574b1b48aec..300e57bf965 100644 --- a/test/smoke/src/areas/editor/editors.ts +++ b/test/smoke/src/areas/editor/editors.ts @@ -11,8 +11,7 @@ export class Editors { constructor(private api: API, private commands: Commands) { } async saveOpenedFile(): Promise { - await this.api.waitForElement('.tabs-container div.tab.active.dirty'); - await this.commands.runCommand('File: Save'); + await this.commands.runCommand('workbench.action.files.save'); } async selectTab(tabName: string, untitled: boolean = false): Promise { diff --git a/test/smoke/test/mocha.opts b/test/smoke/test/mocha.opts index ce88473e86b..9f769655625 100644 --- a/test/smoke/test/mocha.opts +++ b/test/smoke/test/mocha.opts @@ -1,3 +1,3 @@ --timeout 20000 ---slow 2000 +--slow 20000 out/main.js \ No newline at end of file From bc553d5263563f2c290acc9158da71b23c553d62 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 10:59:50 +0200 Subject: [PATCH 106/710] remove slow timeouts --- src/vs/platform/driver/electron-browser/driver.ts | 1 - test/smoke/src/api.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 55202755fea..b2e8ff6c966 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -49,7 +49,6 @@ class WindowDriver implements IWindowDriver { throw new Error('Element not found'); } - await TPromise.timeout(500); const { left, top } = getTopLeftOffset(element as HTMLElement); const { width, height } = getClientArea(element as HTMLElement); let x: number, y: number; diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index 6fa23dc7862..cbe43c9da25 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -11,7 +11,7 @@ export class API { // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding // the time it takes for the actual retry call to complete private retryCount: number; - private readonly retryDuration = 1000; // in milliseconds + private readonly retryDuration = 100; // in milliseconds constructor( private driver: Driver, From 7fd59a0843180da0a3effc4be229e75143509790 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 11:08:21 +0200 Subject: [PATCH 107/710] start debugging with command --- test/smoke/src/areas/debug/debug.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 013892ed931..4bc0ca33a40 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -72,7 +72,7 @@ export class Debug extends Viewlet { } async startDebugging(): Promise { - await this.api.waitAndClick(START); + await this.commands.runCommand('workbench.action.debug.start'); await this.api.waitForElement(PAUSE); await this.api.waitForElement(DEBUG_STATUS_BAR); const portPrefix = 'Port: '; From 9d6f61914044c5aaccf5f9da16e8cc6118a42cbc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 11:17:22 +0200 Subject: [PATCH 108/710] error, missing compilation --- build/lib/compilation.js | 2 +- build/lib/i18n.js | 2 +- build/lib/nls.js | 3 +++ test/smoke/src/areas/debug/debug.ts | 1 - 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build/lib/compilation.js b/build/lib/compilation.js index 61c178b392e..998ebb4f379 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -22,7 +22,7 @@ var rootDir = path.join(__dirname, '../../src'); var options = require('../../src/tsconfig.json').compilerOptions; options.verbose = false; options.sourceMap = true; -if (process.env['VSCODE_NO_SOURCEMAP']) { +if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry options.sourceMap = false; } options.rootDir = rootDir; diff --git a/build/lib/i18n.js b/build/lib/i18n.js index 6f5558001c4..61893ed8b1d 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -1083,7 +1083,7 @@ function prepareI18nPackFiles(externalExtensions, resultingTranslationPaths, pse extPack = extensionsPacks[resource] = { version: i18nPackVersion, contents: {} }; } var externalId = externalExtensions[resource]; - if (!externalId) { + if (!externalId) { // internal extension: remove 'extensions/extensionId/' segnent var secondSlash = path.indexOf('/', firstSlash + 1); extPack.contents[path.substr(secondSlash + 1)] = file.messages; } diff --git a/build/lib/nls.js b/build/lib/nls.js index 7f2730ec891..a63d3699014 100644 --- a/build/lib/nls.js +++ b/build/lib/nls.js @@ -150,13 +150,16 @@ function isImportNode(node) { .filter(function (d) { return d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport; }) .map(function (d) { return d.importClause.namedBindings.name; }) .concat(importEqualsDeclarations.map(function (d) { return d.name; })) + // find read-only references to `nls` .map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); }) .flatten() .filter(function (r) { return !r.isWriteAccess; }) + // find the deepest call expressions AST nodes that contain those references .map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); }) .map(function (a) { return lazy(a).last(); }) .filter(function (n) { return !!n; }) .map(function (n) { return n; }) + // only `localize` calls .filter(function (n) { return n.expression.kind === ts.SyntaxKind.PropertyAccessExpression && n.expression.name.getText() === 'localize'; }); // `localize` named imports var allLocalizeImportDeclarations = importDeclarations diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 4bc0ca33a40..fcbc755e97f 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -13,7 +13,6 @@ import { findElement, Element } from '../../driver'; const VIEWLET = 'div[id="workbench.view.debug"]'; const DEBUG_VIEW = `${VIEWLET} .debug-view-content`; const CONFIGURE = `div[id="workbench.parts.sidebar"] .actions-container .configure`; -const START = `.icon[title="Start Debugging"]`; const STOP = `.debug-actions-widget .debug-action.stop`; const STEP_OVER = `.debug-actions-widget .debug-action.step-over`; const STEP_IN = `.debug-actions-widget .debug-action.step-into`; From db84fe9c35535b100bd4c50b22fe84b79a13857e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 11:20:42 +0200 Subject: [PATCH 109/710] fix #47325 --- .../decorations/browser/decorationsService.ts | 5 +-- .../test/browser/decorationsService.test.ts | 38 +------------------ 2 files changed, 2 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 81e0dc727ed..dfce99a732f 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -249,10 +249,7 @@ class DecorationProviderWrapper { // we make us of that and ignore all uris in which we have never // been interested. for (const uri of uris) { - const value = this.data.get(uri.toString()); - if (value !== undefined) { - this._fetchData(uri); - } + this._fetchData(uri); } } }); diff --git a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts index aae61fb6c20..631cc2df561 100644 --- a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts +++ b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts @@ -9,7 +9,7 @@ import * as assert from 'assert'; import { FileDecorationsService } from 'vs/workbench/services/decorations/browser/decorationsService'; import { IDecorationsProvider, IDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; import URI from 'vs/base/common/uri'; -import { Event, toPromise, Emitter } from 'vs/base/common/event'; +import { Event, toPromise } from 'vs/base/common/event'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; suite('DecorationsService', function () { @@ -169,40 +169,4 @@ suite('DecorationsService', function () { reg.dispose(); }); - - test('Avoid unnecessary decoration change events #46938', async function () { - - let uri1 = URI.parse('file:///uri1.txt'); - let uri2 = URI.parse('file:///uri2.txt'); - - let emitter = new Emitter(); - - let asked = new Set(); - - let reg = service.registerDecorationsProvider({ - label: 'Test', - onDidChange: emitter.event, - provideDecorations(uri: URI) { - asked.add(uri.toString()); - return { tooltip: uri.path, source: 'foo' }; - } - }); - - let deco = service.getDecoration(uri1, false); - assert.equal(deco.tooltip, '/uri1.txt'); - assert.equal(asked.size, 1); - assert.ok(asked.has(uri1.toString())); - - let didChange = toPromise(service.onDidChangeDecorations); - emitter.fire([uri1, uri2]); - - let e = await didChange; - - assert.equal(e.affectsResource(uri1), true); - assert.equal(e.affectsResource(uri2), false); - assert.equal(asked.size, 1); - assert.ok(asked.has(uri1.toString())); - - reg.dispose(); - }); }); From 2f6e59430855c157b898e78cc6ee5169602e2a6a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 11:29:23 +0200 Subject: [PATCH 110/710] green debug tests --- src/vs/platform/driver/electron-browser/driver.ts | 3 +++ test/smoke/src/areas/debug/debug.test.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index b2e8ff6c966..719d0261c3c 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -61,6 +61,9 @@ class WindowDriver implements IWindowDriver { y = top + (height / 2); } + x = Math.round(x); + y = Math.round(y); + const webContents = electron.remote.getCurrentWebContents(); webContents.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount: 1 } as any); webContents.sendInputEvent({ type: 'mouseUp', x, y, button: 'left', clickCount: 1 } as any); diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index 05633988f67..4223c58bee3 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -54,6 +54,9 @@ export function setup() { it('start debugging', async function () { const app = this.app as SpectronApplication; + // TODO@isidor + await new Promise(c => setTimeout(c, 100)); + port = await app.workbench.debug.startDebugging(); await app.screenCapturer.capture('debugging has started'); From bfe225320565a4c5168c7d133a4c40281e6051ee Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 11:31:28 +0200 Subject: [PATCH 111/710] green preferences tests --- .../platform/driver/electron-browser/driver.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 719d0261c3c..e8047cb23a0 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -43,6 +43,14 @@ class WindowDriver implements IWindowDriver { constructor() { } async click(selector: string, xoffset?: number, yoffset?: number): TPromise { + return this._click(selector, 1, xoffset, yoffset); + } + + doubleClick(selector: string): TPromise { + return this._click(selector, 2); + } + + private async _click(selector: string, clickCount: number, xoffset?: number, yoffset?: number): TPromise { const element = document.querySelector(selector); if (!element) { @@ -65,16 +73,12 @@ class WindowDriver implements IWindowDriver { y = Math.round(y); const webContents = electron.remote.getCurrentWebContents(); - webContents.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount: 1 } as any); - webContents.sendInputEvent({ type: 'mouseUp', x, y, button: 'left', clickCount: 1 } as any); + webContents.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount } as any); + webContents.sendInputEvent({ type: 'mouseUp', x, y, button: 'left', clickCount } as any); await TPromise.timeout(100); } - doubleClick(selector: string): TPromise { - throw new Error('Method not implemented.'); - } - move(selector: string): TPromise { throw new Error('Method not implemented.'); } From d18d301248a33b5386ac082b5b0874709a199701 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 11:38:14 +0200 Subject: [PATCH 112/710] green search tests --- src/vs/platform/driver/electron-browser/driver.ts | 15 ++++++++++++--- src/vs/platform/driver/electron-main/driver.ts | 12 ++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index e8047cb23a0..1845fe068d4 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -50,7 +50,7 @@ class WindowDriver implements IWindowDriver { return this._click(selector, 2); } - private async _click(selector: string, clickCount: number, xoffset?: number, yoffset?: number): TPromise { + private async _getElementXY(selector: string, xoffset?: number, yoffset?: number): TPromise<{ x: number; y: number; }> { const element = document.querySelector(selector); if (!element) { @@ -72,6 +72,11 @@ class WindowDriver implements IWindowDriver { x = Math.round(x); y = Math.round(y); + return { x, y }; + } + + private async _click(selector: string, clickCount: number, xoffset?: number, yoffset?: number): TPromise { + const { x, y } = await this._getElementXY(selector, xoffset, yoffset); const webContents = electron.remote.getCurrentWebContents(); webContents.sendInputEvent({ type: 'mouseDown', x, y, button: 'left', clickCount } as any); webContents.sendInputEvent({ type: 'mouseUp', x, y, button: 'left', clickCount } as any); @@ -79,8 +84,12 @@ class WindowDriver implements IWindowDriver { await TPromise.timeout(100); } - move(selector: string): TPromise { - throw new Error('Method not implemented.'); + async move(selector: string): TPromise { + const { x, y } = await this._getElementXY(selector); + const webContents = electron.remote.getCurrentWebContents(); + webContents.sendInputEvent({ type: 'mouseMove', x, y } as any); + + await TPromise.timeout(100); } async setValue(selector: string, text: string): TPromise { diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 9aa152f8437..77505e14b6b 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -12,7 +12,7 @@ import { serve as serveNet } from 'vs/base/parts/ipc/node/ipc.net'; import { combinedDisposable, IDisposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IPCServer, IClientRouter } from 'vs/base/parts/ipc/common/ipc'; -import { SimpleKeybinding } from 'vs/base/common/keyCodes'; +import { SimpleKeybinding, KeyCode } from 'vs/base/common/keyCodes'; import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { OS } from 'vs/base/common/platform'; @@ -29,6 +29,10 @@ class WindowRouter implements IClientRouter { } } +function isSilentKeyCode(keyCode: KeyCode) { + return keyCode < KeyCode.KEY_0; +} + export class Driver implements IDriver, IWindowDriverRegistry { _serviceBrand: any; @@ -91,7 +95,11 @@ export class Driver implements IDriver, IWindowDriverRegistry { } webContents.sendInputEvent({ type: 'keyDown', keyCode, modifiers } as any); - webContents.sendInputEvent({ type: 'char', keyCode, modifiers } as any); + + if (!isSilentKeyCode(keybinding.keyCode)) { + webContents.sendInputEvent({ type: 'char', keyCode, modifiers } as any); + } + webContents.sendInputEvent({ type: 'keyUp', keyCode, modifiers } as any); await TPromise.timeout(100); From 1d143981b45110432de649a8f2d8c1436c107d2c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 11 Apr 2018 12:06:50 +0200 Subject: [PATCH 113/710] Merge fileServices in /node and /electron-browser (fixes #38776) --- src/vs/platform/files/common/files.ts | 5 - .../extensionsTipsService.test.ts | 6 +- .../relauncher.contribution.ts | 8 + .../backupFileService.test.ts | 6 +- .../configurationEditingService.test.ts | 6 +- .../configurationService.test.ts | 12 +- .../files/electron-browser/fileService.ts | 1366 +++++++++++++++-- .../electron-browser/remoteFileService.ts | 8 +- .../services/files/node/fileService.ts | 1288 ---------------- .../fileService.test.ts | 54 +- .../fixtures/resolver/examples/company.js | 0 .../fixtures/resolver/examples/conway.js | 0 .../fixtures/resolver/examples/employee.js | 0 .../fixtures/resolver/examples/small.js | 0 .../fixtures/resolver/index.html | 0 .../fixtures/resolver/other/deep/company.js | 0 .../fixtures/resolver/other/deep/conway.js | 0 .../fixtures/resolver/other/deep/employee.js | 0 .../fixtures/resolver/other/deep/small.js | 0 .../fixtures/resolver/site.css | 0 .../fixtures/service/binary.txt | Bin .../fixtures/service/deep/company.js | 0 .../fixtures/service/deep/conway.js | 0 .../fixtures/service/deep/employee.js | 0 .../fixtures/service/deep/small.js | 0 .../fixtures/service/index.html | 0 .../fixtures/service/lorem.txt | 0 .../fixtures/service/small.txt | 0 .../fixtures/service/small_umlaut.txt | 0 .../fixtures/service/some_utf16le.css | Bin .../fixtures/service/some_utf8_bom.txt | 0 .../resolver.test.ts | 4 +- .../test/{node => electron-browser}/utils.ts | 0 .../watcher.test.ts | 0 .../keybindingEditing.test.ts | 15 +- .../workbench/test/workbenchTestServices.ts | 3 - 36 files changed, 1313 insertions(+), 1468 deletions(-) rename src/vs/workbench/services/backup/test/{node => electron-browser}/backupFileService.test.ts (98%) rename src/vs/workbench/services/configuration/test/{node => electron-browser}/configurationEditingService.test.ts (98%) rename src/vs/workbench/services/configuration/test/{node => electron-browser}/configurationService.test.ts (98%) delete mode 100644 src/vs/workbench/services/files/node/fileService.ts rename src/vs/workbench/services/files/test/{node => electron-browser}/fileService.test.ts (95%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/examples/company.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/examples/conway.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/examples/employee.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/examples/small.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/index.html (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/other/deep/company.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/other/deep/conway.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/other/deep/employee.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/other/deep/small.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/resolver/site.css (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/binary.txt (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/deep/company.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/deep/conway.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/deep/employee.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/deep/small.js (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/index.html (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/lorem.txt (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/small.txt (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/small_umlaut.txt (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/some_utf16le.css (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/fixtures/service/some_utf8_bom.txt (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/resolver.test.ts (97%) rename src/vs/workbench/services/files/test/{node => electron-browser}/utils.ts (100%) rename src/vs/workbench/services/files/test/{node => electron-browser}/watcher.test.ts (100%) rename src/vs/workbench/services/keybinding/test/{node => electron-browser}/keybindingEditing.test.ts (95%) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 38114652f14..8efe3094e5d 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -140,11 +140,6 @@ export interface IFileService { */ unwatchFileChanges(resource: URI): void; - /** - * Configures the file service with the provided options. - */ - updateOptions(options: object): void; - /** * Returns the preferred encoding to use for a given resource. */ diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts index 98b711a62e8..3d75afd31e8 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts @@ -23,12 +23,12 @@ import { Emitter } from 'vs/base/common/event'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { TestTextResourceConfigurationService, TestContextService, TestLifecycleService, TestEnvironmentService, TestNotificationService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextResourceConfigurationService, TestContextService, TestLifecycleService, TestEnvironmentService, TestNotificationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import URI from 'vs/base/common/uri'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { IFileService } from 'vs/platform/files/common/files'; -import { FileService } from 'vs/workbench/services/files/node/fileService'; +import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import * as extfs from 'vs/base/node/extfs'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IPager } from 'vs/base/common/paging'; @@ -265,7 +265,7 @@ suite('ExtensionsTipsService Test', () => { const myWorkspace = testWorkspace(URI.from({ scheme: 'file', path: folderDir })); workspaceService = new TestContextService(myWorkspace); instantiationService.stub(IWorkspaceContextService, workspaceService); - instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), { disableWatcher: true })); + instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true })); }); } diff --git a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts index cc4f495a0d1..e1b621a5d90 100644 --- a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts +++ b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts @@ -26,6 +26,7 @@ interface IConfiguration extends IWindowsConfiguration { telemetry: { enableCrashReporter: boolean }; keyboard: { touchbar: { enabled: boolean } }; workbench: { tree: { horizontalScrolling: boolean } }; + files: { useExperimentalFileWatcher: boolean }; } export class SettingsChangeRelauncher implements IWorkbenchContribution { @@ -40,6 +41,7 @@ export class SettingsChangeRelauncher implements IWorkbenchContribution { private touchbarEnabled: boolean; private treeHorizontalScrolling: boolean; private windowsSmoothScrollingWorkaround: boolean; + private experimentalFileWatcher: boolean; private firstFolderResource: URI; private extensionHostRestarter: RunOnceScheduler; @@ -103,6 +105,12 @@ export class SettingsChangeRelauncher implements IWorkbenchContribution { changed = true; } + // Experimental File Watcher + if (config.files && typeof config.files.useExperimentalFileWatcher === 'boolean' && config.files.useExperimentalFileWatcher !== this.experimentalFileWatcher) { + this.experimentalFileWatcher = config.files.useExperimentalFileWatcher; + changed = true; + } + // macOS: Touchbar config if (isMacintosh && config.keyboard && config.keyboard.touchbar && typeof config.keyboard.touchbar.enabled === 'boolean' && config.keyboard.touchbar.enabled !== this.touchbarEnabled) { this.touchbarEnabled = config.keyboard.touchbar.enabled; diff --git a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts similarity index 98% rename from src/vs/workbench/services/backup/test/node/backupFileService.test.ts rename to src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts index aa59da270d7..fc79fe68eeb 100644 --- a/src/vs/workbench/services/backup/test/node/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts @@ -14,9 +14,9 @@ import * as path from 'path'; import * as pfs from 'vs/base/node/pfs'; import Uri from 'vs/base/common/uri'; import { BackupFileService, BackupFilesModel } from 'vs/workbench/services/backup/node/backupFileService'; -import { FileService } from 'vs/workbench/services/files/node/fileService'; +import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { TextModel, createTextBufferFactory } from 'vs/editor/common/model/textModel'; -import { TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestEnvironmentService, TestNotificationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; import { Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { DefaultEndOfLine } from 'vs/editor/common/model'; @@ -38,7 +38,7 @@ const untitledBackupPath = path.join(workspaceBackupPath, 'untitled', crypto.cre class TestBackupFileService extends BackupFileService { constructor(workspace: Uri, backupHome: string, workspacesJsonPath: string) { - const fileService = new FileService(new TestContextService(new Workspace(workspace.fsPath, workspace.fsPath, toWorkspaceFolders([{ path: workspace.fsPath }]))), TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), { disableWatcher: true }); + const fileService = new FileService(new TestContextService(new Workspace(workspace.fsPath, workspace.fsPath, toWorkspaceFolders([{ path: workspace.fsPath }]))), TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true }); super(workspaceBackupPath, fileService); } diff --git a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts similarity index 98% rename from src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts rename to src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts index 0712f46945d..4aa21047fda 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts @@ -18,11 +18,11 @@ import { parseArgs } from 'vs/platform/environment/node/argv'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import * as extfs from 'vs/base/node/extfs'; -import { TestTextFileService, TestTextResourceConfigurationService, workbenchInstantiationService, TestLifecycleService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextFileService, TestTextResourceConfigurationService, workbenchInstantiationService, TestLifecycleService, TestEnvironmentService, TestStorageService, TestNotificationService } from 'vs/workbench/test/workbenchTestServices'; import * as uuid from 'vs/base/common/uuid'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { WorkspaceService } from 'vs/workbench/services/configuration/node/configurationService'; -import { FileService } from 'vs/workbench/services/files/node/fileService'; +import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { ConfigurationEditingService, ConfigurationEditingError, ConfigurationEditingErrorCode } from 'vs/workbench/services/configuration/node/configurationEditingService'; import { IFileService } from 'vs/platform/files/common/files'; import { WORKSPACE_STANDALONE_CONFIGURATIONS } from 'vs/workbench/services/configuration/common/configuration'; @@ -104,7 +104,7 @@ suite('ConfigurationEditingService', () => { instantiationService.stub(IWorkspaceContextService, workspaceService); return workspaceService.initialize(noWorkspace ? {} as IWindowConfiguration : workspaceDir).then(() => { instantiationService.stub(IConfigurationService, workspaceService); - instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), { disableWatcher: true })); + instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true })); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); instantiationService.stub(ICommandService, CommandService); diff --git a/src/vs/workbench/services/configuration/test/node/configurationService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts similarity index 98% rename from src/vs/workbench/services/configuration/test/node/configurationService.test.ts rename to src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts index 651ce72f7c6..ac651e2834e 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts @@ -24,8 +24,8 @@ import { ConfigurationEditingErrorCode } from 'vs/workbench/services/configurati import { FileChangeType, FileChangesEvent, IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; import { ConfigurationTarget, IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { workbenchInstantiationService, TestTextResourceConfigurationService, TestTextFileService, TestLifecycleService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; -import { FileService } from 'vs/workbench/services/files/node/fileService'; +import { workbenchInstantiationService, TestTextResourceConfigurationService, TestTextFileService, TestLifecycleService, TestEnvironmentService, TestStorageService, TestNotificationService } from 'vs/workbench/test/workbenchTestServices'; +import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; @@ -151,7 +151,7 @@ suite('WorkspaceContextService - Workspace', () => { return workspaceService.initialize({ id: configPath, configPath }).then(() => { - instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), { disableWatcher: true })); + instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true })); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); workspaceService.setInstantiationService(instantiationService); @@ -409,7 +409,7 @@ suite('WorkspaceService - Initialization', () => { instantiationService.stub(IEnvironmentService, environmentService); return workspaceService.initialize({}).then(() => { - instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), { disableWatcher: true })); + instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true })); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); workspaceService.setInstantiationService(instantiationService); @@ -667,7 +667,7 @@ suite('WorkspaceConfigurationService - Folder', () => { instantiationService.stub(IEnvironmentService, environmentService); return workspaceService.initialize(folderDir).then(() => { - instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), { disableWatcher: true })); + instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true })); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); workspaceService.setInstantiationService(instantiationService); @@ -980,7 +980,7 @@ suite('WorkspaceConfigurationService - Multiroot', () => { return workspaceService.initialize({ id: configPath, configPath }).then(() => { - instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), { disableWatcher: true })); + instantiationService.stub(IFileService, new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true })); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); workspaceService.setInstantiationService(instantiationService); diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index 7ea4e454d3c..7e459ad3dea 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -2,110 +2,221 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ + 'use strict'; -import * as nls from 'vs/nls'; +import * as paths from 'path'; +import * as fs from 'fs'; +import * as os from 'os'; +import * as crypto from 'crypto'; +import * as assert from 'assert'; +import { isParent, FileOperation, FileOperationEvent, IContent, IFileService, IResolveFileOptions, IResolveFileResult, IResolveContentOptions, IFileStat, IStreamContent, FileOperationError, FileOperationResult, IUpdateContentOptions, FileChangeType, IImportResult, FileChangesEvent, ICreateFileOptions, IContentData, ITextSnapshot, IFilesConfiguration } from 'vs/platform/files/common/files'; +import { MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/platform/files/node/files'; +import { isEqualOrParent } from 'vs/base/common/paths'; +import { ResourceMap } from 'vs/base/common/map'; +import * as arrays from 'vs/base/common/arrays'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import * as paths from 'vs/base/common/paths'; -import * as encoding from 'vs/base/node/encoding'; -import * as errors from 'vs/base/common/errors'; +import * as objects from 'vs/base/common/objects'; +import * as extfs from 'vs/base/node/extfs'; +import { nfcall, ThrottledDelayer } from 'vs/base/common/async'; import uri from 'vs/base/common/uri'; -import { FileOperation, FileOperationEvent, IFileService, IFilesConfiguration, IResolveFileOptions, IFileStat, IResolveFileResult, IContent, IStreamContent, IImportResult, IResolveContentOptions, IUpdateContentOptions, FileChangesEvent, ICreateFileOptions, ITextSnapshot } from 'vs/platform/files/common/files'; -import { FileService as NodeFileService, IFileServiceOptions, IEncodingOverride } from 'vs/workbench/services/files/node/fileService'; -import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import * as nls from 'vs/nls'; +import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; +import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import * as pfs from 'vs/base/node/pfs'; +import * as encoding from 'vs/base/node/encoding'; +import * as flow from 'vs/base/node/flow'; +import { FileWatcher as UnixWatcherService } from 'vs/workbench/services/files/node/watcher/unix/watcherService'; +import { FileWatcher as WindowsWatcherService } from 'vs/workbench/services/files/node/watcher/win32/watcherService'; +import { toFileChangesEvent, normalize, IRawFileChange } from 'vs/workbench/services/files/node/watcher/common'; import { Event, Emitter } from 'vs/base/common/event'; -import { shell } from 'electron'; +import { FileWatcher as NsfwWatcherService } from 'vs/workbench/services/files/node/watcher/nsfw/watcherService'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; -import { isMacintosh, isWindows } from 'vs/base/common/platform'; -import product from 'vs/platform/node/product'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; +import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { getBaseLabel } from 'vs/base/common/labels'; +import { Readable } from 'stream'; import { Schemas } from 'vs/base/common/network'; -import { Severity, INotificationService } from 'vs/platform/notification/common/notification'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import product from 'vs/platform/node/product'; import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; +import { shell } from 'electron'; + +export interface IEncodingOverride { + parent?: uri; + extension?: string; + encoding: string; +} + +export interface IFileServiceTestOptions { + tmpDir?: string; + disableWatcher?: boolean; + encodingOverride?: IEncodingOverride[]; +} + +function etag(stat: fs.Stats): string; +function etag(size: number, mtime: number): string; +function etag(arg1: any, arg2?: any): string { + let size: number; + let mtime: number; + if (typeof arg2 === 'number') { + size = arg1; + mtime = arg2; + } else { + size = (arg1).size; + mtime = (arg1).mtime.getTime(); + } + + return `"${crypto.createHash('sha1').update(String(size) + String(mtime)).digest('hex')}"`; +} + +class BufferPool { + + static _64K = new BufferPool(64 * 1024, 5); + + constructor( + readonly bufferSize: number, + private readonly _capacity: number, + private readonly _free: Buffer[] = [], + ) { + // + } + + acquire(): Buffer { + if (this._free.length === 0) { + return Buffer.allocUnsafe(this.bufferSize); + } else { + return this._free.shift(); + } + } + + release(buf: Buffer): void { + if (this._free.length <= this._capacity) { + this._free.push(buf); + } + } +} export class FileService implements IFileService { public _serviceBrand: any; - // If we run with .NET framework < 4.5, we need to detect this error to inform the user + private static readonly FS_EVENT_DELAY = 50; // aggregate and only emit events when changes have stopped for this duration (in ms) + private static readonly FS_REWATCH_DELAY = 300; // delay to rewatch a file that was renamed or deleted (in ms) + private static readonly NET_VERSION_ERROR = 'System.MissingMethodException'; private static readonly NET_VERSION_ERROR_IGNORE_KEY = 'ignoreNetVersionError'; private static readonly ENOSPC_ERROR = 'ENOSPC'; private static readonly ENOSPC_ERROR_IGNORE_KEY = 'ignoreEnospcError'; - private raw: NodeFileService; + protected readonly _onFileChanges: Emitter; + protected readonly _onAfterOperation: Emitter; - private toUnbind: IDisposable[]; + private tmpPath: string; - protected _onFileChanges: Emitter; - protected _onAfterOperation: Emitter; + private toDispose: IDisposable[]; + + private activeWorkspaceFileChangeWatcher: IDisposable; + private activeFileChangesWatchers: ResourceMap; + private fileChangesWatchDelayer: ThrottledDelayer; + private undeliveredRawFileChangesEvents: IRawFileChange[]; + + private useExperimentalFileWatcher: boolean; + private watcherIgnoredPatterns: string[]; + + private encodingOverride: IEncodingOverride[]; constructor( - @IConfigurationService private configurationService: IConfigurationService, - @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IEnvironmentService private environmentService: IEnvironmentService, - @ILifecycleService private lifecycleService: ILifecycleService, - @INotificationService private notificationService: INotificationService, - @IStorageService private storageService: IStorageService, - @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService + private contextService: IWorkspaceContextService, + private environmentService: IEnvironmentService, + private textResourceConfigurationService: ITextResourceConfigurationService, + private configurationService: IConfigurationService, + private lifecycleService: ILifecycleService, + private storageService: IStorageService, + private notificationService: INotificationService, + private options: IFileServiceTestOptions = Object.create(null) ) { - this.toUnbind = []; + this.toDispose = []; + this.tmpPath = this.options.tmpDir || os.tmpdir(); this._onFileChanges = new Emitter(); - this.toUnbind.push(this._onFileChanges); + this.toDispose.push(this._onFileChanges); this._onAfterOperation = new Emitter(); - this.toUnbind.push(this._onAfterOperation); + this.toDispose.push(this._onAfterOperation); + + this.activeFileChangesWatchers = new ResourceMap(); + this.fileChangesWatchDelayer = new ThrottledDelayer(FileService.FS_EVENT_DELAY); + this.undeliveredRawFileChangesEvents = []; const configuration = this.configurationService.getValue(); - let watcherIgnoredPatterns: string[] = []; + this.watcherIgnoredPatterns = []; if (configuration.files && configuration.files.watcherExclude) { - watcherIgnoredPatterns = Object.keys(configuration.files.watcherExclude).filter(k => !!configuration.files.watcherExclude[k]); + this.watcherIgnoredPatterns = Object.keys(configuration.files.watcherExclude).filter(k => !!configuration.files.watcherExclude[k]); } - // build config - const fileServiceConfig: IFileServiceOptions = { - errorLogger: (msg: string) => this.onFileServiceError(msg), - encodingOverride: this.getEncodingOverrides(), - watcherIgnoredPatterns, - verboseLogging: environmentService.verbose, - useExperimentalFileWatcher: configuration.files.useExperimentalFileWatcher, - elevationSupport: { - cliPath: this.environmentService.cliPath, - promptTitle: this.environmentService.appNameLong, - promptIcnsPath: (isMacintosh && this.environmentService.isBuilt) ? paths.join(paths.dirname(this.environmentService.appRoot), `${product.nameShort}.icns`) : void 0 - } - }; + this.useExperimentalFileWatcher = configuration.files && configuration.files.useExperimentalFileWatcher; - // create service - this.raw = new NodeFileService(contextService, environmentService, textResourceConfigurationService, configurationService, lifecycleService, fileServiceConfig); + this.encodingOverride = this.options.encodingOverride || this.getEncodingOverrides(); - // Listeners this.registerListeners(); } - public get onFileChanges(): Event { - return this._onFileChanges.event; + private registerListeners(): void { + + // Wait until we are fully running before starting file watchers + this.lifecycleService.when(LifecyclePhase.Running).then(() => { + this.setupFileWatching(); + }); + + // Workbench State Change + this.toDispose.push(this.contextService.onDidChangeWorkbenchState(() => { + if (this.lifecycleService.phase >= LifecyclePhase.Running) { + this.setupFileWatching(); + } + })); + + // Workspace Folder Change + this.toDispose.push(this.contextService.onDidChangeWorkspaceFolders(() => { + this.encodingOverride = this.getEncodingOverrides(); + })); + + // Lifecycle + this.lifecycleService.onShutdown(this.dispose, this); } - public get onAfterOperation(): Event { - return this._onAfterOperation.event; + private getEncodingOverrides(): IEncodingOverride[] { + const encodingOverride: IEncodingOverride[] = []; + + // Global settings + encodingOverride.push({ parent: uri.file(this.environmentService.appSettingsHome), encoding: encoding.UTF8 }); + + // Workspace files + encodingOverride.push({ extension: WORKSPACE_EXTENSION, encoding: encoding.UTF8 }); + + // Folder Settings + this.contextService.getWorkspace().folders.forEach(folder => { + encodingOverride.push({ parent: uri.file(paths.join(folder.uri.fsPath, '.vscode')), encoding: encoding.UTF8 }); + }); + + return encodingOverride; } - private onFileServiceError(error: string | Error): void { + private handleError(error: string | Error): void { const msg = error ? error.toString() : void 0; if (!msg) { return; } // Forward to unexpected error handler - errors.onUnexpectedError(msg); + onUnexpectedError(msg); // Detect if we run < .NET Framework 4.5 (TODO@ben remove with new watcher impl) if (msg.indexOf(FileService.NET_VERSION_ERROR) >= 0 && !this.storageService.getBoolean(FileService.NET_VERSION_ERROR_IGNORE_KEY, StorageScope.WORKSPACE)) { @@ -142,95 +253,761 @@ export class FileService implements IFileService { } } - private registerListeners(): void { - - // File events - this.toUnbind.push(this.raw.onFileChanges(e => this._onFileChanges.fire(e))); - this.toUnbind.push(this.raw.onAfterOperation(e => this._onAfterOperation.fire(e))); - - // Config changes - this.toUnbind.push(this.configurationService.onDidChangeConfiguration(e => this.onConfigurationChange(e))); - - // Root changes - this.toUnbind.push(this.contextService.onDidChangeWorkspaceFolders(() => this.onDidChangeWorkspaceFolders())); - - // Lifecycle - this.lifecycleService.onShutdown(this.dispose, this); + public get onFileChanges(): Event { + return this._onFileChanges.event; } - private onDidChangeWorkspaceFolders(): void { - this.updateOptions({ encodingOverride: this.getEncodingOverrides() }); + public get onAfterOperation(): Event { + return this._onAfterOperation.event; } - private getEncodingOverrides(): IEncodingOverride[] { - const encodingOverride: IEncodingOverride[] = []; - - // Global settings - encodingOverride.push({ parent: uri.file(this.environmentService.appSettingsHome), encoding: encoding.UTF8 }); - - // Workspace files - encodingOverride.push({ extension: WORKSPACE_EXTENSION, encoding: encoding.UTF8 }); - - // Folder Settings - this.contextService.getWorkspace().folders.forEach(folder => { - encodingOverride.push({ parent: uri.file(paths.join(folder.uri.fsPath, '.vscode')), encoding: encoding.UTF8 }); - }); - - return encodingOverride; - } - - private onConfigurationChange(event: IConfigurationChangeEvent): void { - if (event.affectsConfiguration('files.useExperimentalFileWatcher')) { - this.updateOptions({ useExperimentalFileWatcher: this.configurationService.getValue('files.useExperimentalFileWatcher') }); + public updateOptions(options: IFileServiceTestOptions): void { + if (options) { + objects.mixin(this.options, options); // overwrite current options } } - public updateOptions(options: object): void { - this.raw.updateOptions(options); + private setupFileWatching(): void { + + // dispose old if any + if (this.activeWorkspaceFileChangeWatcher) { + this.activeWorkspaceFileChangeWatcher.dispose(); + } + + // Return if not aplicable + const workbenchState = this.contextService.getWorkbenchState(); + if (workbenchState === WorkbenchState.EMPTY || this.options.disableWatcher) { + return; + } + + // new watcher: use it if setting tells us so or we run in multi-root environment + if (this.useExperimentalFileWatcher || workbenchState === WorkbenchState.WORKSPACE) { + this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupNsfwWorkspaceWatching().startWatching()); + } + + // old watcher + else { + if (isWindows) { + this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupWin32WorkspaceWatching().startWatching()); + } else { + this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupUnixWorkspaceWatching().startWatching()); + } + } + } + + private setupWin32WorkspaceWatching(): WindowsWatcherService { + return new WindowsWatcherService(this.contextService, this.watcherIgnoredPatterns, e => this._onFileChanges.fire(e), err => this.handleError(err), this.environmentService.verbose); + } + + private setupUnixWorkspaceWatching(): UnixWatcherService { + return new UnixWatcherService(this.contextService, this.watcherIgnoredPatterns, e => this._onFileChanges.fire(e), err => this.handleError(err), this.environmentService.verbose); + } + + private setupNsfwWorkspaceWatching(): NsfwWatcherService { + return new NsfwWatcherService(this.contextService, this.configurationService, e => this._onFileChanges.fire(e), err => this.handleError(err), this.environmentService.verbose); } public resolveFile(resource: uri, options?: IResolveFileOptions): TPromise { - return this.raw.resolveFile(resource, options); + return this.resolve(resource, options); } public resolveFiles(toResolve: { resource: uri, options?: IResolveFileOptions }[]): TPromise { - return this.raw.resolveFiles(toResolve); + return TPromise.join(toResolve.map(resourceAndOptions => this.resolve(resourceAndOptions.resource, resourceAndOptions.options) + .then(stat => ({ stat, success: true }), error => ({ stat: void 0, success: false })))); } public existsFile(resource: uri): TPromise { - return this.raw.existsFile(resource); + return this.resolveFile(resource).then(() => true, () => false); } public resolveContent(resource: uri, options?: IResolveContentOptions): TPromise { - return this.raw.resolveContent(resource, options); + return this.resolveStreamContent(resource, options).then(streamContent => { + return new TPromise((resolve, reject) => { + + const result: IContent = { + resource: streamContent.resource, + name: streamContent.name, + mtime: streamContent.mtime, + etag: streamContent.etag, + encoding: streamContent.encoding, + value: '' + }; + + streamContent.value.on('data', chunk => result.value += chunk); + streamContent.value.on('error', err => reject(err)); + streamContent.value.on('end', _ => resolve(result)); + + return result; + }); + }); } public resolveStreamContent(resource: uri, options?: IResolveContentOptions): TPromise { - return this.raw.resolveStreamContent(resource, options); + + // Guard early against attempts to resolve an invalid file path + if (resource.scheme !== Schemas.file || !resource.fsPath) { + return TPromise.wrapError(new FileOperationError( + nls.localize('fileInvalidPath', "Invalid file resource ({0})", resource.toString(true)), + FileOperationResult.FILE_INVALID_PATH, + options + )); + } + + const result: IStreamContent = { + resource: void 0, + name: void 0, + mtime: void 0, + etag: void 0, + encoding: void 0, + value: void 0 + }; + + const contentResolverTokenSource = new CancellationTokenSource(); + + const onStatError = (error: Error) => { + + // error: stop reading the file the stat and content resolve call + // usually race, mostly likely the stat call will win and cancel + // the content call + contentResolverTokenSource.cancel(); + + // forward error + return TPromise.wrapError(error); + }; + + const statsPromise = this.resolveFile(resource).then(stat => { + result.resource = stat.resource; + result.name = stat.name; + result.mtime = stat.mtime; + result.etag = stat.etag; + + // Return early if resource is a directory + if (stat.isDirectory) { + return onStatError(new FileOperationError( + nls.localize('fileIsDirectoryError', "File is directory"), + FileOperationResult.FILE_IS_DIRECTORY, + options + )); + } + + // Return early if file not modified since + if (options && options.etag && options.etag === stat.etag) { + return onStatError(new FileOperationError( + nls.localize('fileNotModifiedError', "File not modified since"), + FileOperationResult.FILE_NOT_MODIFIED_SINCE, + options + )); + } + + // Return early if file is too large to load + if (typeof stat.size === 'number') { + if (stat.size > Math.max(this.environmentService.args['max-memory'] * 1024 * 1024 || 0, MAX_HEAP_SIZE)) { + return onStatError(new FileOperationError( + nls.localize('fileTooLargeForHeapError', "To open a file of this size, you need to restart VS Code and allow it to use more memory"), + FileOperationResult.FILE_EXCEED_MEMORY_LIMIT + )); + } + + if (stat.size > MAX_FILE_SIZE) { + return onStatError(new FileOperationError( + nls.localize('fileTooLargeError', "File too large to open"), + FileOperationResult.FILE_TOO_LARGE + )); + } + } + + return void 0; + }, err => { + + // Wrap file not found errors + if (err.code === 'ENOENT') { + return onStatError(new FileOperationError( + nls.localize('fileNotFoundError', "File not found ({0})", resource.toString(true)), + FileOperationResult.FILE_NOT_FOUND, + options + )); + } + + return onStatError(err); + }); + + let completePromise: Thenable; + + // await the stat iff we already have an etag so that we compare the + // etag from the stat before we actually read the file again. + if (options && options.etag) { + completePromise = statsPromise.then(() => { + return this.fillInContents(result, resource, options, contentResolverTokenSource.token); // Waterfall -> only now resolve the contents + }); + } + + // a fresh load without a previous etag which means we can resolve the file stat + // and the content at the same time, avoiding the waterfall. + else { + completePromise = Promise.all([statsPromise, this.fillInContents(result, resource, options, contentResolverTokenSource.token)]); + } + + return TPromise.wrap(completePromise).then(() => { + contentResolverTokenSource.dispose(); + + return result; + }); } - public updateContent(resource: uri, value: string | ITextSnapshot, options?: IUpdateContentOptions): TPromise { - return this.raw.updateContent(resource, value, options); + private fillInContents(content: IStreamContent, resource: uri, options: IResolveContentOptions, token: CancellationToken): Thenable { + return this.resolveFileData(resource, options, token).then(data => { + content.encoding = data.encoding; + content.value = data.stream; + }); } - public moveFile(source: uri, target: uri, overwrite?: boolean): TPromise { - return this.raw.moveFile(source, target, overwrite); + private resolveFileData(resource: uri, options: IResolveContentOptions, token: CancellationToken): Thenable { + + const chunkBuffer = BufferPool._64K.acquire(); + + const result: IContentData = { + encoding: void 0, + stream: void 0 + }; + + return new Promise((resolve, reject) => { + fs.open(this.toAbsolutePath(resource), 'r', (err, fd) => { + if (err) { + if (err.code === 'ENOENT') { + // Wrap file not found errors + err = new FileOperationError( + nls.localize('fileNotFoundError', "File not found ({0})", resource.toString(true)), + FileOperationResult.FILE_NOT_FOUND, + options + ); + } + + return reject(err); + } + + let decoder: NodeJS.ReadWriteStream; + let totalBytesRead = 0; + + const finish = (err?: any) => { + + if (err) { + if (err.code === 'EISDIR') { + // Wrap EISDIR errors (fs.open on a directory works, but you cannot read from it) + err = new FileOperationError( + nls.localize('fileIsDirectoryError', "File is directory"), + FileOperationResult.FILE_IS_DIRECTORY, + options + ); + } + if (decoder) { + // If the decoder already started, we have to emit the error through it as + // event because the promise is already resolved! + decoder.emit('error', err); + } else { + reject(err); + } + } + if (decoder) { + decoder.end(); + } + + // return the shared buffer + BufferPool._64K.release(chunkBuffer); + + if (fd) { + fs.close(fd, err => { + if (err) { + this.handleError(`resolveFileData#close(): ${err.toString()}`); + } + }); + } + }; + + const handleChunk = (bytesRead: number) => { + if (token.isCancellationRequested) { + // cancellation -> finish + finish(new Error('cancelled')); + } else if (bytesRead === 0) { + // no more data -> finish + finish(); + } else if (bytesRead < chunkBuffer.length) { + // write the sub-part of data we received -> repeat + decoder.write(chunkBuffer.slice(0, bytesRead), readChunk); + } else { + // write all data we received -> repeat + decoder.write(chunkBuffer, readChunk); + } + }; + + let currentPosition: number = (options && options.position) || null; + + const readChunk = () => { + fs.read(fd, chunkBuffer, 0, chunkBuffer.length, currentPosition, (err, bytesRead) => { + totalBytesRead += bytesRead; + + if (typeof currentPosition === 'number') { + // if we received a position argument as option we need to ensure that + // we advance the position by the number of bytesread + currentPosition += bytesRead; + } + + if (totalBytesRead > Math.max(this.environmentService.args['max-memory'] * 1024 * 1024 || 0, MAX_HEAP_SIZE)) { + finish(new FileOperationError( + nls.localize('fileTooLargeForHeapError', "To open a file of this size, you need to restart VS Code and allow it to use more memory"), + FileOperationResult.FILE_EXCEED_MEMORY_LIMIT + )); + } + + if (totalBytesRead > MAX_FILE_SIZE) { + // stop when reading too much + finish(new FileOperationError( + nls.localize('fileTooLargeError', "File too large to open"), + FileOperationResult.FILE_TOO_LARGE, + options + )); + } else if (err) { + // some error happened + finish(err); + + } else if (decoder) { + // pass on to decoder + handleChunk(bytesRead); + + } else { + // when receiving the first chunk of data we need to create the + // decoding stream which is then used to drive the string stream. + TPromise.as(encoding.detectEncodingFromBuffer( + { buffer: chunkBuffer, bytesRead }, + options && options.autoGuessEncoding || this.configuredAutoGuessEncoding(resource) + )).then(detected => { + + if (options && options.acceptTextOnly && detected.seemsBinary) { + // Return error early if client only accepts text and this is not text + finish(new FileOperationError( + nls.localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), + FileOperationResult.FILE_IS_BINARY, + options + )); + + } else { + result.encoding = this.getEncoding(resource, this.getPeferredEncoding(resource, options, detected)); + result.stream = decoder = encoding.decodeStream(result.encoding); + resolve(result); + handleChunk(bytesRead); + } + + }).then(void 0, err => { + // failed to get encoding + finish(err); + }); + } + }); + }; + + // start reading + readChunk(); + }); + }); } - public copyFile(source: uri, target: uri, overwrite?: boolean): TPromise { - return this.raw.copyFile(source, target, overwrite); + public updateContent(resource: uri, value: string | ITextSnapshot, options: IUpdateContentOptions = Object.create(null)): TPromise { + if (options.writeElevated) { + return this.doUpdateContentElevated(resource, value, options); + } + + return this.doUpdateContent(resource, value, options); } - public createFile(resource: uri, content?: string, options?: ICreateFileOptions): TPromise { - return this.raw.createFile(resource, content, options); + private doUpdateContent(resource: uri, value: string | ITextSnapshot, options: IUpdateContentOptions = Object.create(null)): TPromise { + const absolutePath = this.toAbsolutePath(resource); + + // 1.) check file for writing + return this.checkFileBeforeWriting(absolutePath, options).then(exists => { + let createParentsPromise: TPromise; + if (exists) { + createParentsPromise = TPromise.as(null); + } else { + createParentsPromise = pfs.mkdirp(paths.dirname(absolutePath)); + } + + // 2.) create parents as needed + return createParentsPromise.then(() => { + const encodingToWrite = this.getEncoding(resource, options.encoding); + let addBomPromise: TPromise = TPromise.as(false); + + // UTF_16 BE and LE as well as UTF_8 with BOM always have a BOM + if (encodingToWrite === encoding.UTF16be || encodingToWrite === encoding.UTF16le || encodingToWrite === encoding.UTF8_with_bom) { + addBomPromise = TPromise.as(true); + } + + // Existing UTF-8 file: check for options regarding BOM + else if (exists && encodingToWrite === encoding.UTF8) { + if (options.overwriteEncoding) { + addBomPromise = TPromise.as(false); // if we are to overwrite the encoding, we do not preserve it if found + } else { + addBomPromise = encoding.detectEncodingByBOM(absolutePath).then(enc => enc === encoding.UTF8); // otherwise preserve it if found + } + } + + // 3.) check to add UTF BOM + return addBomPromise.then(addBom => { + + // 4.) set contents and resolve + return this.doSetContentsAndResolve(resource, absolutePath, value, addBom, encodingToWrite).then(void 0, error => { + if (!exists || error.code !== 'EPERM' || !isWindows) { + return TPromise.wrapError(error); + } + + // On Windows and if the file exists with an EPERM error, we try a different strategy of saving the file + // by first truncating the file and then writing with r+ mode. This helps to save hidden files on Windows + // (see https://github.com/Microsoft/vscode/issues/931) + + // 5.) truncate + return pfs.truncate(absolutePath, 0).then(() => { + + // 6.) set contents (this time with r+ mode) and resolve again + return this.doSetContentsAndResolve(resource, absolutePath, value, addBom, encodingToWrite, { flag: 'r+' }); + }); + }); + }); + }); + }).then(null, error => { + if (error.code === 'EACCES' || error.code === 'EPERM') { + return TPromise.wrapError(new FileOperationError( + nls.localize('filePermission', "Permission denied writing to file ({0})", resource.toString(true)), + FileOperationResult.FILE_PERMISSION_DENIED, + options + )); + } + + return TPromise.wrapError(error); + }); + } + + private doSetContentsAndResolve(resource: uri, absolutePath: string, value: string | ITextSnapshot, addBOM: boolean, encodingToWrite: string, options?: { mode?: number; flag?: string; }): TPromise { + let writeFilePromise: TPromise; + + // Configure encoding related options as needed + const writeFileOptions: extfs.IWriteFileOptions = options ? options : Object.create(null); + if (addBOM || encodingToWrite !== encoding.UTF8) { + writeFileOptions.encoding = { + charset: encodingToWrite, + addBOM + }; + } + + if (typeof value === 'string') { + writeFilePromise = pfs.writeFile(absolutePath, value, writeFileOptions); + } else { + writeFilePromise = pfs.writeFile(absolutePath, this.snapshotToReadableStream(value), writeFileOptions); + } + + // set contents + return writeFilePromise.then(() => { + + // resolve + return this.resolve(resource); + }); + } + + private snapshotToReadableStream(snapshot: ITextSnapshot): NodeJS.ReadableStream { + return new Readable({ + read: function () { + try { + let chunk: string; + let canPush = true; + + // Push all chunks as long as we can push and as long as + // the underlying snapshot returns strings to us + while (canPush && typeof (chunk = snapshot.read()) === 'string') { + canPush = this.push(chunk); + } + + // Signal EOS by pushing NULL + if (typeof chunk !== 'string') { + this.push(null); + } + } catch (error) { + this.emit('error', error); + } + }, + encoding: encoding.UTF8 // very important, so that strings are passed around and not buffers! + }); + } + + private doUpdateContentElevated(resource: uri, value: string | ITextSnapshot, options: IUpdateContentOptions = Object.create(null)): TPromise { + const absolutePath = this.toAbsolutePath(resource); + + // 1.) check file for writing + return this.checkFileBeforeWriting(absolutePath, options, options.overwriteReadonly /* ignore readonly if we overwrite readonly, this is handled via sudo later */).then(exists => { + const writeOptions: IUpdateContentOptions = objects.assign(Object.create(null), options); + writeOptions.writeElevated = false; + writeOptions.encoding = this.getEncoding(resource, options.encoding); + + // 2.) write to a temporary file to be able to copy over later + const tmpPath = paths.join(this.tmpPath, `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`); + return this.updateContent(uri.file(tmpPath), value, writeOptions).then(() => { + + // 3.) invoke our CLI as super user + return (import('sudo-prompt')).then(sudoPrompt => { + return new TPromise((c, e) => { + const promptOptions = { + name: this.environmentService.appNameLong.replace('-', ''), + icns: (isMacintosh && this.environmentService.isBuilt) ? paths.join(paths.dirname(this.environmentService.appRoot), `${product.nameShort}.icns`) : void 0 + }; + + const sudoCommand: string[] = [`"${this.environmentService.cliPath}"`]; + if (options.overwriteReadonly) { + sudoCommand.push('--file-chmod'); + } + sudoCommand.push('--file-write', `"${tmpPath}"`, `"${absolutePath}"`); + + sudoPrompt.exec(sudoCommand.join(' '), promptOptions, (error: string, stdout: string, stderr: string) => { + if (error || stderr) { + e(error || stderr); + } else { + c(void 0); + } + }); + }); + }).then(() => { + + // 3.) delete temp file + return pfs.del(tmpPath, this.tmpPath).then(() => { + + // 4.) resolve again + return this.resolve(resource); + }); + }); + }); + }).then(null, error => { + if (this.environmentService.verbose) { + this.handleError(`Unable to write to file '${resource.toString(true)}' as elevated user (${error})`); + } + + if (!FileOperationError.isFileOperationError(error)) { + error = new FileOperationError( + nls.localize('filePermission', "Permission denied writing to file ({0})", resource.toString(true)), + FileOperationResult.FILE_PERMISSION_DENIED, + options + ); + } + + return TPromise.wrapError(error); + }); + } + + public createFile(resource: uri, content: string = '', options: ICreateFileOptions = Object.create(null)): TPromise { + const absolutePath = this.toAbsolutePath(resource); + + let checkFilePromise: TPromise; + if (options.overwrite) { + checkFilePromise = TPromise.as(false); + } else { + checkFilePromise = pfs.exists(absolutePath); + } + + // Check file exists + return checkFilePromise.then(exists => { + if (exists && !options.overwrite) { + return TPromise.wrapError(new FileOperationError( + nls.localize('fileExists', "File to create already exists ({0})", resource.toString(true)), + FileOperationResult.FILE_MODIFIED_SINCE, + options + )); + } + + // Create file + return this.updateContent(resource, content).then(result => { + + // Events + this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, result)); + + return result; + }); + }); } public createFolder(resource: uri): TPromise { - return this.raw.createFolder(resource); + + // 1.) Create folder + const absolutePath = this.toAbsolutePath(resource); + return pfs.mkdirp(absolutePath).then(() => { + + // 2.) Resolve + return this.resolve(resource).then(result => { + + // Events + this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, result)); + + return result; + }); + }); + } + + private checkFileBeforeWriting(absolutePath: string, options: IUpdateContentOptions = Object.create(null), ignoreReadonly?: boolean): TPromise { + return pfs.exists(absolutePath).then(exists => { + if (exists) { + return pfs.stat(absolutePath).then(stat => { + if (stat.isDirectory()) { + return TPromise.wrapError(new Error('Expected file is actually a directory')); + } + + // Dirty write prevention: if the file on disk has been changed and does not match our expected + // mtime and etag, we bail out to prevent dirty writing. + // + // First, we check for a mtime that is in the future before we do more checks. The assumption is + // that only the mtime is an indicator for a file that has changd on disk. + // + // Second, if the mtime has advanced, we compare the size of the file on disk with our previous + // one using the etag() function. Relying only on the mtime check has prooven to produce false + // positives due to file system weirdness (especially around remote file systems). As such, the + // check for size is a weaker check because it can return a false negative if the file has changed + // but to the same length. This is a compromise we take to avoid having to produce checksums of + // the file content for comparison which would be much slower to compute. + if (typeof options.mtime === 'number' && typeof options.etag === 'string' && options.mtime < stat.mtime.getTime() && options.etag !== etag(stat.size, options.mtime)) { + return TPromise.wrapError(new FileOperationError(nls.localize('fileModifiedError', "File Modified Since"), FileOperationResult.FILE_MODIFIED_SINCE, options)); + } + + // Throw if file is readonly and we are not instructed to overwrite + if (!ignoreReadonly && !(stat.mode & 128) /* readonly */) { + if (!options.overwriteReadonly) { + return this.readOnlyError(options); + } + + // Try to change mode to writeable + let mode = stat.mode; + mode = mode | 128; + return pfs.chmod(absolutePath, mode).then(() => { + + // Make sure to check the mode again, it could have failed + return pfs.stat(absolutePath).then(stat => { + if (!(stat.mode & 128) /* readonly */) { + return this.readOnlyError(options); + } + + return exists; + }); + }); + } + + return TPromise.as(exists); + }); + } + + return TPromise.as(exists); + }); + } + + private readOnlyError(options: IUpdateContentOptions): TPromise { + return TPromise.wrapError(new FileOperationError( + nls.localize('fileReadOnlyError', "File is Read Only"), + FileOperationResult.FILE_READ_ONLY, + options + )); } public rename(resource: uri, newName: string): TPromise { - return this.raw.rename(resource, newName); + const newPath = paths.join(paths.dirname(resource.fsPath), newName); + + return this.moveFile(resource, uri.file(newPath)); + } + + public moveFile(source: uri, target: uri, overwrite?: boolean): TPromise { + return this.moveOrCopyFile(source, target, false, overwrite); + } + + public copyFile(source: uri, target: uri, overwrite?: boolean): TPromise { + return this.moveOrCopyFile(source, target, true, overwrite); + } + + private moveOrCopyFile(source: uri, target: uri, keepCopy: boolean, overwrite: boolean): TPromise { + const sourcePath = this.toAbsolutePath(source); + const targetPath = this.toAbsolutePath(target); + + // 1.) move / copy + return this.doMoveOrCopyFile(sourcePath, targetPath, keepCopy, overwrite).then(() => { + + // 2.) resolve + return this.resolve(target).then(result => { + + // Events + this._onAfterOperation.fire(new FileOperationEvent(source, keepCopy ? FileOperation.COPY : FileOperation.MOVE, result)); + + return result; + }); + }); + } + + private doMoveOrCopyFile(sourcePath: string, targetPath: string, keepCopy: boolean, overwrite: boolean): TPromise { + + // 1.) validate operation + if (isParent(targetPath, sourcePath, !isLinux)) { + return TPromise.wrapError(new Error('Unable to move/copy when source path is parent of target path')); + } + + // 2.) check if target exists + return pfs.exists(targetPath).then(exists => { + const isCaseRename = sourcePath.toLowerCase() === targetPath.toLowerCase(); + const isSameFile = sourcePath === targetPath; + + // Return early with conflict if target exists and we are not told to overwrite + if (exists && !isCaseRename && !overwrite) { + return TPromise.wrapError(new FileOperationError(nls.localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), FileOperationResult.FILE_MOVE_CONFLICT)); + } + + // 3.) make sure target is deleted before we move/copy unless this is a case rename of the same file + let deleteTargetPromise = TPromise.wrap(void 0); + if (exists && !isCaseRename) { + if (isEqualOrParent(sourcePath, targetPath, !isLinux /* ignorecase */)) { + return TPromise.wrapError(new Error(nls.localize('unableToMoveCopyError', "Unable to move/copy. File would replace folder it is contained in."))); // catch this corner case! + } + + deleteTargetPromise = this.del(uri.file(targetPath)); + } + + return deleteTargetPromise.then(() => { + + // 4.) make sure parents exists + return pfs.mkdirp(paths.dirname(targetPath)).then(() => { + + // 4.) copy/move + if (isSameFile) { + return TPromise.wrap(null); + } else if (keepCopy) { + return nfcall(extfs.copy, sourcePath, targetPath); + } else { + return nfcall(extfs.mv, sourcePath, targetPath); + } + }).then(() => exists); + }); + }); + } + + public importFile(source: uri, targetFolder: uri): TPromise { + const sourcePath = this.toAbsolutePath(source); + const targetResource = uri.file(paths.join(targetFolder.fsPath, paths.basename(source.fsPath))); + const targetPath = this.toAbsolutePath(targetResource); + + // 1.) resolve + return pfs.stat(sourcePath).then(stat => { + if (stat.isDirectory()) { + return TPromise.wrapError(new Error(nls.localize('foldersCopyError', "Folders cannot be copied into the workspace. Please select individual files to copy them."))); // for now we do not allow to import a folder into a workspace + } + + // 2.) copy + return this.doMoveOrCopyFile(sourcePath, targetPath, true, true).then(exists => { + + // 3.) resolve + return this.resolve(targetResource).then(stat => { + + // Events + this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.IMPORT, stat)); + + return { isNew: !exists, stat }; + }); + }); + }); } public del(resource: uri, useTrash?: boolean): TPromise { @@ -238,7 +1015,7 @@ export class FileService implements IFileService { return this.doMoveItemToTrash(resource); } - return this.raw.del(resource); + return this.doDelete(resource); } private doMoveItemToTrash(resource: uri): TPromise { @@ -253,44 +1030,367 @@ export class FileService implements IFileService { return TPromise.as(null); } - public importFile(source: uri, targetFolder: uri): TPromise { - return this.raw.importFile(source, targetFolder).then((result) => { - return { - isNew: result && result.isNew, - stat: result && result.stat - }; + private doDelete(resource: uri): TPromise { + const absolutePath = this.toAbsolutePath(resource); + + return pfs.del(absolutePath, this.tmpPath).then(() => { + + // Events + this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.DELETE)); }); } - public watchFileChanges(resource: uri): void { - if (!resource) { - return; + // Helpers + + private toAbsolutePath(arg1: uri | IFileStat): string { + let resource: uri; + if (arg1 instanceof uri) { + resource = arg1; + } else { + resource = (arg1).resource; } - if (resource.scheme !== Schemas.file) { - return; // only support files - } + assert.ok(resource && resource.scheme === Schemas.file, `Invalid resource: ${resource}`); - // return early if the resource is inside the workspace for which we have another watcher in place - if (this.contextService.isInsideWorkspace(resource)) { - return; - } - - this.raw.watchFileChanges(resource); + return paths.normalize(resource.fsPath); } - public unwatchFileChanges(resource: uri): void { - this.raw.unwatchFileChanges(resource); + private resolve(resource: uri, options: IResolveFileOptions = Object.create(null)): TPromise { + return this.toStatResolver(resource) + .then(model => model.resolve(options)); + } + + private toStatResolver(resource: uri): TPromise { + const absolutePath = this.toAbsolutePath(resource); + + return pfs.statLink(absolutePath).then(({ isSymbolicLink, stat }) => { + return new StatResolver(resource, isSymbolicLink, stat.isDirectory(), stat.mtime.getTime(), stat.size, this.environmentService.verbose ? err => this.handleError(err) : void 0); + }); + } + + private getPeferredEncoding(resource: uri, options: IResolveContentOptions, detected: encoding.IDetectedEncodingResult): string { + let preferredEncoding: string; + if (options && options.encoding) { + if (detected.encoding === encoding.UTF8 && options.encoding === encoding.UTF8) { + preferredEncoding = encoding.UTF8_with_bom; // indicate the file has BOM if we are to resolve with UTF 8 + } else { + preferredEncoding = options.encoding; // give passed in encoding highest priority + } + } else if (detected.encoding) { + if (detected.encoding === encoding.UTF8) { + preferredEncoding = encoding.UTF8_with_bom; // if we detected UTF-8, it can only be because of a BOM + } else { + preferredEncoding = detected.encoding; + } + } else if (this.configuredEncoding(resource) === encoding.UTF8_with_bom) { + preferredEncoding = encoding.UTF8; // if we did not detect UTF 8 BOM before, this can only be UTF 8 then + } + return preferredEncoding; } public getEncoding(resource: uri, preferredEncoding?: string): string { - return this.raw.getEncoding(resource, preferredEncoding); + let fileEncoding: string; + + const override = this.getEncodingOverride(resource); + if (override) { + fileEncoding = override; + } else if (preferredEncoding) { + fileEncoding = preferredEncoding; + } else { + fileEncoding = this.configuredEncoding(resource); + } + + if (!fileEncoding || !encoding.encodingExists(fileEncoding)) { + fileEncoding = encoding.UTF8; // the default is UTF 8 + } + + return fileEncoding; + } + + private configuredAutoGuessEncoding(resource: uri): boolean { + return this.textResourceConfigurationService.getValue(resource, 'files.autoGuessEncoding'); + } + + private configuredEncoding(resource: uri): string { + return this.textResourceConfigurationService.getValue(resource, 'files.encoding'); + } + + private getEncodingOverride(resource: uri): string { + if (resource && this.encodingOverride && this.encodingOverride.length) { + for (let i = 0; i < this.encodingOverride.length; i++) { + const override = this.encodingOverride[i]; + + // check if the resource is child of encoding override path + if (override.parent && isParent(resource.fsPath, override.parent.fsPath, !isLinux /* ignorecase */)) { + return override.encoding; + } + + // check if the resource extension is equal to encoding override + if (override.extension && paths.extname(resource.fsPath) === `.${override.extension}`) { + return override.encoding; + } + } + } + + return null; + } + + public watchFileChanges(resource: uri): void { + assert.ok(resource && resource.scheme === Schemas.file, `Invalid resource for watching: ${resource}`); + + // Create or get watcher for provided path + let watcher = this.activeFileChangesWatchers.get(resource); + if (!watcher) { + const fsPath = resource.fsPath; + const fsName = paths.basename(resource.fsPath); + + watcher = extfs.watch(fsPath, (eventType: string, filename: string) => { + const renamedOrDeleted = ((filename && filename !== fsName) || eventType === 'rename'); + + // The file was either deleted or renamed. Many tools apply changes to files in an + // atomic way ("Atomic Save") by first renaming the file to a temporary name and then + // renaming it back to the original name. Our watcher will detect this as a rename + // and then stops to work on Mac and Linux because the watcher is applied to the + // inode and not the name. The fix is to detect this case and trying to watch the file + // again after a certain delay. + // In addition, we send out a delete event if after a timeout we detect that the file + // does indeed not exist anymore. + if (renamedOrDeleted) { + + // Very important to dispose the watcher which now points to a stale inode + this.unwatchFileChanges(resource); + + // Wait a bit and try to install watcher again, assuming that the file was renamed quickly ("Atomic Save") + setTimeout(() => { + this.existsFile(resource).done(exists => { + + // File still exists, so reapply the watcher + if (exists) { + this.watchFileChanges(resource); + } + + // File seems to be really gone, so emit a deleted event + else { + this.onRawFileChange({ + type: FileChangeType.DELETED, + path: fsPath + }); + } + }); + }, FileService.FS_REWATCH_DELAY); + } + + // Handle raw file change + this.onRawFileChange({ + type: FileChangeType.UPDATED, + path: fsPath + }); + }, (error: string) => this.handleError(error)); + + if (watcher) { + this.activeFileChangesWatchers.set(resource, watcher); + } + } + } + + private onRawFileChange(event: IRawFileChange): void { + + // add to bucket of undelivered events + this.undeliveredRawFileChangesEvents.push(event); + + if (this.environmentService.verbose) { + console.log('%c[node.js Watcher]%c', 'color: green', 'color: black', event.type === FileChangeType.ADDED ? '[ADDED]' : event.type === FileChangeType.DELETED ? '[DELETED]' : '[CHANGED]', event.path); + } + + // handle emit through delayer to accommodate for bulk changes + this.fileChangesWatchDelayer.trigger(() => { + const buffer = this.undeliveredRawFileChangesEvents; + this.undeliveredRawFileChangesEvents = []; + + // Normalize + const normalizedEvents = normalize(buffer); + + // Logging + if (this.environmentService.verbose) { + normalizedEvents.forEach(r => { + console.log('%c[node.js Watcher]%c >> normalized', 'color: green', 'color: black', r.type === FileChangeType.ADDED ? '[ADDED]' : r.type === FileChangeType.DELETED ? '[DELETED]' : '[CHANGED]', r.path); + }); + } + + // Emit + this._onFileChanges.fire(toFileChangesEvent(normalizedEvents)); + + return TPromise.as(null); + }); + } + + public unwatchFileChanges(resource: uri): void { + const watcher = this.activeFileChangesWatchers.get(resource); + if (watcher) { + watcher.close(); + this.activeFileChangesWatchers.delete(resource); + } } public dispose(): void { - this.toUnbind = dispose(this.toUnbind); + this.toDispose = dispose(this.toDispose); - // Dispose service - this.raw.dispose(); + if (this.activeWorkspaceFileChangeWatcher) { + this.activeWorkspaceFileChangeWatcher.dispose(); + this.activeWorkspaceFileChangeWatcher = null; + } + + this.activeFileChangesWatchers.forEach(watcher => watcher.close()); + this.activeFileChangesWatchers.clear(); + } +} + +export class StatResolver { + private name: string; + private etag: string; + + constructor( + private resource: uri, + private isSymbolicLink: boolean, + private isDirectory: boolean, + private mtime: number, + private size: number, + private errorLogger?: (error: Error | string) => void + ) { + assert.ok(resource && resource.scheme === Schemas.file, `Invalid resource: ${resource}`); + + this.name = getBaseLabel(resource); + this.etag = etag(size, mtime); + } + + public resolve(options: IResolveFileOptions): TPromise { + + // General Data + const fileStat: IFileStat = { + resource: this.resource, + isDirectory: this.isDirectory, + isSymbolicLink: this.isSymbolicLink, + name: this.name, + etag: this.etag, + size: this.size, + mtime: this.mtime + }; + + // File Specific Data + if (!this.isDirectory) { + return TPromise.as(fileStat); + } + + // Directory Specific Data + else { + + // Convert the paths from options.resolveTo to absolute paths + let absoluteTargetPaths: string[] = null; + if (options && options.resolveTo) { + absoluteTargetPaths = []; + options.resolveTo.forEach(resource => { + absoluteTargetPaths.push(resource.fsPath); + }); + } + + return new TPromise((c, e) => { + + // Load children + this.resolveChildren(this.resource.fsPath, absoluteTargetPaths, options && options.resolveSingleChildDescendants, children => { + children = arrays.coalesce(children); // we don't want those null children (could be permission denied when reading a child) + fileStat.children = children || []; + + c(fileStat); + }); + }); + } + } + + private resolveChildren(absolutePath: string, absoluteTargetPaths: string[], resolveSingleChildDescendants: boolean, callback: (children: IFileStat[]) => void): void { + extfs.readdir(absolutePath, (error: Error, files: string[]) => { + if (error) { + if (this.errorLogger) { + this.errorLogger(error); + } + + return callback(null); // return - we might not have permissions to read the folder + } + + // for each file in the folder + flow.parallel(files, (file: string, clb: (error: Error, children: IFileStat) => void) => { + const fileResource = uri.file(paths.resolve(absolutePath, file)); + let fileStat: fs.Stats; + let isSymbolicLink = false; + const $this = this; + + flow.sequence( + function onError(error: Error): void { + if ($this.errorLogger) { + $this.errorLogger(error); + } + + clb(null, null); // return - we might not have permissions to read the folder or stat the file + }, + + function stat(this: any): void { + extfs.statLink(fileResource.fsPath, this); + }, + + function countChildren(this: any, statAndLink: extfs.IStatAndLink): void { + fileStat = statAndLink.stat; + isSymbolicLink = statAndLink.isSymbolicLink; + + if (fileStat.isDirectory()) { + extfs.readdir(fileResource.fsPath, (error, result) => { + this(null, result ? result.length : 0); + }); + } else { + this(null, 0); + } + }, + + function resolve(childCount: number): void { + const childStat: IFileStat = { + resource: fileResource, + isDirectory: fileStat.isDirectory(), + isSymbolicLink, + name: file, + mtime: fileStat.mtime.getTime(), + etag: etag(fileStat), + size: fileStat.size + }; + + // Return early for files + if (!fileStat.isDirectory()) { + return clb(null, childStat); + } + + // Handle Folder + let resolveFolderChildren = false; + if (files.length === 1 && resolveSingleChildDescendants) { + resolveFolderChildren = true; + } else if (childCount > 0 && absoluteTargetPaths && absoluteTargetPaths.some(targetPath => isEqualOrParent(targetPath, fileResource.fsPath, !isLinux /* ignorecase */))) { + resolveFolderChildren = true; + } + + // Continue resolving children based on condition + if (resolveFolderChildren) { + $this.resolveChildren(fileResource.fsPath, absoluteTargetPaths, resolveSingleChildDescendants, children => { + children = arrays.coalesce(children); // we don't want those null children + childStat.children = children || []; + + clb(null, childStat); + }); + } + + // Otherwise return result + else { + clb(null, childStat); + } + }); + }, (errors, result) => { + callback(result); + }); + }); } } diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 8a4a0c41cc7..2137a762b6b 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -84,13 +84,13 @@ export class RemoteFileService extends FileService { @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService, ) { super( - configurationService, contextService, environmentService, - lifecycleService, - notificationService, - _storageService, textResourceConfigurationService, + configurationService, + lifecycleService, + _storageService, + notificationService ); this._supportedSchemes = JSON.parse(this._storageService.get('remote_schemes', undefined, '[]')); diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts deleted file mode 100644 index c73b17c1d36..00000000000 --- a/src/vs/workbench/services/files/node/fileService.ts +++ /dev/null @@ -1,1288 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import * as paths from 'path'; -import * as fs from 'fs'; -import * as os from 'os'; -import * as crypto from 'crypto'; -import * as assert from 'assert'; -import { isParent, FileOperation, FileOperationEvent, IContent, IFileService, IResolveFileOptions, IResolveFileResult, IResolveContentOptions, IFileStat, IStreamContent, FileOperationError, FileOperationResult, IUpdateContentOptions, FileChangeType, IImportResult, FileChangesEvent, ICreateFileOptions, IContentData, ITextSnapshot } from 'vs/platform/files/common/files'; -import { MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/platform/files/node/files'; -import { isEqualOrParent } from 'vs/base/common/paths'; -import { ResourceMap } from 'vs/base/common/map'; -import * as arrays from 'vs/base/common/arrays'; -import { TPromise } from 'vs/base/common/winjs.base'; -import * as objects from 'vs/base/common/objects'; -import * as extfs from 'vs/base/node/extfs'; -import { nfcall, ThrottledDelayer } from 'vs/base/common/async'; -import uri from 'vs/base/common/uri'; -import * as nls from 'vs/nls'; -import { isWindows, isLinux } from 'vs/base/common/platform'; -import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import * as pfs from 'vs/base/node/pfs'; -import * as encoding from 'vs/base/node/encoding'; -import * as flow from 'vs/base/node/flow'; -import { FileWatcher as UnixWatcherService } from 'vs/workbench/services/files/node/watcher/unix/watcherService'; -import { FileWatcher as WindowsWatcherService } from 'vs/workbench/services/files/node/watcher/win32/watcherService'; -import { toFileChangesEvent, normalize, IRawFileChange } from 'vs/workbench/services/files/node/watcher/common'; -import { Event, Emitter } from 'vs/base/common/event'; -import { FileWatcher as NsfwWatcherService } from 'vs/workbench/services/files/node/watcher/nsfw/watcherService'; -import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; -import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { getBaseLabel } from 'vs/base/common/labels'; -import { Readable } from 'stream'; -import { Schemas } from 'vs/base/common/network'; - -export interface IEncodingOverride { - parent?: uri; - extension?: string; - encoding: string; -} - -export interface IFileServiceOptions { - tmpDir?: string; - errorLogger?: (msg: string) => void; - encodingOverride?: IEncodingOverride[]; - watcherIgnoredPatterns?: string[]; - disableWatcher?: boolean; - verboseLogging?: boolean; - useExperimentalFileWatcher?: boolean; - writeElevated?: (source: string, target: string) => TPromise; - elevationSupport?: { - cliPath: string; - promptTitle: string; - promptIcnsPath?: string; - }; -} - -function etag(stat: fs.Stats): string; -function etag(size: number, mtime: number): string; -function etag(arg1: any, arg2?: any): string { - let size: number; - let mtime: number; - if (typeof arg2 === 'number') { - size = arg1; - mtime = arg2; - } else { - size = (arg1).size; - mtime = (arg1).mtime.getTime(); - } - - return `"${crypto.createHash('sha1').update(String(size) + String(mtime)).digest('hex')}"`; -} - -class BufferPool { - - static _64K = new BufferPool(64 * 1024, 5); - - constructor( - readonly bufferSize: number, - private readonly _capacity: number, - private readonly _free: Buffer[] = [], - ) { - // - } - - acquire(): Buffer { - if (this._free.length === 0) { - return Buffer.allocUnsafe(this.bufferSize); - } else { - return this._free.shift(); - } - } - - release(buf: Buffer): void { - if (this._free.length <= this._capacity) { - this._free.push(buf); - } - } -} - -export class FileService implements IFileService { - - public _serviceBrand: any; - - private static readonly FS_EVENT_DELAY = 50; // aggregate and only emit events when changes have stopped for this duration (in ms) - private static readonly FS_REWATCH_DELAY = 300; // delay to rewatch a file that was renamed or deleted (in ms) - - private tmpPath: string; - private options: IFileServiceOptions; - - private readonly _onFileChanges: Emitter; - private readonly _onAfterOperation: Emitter; - - private toDispose: IDisposable[]; - - private activeFileChangesWatchers: ResourceMap; - private fileChangesWatchDelayer: ThrottledDelayer; - private undeliveredRawFileChangesEvents: IRawFileChange[]; - - private activeWorkspaceFileChangeWatcher: IDisposable; - - constructor( - private contextService: IWorkspaceContextService, - private environmentService: IEnvironmentService, - private textResourceConfigurationService: ITextResourceConfigurationService, - private configurationService: IConfigurationService, - private lifecycleService: ILifecycleService, - options: IFileServiceOptions - ) { - this.toDispose = []; - this.options = options || Object.create(null); - this.tmpPath = this.options.tmpDir || os.tmpdir(); - - this._onFileChanges = new Emitter(); - this.toDispose.push(this._onFileChanges); - - this._onAfterOperation = new Emitter(); - this.toDispose.push(this._onAfterOperation); - - if (!this.options.errorLogger) { - this.options.errorLogger = console.error; - } - - this.activeFileChangesWatchers = new ResourceMap(); - this.fileChangesWatchDelayer = new ThrottledDelayer(FileService.FS_EVENT_DELAY); - this.undeliveredRawFileChangesEvents = []; - - lifecycleService.when(LifecyclePhase.Running).then(() => { - this.setupFileWatching(); // wait until we are fully running before starting file watchers - }); - - this.registerListeners(); - } - - private registerListeners(): void { - this.toDispose.push(this.contextService.onDidChangeWorkbenchState(() => { - if (this.lifecycleService.phase >= LifecyclePhase.Running) { - this.setupFileWatching(); - } - })); - } - - public get onFileChanges(): Event { - return this._onFileChanges.event; - } - - public get onAfterOperation(): Event { - return this._onAfterOperation.event; - } - - public updateOptions(options: IFileServiceOptions): void { - if (options) { - objects.mixin(this.options, options); // overwrite current options - } - } - - private setupFileWatching(): void { - - // dispose old if any - if (this.activeWorkspaceFileChangeWatcher) { - this.activeWorkspaceFileChangeWatcher.dispose(); - } - - // Return if not aplicable - const workbenchState = this.contextService.getWorkbenchState(); - if (workbenchState === WorkbenchState.EMPTY || this.options.disableWatcher) { - return; - } - - // new watcher: use it if setting tells us so or we run in multi-root environment - if (this.options.useExperimentalFileWatcher || workbenchState === WorkbenchState.WORKSPACE) { - this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupNsfwWorkspaceWatching().startWatching()); - } - - // old watcher - else { - if (isWindows) { - this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupWin32WorkspaceWatching().startWatching()); - } else { - this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupUnixWorkspaceWatching().startWatching()); - } - } - } - - private setupWin32WorkspaceWatching(): WindowsWatcherService { - return new WindowsWatcherService(this.contextService, this.options.watcherIgnoredPatterns, e => this._onFileChanges.fire(e), this.options.errorLogger, this.options.verboseLogging); - } - - private setupUnixWorkspaceWatching(): UnixWatcherService { - return new UnixWatcherService(this.contextService, this.options.watcherIgnoredPatterns, e => this._onFileChanges.fire(e), this.options.errorLogger, this.options.verboseLogging); - } - - private setupNsfwWorkspaceWatching(): NsfwWatcherService { - return new NsfwWatcherService(this.contextService, this.configurationService, e => this._onFileChanges.fire(e), this.options.errorLogger, this.options.verboseLogging); - } - - public resolveFile(resource: uri, options?: IResolveFileOptions): TPromise { - return this.resolve(resource, options); - } - - public resolveFiles(toResolve: { resource: uri, options?: IResolveFileOptions }[]): TPromise { - return TPromise.join(toResolve.map(resourceAndOptions => this.resolve(resourceAndOptions.resource, resourceAndOptions.options) - .then(stat => ({ stat, success: true }), error => ({ stat: void 0, success: false })))); - } - - public existsFile(resource: uri): TPromise { - return this.resolveFile(resource).then(() => true, () => false); - } - - public resolveContent(resource: uri, options?: IResolveContentOptions): TPromise { - return this.resolveStreamContent(resource, options).then(streamContent => { - return new TPromise((resolve, reject) => { - - const result: IContent = { - resource: streamContent.resource, - name: streamContent.name, - mtime: streamContent.mtime, - etag: streamContent.etag, - encoding: streamContent.encoding, - value: '' - }; - - streamContent.value.on('data', chunk => result.value += chunk); - streamContent.value.on('error', err => reject(err)); - streamContent.value.on('end', _ => resolve(result)); - - return result; - }); - }); - } - - public resolveStreamContent(resource: uri, options?: IResolveContentOptions): TPromise { - - // Guard early against attempts to resolve an invalid file path - if (resource.scheme !== Schemas.file || !resource.fsPath) { - return TPromise.wrapError(new FileOperationError( - nls.localize('fileInvalidPath', "Invalid file resource ({0})", resource.toString(true)), - FileOperationResult.FILE_INVALID_PATH, - options - )); - } - - const result: IStreamContent = { - resource: void 0, - name: void 0, - mtime: void 0, - etag: void 0, - encoding: void 0, - value: void 0 - }; - - const contentResolverTokenSource = new CancellationTokenSource(); - - const onStatError = (error: Error) => { - - // error: stop reading the file the stat and content resolve call - // usually race, mostly likely the stat call will win and cancel - // the content call - contentResolverTokenSource.cancel(); - - // forward error - return TPromise.wrapError(error); - }; - - const statsPromise = this.resolveFile(resource).then(stat => { - result.resource = stat.resource; - result.name = stat.name; - result.mtime = stat.mtime; - result.etag = stat.etag; - - // Return early if resource is a directory - if (stat.isDirectory) { - return onStatError(new FileOperationError( - nls.localize('fileIsDirectoryError', "File is directory"), - FileOperationResult.FILE_IS_DIRECTORY, - options - )); - } - - // Return early if file not modified since - if (options && options.etag && options.etag === stat.etag) { - return onStatError(new FileOperationError( - nls.localize('fileNotModifiedError', "File not modified since"), - FileOperationResult.FILE_NOT_MODIFIED_SINCE, - options - )); - } - - // Return early if file is too large to load - if (typeof stat.size === 'number') { - if (stat.size > Math.max(this.environmentService.args['max-memory'] * 1024 * 1024 || 0, MAX_HEAP_SIZE)) { - return onStatError(new FileOperationError( - nls.localize('fileTooLargeForHeapError', "To open a file of this size, you need to restart VS Code and allow it to use more memory"), - FileOperationResult.FILE_EXCEED_MEMORY_LIMIT - )); - } - - if (stat.size > MAX_FILE_SIZE) { - return onStatError(new FileOperationError( - nls.localize('fileTooLargeError', "File too large to open"), - FileOperationResult.FILE_TOO_LARGE - )); - } - } - - return void 0; - }, err => { - - // Wrap file not found errors - if (err.code === 'ENOENT') { - return onStatError(new FileOperationError( - nls.localize('fileNotFoundError', "File not found ({0})", resource.toString(true)), - FileOperationResult.FILE_NOT_FOUND, - options - )); - } - - return onStatError(err); - }); - - let completePromise: Thenable; - - // await the stat iff we already have an etag so that we compare the - // etag from the stat before we actually read the file again. - if (options && options.etag) { - completePromise = statsPromise.then(() => { - return this.fillInContents(result, resource, options, contentResolverTokenSource.token); // Waterfall -> only now resolve the contents - }); - } - - // a fresh load without a previous etag which means we can resolve the file stat - // and the content at the same time, avoiding the waterfall. - else { - completePromise = Promise.all([statsPromise, this.fillInContents(result, resource, options, contentResolverTokenSource.token)]); - } - - return TPromise.wrap(completePromise).then(() => { - contentResolverTokenSource.dispose(); - - return result; - }); - } - - private fillInContents(content: IStreamContent, resource: uri, options: IResolveContentOptions, token: CancellationToken): Thenable { - return this.resolveFileData(resource, options, token).then(data => { - content.encoding = data.encoding; - content.value = data.stream; - }); - } - - private resolveFileData(resource: uri, options: IResolveContentOptions, token: CancellationToken): Thenable { - - const chunkBuffer = BufferPool._64K.acquire(); - - const result: IContentData = { - encoding: void 0, - stream: void 0 - }; - - return new Promise((resolve, reject) => { - fs.open(this.toAbsolutePath(resource), 'r', (err, fd) => { - if (err) { - if (err.code === 'ENOENT') { - // Wrap file not found errors - err = new FileOperationError( - nls.localize('fileNotFoundError', "File not found ({0})", resource.toString(true)), - FileOperationResult.FILE_NOT_FOUND, - options - ); - } - - return reject(err); - } - - let decoder: NodeJS.ReadWriteStream; - let totalBytesRead = 0; - - const finish = (err?: any) => { - - if (err) { - if (err.code === 'EISDIR') { - // Wrap EISDIR errors (fs.open on a directory works, but you cannot read from it) - err = new FileOperationError( - nls.localize('fileIsDirectoryError', "File is directory"), - FileOperationResult.FILE_IS_DIRECTORY, - options - ); - } - if (decoder) { - // If the decoder already started, we have to emit the error through it as - // event because the promise is already resolved! - decoder.emit('error', err); - } else { - reject(err); - } - } - if (decoder) { - decoder.end(); - } - - // return the shared buffer - BufferPool._64K.release(chunkBuffer); - - if (fd) { - fs.close(fd, err => { - if (err) { - this.options.errorLogger(`resolveFileData#close(): ${err.toString()}`); - } - }); - } - }; - - const handleChunk = (bytesRead: number) => { - if (token.isCancellationRequested) { - // cancellation -> finish - finish(new Error('cancelled')); - } else if (bytesRead === 0) { - // no more data -> finish - finish(); - } else if (bytesRead < chunkBuffer.length) { - // write the sub-part of data we received -> repeat - decoder.write(chunkBuffer.slice(0, bytesRead), readChunk); - } else { - // write all data we received -> repeat - decoder.write(chunkBuffer, readChunk); - } - }; - - let currentPosition: number = (options && options.position) || null; - - const readChunk = () => { - fs.read(fd, chunkBuffer, 0, chunkBuffer.length, currentPosition, (err, bytesRead) => { - totalBytesRead += bytesRead; - - if (typeof currentPosition === 'number') { - // if we received a position argument as option we need to ensure that - // we advance the position by the number of bytesread - currentPosition += bytesRead; - } - - if (totalBytesRead > Math.max(this.environmentService.args['max-memory'] * 1024 * 1024 || 0, MAX_HEAP_SIZE)) { - finish(new FileOperationError( - nls.localize('fileTooLargeForHeapError', "To open a file of this size, you need to restart VS Code and allow it to use more memory"), - FileOperationResult.FILE_EXCEED_MEMORY_LIMIT - )); - } - - if (totalBytesRead > MAX_FILE_SIZE) { - // stop when reading too much - finish(new FileOperationError( - nls.localize('fileTooLargeError', "File too large to open"), - FileOperationResult.FILE_TOO_LARGE, - options - )); - } else if (err) { - // some error happened - finish(err); - - } else if (decoder) { - // pass on to decoder - handleChunk(bytesRead); - - } else { - // when receiving the first chunk of data we need to create the - // decoding stream which is then used to drive the string stream. - TPromise.as(encoding.detectEncodingFromBuffer( - { buffer: chunkBuffer, bytesRead }, - options && options.autoGuessEncoding || this.configuredAutoGuessEncoding(resource) - )).then(detected => { - - if (options && options.acceptTextOnly && detected.seemsBinary) { - // Return error early if client only accepts text and this is not text - finish(new FileOperationError( - nls.localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), - FileOperationResult.FILE_IS_BINARY, - options - )); - - } else { - result.encoding = this.getEncoding(resource, this.getPeferredEncoding(resource, options, detected)); - result.stream = decoder = encoding.decodeStream(result.encoding); - resolve(result); - handleChunk(bytesRead); - } - - }).then(void 0, err => { - // failed to get encoding - finish(err); - }); - } - }); - }; - - // start reading - readChunk(); - }); - }); - } - - public updateContent(resource: uri, value: string | ITextSnapshot, options: IUpdateContentOptions = Object.create(null)): TPromise { - if (this.options.elevationSupport && options.writeElevated) { - return this.doUpdateContentElevated(resource, value, options); - } - - return this.doUpdateContent(resource, value, options); - } - - private doUpdateContent(resource: uri, value: string | ITextSnapshot, options: IUpdateContentOptions = Object.create(null)): TPromise { - const absolutePath = this.toAbsolutePath(resource); - - // 1.) check file for writing - return this.checkFileBeforeWriting(absolutePath, options).then(exists => { - let createParentsPromise: TPromise; - if (exists) { - createParentsPromise = TPromise.as(null); - } else { - createParentsPromise = pfs.mkdirp(paths.dirname(absolutePath)); - } - - // 2.) create parents as needed - return createParentsPromise.then(() => { - const encodingToWrite = this.getEncoding(resource, options.encoding); - let addBomPromise: TPromise = TPromise.as(false); - - // UTF_16 BE and LE as well as UTF_8 with BOM always have a BOM - if (encodingToWrite === encoding.UTF16be || encodingToWrite === encoding.UTF16le || encodingToWrite === encoding.UTF8_with_bom) { - addBomPromise = TPromise.as(true); - } - - // Existing UTF-8 file: check for options regarding BOM - else if (exists && encodingToWrite === encoding.UTF8) { - if (options.overwriteEncoding) { - addBomPromise = TPromise.as(false); // if we are to overwrite the encoding, we do not preserve it if found - } else { - addBomPromise = encoding.detectEncodingByBOM(absolutePath).then(enc => enc === encoding.UTF8); // otherwise preserve it if found - } - } - - // 3.) check to add UTF BOM - return addBomPromise.then(addBom => { - - // 4.) set contents and resolve - return this.doSetContentsAndResolve(resource, absolutePath, value, addBom, encodingToWrite).then(void 0, error => { - if (!exists || error.code !== 'EPERM' || !isWindows) { - return TPromise.wrapError(error); - } - - // On Windows and if the file exists with an EPERM error, we try a different strategy of saving the file - // by first truncating the file and then writing with r+ mode. This helps to save hidden files on Windows - // (see https://github.com/Microsoft/vscode/issues/931) - - // 5.) truncate - return pfs.truncate(absolutePath, 0).then(() => { - - // 6.) set contents (this time with r+ mode) and resolve again - return this.doSetContentsAndResolve(resource, absolutePath, value, addBom, encodingToWrite, { flag: 'r+' }); - }); - }); - }); - }); - }).then(null, error => { - if (error.code === 'EACCES' || error.code === 'EPERM') { - return TPromise.wrapError(new FileOperationError( - nls.localize('filePermission', "Permission denied writing to file ({0})", resource.toString(true)), - FileOperationResult.FILE_PERMISSION_DENIED, - options - )); - } - - return TPromise.wrapError(error); - }); - } - - private doSetContentsAndResolve(resource: uri, absolutePath: string, value: string | ITextSnapshot, addBOM: boolean, encodingToWrite: string, options?: { mode?: number; flag?: string; }): TPromise { - let writeFilePromise: TPromise; - - // Configure encoding related options as needed - const writeFileOptions: extfs.IWriteFileOptions = options ? options : Object.create(null); - if (addBOM || encodingToWrite !== encoding.UTF8) { - writeFileOptions.encoding = { - charset: encodingToWrite, - addBOM - }; - } - - if (typeof value === 'string') { - writeFilePromise = pfs.writeFile(absolutePath, value, writeFileOptions); - } else { - writeFilePromise = pfs.writeFile(absolutePath, this.snapshotToReadableStream(value), writeFileOptions); - } - - // set contents - return writeFilePromise.then(() => { - - // resolve - return this.resolve(resource); - }); - } - - private snapshotToReadableStream(snapshot: ITextSnapshot): NodeJS.ReadableStream { - return new Readable({ - read: function () { - try { - let chunk: string; - let canPush = true; - - // Push all chunks as long as we can push and as long as - // the underlying snapshot returns strings to us - while (canPush && typeof (chunk = snapshot.read()) === 'string') { - canPush = this.push(chunk); - } - - // Signal EOS by pushing NULL - if (typeof chunk !== 'string') { - this.push(null); - } - } catch (error) { - this.emit('error', error); - } - }, - encoding: encoding.UTF8 // very important, so that strings are passed around and not buffers! - }); - } - - private doUpdateContentElevated(resource: uri, value: string | ITextSnapshot, options: IUpdateContentOptions = Object.create(null)): TPromise { - const absolutePath = this.toAbsolutePath(resource); - - // 1.) check file for writing - return this.checkFileBeforeWriting(absolutePath, options, options.overwriteReadonly /* ignore readonly if we overwrite readonly, this is handled via sudo later */).then(exists => { - const writeOptions: IUpdateContentOptions = objects.assign(Object.create(null), options); - writeOptions.writeElevated = false; - writeOptions.encoding = this.getEncoding(resource, options.encoding); - - // 2.) write to a temporary file to be able to copy over later - const tmpPath = paths.join(this.tmpPath, `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`); - return this.updateContent(uri.file(tmpPath), value, writeOptions).then(() => { - - // 3.) invoke our CLI as super user - return (import('sudo-prompt')).then(sudoPrompt => { - return new TPromise((c, e) => { - const promptOptions = { name: this.options.elevationSupport.promptTitle.replace('-', ''), icns: this.options.elevationSupport.promptIcnsPath }; - - const sudoCommand: string[] = [`"${this.options.elevationSupport.cliPath}"`]; - if (options.overwriteReadonly) { - sudoCommand.push('--file-chmod'); - } - sudoCommand.push('--file-write', `"${tmpPath}"`, `"${absolutePath}"`); - - sudoPrompt.exec(sudoCommand.join(' '), promptOptions, (error: string, stdout: string, stderr: string) => { - if (error || stderr) { - e(error || stderr); - } else { - c(void 0); - } - }); - }); - }).then(() => { - - // 3.) delete temp file - return pfs.del(tmpPath, this.tmpPath).then(() => { - - // 4.) resolve again - return this.resolve(resource); - }); - }); - }); - }).then(null, error => { - if (this.options.verboseLogging) { - this.options.errorLogger(`Unable to write to file '${resource.toString(true)}' as elevated user (${error})`); - } - - if (!FileOperationError.isFileOperationError(error)) { - error = new FileOperationError( - nls.localize('filePermission', "Permission denied writing to file ({0})", resource.toString(true)), - FileOperationResult.FILE_PERMISSION_DENIED, - options - ); - } - - return TPromise.wrapError(error); - }); - } - - public createFile(resource: uri, content: string = '', options: ICreateFileOptions = Object.create(null)): TPromise { - const absolutePath = this.toAbsolutePath(resource); - - let checkFilePromise: TPromise; - if (options.overwrite) { - checkFilePromise = TPromise.as(false); - } else { - checkFilePromise = pfs.exists(absolutePath); - } - - // Check file exists - return checkFilePromise.then(exists => { - if (exists && !options.overwrite) { - return TPromise.wrapError(new FileOperationError( - nls.localize('fileExists', "File to create already exists ({0})", resource.toString(true)), - FileOperationResult.FILE_MODIFIED_SINCE, - options - )); - } - - // Create file - return this.updateContent(resource, content).then(result => { - - // Events - this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, result)); - - return result; - }); - }); - } - - public createFolder(resource: uri): TPromise { - - // 1.) Create folder - const absolutePath = this.toAbsolutePath(resource); - return pfs.mkdirp(absolutePath).then(() => { - - // 2.) Resolve - return this.resolve(resource).then(result => { - - // Events - this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, result)); - - return result; - }); - }); - } - - private checkFileBeforeWriting(absolutePath: string, options: IUpdateContentOptions = Object.create(null), ignoreReadonly?: boolean): TPromise { - return pfs.exists(absolutePath).then(exists => { - if (exists) { - return pfs.stat(absolutePath).then(stat => { - if (stat.isDirectory()) { - return TPromise.wrapError(new Error('Expected file is actually a directory')); - } - - // Dirty write prevention: if the file on disk has been changed and does not match our expected - // mtime and etag, we bail out to prevent dirty writing. - // - // First, we check for a mtime that is in the future before we do more checks. The assumption is - // that only the mtime is an indicator for a file that has changd on disk. - // - // Second, if the mtime has advanced, we compare the size of the file on disk with our previous - // one using the etag() function. Relying only on the mtime check has prooven to produce false - // positives due to file system weirdness (especially around remote file systems). As such, the - // check for size is a weaker check because it can return a false negative if the file has changed - // but to the same length. This is a compromise we take to avoid having to produce checksums of - // the file content for comparison which would be much slower to compute. - if (typeof options.mtime === 'number' && typeof options.etag === 'string' && options.mtime < stat.mtime.getTime() && options.etag !== etag(stat.size, options.mtime)) { - return TPromise.wrapError(new FileOperationError(nls.localize('fileModifiedError', "File Modified Since"), FileOperationResult.FILE_MODIFIED_SINCE, options)); - } - - // Throw if file is readonly and we are not instructed to overwrite - if (!ignoreReadonly && !(stat.mode & 128) /* readonly */) { - if (!options.overwriteReadonly) { - return this.readOnlyError(options); - } - - // Try to change mode to writeable - let mode = stat.mode; - mode = mode | 128; - return pfs.chmod(absolutePath, mode).then(() => { - - // Make sure to check the mode again, it could have failed - return pfs.stat(absolutePath).then(stat => { - if (!(stat.mode & 128) /* readonly */) { - return this.readOnlyError(options); - } - - return exists; - }); - }); - } - - return TPromise.as(exists); - }); - } - - return TPromise.as(exists); - }); - } - - private readOnlyError(options: IUpdateContentOptions): TPromise { - return TPromise.wrapError(new FileOperationError( - nls.localize('fileReadOnlyError', "File is Read Only"), - FileOperationResult.FILE_READ_ONLY, - options - )); - } - - public rename(resource: uri, newName: string): TPromise { - const newPath = paths.join(paths.dirname(resource.fsPath), newName); - - return this.moveFile(resource, uri.file(newPath)); - } - - public moveFile(source: uri, target: uri, overwrite?: boolean): TPromise { - return this.moveOrCopyFile(source, target, false, overwrite); - } - - public copyFile(source: uri, target: uri, overwrite?: boolean): TPromise { - return this.moveOrCopyFile(source, target, true, overwrite); - } - - private moveOrCopyFile(source: uri, target: uri, keepCopy: boolean, overwrite: boolean): TPromise { - const sourcePath = this.toAbsolutePath(source); - const targetPath = this.toAbsolutePath(target); - - // 1.) move / copy - return this.doMoveOrCopyFile(sourcePath, targetPath, keepCopy, overwrite).then(() => { - - // 2.) resolve - return this.resolve(target).then(result => { - - // Events - this._onAfterOperation.fire(new FileOperationEvent(source, keepCopy ? FileOperation.COPY : FileOperation.MOVE, result)); - - return result; - }); - }); - } - - private doMoveOrCopyFile(sourcePath: string, targetPath: string, keepCopy: boolean, overwrite: boolean): TPromise { - - // 1.) validate operation - if (isParent(targetPath, sourcePath, !isLinux)) { - return TPromise.wrapError(new Error('Unable to move/copy when source path is parent of target path')); - } - - // 2.) check if target exists - return pfs.exists(targetPath).then(exists => { - const isCaseRename = sourcePath.toLowerCase() === targetPath.toLowerCase(); - const isSameFile = sourcePath === targetPath; - - // Return early with conflict if target exists and we are not told to overwrite - if (exists && !isCaseRename && !overwrite) { - return TPromise.wrapError(new FileOperationError(nls.localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), FileOperationResult.FILE_MOVE_CONFLICT)); - } - - // 3.) make sure target is deleted before we move/copy unless this is a case rename of the same file - let deleteTargetPromise = TPromise.wrap(void 0); - if (exists && !isCaseRename) { - if (isEqualOrParent(sourcePath, targetPath, !isLinux /* ignorecase */)) { - return TPromise.wrapError(new Error(nls.localize('unableToMoveCopyError', "Unable to move/copy. File would replace folder it is contained in."))); // catch this corner case! - } - - deleteTargetPromise = this.del(uri.file(targetPath)); - } - - return deleteTargetPromise.then(() => { - - // 4.) make sure parents exists - return pfs.mkdirp(paths.dirname(targetPath)).then(() => { - - // 4.) copy/move - if (isSameFile) { - return TPromise.wrap(null); - } else if (keepCopy) { - return nfcall(extfs.copy, sourcePath, targetPath); - } else { - return nfcall(extfs.mv, sourcePath, targetPath); - } - }).then(() => exists); - }); - }); - } - - public importFile(source: uri, targetFolder: uri): TPromise { - const sourcePath = this.toAbsolutePath(source); - const targetResource = uri.file(paths.join(targetFolder.fsPath, paths.basename(source.fsPath))); - const targetPath = this.toAbsolutePath(targetResource); - - // 1.) resolve - return pfs.stat(sourcePath).then(stat => { - if (stat.isDirectory()) { - return TPromise.wrapError(new Error(nls.localize('foldersCopyError', "Folders cannot be copied into the workspace. Please select individual files to copy them."))); // for now we do not allow to import a folder into a workspace - } - - // 2.) copy - return this.doMoveOrCopyFile(sourcePath, targetPath, true, true).then(exists => { - - // 3.) resolve - return this.resolve(targetResource).then(stat => { - - // Events - this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.IMPORT, stat)); - - return { isNew: !exists, stat: stat }; - }); - }); - }); - } - - public del(resource: uri): TPromise { - const absolutePath = this.toAbsolutePath(resource); - - return pfs.del(absolutePath, this.tmpPath).then(() => { - - // Events - this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.DELETE)); - }); - } - - // Helpers - - private toAbsolutePath(arg1: uri | IFileStat): string { - let resource: uri; - if (arg1 instanceof uri) { - resource = arg1; - } else { - resource = (arg1).resource; - } - - assert.ok(resource && resource.scheme === Schemas.file, `Invalid resource: ${resource}`); - - return paths.normalize(resource.fsPath); - } - - private resolve(resource: uri, options: IResolveFileOptions = Object.create(null)): TPromise { - return this.toStatResolver(resource) - .then(model => model.resolve(options)); - } - - private toStatResolver(resource: uri): TPromise { - const absolutePath = this.toAbsolutePath(resource); - - return pfs.statLink(absolutePath).then(({ isSymbolicLink, stat }) => { - return new StatResolver(resource, isSymbolicLink, stat.isDirectory(), stat.mtime.getTime(), stat.size, this.options.verboseLogging ? this.options.errorLogger : void 0); - }); - } - - private getPeferredEncoding(resource: uri, options: IResolveContentOptions, detected: encoding.IDetectedEncodingResult): string { - let preferredEncoding: string; - if (options && options.encoding) { - if (detected.encoding === encoding.UTF8 && options.encoding === encoding.UTF8) { - preferredEncoding = encoding.UTF8_with_bom; // indicate the file has BOM if we are to resolve with UTF 8 - } else { - preferredEncoding = options.encoding; // give passed in encoding highest priority - } - } else if (detected.encoding) { - if (detected.encoding === encoding.UTF8) { - preferredEncoding = encoding.UTF8_with_bom; // if we detected UTF-8, it can only be because of a BOM - } else { - preferredEncoding = detected.encoding; - } - } else if (this.configuredEncoding(resource) === encoding.UTF8_with_bom) { - preferredEncoding = encoding.UTF8; // if we did not detect UTF 8 BOM before, this can only be UTF 8 then - } - return preferredEncoding; - } - - public getEncoding(resource: uri, preferredEncoding?: string): string { - let fileEncoding: string; - - const override = this.getEncodingOverride(resource); - if (override) { - fileEncoding = override; - } else if (preferredEncoding) { - fileEncoding = preferredEncoding; - } else { - fileEncoding = this.configuredEncoding(resource); - } - - if (!fileEncoding || !encoding.encodingExists(fileEncoding)) { - fileEncoding = encoding.UTF8; // the default is UTF 8 - } - - return fileEncoding; - } - - private configuredAutoGuessEncoding(resource: uri): boolean { - return this.textResourceConfigurationService.getValue(resource, 'files.autoGuessEncoding'); - } - - private configuredEncoding(resource: uri): string { - return this.textResourceConfigurationService.getValue(resource, 'files.encoding'); - } - - private getEncodingOverride(resource: uri): string { - if (resource && this.options.encodingOverride && this.options.encodingOverride.length) { - for (let i = 0; i < this.options.encodingOverride.length; i++) { - const override = this.options.encodingOverride[i]; - - // check if the resource is child of encoding override path - if (override.parent && isParent(resource.fsPath, override.parent.fsPath, !isLinux /* ignorecase */)) { - return override.encoding; - } - - // check if the resource extension is equal to encoding override - if (override.extension && paths.extname(resource.fsPath) === `.${override.extension}`) { - return override.encoding; - } - } - } - - return null; - } - - public watchFileChanges(resource: uri): void { - assert.ok(resource && resource.scheme === Schemas.file, `Invalid resource for watching: ${resource}`); - - // Create or get watcher for provided path - let watcher = this.activeFileChangesWatchers.get(resource); - if (!watcher) { - const fsPath = resource.fsPath; - const fsName = paths.basename(resource.fsPath); - - watcher = extfs.watch(fsPath, (eventType: string, filename: string) => { - const renamedOrDeleted = ((filename && filename !== fsName) || eventType === 'rename'); - - // The file was either deleted or renamed. Many tools apply changes to files in an - // atomic way ("Atomic Save") by first renaming the file to a temporary name and then - // renaming it back to the original name. Our watcher will detect this as a rename - // and then stops to work on Mac and Linux because the watcher is applied to the - // inode and not the name. The fix is to detect this case and trying to watch the file - // again after a certain delay. - // In addition, we send out a delete event if after a timeout we detect that the file - // does indeed not exist anymore. - if (renamedOrDeleted) { - - // Very important to dispose the watcher which now points to a stale inode - this.unwatchFileChanges(resource); - - // Wait a bit and try to install watcher again, assuming that the file was renamed quickly ("Atomic Save") - setTimeout(() => { - this.existsFile(resource).done(exists => { - - // File still exists, so reapply the watcher - if (exists) { - this.watchFileChanges(resource); - } - - // File seems to be really gone, so emit a deleted event - else { - this.onRawFileChange({ - type: FileChangeType.DELETED, - path: fsPath - }); - } - }); - }, FileService.FS_REWATCH_DELAY); - } - - // Handle raw file change - this.onRawFileChange({ - type: FileChangeType.UPDATED, - path: fsPath - }); - }, (error: string) => this.options.errorLogger(error)); - - if (watcher) { - this.activeFileChangesWatchers.set(resource, watcher); - } - } - } - - private onRawFileChange(event: IRawFileChange): void { - - // add to bucket of undelivered events - this.undeliveredRawFileChangesEvents.push(event); - - if (this.options.verboseLogging) { - console.log('%c[node.js Watcher]%c', 'color: green', 'color: black', event.type === FileChangeType.ADDED ? '[ADDED]' : event.type === FileChangeType.DELETED ? '[DELETED]' : '[CHANGED]', event.path); - } - - // handle emit through delayer to accommodate for bulk changes - this.fileChangesWatchDelayer.trigger(() => { - const buffer = this.undeliveredRawFileChangesEvents; - this.undeliveredRawFileChangesEvents = []; - - // Normalize - const normalizedEvents = normalize(buffer); - - // Logging - if (this.options.verboseLogging) { - normalizedEvents.forEach(r => { - console.log('%c[node.js Watcher]%c >> normalized', 'color: green', 'color: black', r.type === FileChangeType.ADDED ? '[ADDED]' : r.type === FileChangeType.DELETED ? '[DELETED]' : '[CHANGED]', r.path); - }); - } - - // Emit - this._onFileChanges.fire(toFileChangesEvent(normalizedEvents)); - - return TPromise.as(null); - }); - } - - public unwatchFileChanges(resource: uri): void { - const watcher = this.activeFileChangesWatchers.get(resource); - if (watcher) { - watcher.close(); - this.activeFileChangesWatchers.delete(resource); - } - } - - public dispose(): void { - this.toDispose = dispose(this.toDispose); - - if (this.activeWorkspaceFileChangeWatcher) { - this.activeWorkspaceFileChangeWatcher.dispose(); - this.activeWorkspaceFileChangeWatcher = null; - } - - this.activeFileChangesWatchers.forEach(watcher => watcher.close()); - this.activeFileChangesWatchers.clear(); - } -} - -export class StatResolver { - private name: string; - private etag: string; - - constructor( - private resource: uri, - private isSymbolicLink: boolean, - private isDirectory: boolean, - private mtime: number, - private size: number, - private errorLogger?: (error: Error | string) => void - ) { - assert.ok(resource && resource.scheme === Schemas.file, `Invalid resource: ${resource}`); - - this.name = getBaseLabel(resource); - this.etag = etag(size, mtime); - } - - public resolve(options: IResolveFileOptions): TPromise { - - // General Data - const fileStat: IFileStat = { - resource: this.resource, - isDirectory: this.isDirectory, - isSymbolicLink: this.isSymbolicLink, - name: this.name, - etag: this.etag, - size: this.size, - mtime: this.mtime - }; - - // File Specific Data - if (!this.isDirectory) { - return TPromise.as(fileStat); - } - - // Directory Specific Data - else { - - // Convert the paths from options.resolveTo to absolute paths - let absoluteTargetPaths: string[] = null; - if (options && options.resolveTo) { - absoluteTargetPaths = []; - options.resolveTo.forEach(resource => { - absoluteTargetPaths.push(resource.fsPath); - }); - } - - return new TPromise((c, e) => { - - // Load children - this.resolveChildren(this.resource.fsPath, absoluteTargetPaths, options && options.resolveSingleChildDescendants, children => { - children = arrays.coalesce(children); // we don't want those null children (could be permission denied when reading a child) - fileStat.children = children || []; - - c(fileStat); - }); - }); - } - } - - private resolveChildren(absolutePath: string, absoluteTargetPaths: string[], resolveSingleChildDescendants: boolean, callback: (children: IFileStat[]) => void): void { - extfs.readdir(absolutePath, (error: Error, files: string[]) => { - if (error) { - if (this.errorLogger) { - this.errorLogger(error); - } - - return callback(null); // return - we might not have permissions to read the folder - } - - // for each file in the folder - flow.parallel(files, (file: string, clb: (error: Error, children: IFileStat) => void) => { - const fileResource = uri.file(paths.resolve(absolutePath, file)); - let fileStat: fs.Stats; - let isSymbolicLink = false; - const $this = this; - - flow.sequence( - function onError(error: Error): void { - if ($this.errorLogger) { - $this.errorLogger(error); - } - - clb(null, null); // return - we might not have permissions to read the folder or stat the file - }, - - function stat(this: any): void { - extfs.statLink(fileResource.fsPath, this); - }, - - function countChildren(this: any, statAndLink: extfs.IStatAndLink): void { - fileStat = statAndLink.stat; - isSymbolicLink = statAndLink.isSymbolicLink; - - if (fileStat.isDirectory()) { - extfs.readdir(fileResource.fsPath, (error, result) => { - this(null, result ? result.length : 0); - }); - } else { - this(null, 0); - } - }, - - function resolve(childCount: number): void { - const childStat: IFileStat = { - resource: fileResource, - isDirectory: fileStat.isDirectory(), - isSymbolicLink, - name: file, - mtime: fileStat.mtime.getTime(), - etag: etag(fileStat), - size: fileStat.size - }; - - // Return early for files - if (!fileStat.isDirectory()) { - return clb(null, childStat); - } - - // Handle Folder - let resolveFolderChildren = false; - if (files.length === 1 && resolveSingleChildDescendants) { - resolveFolderChildren = true; - } else if (childCount > 0 && absoluteTargetPaths && absoluteTargetPaths.some(targetPath => isEqualOrParent(targetPath, fileResource.fsPath, !isLinux /* ignorecase */))) { - resolveFolderChildren = true; - } - - // Continue resolving children based on condition - if (resolveFolderChildren) { - $this.resolveChildren(fileResource.fsPath, absoluteTargetPaths, resolveSingleChildDescendants, children => { - children = arrays.coalesce(children); // we don't want those null children - childStat.children = children || []; - - clb(null, childStat); - }); - } - - // Otherwise return result - else { - clb(null, childStat); - } - }); - }, (errors, result) => { - callback(result); - }); - }); - } -} diff --git a/src/vs/workbench/services/files/test/node/fileService.test.ts b/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts similarity index 95% rename from src/vs/workbench/services/files/test/node/fileService.test.ts rename to src/vs/workbench/services/files/test/electron-browser/fileService.test.ts index fb5aceb59bd..959d774f9d9 100644 --- a/src/vs/workbench/services/files/test/node/fileService.test.ts +++ b/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts @@ -11,14 +11,14 @@ import * as os from 'os'; import * as assert from 'assert'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileService, IEncodingOverride } from 'vs/workbench/services/files/node/fileService'; +import { FileService, IEncodingOverride } from 'vs/workbench/services/files/electron-browser/fileService'; import { FileOperation, FileOperationEvent, FileChangesEvent, FileOperationResult, FileOperationError } from 'vs/platform/files/common/files'; import uri from 'vs/base/common/uri'; import * as uuid from 'vs/base/common/uuid'; import * as pfs from 'vs/base/node/pfs'; import * as encodingLib from 'vs/base/node/encoding'; -import * as utils from 'vs/workbench/services/files/test/node/utils'; -import { TestEnvironmentService, TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; +import * as utils from 'vs/workbench/services/files/test/electron-browser/utils'; +import { TestEnvironmentService, TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestNotificationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; import { Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TextModel } from 'vs/editor/common/model/textModel'; @@ -34,7 +34,7 @@ suite('FileService', () => { const sourceDir = require.toUrl('./fixtures/service'); return pfs.copy(sourceDir, testDir).then(() => { - service = new FileService(new TestContextService(new Workspace(testDir, testDir, toWorkspaceFolders([{ path: testDir }]))), TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), { disableWatcher: true }); + service = new FileService(new TestContextService(new Workspace(testDir, testDir, toWorkspaceFolders([{ path: testDir }]))), TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true }); }); }); @@ -892,10 +892,18 @@ suite('FileService', () => { const textResourceConfigurationService = new TestTextResourceConfigurationService(configurationService); - const _service = new FileService(new TestContextService(new Workspace(_testDir, _testDir, toWorkspaceFolders([{ path: _testDir }]))), TestEnvironmentService, textResourceConfigurationService, configurationService, new TestLifecycleService(), { - encodingOverride, - disableWatcher: true - }); + const _service = new FileService( + new TestContextService(new Workspace(_testDir, _testDir, toWorkspaceFolders([{ path: _testDir }]))), + TestEnvironmentService, + textResourceConfigurationService, + configurationService, + new TestLifecycleService(), + new TestStorageService(), + new TestNotificationService(), + { + encodingOverride, + disableWatcher: true + }); return _service.resolveContent(uri.file(path.join(testDir, 'index.html'))).then(c => { assert.equal(c.encoding, 'windows1252'); @@ -929,10 +937,18 @@ suite('FileService', () => { const textResourceConfigurationService = new TestTextResourceConfigurationService(configurationService); - const _service = new FileService(new TestContextService(new Workspace(_testDir, _testDir, toWorkspaceFolders([{ path: _testDir }]))), TestEnvironmentService, textResourceConfigurationService, configurationService, new TestLifecycleService(), { - encodingOverride, - disableWatcher: true - }); + const _service = new FileService( + new TestContextService(new Workspace(_testDir, _testDir, toWorkspaceFolders([{ path: _testDir }]))), + TestEnvironmentService, + textResourceConfigurationService, + configurationService, + new TestLifecycleService(), + new TestStorageService(), + new TestNotificationService(), + { + encodingOverride, + disableWatcher: true + }); return _service.resolveContent(uri.file(path.join(testDir, 'index.html'))).then(c => { assert.equal(c.encoding, 'windows1252'); @@ -955,9 +971,17 @@ suite('FileService', () => { const _sourceDir = require.toUrl('./fixtures/service'); const resource = uri.file(path.join(testDir, 'index.html')); - const _service = new FileService(new TestContextService(new Workspace(_testDir, _testDir, toWorkspaceFolders([{ path: _testDir }]))), TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), { - disableWatcher: true - }); + const _service = new FileService( + new TestContextService(new Workspace(_testDir, _testDir, toWorkspaceFolders([{ path: _testDir }]))), + TestEnvironmentService, + new TestTextResourceConfigurationService(), + new TestConfigurationService(), + new TestLifecycleService(), + new TestStorageService(), + new TestNotificationService(), + { + disableWatcher: true + }); return pfs.copy(_sourceDir, _testDir).then(() => { return pfs.readFile(resource.fsPath).then(data => { diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/company.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/company.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/examples/company.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/company.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/conway.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/conway.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/examples/conway.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/conway.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/employee.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/employee.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/examples/employee.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/employee.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/small.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/small.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/examples/small.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/examples/small.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/index.html b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/index.html similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/index.html rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/index.html diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/company.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/company.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/company.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/company.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/conway.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/conway.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/conway.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/conway.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/employee.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/employee.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/employee.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/employee.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/small.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/small.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/small.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/other/deep/small.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/site.css b/src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/site.css similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/resolver/site.css rename to src/vs/workbench/services/files/test/electron-browser/fixtures/resolver/site.css diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/binary.txt b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/binary.txt similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/binary.txt rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/binary.txt diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/deep/company.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/company.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/deep/company.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/company.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/deep/conway.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/conway.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/deep/conway.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/conway.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/deep/employee.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/employee.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/deep/employee.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/employee.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/deep/small.js b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/small.js similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/deep/small.js rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/deep/small.js diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/index.html b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/index.html similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/index.html rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/index.html diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/lorem.txt b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/lorem.txt similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/lorem.txt rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/lorem.txt diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/small.txt b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/small.txt similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/small.txt rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/small.txt diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/small_umlaut.txt b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/small_umlaut.txt similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/small_umlaut.txt rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/small_umlaut.txt diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/some_utf16le.css b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/some_utf16le.css similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/some_utf16le.css rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/some_utf16le.css diff --git a/src/vs/workbench/services/files/test/node/fixtures/service/some_utf8_bom.txt b/src/vs/workbench/services/files/test/electron-browser/fixtures/service/some_utf8_bom.txt similarity index 100% rename from src/vs/workbench/services/files/test/node/fixtures/service/some_utf8_bom.txt rename to src/vs/workbench/services/files/test/electron-browser/fixtures/service/some_utf8_bom.txt diff --git a/src/vs/workbench/services/files/test/node/resolver.test.ts b/src/vs/workbench/services/files/test/electron-browser/resolver.test.ts similarity index 97% rename from src/vs/workbench/services/files/test/node/resolver.test.ts rename to src/vs/workbench/services/files/test/electron-browser/resolver.test.ts index 230d31d4e0f..3a9c19ad869 100644 --- a/src/vs/workbench/services/files/test/node/resolver.test.ts +++ b/src/vs/workbench/services/files/test/electron-browser/resolver.test.ts @@ -9,10 +9,10 @@ import * as fs from 'fs'; import * as path from 'path'; import * as assert from 'assert'; -import { StatResolver } from 'vs/workbench/services/files/node/fileService'; +import { StatResolver } from 'vs/workbench/services/files/electron-browser/fileService'; import uri from 'vs/base/common/uri'; import { isLinux } from 'vs/base/common/platform'; -import * as utils from 'vs/workbench/services/files/test/node/utils'; +import * as utils from 'vs/workbench/services/files/test/electron-browser/utils'; function create(relativePath: string): StatResolver { let basePath = require.toUrl('./fixtures/resolver'); diff --git a/src/vs/workbench/services/files/test/node/utils.ts b/src/vs/workbench/services/files/test/electron-browser/utils.ts similarity index 100% rename from src/vs/workbench/services/files/test/node/utils.ts rename to src/vs/workbench/services/files/test/electron-browser/utils.ts diff --git a/src/vs/workbench/services/files/test/node/watcher.test.ts b/src/vs/workbench/services/files/test/electron-browser/watcher.test.ts similarity index 100% rename from src/vs/workbench/services/files/test/node/watcher.test.ts rename to src/vs/workbench/services/files/test/electron-browser/watcher.test.ts diff --git a/src/vs/workbench/services/keybinding/test/node/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts similarity index 95% rename from src/vs/workbench/services/keybinding/test/node/keybindingEditing.test.ts rename to src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 9e7e5d447f1..5d78d2c0752 100644 --- a/src/vs/workbench/services/keybinding/test/node/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -16,11 +16,11 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { KeyCode, SimpleKeybinding, ChordKeybinding } from 'vs/base/common/keyCodes'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import * as extfs from 'vs/base/node/extfs'; -import { TestTextFileService, TestEditorGroupService, TestLifecycleService, TestBackupFileService, TestContextService, TestTextResourceConfigurationService, TestHashService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextFileService, TestEditorGroupService, TestLifecycleService, TestBackupFileService, TestContextService, TestTextResourceConfigurationService, TestHashService, TestEnvironmentService, TestStorageService, TestNotificationService } from 'vs/workbench/test/workbenchTestServices'; import { IWorkspaceContextService, Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import * as uuid from 'vs/base/common/uuid'; import { ConfigurationService } from 'vs/platform/configuration/node/configurationService'; -import { FileService } from 'vs/workbench/services/files/node/fileService'; +import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; @@ -80,7 +80,16 @@ suite('Keybindings Editing', () => { instantiationService.stub(ITelemetryService, NullTelemetryService); instantiationService.stub(IModeService, ModeServiceImpl); instantiationService.stub(IModelService, instantiationService.createInstance(ModelServiceImpl)); - instantiationService.stub(IFileService, new FileService(new TestContextService(new Workspace(testDir, testDir, toWorkspaceFolders([{ path: testDir }]))), TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), lifecycleService, { disableWatcher: true })); + instantiationService.stub(IFileService, new FileService( + new TestContextService(new Workspace(testDir, testDir, toWorkspaceFolders([{ path: testDir }]))), + TestEnvironmentService, + new TestTextResourceConfigurationService(), + new TestConfigurationService(), + lifecycleService, + new TestStorageService(), + new TestNotificationService(), + { disableWatcher: true }) + ); instantiationService.stub(IUntitledEditorService, instantiationService.createInstance(UntitledEditorService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelService, instantiationService.createInstance(TextModelResolverService)); diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 0ca51d6b653..1fea905ffe0 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -815,9 +815,6 @@ export class TestFileService implements IFileService { unwatchFileChanges(resource: URI): void { } - updateOptions(options: any): void { - } - getEncoding(resource: URI): string { return 'utf8'; } From 6a47eccedc819d1507d7443d17625c52910f193c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 12:08:00 +0200 Subject: [PATCH 114/710] green extensions tests --- src/vs/platform/driver/common/driver.ts | 7 +++ .../driver/electron-browser/driver.ts | 5 +- .../platform/driver/electron-main/driver.ts | 62 ++++++++++++------- test/smoke/src/application.ts | 8 ++- test/smoke/src/areas/extensions/extensions.ts | 8 +-- 5 files changed, 57 insertions(+), 33 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index 8bdfc666f32..f859f45075b 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -131,10 +131,12 @@ export class DriverChannelClient implements IDriver { export interface IWindowDriverRegistry { registerWindowDriver(windowId: number): TPromise; + reloadWindowDriver(windowId: number): TPromise; } export interface IWindowDriverRegistryChannel extends IChannel { call(command: 'registerWindowDriver', arg: number): TPromise; + call(command: 'reloadWindowDriver', arg: number): TPromise; call(command: string, arg: any): TPromise; } @@ -145,6 +147,7 @@ export class WindowDriverRegistryChannel implements IWindowDriverRegistryChannel call(command: string, arg?: any): TPromise { switch (command) { case 'registerWindowDriver': return this.registry.registerWindowDriver(arg); + case 'reloadWindowDriver': return this.registry.reloadWindowDriver(arg); } return undefined; @@ -160,6 +163,10 @@ export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry registerWindowDriver(windowId: number): TPromise { return this.channel.call('registerWindowDriver', windowId); } + + reloadWindowDriver(windowId: number): TPromise { + return this.channel.call('reloadWindowDriver', windowId); + } } export interface IWindowDriver { diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index 1845fe068d4..c762963dddc 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -6,7 +6,7 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, toDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { IWindowDriver, IElement, WindowDriverChannel, WindowDriverRegistryChannelClient } from 'vs/platform/driver/common/driver'; import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -180,5 +180,6 @@ export async function registerWindowDriver( await windowDriverRegistry.registerWindowDriver(windowId); - return client; + const disposable = toDisposable(() => windowDriverRegistry.reloadWindowDriver(windowId)); + return combinedDisposable([disposable, client]); } \ No newline at end of file diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 77505e14b6b..aa8ad7ed625 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -15,6 +15,7 @@ import { IPCServer, IClientRouter } from 'vs/base/parts/ipc/common/ipc'; import { SimpleKeybinding, KeyCode } from 'vs/base/common/keyCodes'; import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { OS } from 'vs/base/common/platform'; +import { Emitter, toPromise } from 'vs/base/common/event'; // TODO@joao: bad layering! import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; @@ -38,24 +39,33 @@ export class Driver implements IDriver, IWindowDriverRegistry { _serviceBrand: any; private registeredWindowIds = new Set(); + private reloadingWindowIds = new Set(); + private onDidReloadingChange = new Emitter(); constructor( private windowServer: IPCServer, @IWindowsMainService private windowsService: IWindowsMainService ) { } - registerWindowDriver(windowId: number): TPromise { + async registerWindowDriver(windowId: number): TPromise { this.registeredWindowIds.add(windowId); - return TPromise.as(null); + this.reloadingWindowIds.delete(windowId); + this.onDidReloadingChange.fire(); + } + + async reloadWindowDriver(windowId: number): TPromise { + this.reloadingWindowIds.add(windowId); } async getWindowIds(): TPromise { return this.windowsService.getWindows() .map(w => w.id) - .filter(id => this.registeredWindowIds.has(id)); + .filter(id => this.registeredWindowIds.has(id) && !this.reloadingWindowIds.has(id)); } async dispatchKeybinding(windowId: number, keybinding: string): TPromise { + await this.whenUnfrozen(windowId); + const [first, second] = KeybindingIO._readUserBinding(keybinding); await this._dispatchKeybinding(windowId, first); @@ -105,56 +115,64 @@ export class Driver implements IDriver, IWindowDriverRegistry { await TPromise.timeout(100); } - click(windowId: number, selector: string, xoffset?: number, yoffset?: number): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async click(windowId: number, selector: string, xoffset?: number, yoffset?: number): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.click(selector, xoffset, yoffset); } - doubleClick(windowId: number, selector: string): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async doubleClick(windowId: number, selector: string): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.doubleClick(selector); } - move(windowId: number, selector: string): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async move(windowId: number, selector: string): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.move(selector); } - setValue(windowId: number, selector: string, text: string): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async setValue(windowId: number, selector: string, text: string): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.setValue(selector, text); } - getTitle(windowId: number): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async getTitle(windowId: number): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.getTitle(); } - isActiveElement(windowId: number, selector: string): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async isActiveElement(windowId: number, selector: string): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.isActiveElement(selector); } - getElements(windowId: number, selector: string, recursive: boolean): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async getElements(windowId: number, selector: string, recursive: boolean): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.getElements(selector, recursive); } - typeInEditor(windowId: number, selector: string, text: string): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async typeInEditor(windowId: number, selector: string, text: string): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.typeInEditor(selector, text); } - getTerminalBuffer(windowId: number, selector: string): TPromise { - const windowDriver = this.getWindowDriver(windowId); + async getTerminalBuffer(windowId: number, selector: string): TPromise { + const windowDriver = await this.getWindowDriver(windowId); return windowDriver.getTerminalBuffer(selector); } - private getWindowDriver(windowId: number): IWindowDriver { + private async getWindowDriver(windowId: number): TPromise { + await this.whenUnfrozen(windowId); + const router = new WindowRouter(windowId); const windowDriverChannel = this.windowServer.getChannel('windowDriver', router); return new WindowDriverChannelClient(windowDriverChannel); } + + private async whenUnfrozen(windowId: number): TPromise { + while (this.reloadingWindowIds.has(windowId)) { + await toPromise(this.onDidReloadingChange.event); + } + } } export async function serve( diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 1d7294c1ed0..e88eec93df7 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -120,8 +120,10 @@ export class SpectronApplication { } async reload(): Promise { - await this.workbench.runCommand('Reload Window'); - // TODO @sandy: Find a proper condition to wait for reload + this.workbench.runCommand('Reload Window') + .catch(err => null); // ignore the connection drop errors + + // needs to be enough to propagate the 'Reload Window' command await new Promise(c => setTimeout(c, 1500)); await this.checkWindowReady(); } @@ -278,7 +280,7 @@ export class SpectronApplication { let retries = 0; - while (++retries < 50) { + while (++retries < 300) { // 30 seconds const ids = await this.codeInstance.driver.getWindowIds(); if (ids.length > 0) { diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index dc9bdf976ac..bedca3d1aa1 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -30,14 +30,10 @@ export class Extensions extends Viewlet { await this.api.setValue(SEARCH_BOX, name); } - async installExtension(name: string): Promise { + async installExtension(name: string): Promise { await this.searchForExtension(name); - // we might want to wait for a while longer since the Marketplace can be slow - // a minute should do - await this.api.waitFor(() => this.api.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`), void 0, 'waiting for install button', 600); - + await this.api.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`); await this.api.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.reload`); - return true; } } \ No newline at end of file From 6ec806c64f2e1cc17f270018cf1e83a063b6bb6d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 12:09:11 +0200 Subject: [PATCH 115/710] :lipstick: --- test/smoke/src/application.ts | 130 ---------------------------------- 1 file changed, 130 deletions(-) diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index e88eec93df7..8a7cb11142d 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { test as testPort } from 'portastic'; import { API } from './api'; import { ScreenCapturer } from './helpers/screenshot'; import { Workbench } from './areas/workbench/workbench'; @@ -12,19 +11,6 @@ import * as cp from 'child_process'; import { CodeDriver } from './driver'; import { Code, spawn, SpawnOptions } from './vscode/code'; -// Just hope random helps us here, cross your fingers! -export async function findFreePort(): Promise { - for (let i = 0; i < 10; i++) { - const port = 10000 + Math.round(Math.random() * 10000); - - if (await testPort(port)) { - return port; - } - } - - throw new Error('Could not find free port!'); -} - export enum Quality { Dev, Insiders, @@ -141,85 +127,6 @@ export class SpectronApplication { } private async startApplication(workspaceOrFolder: string, extraArgs: string[] = []): Promise { - - // let args: string[] = []; - // let chromeDriverArgs: string[] = []; - - // if (process.env.VSCODE_REPOSITORY) { - // args.push(process.env.VSCODE_REPOSITORY as string); - // } - - // args.push(workspaceOrFolder); - - // // Prevent 'Getting Started' web page from opening on clean user-data-dir - // args.push('--skip-getting-started'); - - // // Prevent 'Getting Started' web page from opening on clean user-data-dir - // args.push('--skip-release-notes'); - - // // Prevent Quick Open from closing when focus is stolen, this allows concurrent smoketest suite running - // args.push('--sticky-quickopen'); - - // // Disable telemetry - // args.push('--disable-telemetry'); - - // // Disable updates - // args.push('--disable-updates'); - - // // Disable crash reporter - // // This seems to be the fix for the strange hangups in which Code stays unresponsive - // // and tests finish badly with timeouts, leaving Code running in the background forever - // args.push('--disable-crash-reporter'); - - // // Ensure that running over custom extensions directory, rather than picking up the one that was used by a tester previously - // args.push(`--extensions-dir=${this.options.extensionsPath}`); - - // args.push(...extraArgs); - - // chromeDriverArgs.push(`--user-data-dir=${this.options.userDataDir}`); - - // Spectron always uses the same port number for the chrome driver - // and it handles gracefully when two instances use the same port number - // This works, but when one of the instances quits, it takes down - // chrome driver with it, leaving the other instance in DISPAIR!!! :( - // const port = await findFreePort(); - - // We must get a different port for debugging the smoketest express app - // otherwise concurrent test runs will clash on those ports - // const env = { PORT: String(await findFreePort()), ...process.env }; - - // const opts = { - // path: this.options.electronPath, - // port, - // args, - // env, - // chromeDriverArgs, - // startTimeout: 10000, - // requireName: 'nodeRequire' - // }; - - // const runName = String(SpectronApplication.count++); - // let testsuiteRootPath: string | undefined = undefined; - // let screenshotsDirPath: string | undefined = undefined; - - // if (this.options.artifactsPath) { - // testsuiteRootPath = path.join(this.options.artifactsPath, sanitize(runName)); - // mkdirp.sync(testsuiteRootPath); - - // // Collect screenshots - // screenshotsDirPath = path.join(testsuiteRootPath, 'screenshots'); - // mkdirp.sync(screenshotsDirPath); - - // // Collect chromedriver logs - // const chromedriverLogPath = path.join(testsuiteRootPath, 'chromedriver.log'); - // opts.chromeDriverLogPath = chromedriverLogPath; - - // // Collect webdriver logs - // const webdriverLogsPath = path.join(testsuiteRootPath, 'webdriver'); - // mkdirp.sync(webdriverLogsPath); - // opts.webdriverLogPath = webdriverLogsPath; - // } - this.codeInstance = await spawn({ codePath: this.options.codePath, workspacePath: workspaceOrFolder, @@ -228,43 +135,6 @@ export class SpectronApplication { verbose: this.options.verbose }); - // if (testsuiteRootPath) { - // // Collect logs - // const mainProcessLogPath = path.join(testsuiteRootPath, 'main.log'); - // const rendererProcessLogPath = path.join(testsuiteRootPath, 'renderer.log'); - - // const flush = async () => { - // if (!this.spectron) { - // return; - // } - - // const mainLogs = await this.spectron.client.getMainProcessLogs(); - // await new Promise((c, e) => fs.appendFile(mainProcessLogPath, mainLogs.join('\n'), { encoding: 'utf8' }, err => err ? e(err) : c())); - - // const rendererLogs = (await this.spectron.client.getRenderProcessLogs()).map(m => `${m.timestamp} - ${m.level} - ${m.message}`); - // await new Promise((c, e) => fs.appendFile(rendererProcessLogPath, rendererLogs.join('\n'), { encoding: 'utf8' }, err => err ? e(err) : c())); - // }; - - // let running = true; - // const loopFlush = async () => { - // while (true) { - // await flush(); - - // if (!running) { - // return; - // } - - // await new Promise(c => setTimeout(c, 1000)); - // } - // }; - - // const loopPromise = loopFlush(); - // this.stopLogCollection = () => { - // running = false; - // return loopPromise; - // }; - // } - this._screenCapturer = new ScreenCapturer(null as any, this._suiteName, ''); const driver = new CodeDriver(this.codeInstance.driver, this.options.verbose); From 04cb861845245ba4eff4935501ab6b6317fe3666 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 12:12:58 +0200 Subject: [PATCH 116/710] remove screenCapturer --- test/smoke/src/api.ts | 3 -- test/smoke/src/application.ts | 11 +--- test/smoke/src/areas/css/css.test.ts | 4 -- test/smoke/src/areas/debug/debug.test.ts | 11 ---- test/smoke/src/areas/editor/editor.test.ts | 1 - .../src/areas/extensions/extensions.test.ts | 1 - test/smoke/src/areas/git/git.test.ts | 1 - .../src/areas/multiroot/multiroot.test.ts | 1 - .../src/areas/preferences/preferences.test.ts | 3 -- .../src/areas/workbench/data-loss.test.ts | 5 -- .../areas/workbench/data-migration.test.ts | 1 - .../src/areas/workbench/localization.test.ts | 5 -- test/smoke/src/helpers/screenshot.ts | 37 ------------- test/smoke/src/helpers/utilities.ts | 53 ------------------- 14 files changed, 1 insertion(+), 136 deletions(-) delete mode 100644 test/smoke/src/helpers/screenshot.ts delete mode 100644 test/smoke/src/helpers/utilities.ts diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index cbe43c9da25..d548ea39f6b 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ScreenCapturer } from './helpers/screenshot'; import { Driver, Element } from './driver'; export class API { @@ -15,7 +14,6 @@ export class API { constructor( private driver: Driver, - private screenCapturer: ScreenCapturer, waitTime: number ) { this.retryCount = (waitTime * 1000) / this.retryDuration; @@ -99,7 +97,6 @@ export class API { while (true) { if (trial > retryCount) { - await this.screenCapturer.capture('timeout'); throw new Error(`${timeoutMessage}: Timed out after ${(retryCount * this.retryDuration) / 1000} seconds.`); } diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 8a7cb11142d..5ab35ebb77d 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { API } from './api'; -import { ScreenCapturer } from './helpers/screenshot'; import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; import * as cp from 'child_process'; @@ -36,7 +35,6 @@ export class SpectronApplication { private _api: API; private _workbench: Workbench; - private _screenCapturer: ScreenCapturer; private codeInstance: Code | undefined; private keybindings: any[]; private stopLogCollection: (() => Promise) | undefined; @@ -53,10 +51,6 @@ export class SpectronApplication { return this._api; } - get screenCapturer(): ScreenCapturer { - return this._screenCapturer; - } - get workbench(): Workbench { return this._workbench; } @@ -81,7 +75,6 @@ export class SpectronApplication { set suiteName(suiteName: string) { this._suiteName = suiteName; - this._screenCapturer.suiteName = suiteName; } async start(waitForWelcome: boolean = true): Promise { @@ -135,10 +128,8 @@ export class SpectronApplication { verbose: this.options.verbose }); - this._screenCapturer = new ScreenCapturer(null as any, this._suiteName, ''); - const driver = new CodeDriver(this.codeInstance.driver, this.options.verbose); - this._api = new API(driver, this.screenCapturer, this.options.waitTime); + this._api = new API(driver, this.options.waitTime); this._workbench = new Workbench(this._api, this.keybindings, this.userDataPath); } diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index 6b187d53a28..cce6027a184 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -26,11 +26,9 @@ export function setup() { await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); await app.api.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); - await app.screenCapturer.capture('CSS Warning in editor'); await app.workbench.problems.showProblemsView(); await app.api.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); - await app.screenCapturer.capture('CSS Warning in problems view'); await app.workbench.problems.hideProblemsView(); }); @@ -41,12 +39,10 @@ export function setup() { await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); await app.api.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); - await app.screenCapturer.capture('CSS Error in editor'); const problems = new Problems(app.api, app.workbench); await problems.showProblemsView(); await app.api.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); - await app.screenCapturer.capture('CSS Error in probles view'); await problems.hideProblemsView(); }); }); diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index 4223c58bee3..392a8c87e48 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -31,7 +31,6 @@ export function setup() { fs.writeFileSync(launchJsonPath, JSON.stringify(config, undefined, 4), 'utf8'); await app.workbench.editor.waitForEditorContents('launch.json', contents => /"protocol": "inspector"/.test(contents)); - await app.screenCapturer.capture('launch.json file'); assert.equal(config.configurations[0].request, 'launch'); assert.equal(config.configurations[0].type, 'node'); @@ -47,7 +46,6 @@ export function setup() { await app.workbench.quickopen.openFile('index.js'); await app.workbench.debug.setBreakpointOnLine(6); - await app.screenCapturer.capture('breakpoints are set'); }); let port: number; @@ -58,15 +56,12 @@ export function setup() { await new Promise(c => setTimeout(c, 100)); port = await app.workbench.debug.startDebugging(); - await app.screenCapturer.capture('debugging has started'); await new Promise((c, e) => { const request = http.get(`http://localhost:${port}`); request.on('error', e); app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 6, 'looking for index.js and line 6').then(c, e); }); - - await app.screenCapturer.capture('debugging is paused'); }); it('focus stack frames and variables', async function () { @@ -88,15 +83,12 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.debug.stepIn(); - await app.screenCapturer.capture('debugging has stepped in'); const first = await app.workbench.debug.waitForStackFrame(sf => sf.name === 'response.js', 'looking for response.js'); await app.workbench.debug.stepOver(); - await app.screenCapturer.capture('debugging has stepped over'); await app.workbench.debug.waitForStackFrame(sf => sf.name === 'response.js' && sf.lineNumber === first.lineNumber + 1, `looking for response.js and line ${first.lineNumber + 1}`); await app.workbench.debug.stepOut(); - await app.screenCapturer.capture('debugging has stepped out'); await app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 7, `looking for index.js and line 7`); }); @@ -105,7 +97,6 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.debug.continue(); - await app.screenCapturer.capture('debugging has continued'); await new Promise((c, e) => { const request = http.get(`http://localhost:${port}`); @@ -113,7 +104,6 @@ export function setup() { app.workbench.debug.waitForStackFrame(sf => sf.name === 'index.js' && sf.lineNumber === 6, `looking for index.js and line 6`).then(c, e); }); - await app.screenCapturer.capture('debugging is paused'); }); it('debug console', async function () { @@ -126,7 +116,6 @@ export function setup() { const app = this.app as SpectronApplication; await app.workbench.debug.stopDebugging(); - await app.screenCapturer.capture('debugging has stopped'); }); }); } \ No newline at end of file diff --git a/test/smoke/src/areas/editor/editor.test.ts b/test/smoke/src/areas/editor/editor.test.ts index 257905b1289..4f7267fef95 100644 --- a/test/smoke/src/areas/editor/editor.test.ts +++ b/test/smoke/src/areas/editor/editor.test.ts @@ -35,7 +35,6 @@ export function setup() { await app.workbench.quickopen.openFile('www'); await app.workbench.editor.rename('www', 7, 'app', 'newApp'); await app.workbench.editor.waitForEditorContents('www', contents => contents.indexOf('newApp') > -1); - await app.screenCapturer.capture('Rename result'); }); // it('folds/unfolds the code correctly', async function () { diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index 703581dc99e..ca3c2820676 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -31,7 +31,6 @@ export function setup() { await app.workbench.runCommand('Smoke Test Check'); const statusbarText = await app.workbench.statusbar.getStatusbarTextByTitle('smoke test'); - await app.screenCapturer.capture('Statusbar'); assert.equal(statusbarText, 'VS Code Smoke Test Check'); }); }); diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 1be1f6c3a41..1135877da50 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -32,7 +32,6 @@ export function setup() { await app.workbench.scm.refreshSCMViewlet(); await app.workbench.scm.waitForChange('app.js', 'Modified'); await app.workbench.scm.waitForChange('index.jade', 'Modified'); - await app.screenCapturer.capture('changes'); }); it('opens diff editor', async function () { diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index 750845ded80..a5e1b9c9269 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -30,7 +30,6 @@ export function setup() { it('shows workspace name in title', async function () { const app = this.app as SpectronApplication; const title = await app.api.getTitle(); - await app.screenCapturer.capture('window title'); assert.ok(title.indexOf('smoketest (Workspace)') >= 0); }); }); diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index e0d0e8223ab..76bddda4621 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -19,13 +19,10 @@ export function setup() { await app.workbench.explorer.openFile('app.js'); await app.api.waitForElements('.line-numbers', false, elements => !!elements.length); - await app.screenCapturer.capture('app.js has line numbers'); await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); await app.workbench.editors.selectTab('app.js'); await app.api.waitForElements('.line-numbers', false, result => !result || result.length === 0); - - await app.screenCapturer.capture('line numbers hidden'); }); it(`changes 'workbench.action.toggleSidebarPosition' command key binding and verifies it`, async function () { diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index 9d5298bbed8..50d477f2803 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -18,24 +18,19 @@ export function setup() { const untitled = 'Untitled-1'; const textToTypeInUntitled = 'Hello, Unitled Code'; await app.workbench.editor.waitForTypeInEditor(untitled, textToTypeInUntitled); - await app.screenCapturer.capture('Untitled file before reload'); const readmeMd = 'readme.md'; const textToType = 'Hello, Code'; await app.workbench.explorer.openFile(readmeMd); await app.workbench.editor.waitForTypeInEditor(readmeMd, textToType); - await app.screenCapturer.capture(`${readmeMd} before reload`); await app.reload(); - await app.screenCapturer.capture('After reload'); await app.workbench.editors.waitForActiveTab(readmeMd, true); - await app.screenCapturer.capture(`${readmeMd} after reload`); await app.workbench.editor.waitForEditorContents(readmeMd, c => c.indexOf(textToType) > -1); await app.workbench.editors.waitForTab(untitled, true); await app.workbench.editors.selectTab(untitled, true); - await app.screenCapturer.capture('Untitled file after reload'); await app.workbench.editor.waitForEditorContents(untitled, c => c.indexOf(textToTypeInUntitled) > -1); }); }); diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 582331b6aa9..3dc5a8e44d8 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -51,7 +51,6 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { assert.ok(await app.workbench.editors.waitForActiveTab('Untitled-1', true), `Untitled-1 tab is not present after migration.`); await app.workbench.editor.waitForEditorContents('Untitled-1', c => c.indexOf(textToType) > -1); - await app.screenCapturer.capture('Untitled file text'); await app.stop(); }); diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index ed1f88b0cf1..a39722858e4 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -29,27 +29,22 @@ export function setup() { } let text = await app.workbench.explorer.getOpenEditorsViewTitle(); - await app.screenCapturer.capture('Open editors title'); assert(/geöffnete editoren/i.test(text)); await app.workbench.search.openSearchViewlet(); text = await app.workbench.search.getTitle(); - await app.screenCapturer.capture('Search title'); assert(/suchen/i.test(text)); await app.workbench.scm.openSCMViewlet(); text = await app.workbench.scm.getTitle(); - await app.screenCapturer.capture('Scm title'); assert(/quellcodeverwaltung/i.test(text)); await app.workbench.debug.openDebugViewlet(); text = await app.workbench.debug.getTitle(); - await app.screenCapturer.capture('Debug title'); assert(/debuggen/i.test(text)); await app.workbench.extensions.openExtensionsViewlet(); text = await app.workbench.extensions.getTitle(); - await app.screenCapturer.capture('Extensions title'); assert(/erweiterungen/i.test(text)); }); }); diff --git a/test/smoke/src/helpers/screenshot.ts b/test/smoke/src/helpers/screenshot.ts deleted file mode 100644 index 18a068ec388..00000000000 --- a/test/smoke/src/helpers/screenshot.ts +++ /dev/null @@ -1,37 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as path from 'path'; -import * as fs from 'fs'; -import * as mkdirp from 'mkdirp'; -import { Application } from 'spectron'; -import { sanitize } from './utilities'; - -export class ScreenCapturer { - - private static counter = 0; - - constructor( - private application: Application, - public suiteName: string, - private screenshotsDirPath: string | undefined, - ) { } - - async capture(name: string): Promise { - if (!this.screenshotsDirPath) { - return; - } - - const screenshotPath = path.join( - this.screenshotsDirPath, - sanitize(this.suiteName), - `${ScreenCapturer.counter++}-${sanitize(name)}.png` - ); - - const image = await this.application.browserWindow.capturePage(); - await new Promise((c, e) => mkdirp(path.dirname(screenshotPath), err => err ? e(err) : c())); - await new Promise((c, e) => fs.writeFile(screenshotPath, image, err => err ? e(err) : c())); - } -} diff --git a/test/smoke/src/helpers/utilities.ts b/test/smoke/src/helpers/utilities.ts deleted file mode 100644 index 8b86d31c957..00000000000 --- a/test/smoke/src/helpers/utilities.ts +++ /dev/null @@ -1,53 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as fs from 'fs'; -import { dirname } from 'path'; - -export function nfcall(fn: Function, ...args): Promise { - return new Promise((c, e) => fn(...args, (err, r) => err ? e(err) : c(r))); -} - -export async function mkdirp(path: string, mode?: number): Promise { - const mkdir = async () => { - try { - await nfcall(fs.mkdir, path, mode); - } catch (err) { - if (err.code === 'EEXIST') { - const stat = await nfcall(fs.stat, path); - - if (stat.isDirectory) { - return; - } - - throw new Error(`'${path}' exists and is not a directory.`); - } - - throw err; - } - }; - - // is root? - if (path === dirname(path)) { - return true; - } - - try { - await mkdir(); - } catch (err) { - if (err.code !== 'ENOENT') { - throw err; - } - - await mkdirp(dirname(path), mode); - await mkdir(); - } - - return true; -} - -export function sanitize(name: string): string { - return name.replace(/[&*:\/]/g, ''); -} \ No newline at end of file From 72bd5854c8fbd80c6b8ba4d73b473eb552b9fed9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 12:18:42 +0200 Subject: [PATCH 117/710] cleanup --- test/smoke/src/application.ts | 6 ------ test/smoke/src/areas/css/css.test.ts | 4 ---- test/smoke/src/areas/debug/debug.test.ts | 5 ----- test/smoke/src/areas/editor/editor.test.ts | 4 ---- test/smoke/src/areas/explorer/explorer.test.ts | 4 ---- test/smoke/src/areas/extensions/extensions.test.ts | 4 ---- test/smoke/src/areas/git/git.test.ts | 5 ----- test/smoke/src/areas/multiroot/multiroot.test.ts | 2 -- test/smoke/src/areas/preferences/preferences.test.ts | 4 ---- test/smoke/src/areas/search/search.test.ts | 4 ---- test/smoke/src/areas/statusbar/statusbar.test.ts | 4 ---- test/smoke/src/areas/workbench/data-loss.test.ts | 4 ---- test/smoke/src/areas/workbench/data-migration.test.ts | 6 ------ test/smoke/src/areas/workbench/localization.test.ts | 1 - 14 files changed, 57 deletions(-) diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 5ab35ebb77d..d646c6c6e6a 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -71,12 +71,6 @@ export class SpectronApplication { return this.options.workspaceFilePath; } - private _suiteName: string = 'Init'; - - set suiteName(suiteName: string) { - this._suiteName = suiteName; - } - async start(waitForWelcome: boolean = true): Promise { await this._start(); diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index cce6027a184..ad0d7923b1a 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -8,10 +8,6 @@ import { ProblemSeverity, Problems } from '../problems/problems'; export function setup() { describe('CSS', () => { - before(function () { - this.app.suiteName = 'CSS'; - }); - it('verifies quick outline', async function () { const app = this.app as SpectronApplication; await app.workbench.quickopen.openFile('style.css'); diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index 392a8c87e48..edb1d58be46 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -12,11 +12,6 @@ import { SpectronApplication } from '../../application'; export function setup() { describe('Debug', () => { - before(async function () { - const app = this.app as SpectronApplication; - app.suiteName = 'Debug'; - }); - it('configure launch json', async function () { const app = this.app as SpectronApplication; diff --git a/test/smoke/src/areas/editor/editor.test.ts b/test/smoke/src/areas/editor/editor.test.ts index 4f7267fef95..5bc47218228 100644 --- a/test/smoke/src/areas/editor/editor.test.ts +++ b/test/smoke/src/areas/editor/editor.test.ts @@ -7,10 +7,6 @@ import { SpectronApplication } from '../../application'; export function setup() { describe('Editor', () => { - before(function () { - this.app.suiteName = 'Editor'; - }); - it('shows correct quick outline', async function () { const app = this.app as SpectronApplication; await app.workbench.quickopen.openFile('www'); diff --git a/test/smoke/src/areas/explorer/explorer.test.ts b/test/smoke/src/areas/explorer/explorer.test.ts index a18c7ec6f0c..5cde709ad74 100644 --- a/test/smoke/src/areas/explorer/explorer.test.ts +++ b/test/smoke/src/areas/explorer/explorer.test.ts @@ -7,10 +7,6 @@ import { SpectronApplication } from '../../application'; export function setup() { describe('Explorer', () => { - before(function () { - this.app.suiteName = 'Explorer'; - }); - it('quick open search produces correct result', async function () { const app = this.app as SpectronApplication; const expectedNames = [ diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index ca3c2820676..f9e324c77c3 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -8,10 +8,6 @@ import { SpectronApplication, Quality } from '../../application'; export function setup() { describe('Extensions', () => { - before(function () { - this.app.suiteName = 'Extensions'; - }); - it(`install and activate vscode-smoketest-check extension`, async function () { const app = this.app as SpectronApplication; diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 1135877da50..9c89b77a5e2 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -11,11 +11,6 @@ const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[t export function setup() { describe('Git', () => { - before(async function () { - const app = this.app as SpectronApplication; - app.suiteName = 'Git'; - }); - it('reflects working tree changes', async function () { const app = this.app as SpectronApplication; diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index a5e1b9c9269..add575164a1 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -10,8 +10,6 @@ export function setup() { describe('Multiroot', () => { before(async function () { - this.app.suiteName = 'Multiroot'; - const app = this.app as SpectronApplication; // restart with preventing additional windows from restoring diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index 76bddda4621..21dde973031 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -10,10 +10,6 @@ import { ActivityBarPosition } from '../activitybar/activityBar'; export function setup() { describe('Preferences', () => { - before(function () { - this.app.suiteName = 'Preferences'; - }); - it('turns off editor line numbers and verifies the live change', async function () { const app = this.app as SpectronApplication; diff --git a/test/smoke/src/areas/search/search.test.ts b/test/smoke/src/areas/search/search.test.ts index caa3444efe4..9351c8fafe4 100644 --- a/test/smoke/src/areas/search/search.test.ts +++ b/test/smoke/src/areas/search/search.test.ts @@ -7,10 +7,6 @@ import { SpectronApplication } from '../../application'; export function setup() { describe('Search', () => { - before(function () { - this.app.suiteName = 'Search'; - }); - it('searches for body & checks for correct result number', async function () { const app = this.app as SpectronApplication; await app.workbench.search.openSearchViewlet(); diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 24dce071f6c..78954928847 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -8,10 +8,6 @@ import { StatusBarElement } from './statusbar'; export function setup() { describe('Statusbar', () => { - before(function () { - this.app.suiteName = 'Statusbar'; - }); - it('verifies presence of all default status bar elements', async function () { const app = this.app as SpectronApplication; diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index 50d477f2803..2781d043ea4 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -7,10 +7,6 @@ import { SpectronApplication } from '../../application'; export function setup() { describe('Dataloss', () => { - before(function () { - this.app.suiteName = 'Dataloss'; - }); - it(`verifies that 'hot exit' works for dirty files`, async function () { const app = this.app as SpectronApplication; await app.workbench.editors.newUntitledFile(); diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 3dc5a8e44d8..c48d216f80b 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -28,7 +28,6 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { } await stableApp.start(); - stableApp.suiteName = 'Data Migration'; const textToType = 'Very dirty file'; @@ -46,7 +45,6 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { } await app.start(false); - app.suiteName = 'Data Migration'; assert.ok(await app.workbench.editors.waitForActiveTab('Untitled-1', true), `Untitled-1 tab is not present after migration.`); @@ -64,7 +62,6 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { } await stableApp.start(); - stableApp.suiteName = 'Data Migration'; const fileName = 'app.js'; const textPart = 'This is going to be an unsaved file'; @@ -84,7 +81,6 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { } await app.start(false); - app.suiteName = 'Data Migration'; assert.ok(await app.workbench.editors.waitForActiveTab(fileName), `dirty file tab is not present after migration.`); await app.workbench.editor.waitForEditorContents(fileName, c => c.indexOf(textPart) > -1); @@ -101,7 +97,6 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { } await stableApp.start(); - stableApp.suiteName = 'Data Migration'; const fileName1 = 'app.js', fileName2 = 'jsconfig.json', fileName3 = 'readme.md'; @@ -119,7 +114,6 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { } await app.start(false); - app.suiteName = 'Data Migration'; assert.ok(await app.workbench.editors.waitForTab(fileName1), `${fileName1} tab was not restored after migration.`); assert.ok(await app.workbench.editors.waitForTab(fileName2), `${fileName2} tab was not restored after migration.`); diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index a39722858e4..2a41c77ea20 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -11,7 +11,6 @@ export function setup() { describe('Localization', () => { before(async function () { const app = this.app as SpectronApplication; - this.app.suiteName = 'Localization'; if (app.quality === Quality.Dev) { return; From 1b2f1980c40636c2ac76a99275333c720b496e5b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 12:20:37 +0200 Subject: [PATCH 118/710] forward extraArgs to app --- test/smoke/src/application.ts | 3 ++- test/smoke/src/vscode/code.ts | 21 +++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index d646c6c6e6a..c656696eec6 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -119,7 +119,8 @@ export class SpectronApplication { workspacePath: workspaceOrFolder, userDataDir: this.options.userDataDir, extensionsPath: this.options.extensionsPath, - verbose: this.options.verbose + verbose: this.options.verbose, + extraArgs }); const driver = new CodeDriver(this.codeInstance.driver, this.options.verbose); diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index b7604d04e4a..a5e0110b796 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -72,14 +72,6 @@ export class Code { } } -export interface SpawnOptions { - codePath?: string; - workspacePath: string; - userDataDir: string; - extensionsPath: string; - verbose: boolean; -} - export async function connect(child: cp.ChildProcess, outPath: string, handlePath: string): Promise { let errCount = 0; @@ -103,6 +95,15 @@ export async function connect(child: cp.ChildProcess, outPath: string, handlePat const instances = new Set(); process.once('exit', () => instances.forEach(code => code.kill())); +export interface SpawnOptions { + codePath?: string; + workspacePath: string; + userDataDir: string; + extensionsPath: string; + verbose: boolean; + extraArgs?: string[]; +} + export async function spawn(options: SpawnOptions): Promise { const codePath = options.codePath; const electronPath = codePath ? getBuildElectronPath(codePath) : getDevElectronPath(); @@ -126,6 +127,10 @@ export async function spawn(options: SpawnOptions): Promise { args.unshift(repoPath); } + if (options.extraArgs) { + args.push(...options.extraArgs); + } + const spawnOptions: cp.SpawnOptions = {}; if (options.verbose) { From 1b33eb37d5df3b74d373bde1f8b6446fa4df88e5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 12:32:56 +0200 Subject: [PATCH 119/710] make readDirectory return string/stat-tuples, #47475 --- src/vs/platform/files/common/files.ts | 2 +- src/vs/vscode.proposed.d.ts | 8 +++---- .../electron-browser/mainThreadFileSystem.ts | 6 ++---- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- .../workbench/api/node/extHostFileSystem.ts | 21 +++++++++++-------- .../electron-browser/remoteFileService.ts | 6 +++++- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 8efe3094e5d..5782c248f64 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -174,7 +174,7 @@ export interface IFileSystemProvider { writeFile(resource: URI, content: Uint8Array): TPromise; move(from: URI, to: URI): TPromise; mkdir(resource: URI): TPromise; - readdir(resource: URI): TPromise<[URI, IStat][]>; + readdir(resource: URI): TPromise<[string, IStat][]>; delete(resource: URI): TPromise; } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b64040df24d..3f790bdb8db 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -251,7 +251,7 @@ declare module 'vscode' { // todo@joh add open/close calls? export interface FileSystemProvider2 { - _version: 3; + _version: 4; /** * An event to signal that a resource has been created, changed, or deleted. @@ -273,9 +273,9 @@ declare module 'vscode' { * * @param uri The uri of the folder. * @param token A cancellation token. - * @return A thenable that resolves to an array of tuples of resources and files stats. + * @return A thenable that resolves to an array of tuples of file names and files stats. */ - readDirectory(uri: Uri, token: CancellationToken): Thenable<[Uri, FileStat2][]>; + readDirectory(uri: Uri, token: CancellationToken): Thenable<[string, FileStat2][]>; /** * Read the entire contents of a file. @@ -313,7 +313,7 @@ declare module 'vscode' { delete(uri: Uri, token: CancellationToken): Thenable; // todo@remote - create(uri: Uri, options: { type: FileType }, token: CancellationToken): Thenable; + create(uri: Uri, options: { type: FileType2 }, token: CancellationToken): Thenable; } export namespace workspace { diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 80ea36bc303..7e63bbd33d5 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -116,10 +116,8 @@ class RemoteFileSystemProvider implements IFileSystemProvider { mkdir(resource: URI): TPromise { return this._proxy.$mkdir(this._handle, resource); } - readdir(resource: URI): TPromise<[URI, IStat][], any> { - return this._proxy.$readdir(this._handle, resource).then(data => { - return data.map(tuple => <[URI, IStat]>[URI.revive(tuple[0]), tuple[1]]); - }); + readdir(resource: URI): TPromise<[string, IStat][], any> { + return this._proxy.$readdir(this._handle, resource); } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 44e0ba2ce5b..3c4042cd144 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -572,7 +572,7 @@ export interface ExtHostFileSystemShape { $move(handle: number, resource: UriComponents, target: UriComponents): TPromise; $mkdir(handle: number, resource: UriComponents): TPromise; - $readdir(handle: number, resource: UriComponents): TPromise<[UriComponents, IStat][]>; + $readdir(handle: number, resource: UriComponents): TPromise<[string, IStat][]>; $delete(handle: number, resource: UriComponents): TPromise; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 109c18061b1..a3c2ab0b710 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -10,6 +10,7 @@ import { Event, mapEvent } from 'vs/base/common/event'; import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystemShape } from './extHost.protocol'; import * as vscode from 'vscode'; import * as files from 'vs/platform/files/common/files'; +import * as path from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; import { asWinJsPromise } from 'vs/base/common/async'; import { IPatternInfo } from 'vs/platform/search/common/search'; @@ -59,7 +60,7 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { class FileSystemProviderShim implements vscode.FileSystemProvider2 { - _version: 3; + _version: 4; onDidChange: vscode.Event; @@ -77,9 +78,9 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable { return this._delegate.move(oldUri, newUri).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - readDirectory(resource: vscode.Uri): Thenable<[vscode.Uri, vscode.FileStat2][]> { + readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileStat2][]> { return this._delegate.readdir(resource).then(tuples => { - return tuples.map(tuple => <[vscode.Uri, vscode.FileStat2]>[tuple[0], FileSystemProviderShim._modernizeFileStat(tuple[1])]); + return tuples.map(tuple => <[string, vscode.FileStat2]>[path.posix.basename(tuple[0].path), FileSystemProviderShim._modernizeFileStat(tuple[1])]); }); } @@ -131,8 +132,8 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { } }); } - create(resource: vscode.Uri, options: { type: vscode.FileType; }): Thenable { - if (options.type === FileType.Dir) { + create(resource: vscode.Uri, options: { type: vscode.FileType2; }): Thenable { + if (options.type === FileType2.Directory) { return this._delegate.mkdir(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } else { return this._delegate.write(resource, Buffer.from([])) @@ -173,10 +174,12 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 3) { + if (newProvider && newProvider._version === 4) { return this._doRegisterFileSystemProvider(scheme, newProvider); - } else { + } else if (provider) { return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); + } else { + throw new Error('IGNORED both provider'); } } @@ -234,7 +237,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { $stat(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), token)); } - $readdir(handle: number, resource: UriComponents): TPromise<[UriComponents, files.IStat][], any> { + $readdir(handle: number, resource: UriComponents): TPromise<[string, files.IStat][], any> { return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), token)); } $readFile(handle: number, resource: UriComponents): TPromise { @@ -254,7 +257,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), token)); } $mkdir(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).create(URI.revive(resource), { type: FileType.Dir }, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).create(URI.revive(resource), { type: FileType2.Directory }, token)); } $provideFileSearchResults(handle: number, session: number, query: string): TPromise { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 2137a762b6b..23fd3fb4261 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -42,7 +42,11 @@ function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse // dir -> resolve return provider.readdir(resource).then(entries => { // resolve children if requested - return TPromise.join(entries.map(stat => toIFileStat(provider, stat, recurse))).then(children => { + return TPromise.join(entries.map(tuple => { + const [name, stat] = tuple; + const childResource = resource.with({ path: posix.join(resource.path, name) }); + return toIFileStat(provider, [childResource, stat], recurse); + })).then(children => { fileStat.children = children; return fileStat; }); From c28e9b17fd3660ca026aaeac3c71ac06b3d493f5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 12:38:30 +0200 Subject: [PATCH 120/710] bug - make remote-read-stream push `null` eagerly --- .../services/files/electron-browser/remoteFileService.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 23fd3fb4261..9e9aa32cbe2 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -227,18 +227,13 @@ export class RemoteFileService extends FileService { private _createReadStream(provider: IFileSystemProvider, resource: URI): Readable { return new class extends Readable { - _done: boolean = false; _read(size?: number): void { - if (this._done) { - this.push(null); - return; - } provider.readFile(resource).then(data => { - this._done = true; this.push(data); + this.push(null); }, err => { - this._done = true; this.emit('error', err); + this.push(null); }); } }; From 4c5ed7e3c8ef746bc9dbb812eaa2f79fd1e0456f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Weinand?= Date: Wed, 11 Apr 2018 12:51:10 +0200 Subject: [PATCH 121/710] be more resilent when parsing RFC 2822 header in DAP --- .../workbench/parts/debug/node/debugAdapter.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index 9d6c1456e80..943bb658fb9 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -134,6 +134,8 @@ export abstract class AbstractDebugAdapter implements debug.IDebugAdapter { export abstract class StreamDebugAdapter extends AbstractDebugAdapter { private static readonly TWO_CRLF = '\r\n\r\n'; + private static readonly HEADER_LINESEPARATOR = /\r?\n/; // allow for non-RFC 2822 conforming line separators + private static readonly HEADER_FIELDSEPARATOR = /: */; private outputStream: stream.Writable; private rawData: Buffer; @@ -191,13 +193,12 @@ export abstract class StreamDebugAdapter extends AbstractDebugAdapter { continue; // there may be more complete messages to process } } else { - /* const idx = this.rawData.indexOf(StreamDebugAdapter.TWO_CRLF); if (idx !== -1) { const header = this.rawData.toString('utf8', 0, idx); - const lines = header.split('\r\n'); + const lines = header.split(StreamDebugAdapter.HEADER_LINESEPARATOR); for (const h of lines) { - const kvPair = h.split(/: +/); + const kvPair = h.split(StreamDebugAdapter.HEADER_FIELDSEPARATOR); if (kvPair[0] === 'Content-Length') { this.contentLength = Number(kvPair[1]); } @@ -205,17 +206,6 @@ export abstract class StreamDebugAdapter extends AbstractDebugAdapter { this.rawData = this.rawData.slice(idx + StreamDebugAdapter.TWO_CRLF.length); continue; } - */ - const s = this.rawData.toString('utf8', 0, this.rawData.length); - const idx = s.indexOf(StreamDebugAdapter.TWO_CRLF); - if (idx !== -1) { - const match = /Content-Length: (\d+)/.exec(s); - if (match && match[1]) { - this.contentLength = Number(match[1]); - this.rawData = this.rawData.slice(idx + StreamDebugAdapter.TWO_CRLF.length); - continue; // try to handle a complete message - } - } } break; } From 5b003aeaee7b81ae3009ae932f514d9f87778836 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 13:45:27 +0200 Subject: [PATCH 122/710] tweak file change event, #47475 --- src/vs/vscode.proposed.d.ts | 2 +- src/vs/workbench/api/node/extHostFileSystem.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 3f790bdb8db..e20750ac7da 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -231,7 +231,7 @@ declare module 'vscode' { export interface FileChange2 { type: FileChangeType2; - resource: Uri; + uri: Uri; } export enum FileType2 { diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index a3c2ab0b710..de9247046b7 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -118,7 +118,7 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { break; } - return { resource, type: newType }; + return { uri: resource, type: newType }; } // --- delete/create file or folder @@ -192,7 +192,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { if (provider.onDidChange) { reg = provider.onDidChange(event => { let newEvent = event.map(e => { - let { resource, type } = e; + let { uri: resource, type } = e; let newType: files.FileChangeType; switch (type) { case FileChangeType2.Changed: From 9008ae5eb7585214131b927eeff53073893b8a98 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 13:57:03 +0200 Subject: [PATCH 123/710] reuse getEncoding/getPreferredEncoding in remoteFileService, #38776 --- src/vs/base/node/encoding.ts | 4 +-- .../files/electron-browser/fileService.ts | 2 +- .../electron-browser/remoteFileService.ts | 29 ++++--------------- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index 7a35237f3e9..80da2a7c5c1 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -20,7 +20,7 @@ export const UTF16le = 'utf16le'; export interface IDecodeStreamOptions { guessEncoding?: boolean; minBytesRequiredForDetection?: number; - overwriteEncoding?(detected: string): string; + overwriteEncoding?(detectedEncoding: string): string; } export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions): TPromise<{ detected: IDetectedEncodingResult, stream: NodeJS.ReadableStream }> { @@ -79,7 +79,7 @@ export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions this._decodeStreamConstruction = TPromise.as(detectEncodingFromBuffer({ buffer: Buffer.concat(this._buffer), bytesRead: this._bytesBuffered }, options.guessEncoding)).then(detected => { - detected.encoding = options.overwriteEncoding(detected.encoding); // default encoding + detected.encoding = options.overwriteEncoding(detected.encoding); this._decodeStream = decodeStream(detected.encoding); for (const buffer of this._buffer) { this._decodeStream.write(buffer); diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index 7e459ad3dea..39c172f4de5 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -1068,7 +1068,7 @@ export class FileService implements IFileService { }); } - private getPeferredEncoding(resource: uri, options: IResolveContentOptions, detected: encoding.IDetectedEncodingResult): string { + protected getPeferredEncoding(resource: uri, options: IResolveContentOptions, detected: encoding.IDetectedEncodingResult): string { let preferredEncoding: string; if (options && options.encoding) { if (detected.encoding === encoding.UTF8 && options.encoding === encoding.UTF8) { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 9e9aa32cbe2..d9420bb679f 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -12,7 +12,7 @@ import { posix } from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; import { isFalsyOrEmpty, distinct } from 'vs/base/common/arrays'; import { Schemas } from 'vs/base/common/network'; -import { encode, UTF8, UTF8_with_bom, toDecodeStream } from 'vs/base/node/encoding'; +import { encode, toDecodeStream, IDecodeStreamOptions } from 'vs/base/node/encoding'; import { TernarySearchTree } from 'vs/base/common/map'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -261,32 +261,15 @@ export class RemoteFileService extends FileService { ); } - return toDecodeStream(this._createReadStream(provider, resource), { + const decodeStreamOpts: IDecodeStreamOptions = { guessEncoding: options.autoGuessEncoding, overwriteEncoding: detected => { - let preferredEncoding: string; - if (options && options.encoding) { - if (detected === UTF8 && options.encoding === UTF8) { - preferredEncoding = UTF8_with_bom; // indicate the file has BOM if we are to resolve with UTF 8 - } else { - preferredEncoding = options.encoding; // give passed in encoding highest priority - } - } else if (detected) { - if (detected === UTF8) { - preferredEncoding = UTF8_with_bom; // if we detected UTF-8, it can only be because of a BOM - } else { - preferredEncoding = detected; - } - // todo@remote - encoding logic should not be kept - // hostage inside the node file service - // } else if (super.configuredEncoding(resource) === UTF8_with_bom) { - } else { - preferredEncoding = UTF8; // if we did not detect UTF 8 BOM before, this can only be UTF 8 then - } - return preferredEncoding; + const prefered = this.getPeferredEncoding(resource, options, { encoding: detected, seemsBinary: false }); + return this.getEncoding(resource, prefered); } + }; - }).then(data => { + return toDecodeStream(this._createReadStream(provider, resource), decodeStreamOpts).then(data => { if (options.acceptTextOnly && data.detected.seemsBinary) { return TPromise.wrapError(new FileOperationError( From 1ebb0dd23b177409c7a67ba700774b80ae270c95 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 14:05:22 +0200 Subject: [PATCH 124/710] remove spectron references --- test/smoke/package.json | 3 +- test/smoke/src/api.ts | 150 +++++- test/smoke/src/application.ts | 18 +- test/smoke/src/areas/css/css.test.ts | 8 +- test/smoke/src/areas/debug/debug.test.ts | 18 +- test/smoke/src/areas/debug/debug.ts | 6 +- test/smoke/src/areas/editor/editor.test.ts | 12 +- .../smoke/src/areas/explorer/explorer.test.ts | 6 +- .../src/areas/extensions/extensions.test.ts | 4 +- test/smoke/src/areas/git/git.test.ts | 10 +- test/smoke/src/areas/git/scm.ts | 6 +- .../src/areas/multiroot/multiroot.test.ts | 8 +- .../src/areas/preferences/preferences.test.ts | 8 +- test/smoke/src/areas/search/search.test.ts | 10 +- .../src/areas/statusbar/statusbar.test.ts | 14 +- .../smoke/src/areas/terminal/terminal.test.ts | 29 - test/smoke/src/areas/terminal/terminal.ts | 45 -- .../src/areas/workbench/data-loss.test.ts | 4 +- .../areas/workbench/data-migration.test.ts | 4 +- .../src/areas/workbench/localization.test.ts | 6 +- test/smoke/src/areas/workbench/workbench.ts | 3 - test/smoke/src/driver.ts | 271 ---------- test/smoke/src/main.ts | 34 +- test/smoke/yarn.lock | 502 +----------------- 24 files changed, 229 insertions(+), 950 deletions(-) delete mode 100644 test/smoke/src/areas/terminal/terminal.test.ts delete mode 100644 test/smoke/src/areas/terminal/terminal.ts delete mode 100644 test/smoke/src/driver.ts diff --git a/test/smoke/package.json b/test/smoke/package.json index 7ef30e22158..e033db34da0 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -29,10 +29,9 @@ "ncp": "^2.0.0", "portastic": "^1.0.1", "rimraf": "^2.6.1", - "spectron": "^3.7.2", "strip-json-comments": "^2.0.1", "tmp": "0.0.33", "typescript": "2.5.2", "watch": "^1.0.2" } -} \ No newline at end of file +} diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts index d548ea39f6b..f11ae031575 100644 --- a/test/smoke/src/api.ts +++ b/test/smoke/src/api.ts @@ -3,7 +3,149 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Driver, Element } from './driver'; +import { IDriver, IElement } from './vscode/driver'; + +export class CodeDriver { + + constructor( + private driver: IDriver, + private verbose: boolean + ) { } + + private _activeWindowId: number | undefined = undefined; + + async dispatchKeybinding(keybinding: string): Promise { + if (this.verbose) { + console.log('- dispatchKeybinding:', keybinding); + } + + const windowId = await this.getWindowId(); + await this.driver.dispatchKeybinding(windowId, keybinding); + } + + async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { + if (this.verbose) { + console.log('- click:', selector); + } + + const windowId = await this.getWindowId(); + await this.driver.click(windowId, selector, xoffset, yoffset); + } + + async doubleClick(selector: string): Promise { + if (this.verbose) { + console.log('- doubleClick:', selector); + } + + const windowId = await this.getWindowId(); + await this.driver.doubleClick(windowId, selector); + } + + async move(selector: string): Promise { + if (this.verbose) { + console.log('- move:', selector); + } + + const windowId = await this.getWindowId(); + await this.driver.move(windowId, selector); + } + + async setValue(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- setValue:', selector, text); + } + + const windowId = await this.getWindowId(); + await this.driver.setValue(windowId, selector, text); + } + + async getTitle(): Promise { + if (this.verbose) { + console.log('- getTitle:'); + } + + const windowId = await this.getWindowId(); + return await this.driver.getTitle(windowId); + } + + async isActiveElement(selector: string): Promise { + if (this.verbose) { + console.log('- isActiveElement:', selector); + } + + const windowId = await this.getWindowId(); + return await this.driver.isActiveElement(windowId, selector); + } + + async getElements(selector: string, recursive = false): Promise { + if (this.verbose) { + console.log('- getElements:', selector); + } + + const windowId = await this.getWindowId(); + return await this.driver.getElements(windowId, selector, recursive); + } + + async typeInEditor(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- typeInEditor:', selector, text); + } + + const windowId = await this.getWindowId(); + return await this.driver.typeInEditor(windowId, selector, text); + } + + async getTerminalBuffer(selector: string): Promise { + if (this.verbose) { + console.log('- getTerminalBuffer:', selector); + } + + const windowId = await this.getWindowId(); + return await this.driver.getTerminalBuffer(windowId, selector); + } + + private async getWindowId(): Promise { + if (typeof this._activeWindowId !== 'number') { + const windows = await this.driver.getWindowIds(); + this._activeWindowId = windows[0]; + } + + return this._activeWindowId; + } +} + +export function findElement(element: IElement, fn: (element: IElement) => boolean): IElement | null { + const queue = [element]; + + while (queue.length > 0) { + const element = queue.shift()!; + + if (fn(element)) { + return element; + } + + queue.push(...element.children); + } + + return null; +} + +export function findElements(element: IElement, fn: (element: IElement) => boolean): IElement[] { + const result: IElement[] = []; + const queue = [element]; + + while (queue.length > 0) { + const element = queue.shift()!; + + if (fn(element)) { + result.push(element); + } + + queue.push(...element.children); + } + + return result; +} export class API { @@ -13,7 +155,7 @@ export class API { private readonly retryDuration = 100; // in milliseconds constructor( - private driver: Driver, + private driver: CodeDriver, waitTime: number ) { this.retryCount = (waitTime * 1000) / this.retryDuration; @@ -58,11 +200,11 @@ export class API { return elements.length; } - waitForElements(selector: string, recursive: boolean, accept: (result: Element[]) => boolean = result => result.length > 0): Promise { + waitForElements(selector: string, recursive: boolean, accept: (result: IElement[]) => boolean = result => result.length > 0): Promise { return this.waitFor(() => this.driver.getElements(selector, recursive), accept, `elements with selector ${selector}`) as Promise; } - waitForElement(selector: string, accept: (result: Element | undefined) => boolean = result => !!result): Promise { + waitForElement(selector: string, accept: (result: IElement | undefined) => boolean = result => !!result): Promise { return this.waitFor(() => this.driver.getElements(selector).then(els => els[0]), accept, `element with selector ${selector}`) as Promise; } diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index c656696eec6..0b43ca0b346 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -3,11 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from './api'; +import { API, CodeDriver } from './api'; import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; import * as cp from 'child_process'; -import { CodeDriver } from './driver'; import { Code, spawn, SpawnOptions } from './vscode/code'; export enum Quality { @@ -16,22 +15,15 @@ export enum Quality { Stable } -export interface SpectronApplicationOptions extends SpawnOptions { +export interface ApplicationOptions extends SpawnOptions { quality: Quality; - electronPath: string; workspacePath: string; - artifactsPath: string; workspaceFilePath: string; waitTime: number; verbose: boolean; } -/** - * Wraps Spectron's Application instance with its used methods. - */ -export class SpectronApplication { - - // private static count = 0; +export class Application { private _api: API; private _workbench: Workbench; @@ -39,9 +31,7 @@ export class SpectronApplication { private keybindings: any[]; private stopLogCollection: (() => Promise) | undefined; - constructor( - private options: SpectronApplicationOptions - ) { } + constructor(private options: ApplicationOptions) { } get quality(): Quality { return this.options.quality; diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index ad0d7923b1a..10f473a59a9 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -3,13 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; import { ProblemSeverity, Problems } from '../problems/problems'; export function setup() { describe('CSS', () => { it('verifies quick outline', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('style.css'); await app.workbench.quickopen.openQuickOutline(); @@ -17,7 +17,7 @@ export function setup() { }); it('verifies warnings for the empty rule', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); @@ -29,7 +29,7 @@ export function setup() { }); it('verifies that warning becomes an error once setting changed', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.settingsEditor.addUserSetting('css.lint.emptyRules', '"error"'); await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index edb1d58be46..45710a1b6f7 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -8,12 +8,12 @@ import * as http from 'http'; import * as path from 'path'; import * as fs from 'fs'; import * as stripJsonComments from 'strip-json-comments'; -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; export function setup() { describe('Debug', () => { it('configure launch json', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.debug.openDebugViewlet(); await app.workbench.quickopen.openFile('app.js'); @@ -37,7 +37,7 @@ export function setup() { }); it('breakpoints', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('index.js'); await app.workbench.debug.setBreakpointOnLine(6); @@ -45,7 +45,7 @@ export function setup() { let port: number; it('start debugging', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; // TODO@isidor await new Promise(c => setTimeout(c, 100)); @@ -60,7 +60,7 @@ export function setup() { }); it('focus stack frames and variables', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); @@ -75,7 +75,7 @@ export function setup() { }); it('stepOver, stepIn, stepOut', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.debug.stepIn(); @@ -89,7 +89,7 @@ export function setup() { }); it('continue', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.debug.continue(); @@ -102,13 +102,13 @@ export function setup() { }); it('debug console', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.debug.waitForReplCommand('2 + 2', r => r === '4'); }); it('stop debugging', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.debug.stopDebugging(); }); diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index fcbc755e97f..f19b3b5143d 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -5,10 +5,10 @@ import { Viewlet } from '../workbench/viewlet'; import { Commands } from '../workbench/workbench'; -import { API } from '../../api'; +import { API, findElement } from '../../api'; import { Editors } from '../editor/editors'; import { Editor } from '../editor/editor'; -import { findElement, Element } from '../../driver'; +import { IElement } from '../../vscode/driver'; const VIEWLET = 'div[id="workbench.view.debug"]'; const DEBUG_VIEW = `${VIEWLET} .debug-view-content`; @@ -37,7 +37,7 @@ export interface IStackFrame { lineNumber: number; } -function toStackFrame(element: Element): IStackFrame { +function toStackFrame(element: IElement): IStackFrame { const name = findElement(element, e => /\bfile-name\b/.test(e.className))!; const line = findElement(element, e => /\bline-number\b/.test(e.className))!; const lineNumber = line.textContent ? parseInt(line.textContent.split(':').shift() || '0') : 0; diff --git a/test/smoke/src/areas/editor/editor.test.ts b/test/smoke/src/areas/editor/editor.test.ts index 5bc47218228..b892c49d5da 100644 --- a/test/smoke/src/areas/editor/editor.test.ts +++ b/test/smoke/src/areas/editor/editor.test.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; export function setup() { describe('Editor', () => { it('shows correct quick outline', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('www'); await app.workbench.quickopen.openQuickOutline(); @@ -16,7 +16,7 @@ export function setup() { }); it(`finds 'All References' to 'app'`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('www'); const references = await app.workbench.editor.findReferences('app', 7); @@ -27,7 +27,7 @@ export function setup() { }); it(`renames local 'app' variable`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('www'); await app.workbench.editor.rename('www', 7, 'app', 'newApp'); await app.workbench.editor.waitForEditorContents('www', contents => contents.indexOf('newApp') > -1); @@ -50,7 +50,7 @@ export function setup() { // }); it(`verifies that 'Go To Definition' works`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('app.js'); await app.workbench.editor.gotoDefinition('express', 11); @@ -59,7 +59,7 @@ export function setup() { }); it(`verifies that 'Peek Definition' works`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('app.js'); const peek = await app.workbench.editor.peekDefinition('express', 11); diff --git a/test/smoke/src/areas/explorer/explorer.test.ts b/test/smoke/src/areas/explorer/explorer.test.ts index 5cde709ad74..425233c7ad7 100644 --- a/test/smoke/src/areas/explorer/explorer.test.ts +++ b/test/smoke/src/areas/explorer/explorer.test.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; export function setup() { describe('Explorer', () => { it('quick open search produces correct result', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; const expectedNames = [ '.eslintrc.json', 'tasks.json', @@ -25,7 +25,7 @@ export function setup() { }); it('quick open respects fuzzy matching', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; const expectedNames = [ 'tasks.json', 'app.js', diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index f9e324c77c3..2a5b2f89fab 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SpectronApplication, Quality } from '../../application'; +import { Application, Quality } from '../../application'; export function setup() { describe('Extensions', () => { it(`install and activate vscode-smoketest-check extension`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; if (app.quality === Quality.Dev) { this.skip(); diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 9c89b77a5e2..ab742c7ef44 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; @@ -12,7 +12,7 @@ const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[t export function setup() { describe('Git', () => { it('reflects working tree changes', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.scm.openSCMViewlet(); @@ -30,7 +30,7 @@ export function setup() { }); it('opens diff editor', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.scm.openSCMViewlet(); await app.workbench.scm.openChange('app.js'); @@ -38,7 +38,7 @@ export function setup() { }); it('stages correctly', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.scm.openSCMViewlet(); @@ -52,7 +52,7 @@ export function setup() { }); it(`stages, commits changes and verifies outgoing change`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.scm.openSCMViewlet(); diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index b2cc5fc8baf..21a69240780 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../api'; +import { API, findElement, findElements } from '../../api'; import { Commands } from '../workbench/workbench'; -import { Element, findElement, findElements } from '../../driver'; +import { IElement } from '../../vscode/driver'; const VIEWLET = 'div[id="workbench.view.scm"]'; const SCM_INPUT = `${VIEWLET} .scm-editor textarea`; @@ -24,7 +24,7 @@ interface Change { actions: string[]; } -function toChange(element: Element): Change { +function toChange(element: IElement): Change { const name = findElement(element, e => /\blabel-name\b/.test(e.className))!; const type = element.attributes['data-tooltip'] || ''; diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index add575164a1..a5f47f25967 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -4,13 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; export function setup() { describe('Multiroot', () => { before(async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; // restart with preventing additional windows from restoring // to ensure the window after restart is the multi-root workspace @@ -18,7 +18,7 @@ export function setup() { }); it('shows results from all folders', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openQuickOpen('*.*'); await app.workbench.quickopen.waitForQuickOpenElements(names => names.length === 6); @@ -26,7 +26,7 @@ export function setup() { }); it('shows workspace name in title', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; const title = await app.api.getTitle(); assert.ok(title.indexOf('smoketest (Workspace)') >= 0); }); diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index 21dde973031..92c58ab4517 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -5,13 +5,13 @@ import * as assert from 'assert'; -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; import { ActivityBarPosition } from '../activitybar/activityBar'; export function setup() { describe('Preferences', () => { it('turns off editor line numbers and verifies the live change', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.explorer.openFile('app.js'); await app.api.waitForElements('.line-numbers', false, elements => !!elements.length); @@ -22,7 +22,7 @@ export function setup() { }); it(`changes 'workbench.action.toggleSidebarPosition' command key binding and verifies it`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.LEFT), 'Activity bar should be positioned on the left.'); await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', 'ctrl+u', 'Control+U'); @@ -32,7 +32,7 @@ export function setup() { }); after(async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.settingsEditor.clearUserSettings(); }); }); diff --git a/test/smoke/src/areas/search/search.test.ts b/test/smoke/src/areas/search/search.test.ts index 9351c8fafe4..484e428e7b1 100644 --- a/test/smoke/src/areas/search/search.test.ts +++ b/test/smoke/src/areas/search/search.test.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; export function setup() { describe('Search', () => { it('searches for body & checks for correct result number', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.search.openSearchViewlet(); await app.workbench.search.searchFor('body'); @@ -16,7 +16,7 @@ export function setup() { }); it('searches only for *.js files & checks for correct result number', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.search.searchFor('body'); await app.workbench.search.showQueryDetails(); await app.workbench.search.setFilesToIncludeText('*.js'); @@ -28,14 +28,14 @@ export function setup() { }); it('dismisses result & checks for correct result number', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.search.searchFor('body'); await app.workbench.search.removeFileMatch(1); await app.workbench.search.waitForResultText('10 results in 4 files'); }); it('replaces first search result with a replace term', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.search.searchFor('body'); await app.workbench.search.expandReplace(); diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 78954928847..3c748bde9bb 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -3,13 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication, Quality } from '../../application'; +import { Application, Quality } from '../../application'; import { StatusBarElement } from './statusbar'; export function setup() { describe('Statusbar', () => { it('verifies presence of all default status bar elements', async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); if (app.quality !== Quality.Dev) { @@ -27,7 +27,7 @@ export function setup() { }); it(`verifies that 'quick open' opens when clicking on status bar elements`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.statusbar.clickOn(StatusBarElement.BRANCH_STATUS); await app.workbench.quickopen.waitForQuickOpenOpened(); @@ -49,14 +49,14 @@ export function setup() { }); it(`verifies that 'Problems View' appears when clicking on 'Problems' status element`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.statusbar.clickOn(StatusBarElement.PROBLEMS_STATUS); await app.workbench.problems.waitForProblemsView(); }); it(`verifies that 'Tweet us feedback' pop-up appears when clicking on 'Feedback' icon`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; if (app.quality === Quality.Dev) { return this.skip(); @@ -67,7 +67,7 @@ export function setup() { }); it(`checks if 'Go to Line' works if called from the status bar`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('app.js'); await app.workbench.statusbar.clickOn(StatusBarElement.SELECTION_STATUS); @@ -79,7 +79,7 @@ export function setup() { }); it(`verifies if changing EOL is reflected in the status bar`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.quickopen.openFile('app.js'); await app.workbench.statusbar.clickOn(StatusBarElement.EOL_STATUS); diff --git a/test/smoke/src/areas/terminal/terminal.test.ts b/test/smoke/src/areas/terminal/terminal.test.ts deleted file mode 100644 index 5713e281cc7..00000000000 --- a/test/smoke/src/areas/terminal/terminal.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// import { SpectronApplication } from '../../application'; - -describe('Terminal', () => { - // let app: SpectronApplication; - // before(() => { app = new SpectronApplication(); return app.start('Terminal'); }); - // after(() => app.stop()); - - // it(`opens terminal, runs 'echo' and verifies the output`, async function () { - // const expected = new Date().getTime().toString(); - // await app.workbench.terminal.showTerminal(); - - // await app.workbench.terminal.runCommand(`echo ${expected}`); - - // await app.workbench.terminal.waitForTerminalText(terminalText => { - // // Last line will not contain the output - // for (let index = terminalText.length - 2; index >= 0; index--) { - // if (!!terminalText[index] && terminalText[index].trim() === expected) { - // return true; - // } - // } - // return false; - // }); - // }); -}); \ No newline at end of file diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts deleted file mode 100644 index e69916b475f..00000000000 --- a/test/smoke/src/areas/terminal/terminal.ts +++ /dev/null @@ -1,45 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { API } from '../../api'; -import { Commands } from '../workbench/workbench'; - -const PANEL_SELECTOR = 'div[id="workbench.panel.terminal"]'; -const XTERM_SELECTOR = `${PANEL_SELECTOR} .terminal-wrapper`; - -export class Terminal { - - constructor(private api: API, private commands: Commands) { } - - async showTerminal(): Promise { - if (!await this.isVisible()) { - await this.commands.runCommand('View: Toggle Integrated Terminal'); - await this.api.waitForElement(XTERM_SELECTOR); - await this.waitForTerminalText(text => text.length > 0, 'Waiting for Terminal to be ready'); - } - } - - isVisible(): Promise { - return this.api.doesElementExist(PANEL_SELECTOR); - } - - async runCommand(commandText: string): Promise { - // TODO@Tyriar fix this. we should not use type but setValue - // await this.spectron.client.type(commandText); - await this.api.dispatchKeybinding('enter'); - } - - async waitForTerminalText(fn: (text: string[]) => boolean, timeOutDescription: string = 'Getting Terminal Text'): Promise { - await this.api.waitFor(async () => { - const terminalText = await this.api.getTerminalBuffer(XTERM_SELECTOR); - return fn(terminalText); - }, void 0, timeOutDescription); - } - - async getCurrentLineNumber(): Promise { - const terminalText = await this.api.getTerminalBuffer(XTERM_SELECTOR); - return terminalText.length; - } -} \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index 2781d043ea4..4dc1e37ab26 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SpectronApplication } from '../../application'; +import { Application } from '../../application'; export function setup() { describe('Dataloss', () => { it(`verifies that 'hot exit' works for dirty files`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; await app.workbench.editors.newUntitledFile(); const untitled = 'Untitled-1'; diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index c48d216f80b..510cea17736 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -5,11 +5,11 @@ import * as assert from 'assert'; -import { SpectronApplication, Quality } from '../../application'; +import { Application, Quality } from '../../application'; import * as rimraf from 'rimraf'; export interface ICreateAppFn { - (quality: Quality): SpectronApplication | null; + (quality: Quality): Application | null; } export function setup(userDataDir: string, createApp: ICreateAppFn) { diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index 2a41c77ea20..e3cc585758e 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -5,12 +5,12 @@ import * as assert from 'assert'; -import { SpectronApplication, Quality } from '../../application'; +import { Application, Quality } from '../../application'; export function setup() { describe('Localization', () => { before(async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; if (app.quality === Quality.Dev) { return; @@ -20,7 +20,7 @@ export function setup() { }); it(`starts with 'DE' locale and verifies title and viewlets text is in German`, async function () { - const app = this.app as SpectronApplication; + const app = this.app as Application; if (app.quality === Quality.Dev) { this.skip(); diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index 01760d509a0..645466acd3b 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -15,7 +15,6 @@ import { StatusBar } from '../statusbar/statusbar'; import { Problems } from '../problems/problems'; import { SettingsEditor } from '../preferences/settings'; import { KeybindingsEditor } from '../preferences/keybindings'; -import { Terminal } from '../terminal/terminal'; import { API } from '../../api'; import { Editors } from '../editor/editors'; @@ -38,7 +37,6 @@ export class Workbench implements Commands { readonly problems: Problems; readonly settingsEditor: SettingsEditor; readonly keybindingsEditor: KeybindingsEditor; - readonly terminal: Terminal; constructor(private api: API, private keybindings: any[], userDataPath: string) { this.editors = new Editors(api, this); @@ -54,7 +52,6 @@ export class Workbench implements Commands { this.problems = new Problems(api, this); this.settingsEditor = new SettingsEditor(api, userDataPath, this, this.editors, this.editor); this.keybindingsEditor = new KeybindingsEditor(api, this); - this.terminal = new Terminal(api, this); } /** diff --git a/test/smoke/src/driver.ts b/test/smoke/src/driver.ts deleted file mode 100644 index 3906cf2ad6c..00000000000 --- a/test/smoke/src/driver.ts +++ /dev/null @@ -1,271 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { SpectronClient } from 'spectron'; -import { IDriver } from './vscode/driver'; - -export interface Element { - tagName: string; - className: string; - textContent: string; - attributes: { [name: string]: string }; - children: Element[]; -} - -export interface Driver { - dispatchKeybinding(keybinding: string): Promise; - click(selector: string, xoffset?: number, yoffset?: number): Promise; - doubleClick(selector: string): Promise; - move(selector: string): Promise; - setValue(selector: string, text: string): Promise; - getTitle(): Promise; - - isActiveElement(selector: string): Promise; - getElements(selector: string, recursive?: boolean): Promise; - typeInEditor(selector: string, text: string): Promise; - getTerminalBuffer(selector: string): Promise; -} - -export class SpectronDriver implements Driver { - - constructor( - private spectronClient: SpectronClient, - private verbose: boolean - ) { } - - dispatchKeybinding(keybinding: string): Promise { - return Promise.reject(new Error('not implemented')); - } - - async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { - if (this.verbose) { - console.log('- click:', selector, xoffset, yoffset); - } - - await this.spectronClient.leftClick(selector, xoffset, yoffset); - - if (this.verbose) { - console.log('- click DONE'); - } - } - - async doubleClick(selector: string): Promise { - if (this.verbose) { - console.log('- doubleClick:', selector); - } - - await this.spectronClient.doubleClick(selector); - } - - async move(selector: string): Promise { - if (this.verbose) { - console.log('- move:', selector); - } - - await this.spectronClient.moveToObject(selector); - } - - async setValue(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- setValue:', selector, text); - } - - await this.spectronClient.setValue(selector, text); - } - - async getTitle(): Promise { - if (this.verbose) { - console.log('- getTitle'); - } - - return await this.spectronClient.getTitle(); - } - - async isActiveElement(selector: string): Promise { - if (this.verbose) { - console.log('- isActiveElement:', selector); - } - - const result = await (this.spectronClient.execute(s => document.activeElement.matches(s), selector) as any as Promise<{ value: boolean; }>); - return result.value; - } - - async getElements(selector: string): Promise { - if (this.verbose) { - console.log('- getElements:', selector); - } - - const result = await (this.spectronClient.execute(selector => { - const query = document.querySelectorAll(selector); - const result: Element[] = []; - - for (let i = 0; i < query.length; i++) { - const element: HTMLElement = query.item(i); - - result.push({ - tagName: element.tagName, - className: element.className, - textContent: element.textContent || '', - attributes: {}, - children: [] - }); - } - - return result; - }, selector) as any as Promise<{ value: Element[]; }>); - - return result.value; - } - - typeInEditor(selector: string, text: string): Promise { - throw new Error('Method not implemented.'); - } - - getTerminalBuffer(selector: string): Promise { - throw new Error('Method not implemented.'); - } -} - -export class CodeDriver implements Driver { - - constructor( - private driver: IDriver, - private verbose: boolean - ) { } - - private _activeWindowId: number | undefined = undefined; - - async dispatchKeybinding(keybinding: string): Promise { - if (this.verbose) { - console.log('- dispatchKeybinding:', keybinding); - } - - const windowId = await this.getWindowId(); - await this.driver.dispatchKeybinding(windowId, keybinding); - } - - async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { - if (this.verbose) { - console.log('- click:', selector); - } - - const windowId = await this.getWindowId(); - await this.driver.click(windowId, selector, xoffset, yoffset); - } - - async doubleClick(selector: string): Promise { - if (this.verbose) { - console.log('- doubleClick:', selector); - } - - const windowId = await this.getWindowId(); - await this.driver.doubleClick(windowId, selector); - } - - async move(selector: string): Promise { - if (this.verbose) { - console.log('- move:', selector); - } - - const windowId = await this.getWindowId(); - await this.driver.move(windowId, selector); - } - - async setValue(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- setValue:', selector, text); - } - - const windowId = await this.getWindowId(); - await this.driver.setValue(windowId, selector, text); - } - - async getTitle(): Promise { - if (this.verbose) { - console.log('- getTitle:'); - } - - const windowId = await this.getWindowId(); - return await this.driver.getTitle(windowId); - } - - async isActiveElement(selector: string): Promise { - if (this.verbose) { - console.log('- isActiveElement:', selector); - } - - const windowId = await this.getWindowId(); - return await this.driver.isActiveElement(windowId, selector); - } - - async getElements(selector: string, recursive = false): Promise { - if (this.verbose) { - console.log('- getElements:', selector); - } - - const windowId = await this.getWindowId(); - return await this.driver.getElements(windowId, selector, recursive); - } - - async typeInEditor(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- typeInEditor:', selector, text); - } - - const windowId = await this.getWindowId(); - return await this.driver.typeInEditor(windowId, selector, text); - } - - async getTerminalBuffer(selector: string): Promise { - if (this.verbose) { - console.log('- getTerminalBuffer:', selector); - } - - const windowId = await this.getWindowId(); - return await this.driver.getTerminalBuffer(windowId, selector); - } - - private async getWindowId(): Promise { - if (typeof this._activeWindowId !== 'number') { - const windows = await this.driver.getWindowIds(); - this._activeWindowId = windows[0]; - } - - return this._activeWindowId; - } -} - -export function findElement(element: Element, fn: (element: Element) => boolean): Element | null { - const queue = [element]; - - while (queue.length > 0) { - const element = queue.shift()!; - - if (fn(element)) { - return element; - } - - queue.push(...element.children); - } - - return null; -} - -export function findElements(element: Element, fn: (element: Element) => boolean): Element[] { - const result: Element[] = []; - const queue = [element]; - - while (queue.length > 0) { - const element = queue.shift()!; - - if (fn(element)) { - result.push(element); - } - - queue.push(...element.children); - } - - return result; -} \ No newline at end of file diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index c4221af778d..a534d232691 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -11,9 +11,9 @@ import * as minimist from 'minimist'; import * as tmp from 'tmp'; import * as rimraf from 'rimraf'; import * as mkdirp from 'mkdirp'; -import { SpectronApplication, Quality } from './application'; -import { setup as setupDataMigrationTests } from './areas/workbench/data-migration.test'; +import { Application, Quality } from './application'; +import { setup as setupDataMigrationTests } from './areas/workbench/data-migration.test'; import { setup as setupDataLossTests } from './areas/workbench/data-loss.test'; import { setup as setupDataExplorerTests } from './areas/explorer/explorer.test'; import { setup as setupDataPreferencesTests } from './areas/preferences/preferences.test'; @@ -26,7 +26,6 @@ import { setup as setupDataStatusbarTests } from './areas/statusbar/statusbar.te import { setup as setupDataExtensionTests } from './areas/extensions/extensions.test'; import { setup as setupDataMultirootTests } from './areas/multiroot/multiroot.test'; import { setup as setupDataLocalizationTests } from './areas/workbench/localization.test'; -// import './areas/terminal/terminal.test'; const tmpDir = tmp.dirSync({ prefix: 't' }) as { name: string; removeCallback: Function; }; const testDataPath = tmpDir.name; @@ -37,7 +36,6 @@ const opts = minimist(args, { string: [ 'build', 'stable-build', - 'log', 'wait-time', 'test-repo', 'keybindings' @@ -50,8 +48,6 @@ const opts = minimist(args, { } }); -const artifactsPath = opts.log || ''; - const workspaceFilePath = path.join(testDataPath, 'smoketest.code-workspace'); const testRepoUrl = 'https://github.com/Microsoft/vscode-smoketest-express'; const workspacePath = path.join(testDataPath, 'vscode-smoketest-express'); @@ -232,41 +228,19 @@ async function setup(): Promise { console.log('*** Smoketest setup done!\n'); } -/** - * WebDriverIO 4.8.0 outputs all kinds of "deprecation" warnings - * for common commands like `keys` and `moveToObject`. - * According to https://github.com/Codeception/CodeceptJS/issues/531, - * these deprecation warnings are for Firefox, and have no alternative replacements. - * Since we can't downgrade WDIO as suggested (it's Spectron's dep, not ours), - * we must suppress the warning with a classic monkey-patch. - * - * @see webdriverio/lib/helpers/depcrecationWarning.js - * @see https://github.com/webdriverio/webdriverio/issues/2076 - */ -// Filter out the following messages: -const wdioDeprecationWarning = /^WARNING: the "\w+" command will be deprecated soon../; // [sic] -// Monkey patch: -const warn = console.warn; -console.warn = function suppressWebdriverWarnings(message) { - if (wdioDeprecationWarning.test(message)) { return; } - warn.apply(console, arguments); -}; - -function createApp(quality: Quality): SpectronApplication | null { +function createApp(quality: Quality): Application | null { const path = quality === Quality.Stable ? stablePath : electronPath; if (!path) { return null; } - return new SpectronApplication({ + return new Application({ quality, codePath: opts.build, - electronPath: path, workspacePath, userDataDir, extensionsPath, - artifactsPath, workspaceFilePath, waitTime: parseInt(opts['wait-time'] || '0') || 20, verbose: opts.verbose diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index a6c8f689aa0..2f15aec3278 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -78,14 +78,6 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - -ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" - ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" @@ -94,20 +86,10 @@ ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - dependencies: - color-convert "^1.9.0" - anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" @@ -119,30 +101,6 @@ aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" -archiver-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" - dependencies: - glob "^7.0.0" - graceful-fs "^4.1.0" - lazystream "^1.0.0" - lodash "^4.8.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - -archiver@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.0.tgz#d2df2e8d5773a82c1dcce925ccc41450ea999afd" - dependencies: - archiver-utils "^1.3.0" - async "^2.0.0" - buffer-crc32 "^0.2.1" - glob "^7.0.0" - lodash "^4.8.0" - readable-stream "^2.0.0" - tar-stream "^1.5.0" - zip-stream "^1.2.0" - are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" @@ -196,20 +154,10 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^2.0.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - dependencies: - lodash "^4.14.0" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -atob@~1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" - aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -226,7 +174,7 @@ aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-runtime@^6.26.0, babel-runtime@^6.9.2: +babel-runtime@^6.9.2: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -247,12 +195,6 @@ binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" -bl@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" - dependencies: - readable-stream "^2.0.5" - block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -300,10 +242,6 @@ browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" -buffer-crc32@^0.2.1: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -333,14 +271,6 @@ chalk@0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" -chalk@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -356,16 +286,6 @@ chokidar@^1.6.0: optionalDependencies: fsevents "^1.0.0" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -374,16 +294,6 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" -color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" @@ -404,15 +314,6 @@ commander@^2.8.1: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" -compress-commons@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" - dependencies: - buffer-crc32 "^0.2.1" - crc32-stream "^2.0.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -466,17 +367,6 @@ cpx@^1.5.0: shell-quote "^1.6.1" subarg "^1.0.0" -crc32-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" - dependencies: - crc "^3.4.4" - readable-stream "^2.0.0" - -crc@^3.4.4: - version "3.5.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.5.0.tgz#98b8ba7d489665ba3979f59b21381374101a1964" - cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -489,25 +379,6 @@ cryptiles@3.x.x: dependencies: boom "5.x.x" -css-parse@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - dependencies: - css "^2.0.0" - -css-value@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea" - -css@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" - dependencies: - inherits "^2.0.1" - source-map "^0.1.38" - source-map-resolve "^0.3.0" - urix "^0.1.0" - currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -544,10 +415,6 @@ deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" -deepmerge@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -560,10 +427,6 @@ detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" -dev-null@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dev-null/-/dev-null-0.1.1.tgz#5a205ce3c2b2ef77b6238d6ba179eb74c6a0e818" - diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" @@ -606,17 +469,6 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -ejs@~2.5.6: - version "2.5.7" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" - -electron-chromedriver@~1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-1.7.1.tgz#008c97976007aa4eb18491ee095e94d17ee47610" - dependencies: - electron-download "^4.1.0" - extract-zip "^1.6.5" - electron-download@^3.0.1: version "3.3.0" resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" @@ -631,20 +483,6 @@ electron-download@^3.0.1: semver "^5.3.0" sumchecker "^1.2.0" -electron-download@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.0.tgz#bf932c746f2f87ffcc09d1dd472f2ff6b9187845" - dependencies: - debug "^2.2.0" - env-paths "^1.0.0" - fs-extra "^2.0.0" - minimist "^1.2.0" - nugget "^2.0.0" - path-exists "^3.0.0" - rc "^1.1.2" - semver "^5.3.0" - sumchecker "^2.0.1" - electron@1.7.7: version "1.7.7" resolved "https://registry.yarnpkg.com/electron/-/electron-1.7.7.tgz#cfd89ca9eba79d763ac0b0c6dcc583792097b9b6" @@ -653,20 +491,10 @@ electron@1.7.7: electron-download "^3.0.1" extract-zip "^1.0.3" -end-of-stream@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" - dependencies: - once "^1.4.0" - entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -env-paths@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" @@ -677,7 +505,7 @@ es6-promise@^4.0.5: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -703,21 +531,13 @@ extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -external-editor@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.5.tgz#52c249a3981b9ba187c7cacf5beb50bf1d91a6bc" - dependencies: - iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.33" - extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" dependencies: is-extglob "^1.0.0" -extract-zip@^1.0.3, extract-zip@^1.6.5: +extract-zip@^1.0.3: version "1.6.6" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" dependencies: @@ -744,12 +564,6 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -815,13 +629,6 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -863,12 +670,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" - dependencies: - globule "^1.0.0" - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -909,7 +710,7 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.5, glob@~7.1.1: +glob@^7.0.5: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -920,15 +721,7 @@ glob@^7.0.0, glob@^7.0.5, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -globule@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" - dependencies: - glob "~7.1.1" - lodash "~4.17.4" - minimatch "~3.0.2" - -graceful-fs@^4.1.0, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -972,10 +765,6 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -1045,10 +834,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -1070,25 +855,6 @@ ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1139,10 +905,6 @@ is-fullwidth-code-point@^1.0.0: dependencies: number-is-nan "^1.0.0" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -1169,10 +931,6 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1203,10 +961,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jschardet@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" - json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -1266,12 +1020,6 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -1329,10 +1077,6 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash@^4.14.0, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - lodash@^4.5.1: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" @@ -1405,11 +1149,7 @@ mime-types@~2.1.7: dependencies: mime-db "~1.33.0" -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -1423,17 +1163,13 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - mkdirp@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" dependencies: minimist "0.0.8" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -1460,10 +1196,6 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - nan@^2.3.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -1510,10 +1242,6 @@ normalize-path@^2.0.0, normalize-path@^2.0.1: dependencies: remove-trailing-separator "^1.0.1" -npm-install-package@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/npm-install-package/-/npm-install-package-2.1.0.tgz#d7efe3cfcd7ab00614b896ea53119dc9ab259125" - npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -1558,25 +1286,12 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -optimist@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -1613,10 +1328,6 @@ path-exists@^2.0.0, path-exists@^2.1.0: dependencies: pinkie-promise "^2.0.0" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -1693,18 +1404,10 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@~1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -1713,10 +1416,6 @@ qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" @@ -1757,7 +1456,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.2.2: +readable-stream@^2.0.2, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -1861,7 +1560,7 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@^2.45.0, request@^2.81.0, request@~2.83.0: +request@^2.45.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -1888,49 +1587,18 @@ request@^2.45.0, request@^2.81.0, request@~2.83.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -resolve-url@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - resolve@^1.1.7: version "1.7.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.0.tgz#2bdf5374811207285df0df652b78f118ab8f3c5e" dependencies: path-parse "^1.0.5" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -rgb2hex@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.0.tgz#ccd55f860ae0c5c4ea37504b958e442d8d12325b" - rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - rx@2.3.24: version "2.3.24" resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" @@ -1960,7 +1628,7 @@ shell-quote@^1.6.1: array-reduce "~0.0.0" jsonify "~0.0.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -1982,25 +1650,6 @@ sntp@2.x.x: dependencies: hoek "4.x.x" -source-map-resolve@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761" - dependencies: - atob "~1.1.0" - resolve-url "~0.2.1" - source-map-url "~0.3.0" - urix "~0.1.0" - -source-map-url@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" - -source-map@^0.1.38: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - dependencies: - amdefine ">=0.0.4" - spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" @@ -2019,26 +1668,10 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" -spectron@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/spectron/-/spectron-3.7.2.tgz#86f41306a9b70ed6ee1500f7f7d3adc389afb446" - dependencies: - dev-null "^0.1.1" - electron-chromedriver "~1.7.1" - request "^2.81.0" - split "^1.0.0" - webdriverio "^4.8.0" - speedometer@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - dependencies: - through "2" - sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" @@ -2061,13 +1694,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -2100,12 +1726,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -2135,12 +1755,6 @@ sumchecker@^1.2.0: debug "^2.2.0" es6-promise "^4.0.5" -sumchecker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" - dependencies: - debug "^2.2.0" - supports-color@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" @@ -2157,18 +1771,6 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - dependencies: - has-flag "^2.0.0" - -supports-color@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.0.0.tgz#1db26229f6ae02f9acdb5410907c36ce2e362b13" - dependencies: - has-flag "^2.0.0" - tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" @@ -2182,15 +1784,6 @@ tar-pack@^3.4.0: tar "^2.2.1" uid-number "^0.0.6" -tar-stream@^1.5.0: - version "1.5.5" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -2210,11 +1803,7 @@ through2@~0.2.3: readable-stream "~1.1.9" xtend "~2.1.1" -through@2, through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tmp@0.0.33, tmp@^0.0.33: +tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: @@ -2262,17 +1851,6 @@ uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -urix@^0.1.0, urix@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -2292,10 +1870,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -validator@~9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/validator/-/validator-9.1.1.tgz#3bdd1065cbd28f9d96ac806dee01030d32fd97ef" - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -2311,59 +1885,16 @@ watch@^1.0.2: exec-sh "^0.2.0" minimist "^1.2.0" -wdio-dot-reporter@~0.0.8: - version "0.0.9" - resolved "https://registry.yarnpkg.com/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz#929b2adafd49d6b0534fda068e87319b47e38fe5" - -webdriverio@^4.8.0: - version "4.9.8" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-4.9.8.tgz#907180e715d3b9e16cabe20bad59854bec1e44fa" - dependencies: - archiver "~2.1.0" - babel-runtime "^6.26.0" - css-parse "~2.0.0" - css-value "~0.0.1" - deepmerge "~2.0.1" - ejs "~2.5.6" - gaze "~1.1.2" - glob "~7.1.1" - inquirer "~3.3.0" - json-stringify-safe "~5.0.1" - mkdirp "~0.5.1" - npm-install-package "~2.1.0" - optimist "~0.6.1" - q "~1.5.0" - request "~2.83.0" - rgb2hex "~0.1.0" - safe-buffer "~5.1.1" - supports-color "~5.0.0" - url "~0.11.0" - validator "~9.1.1" - wdio-dot-reporter "~0.0.8" - wgxpath "~1.0.0" - -wgxpath@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" - wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: string-width "^1.0.2" -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" @@ -2375,12 +1906,3 @@ yauzl@2.4.1: resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" dependencies: fd-slicer "~1.0.1" - -zip-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" - dependencies: - archiver-utils "^1.3.0" - compress-commons "^1.2.0" - lodash "^4.8.0" - readable-stream "^2.0.0" From c92769faa1a866ae4ba2d4e7452fdaabc456224d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 14:26:50 +0200 Subject: [PATCH 125/710] don't allow double read, #41985, #47475 --- .../services/files/electron-browser/remoteFileService.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index d9420bb679f..27316a8c33e 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -227,8 +227,12 @@ export class RemoteFileService extends FileService { private _createReadStream(provider: IFileSystemProvider, resource: URI): Readable { return new class extends Readable { + _readOperation: Thenable; _read(size?: number): void { - provider.readFile(resource).then(data => { + if (this._readOperation) { + return; + } + this._readOperation = provider.readFile(resource).then(data => { this.push(data); this.push(null); }, err => { From 59cc8326ff0b8130cd75a9ce3065d95008fa7a28 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 11 Apr 2018 14:52:18 +0200 Subject: [PATCH 126/710] fileservice :lipstick: --- .../relauncher.contribution.ts | 12 +- .../files/electron-browser/fileService.ts | 150 ++++++++---------- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts index e1b621a5d90..9981d15cb98 100644 --- a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts +++ b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts @@ -20,13 +20,14 @@ import { isEqual } from 'vs/base/common/resources'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { equals } from 'vs/base/common/objects'; interface IConfiguration extends IWindowsConfiguration { update: { channel: string; }; telemetry: { enableCrashReporter: boolean }; keyboard: { touchbar: { enabled: boolean } }; workbench: { tree: { horizontalScrolling: boolean } }; - files: { useExperimentalFileWatcher: boolean }; + files: { useExperimentalFileWatcher: boolean, watcherExclude: object }; } export class SettingsChangeRelauncher implements IWorkbenchContribution { @@ -42,6 +43,7 @@ export class SettingsChangeRelauncher implements IWorkbenchContribution { private treeHorizontalScrolling: boolean; private windowsSmoothScrollingWorkaround: boolean; private experimentalFileWatcher: boolean; + private fileWatcherExclude: object; private firstFolderResource: URI; private extensionHostRestarter: RunOnceScheduler; @@ -111,6 +113,14 @@ export class SettingsChangeRelauncher implements IWorkbenchContribution { changed = true; } + // File Watcher Excludes (only if in folder workspace mode) + if (!this.experimentalFileWatcher && this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { + if (config.files && typeof config.files.watcherExclude === 'object' && !equals(config.files.watcherExclude, this.fileWatcherExclude)) { + this.fileWatcherExclude = config.files.watcherExclude; + changed = true; + } + } + // macOS: Touchbar config if (isMacintosh && config.keyboard && config.keyboard.touchbar && typeof config.keyboard.touchbar.enabled === 'boolean' && config.keyboard.touchbar.enabled !== this.touchbarEnabled) { this.touchbarEnabled = config.keyboard.touchbar.enabled; diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index 39c172f4de5..cce04a6b64f 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -47,61 +47,6 @@ import product from 'vs/platform/node/product'; import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; import { shell } from 'electron'; -export interface IEncodingOverride { - parent?: uri; - extension?: string; - encoding: string; -} - -export interface IFileServiceTestOptions { - tmpDir?: string; - disableWatcher?: boolean; - encodingOverride?: IEncodingOverride[]; -} - -function etag(stat: fs.Stats): string; -function etag(size: number, mtime: number): string; -function etag(arg1: any, arg2?: any): string { - let size: number; - let mtime: number; - if (typeof arg2 === 'number') { - size = arg1; - mtime = arg2; - } else { - size = (arg1).size; - mtime = (arg1).mtime.getTime(); - } - - return `"${crypto.createHash('sha1').update(String(size) + String(mtime)).digest('hex')}"`; -} - -class BufferPool { - - static _64K = new BufferPool(64 * 1024, 5); - - constructor( - readonly bufferSize: number, - private readonly _capacity: number, - private readonly _free: Buffer[] = [], - ) { - // - } - - acquire(): Buffer { - if (this._free.length === 0) { - return Buffer.allocUnsafe(this.bufferSize); - } else { - return this._free.shift(); - } - } - - release(buf: Buffer): void { - if (this._free.length <= this._capacity) { - this._free.push(buf); - } - } -} - export class FileService implements IFileService { public _serviceBrand: any; @@ -118,8 +63,6 @@ export class FileService implements IFileService { protected readonly _onFileChanges: Emitter; protected readonly _onAfterOperation: Emitter; - private tmpPath: string; - private toDispose: IDisposable[]; private activeWorkspaceFileChangeWatcher: IDisposable; @@ -127,9 +70,6 @@ export class FileService implements IFileService { private fileChangesWatchDelayer: ThrottledDelayer; private undeliveredRawFileChangesEvents: IRawFileChange[]; - private useExperimentalFileWatcher: boolean; - private watcherIgnoredPatterns: string[]; - private encodingOverride: IEncodingOverride[]; constructor( @@ -143,7 +83,6 @@ export class FileService implements IFileService { private options: IFileServiceTestOptions = Object.create(null) ) { this.toDispose = []; - this.tmpPath = this.options.tmpDir || os.tmpdir(); this._onFileChanges = new Emitter(); this.toDispose.push(this._onFileChanges); @@ -155,15 +94,6 @@ export class FileService implements IFileService { this.fileChangesWatchDelayer = new ThrottledDelayer(FileService.FS_EVENT_DELAY); this.undeliveredRawFileChangesEvents = []; - const configuration = this.configurationService.getValue(); - - this.watcherIgnoredPatterns = []; - if (configuration.files && configuration.files.watcherExclude) { - this.watcherIgnoredPatterns = Object.keys(configuration.files.watcherExclude).filter(k => !!configuration.files.watcherExclude[k]); - } - - this.useExperimentalFileWatcher = configuration.files && configuration.files.useExperimentalFileWatcher; - this.encodingOverride = this.options.encodingOverride || this.getEncodingOverrides(); this.registerListeners(); @@ -281,26 +211,32 @@ export class FileService implements IFileService { } // new watcher: use it if setting tells us so or we run in multi-root environment - if (this.useExperimentalFileWatcher || workbenchState === WorkbenchState.WORKSPACE) { + const configuration = this.configurationService.getValue(); + if ((configuration.files && configuration.files.useExperimentalFileWatcher) || workbenchState === WorkbenchState.WORKSPACE) { this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupNsfwWorkspaceWatching().startWatching()); } // old watcher else { + let watcherIgnoredPatterns: string[] = []; + if (configuration.files && configuration.files.watcherExclude) { + watcherIgnoredPatterns = Object.keys(configuration.files.watcherExclude).filter(k => !!configuration.files.watcherExclude[k]); + } + if (isWindows) { - this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupWin32WorkspaceWatching().startWatching()); + this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupWin32WorkspaceWatching(watcherIgnoredPatterns).startWatching()); } else { - this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupUnixWorkspaceWatching().startWatching()); + this.activeWorkspaceFileChangeWatcher = toDisposable(this.setupUnixWorkspaceWatching(watcherIgnoredPatterns).startWatching()); } } } - private setupWin32WorkspaceWatching(): WindowsWatcherService { - return new WindowsWatcherService(this.contextService, this.watcherIgnoredPatterns, e => this._onFileChanges.fire(e), err => this.handleError(err), this.environmentService.verbose); + private setupWin32WorkspaceWatching(watcherIgnoredPatterns: string[]): WindowsWatcherService { + return new WindowsWatcherService(this.contextService, watcherIgnoredPatterns, e => this._onFileChanges.fire(e), err => this.handleError(err), this.environmentService.verbose); } - private setupUnixWorkspaceWatching(): UnixWatcherService { - return new UnixWatcherService(this.contextService, this.watcherIgnoredPatterns, e => this._onFileChanges.fire(e), err => this.handleError(err), this.environmentService.verbose); + private setupUnixWorkspaceWatching(watcherIgnoredPatterns: string[]): UnixWatcherService { + return new UnixWatcherService(this.contextService, watcherIgnoredPatterns, e => this._onFileChanges.fire(e), err => this.handleError(err), this.environmentService.verbose); } private setupNsfwWorkspaceWatching(): NsfwWatcherService { @@ -745,7 +681,7 @@ export class FileService implements IFileService { writeOptions.encoding = this.getEncoding(resource, options.encoding); // 2.) write to a temporary file to be able to copy over later - const tmpPath = paths.join(this.tmpPath, `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`); + const tmpPath = paths.join(os.tmpdir(), `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`); return this.updateContent(uri.file(tmpPath), value, writeOptions).then(() => { // 3.) invoke our CLI as super user @@ -773,7 +709,7 @@ export class FileService implements IFileService { }).then(() => { // 3.) delete temp file - return pfs.del(tmpPath, this.tmpPath).then(() => { + return pfs.del(tmpPath, os.tmpdir()).then(() => { // 4.) resolve again return this.resolve(resource); @@ -1033,7 +969,7 @@ export class FileService implements IFileService { private doDelete(resource: uri): TPromise { const absolutePath = this.toAbsolutePath(resource); - return pfs.del(absolutePath, this.tmpPath).then(() => { + return pfs.del(absolutePath, os.tmpdir()).then(() => { // Events this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.DELETE)); @@ -1245,6 +1181,60 @@ export class FileService implements IFileService { } } +export interface IEncodingOverride { + parent?: uri; + extension?: string; + encoding: string; +} + +export interface IFileServiceTestOptions { + disableWatcher?: boolean; + encodingOverride?: IEncodingOverride[]; +} + +function etag(stat: fs.Stats): string; +function etag(size: number, mtime: number): string; +function etag(arg1: any, arg2?: any): string { + let size: number; + let mtime: number; + if (typeof arg2 === 'number') { + size = arg1; + mtime = arg2; + } else { + size = (arg1).size; + mtime = (arg1).mtime.getTime(); + } + + return `"${crypto.createHash('sha1').update(String(size) + String(mtime)).digest('hex')}"`; +} + +class BufferPool { + + static _64K = new BufferPool(64 * 1024, 5); + + constructor( + readonly bufferSize: number, + private readonly _capacity: number, + private readonly _free: Buffer[] = [], + ) { + // + } + + acquire(): Buffer { + if (this._free.length === 0) { + return Buffer.allocUnsafe(this.bufferSize); + } else { + return this._free.shift(); + } + } + + release(buf: Buffer): void { + if (this._free.length <= this._capacity) { + this._free.push(buf); + } + } +} + export class StatResolver { private name: string; private etag: string; From 5d48d47129d6daa981a9a028ddb76086f3481886 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 16:20:09 +0200 Subject: [PATCH 127/710] remove API --- src/vs/platform/driver/common/driver.ts | 2 +- test/smoke/src/api.ts | 267 ------------------ test/smoke/src/application.ts | 30 +- .../src/areas/activitybar/activityBar.ts | 10 +- test/smoke/src/areas/css/css.test.ts | 10 +- test/smoke/src/areas/debug/debug.test.ts | 8 +- test/smoke/src/areas/debug/debug.ts | 54 ++-- test/smoke/src/areas/editor/editor.ts | 38 +-- test/smoke/src/areas/editor/editors.ts | 12 +- test/smoke/src/areas/editor/peek.ts | 16 +- .../smoke/src/areas/explorer/explorer.test.ts | 4 +- test/smoke/src/areas/explorer/explorer.ts | 10 +- test/smoke/src/areas/extensions/extensions.ts | 18 +- test/smoke/src/areas/git/git.test.ts | 6 +- test/smoke/src/areas/git/scm.ts | 28 +- .../src/areas/multiroot/multiroot.test.ts | 2 +- .../src/areas/preferences/keybindings.ts | 22 +- .../src/areas/preferences/preferences.test.ts | 6 +- test/smoke/src/areas/preferences/settings.ts | 14 +- test/smoke/src/areas/problems/problems.ts | 10 +- test/smoke/src/areas/quickopen/quickopen.ts | 28 +- test/smoke/src/areas/search/search.ts | 56 ++-- .../src/areas/statusbar/statusbar.test.ts | 2 +- test/smoke/src/areas/statusbar/statusbar.ts | 13 +- test/smoke/src/areas/workbench/viewlet.ts | 8 +- test/smoke/src/areas/workbench/workbench.ts | 32 +-- test/smoke/src/vscode/code.ts | 259 +++++++++++++++-- 27 files changed, 456 insertions(+), 509 deletions(-) delete mode 100644 test/smoke/src/api.ts diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index f859f45075b..6abbc5d59ad 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -34,7 +34,7 @@ export interface IDriver { setValue(windowId: number, selector: string, text: string): TPromise; getTitle(windowId: number): TPromise; isActiveElement(windowId: number, selector: string): TPromise; - getElements(windowId: number, selector: string, recursive: boolean): TPromise; + getElements(windowId: number, selector: string, recursive?: boolean): TPromise; typeInEditor(windowId: number, selector: string, text: string): TPromise; getTerminalBuffer(windowId: number, selector: string): TPromise; } diff --git a/test/smoke/src/api.ts b/test/smoke/src/api.ts deleted file mode 100644 index f11ae031575..00000000000 --- a/test/smoke/src/api.ts +++ /dev/null @@ -1,267 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IDriver, IElement } from './vscode/driver'; - -export class CodeDriver { - - constructor( - private driver: IDriver, - private verbose: boolean - ) { } - - private _activeWindowId: number | undefined = undefined; - - async dispatchKeybinding(keybinding: string): Promise { - if (this.verbose) { - console.log('- dispatchKeybinding:', keybinding); - } - - const windowId = await this.getWindowId(); - await this.driver.dispatchKeybinding(windowId, keybinding); - } - - async click(selector: string, xoffset?: number | undefined, yoffset?: number | undefined): Promise { - if (this.verbose) { - console.log('- click:', selector); - } - - const windowId = await this.getWindowId(); - await this.driver.click(windowId, selector, xoffset, yoffset); - } - - async doubleClick(selector: string): Promise { - if (this.verbose) { - console.log('- doubleClick:', selector); - } - - const windowId = await this.getWindowId(); - await this.driver.doubleClick(windowId, selector); - } - - async move(selector: string): Promise { - if (this.verbose) { - console.log('- move:', selector); - } - - const windowId = await this.getWindowId(); - await this.driver.move(windowId, selector); - } - - async setValue(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- setValue:', selector, text); - } - - const windowId = await this.getWindowId(); - await this.driver.setValue(windowId, selector, text); - } - - async getTitle(): Promise { - if (this.verbose) { - console.log('- getTitle:'); - } - - const windowId = await this.getWindowId(); - return await this.driver.getTitle(windowId); - } - - async isActiveElement(selector: string): Promise { - if (this.verbose) { - console.log('- isActiveElement:', selector); - } - - const windowId = await this.getWindowId(); - return await this.driver.isActiveElement(windowId, selector); - } - - async getElements(selector: string, recursive = false): Promise { - if (this.verbose) { - console.log('- getElements:', selector); - } - - const windowId = await this.getWindowId(); - return await this.driver.getElements(windowId, selector, recursive); - } - - async typeInEditor(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- typeInEditor:', selector, text); - } - - const windowId = await this.getWindowId(); - return await this.driver.typeInEditor(windowId, selector, text); - } - - async getTerminalBuffer(selector: string): Promise { - if (this.verbose) { - console.log('- getTerminalBuffer:', selector); - } - - const windowId = await this.getWindowId(); - return await this.driver.getTerminalBuffer(windowId, selector); - } - - private async getWindowId(): Promise { - if (typeof this._activeWindowId !== 'number') { - const windows = await this.driver.getWindowIds(); - this._activeWindowId = windows[0]; - } - - return this._activeWindowId; - } -} - -export function findElement(element: IElement, fn: (element: IElement) => boolean): IElement | null { - const queue = [element]; - - while (queue.length > 0) { - const element = queue.shift()!; - - if (fn(element)) { - return element; - } - - queue.push(...element.children); - } - - return null; -} - -export function findElements(element: IElement, fn: (element: IElement) => boolean): IElement[] { - const result: IElement[] = []; - const queue = [element]; - - while (queue.length > 0) { - const element = queue.shift()!; - - if (fn(element)) { - result.push(element); - } - - queue.push(...element.children); - } - - return result; -} - -export class API { - - // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding - // the time it takes for the actual retry call to complete - private retryCount: number; - private readonly retryDuration = 100; // in milliseconds - - constructor( - private driver: CodeDriver, - waitTime: number - ) { - this.retryCount = (waitTime * 1000) / this.retryDuration; - } - - dispatchKeybinding(keybinding: string): Promise { - return this.driver.dispatchKeybinding(keybinding); - } - - waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { - accept = accept ? accept : (result => textContent !== void 0 ? textContent === result : !!result); - return this.waitFor(() => this.driver.getElements(selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); - } - - async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { - await this.waitForElement(selector); - return await this.driver.click(selector, xoffset, yoffset); - } - - async waitAndDoubleClick(selector: string): Promise { - await this.waitForElement(selector); - return await this.driver.doubleClick(selector); - } - - async waitAndMove(selector: string): Promise { - await this.waitForElement(selector); - return await this.driver.move(selector); - } - - async setValue(selector: string, text: string): Promise { - await this.waitForElement(selector); - return await this.driver.setValue(selector, text); - } - - async doesElementExist(selector: string): Promise { - const elements = await this.driver.getElements(selector); - return elements.length > 0; - } - - async getElementCount(selector: string): Promise { - const elements = await this.driver.getElements(selector); - return elements.length; - } - - waitForElements(selector: string, recursive: boolean, accept: (result: IElement[]) => boolean = result => result.length > 0): Promise { - return this.waitFor(() => this.driver.getElements(selector, recursive), accept, `elements with selector ${selector}`) as Promise; - } - - waitForElement(selector: string, accept: (result: IElement | undefined) => boolean = result => !!result): Promise { - return this.waitFor(() => this.driver.getElements(selector).then(els => els[0]), accept, `element with selector ${selector}`) as Promise; - } - - waitForActiveElement(selector: string): Promise { - return this.waitFor(() => this.driver.isActiveElement(selector), undefined, `wait for active element: ${selector}`); - } - - getTitle(): Promise { - return this.driver.getTitle(); - } - - typeInEditor(selector: string, text: string): Promise { - return this.driver.typeInEditor(selector, text); - } - - getTerminalBuffer(selector: string): Promise { - return this.driver.getTerminalBuffer(selector); - } - - private running = false; - async waitFor(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; - async waitFor(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { - if (this.running) { - throw new Error('Not allowed to run nested waitFor calls!'); - } - - this.running = true; - - try { - let trial = 1; - retryCount = typeof retryCount === 'number' ? retryCount : this.retryCount; - - while (true) { - if (trial > retryCount) { - throw new Error(`${timeoutMessage}: Timed out after ${(retryCount * this.retryDuration) / 1000} seconds.`); - } - - let result; - try { - result = await func(); - } catch (e) { - // console.warn(e); - - if (/Method not implemented/.test(e.message)) { - throw e; - } - } - - if (accept(result)) { - return result; - } - - await new Promise(resolve => setTimeout(resolve, this.retryDuration)); - trial++; - } - } finally { - this.running = false; - } - } -} \ No newline at end of file diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 0b43ca0b346..b8f57eae65f 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API, CodeDriver } from './api'; import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; import * as cp from 'child_process'; @@ -25,9 +24,8 @@ export interface ApplicationOptions extends SpawnOptions { export class Application { - private _api: API; + private _code: Code | undefined; private _workbench: Workbench; - private codeInstance: Code | undefined; private keybindings: any[]; private stopLogCollection: (() => Promise) | undefined; @@ -37,8 +35,8 @@ export class Application { return this.options.quality; } - get api(): API { - return this._api; + get code(): Code { + return this._code!; } get workbench(): Workbench { @@ -97,14 +95,14 @@ export class Application { this.stopLogCollection = undefined; } - if (this.codeInstance) { - this.codeInstance.dispose(); - this.codeInstance = undefined; + if (this._code) { + this._code.dispose(); + this._code = undefined; } } private async startApplication(workspaceOrFolder: string, extraArgs: string[] = []): Promise { - this.codeInstance = await spawn({ + this._code = await spawn({ codePath: this.options.codePath, workspacePath: workspaceOrFolder, userDataDir: this.options.userDataDir, @@ -113,13 +111,11 @@ export class Application { extraArgs }); - const driver = new CodeDriver(this.codeInstance.driver, this.options.verbose); - this._api = new API(driver, this.options.waitTime); - this._workbench = new Workbench(this._api, this.keybindings, this.userDataPath); + this._workbench = new Workbench(this._code, this.keybindings, this.userDataPath); } private async checkWindowReady(): Promise { - if (!this.codeInstance) { + if (!this._code) { console.error('No code instance found'); return; } @@ -127,7 +123,7 @@ export class Application { let retries = 0; while (++retries < 300) { // 30 seconds - const ids = await this.codeInstance.driver.getWindowIds(); + const ids = await this._code.getWindowIds(); if (ids.length > 0) { break; @@ -136,12 +132,12 @@ export class Application { await new Promise(c => setTimeout(c, 100)); } - await this.api.waitForElement('.monaco-workbench'); + await this.code.waitForElement('.monaco-workbench'); } private async waitForWelcome(): Promise { - await this.api.waitForElement('.explorer-folders-view'); - await this.api.waitForElement(`.editor-container[id="workbench.editor.walkThroughPart"] .welcomePage`); + await this.code.waitForElement('.explorer-folders-view'); + await this.code.waitForElement(`.editor-container[id="workbench.editor.walkThroughPart"] .welcomePage`); } private retrieveKeybindings(): Promise { diff --git a/test/smoke/src/areas/activitybar/activityBar.ts b/test/smoke/src/areas/activitybar/activityBar.ts index 46665d64009..22d43a8f8c9 100644 --- a/test/smoke/src/areas/activitybar/activityBar.ts +++ b/test/smoke/src/areas/activitybar/activityBar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; +import { Code } from '../../vscode/code'; export enum ActivityBarPosition { LEFT = 0, @@ -12,11 +12,9 @@ export enum ActivityBarPosition { export class ActivityBar { - constructor(private api: API) { - // noop - } + constructor(private code: Code) { } - public async getActivityBar(position: ActivityBarPosition): Promise { + async getActivityBar(position: ActivityBarPosition): Promise { let positionClass: string; if (position === ActivityBarPosition.LEFT) { @@ -27,6 +25,6 @@ export class ActivityBar { throw new Error('No such position for activity bar defined.'); } - return this.api.waitForElement(`.part.activitybar.${positionClass}`); + await this.code.waitForElement(`.part.activitybar.${positionClass}`); } } \ No newline at end of file diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index 10f473a59a9..176e634bf6d 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -21,10 +21,10 @@ export function setup() { await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - await app.api.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); + await app.code.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); await app.workbench.problems.showProblemsView(); - await app.api.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); + await app.code.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); await app.workbench.problems.hideProblemsView(); }); @@ -34,11 +34,11 @@ export function setup() { await app.workbench.quickopen.openFile('style.css'); await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - await app.api.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); + await app.code.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); - const problems = new Problems(app.api, app.workbench); + const problems = new Problems(app.code, app.workbench); await problems.showProblemsView(); - await app.api.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); + await app.code.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); await problems.hideProblemsView(); }); }); diff --git a/test/smoke/src/areas/debug/debug.test.ts b/test/smoke/src/areas/debug/debug.test.ts index 45710a1b6f7..b193d856cfa 100644 --- a/test/smoke/src/areas/debug/debug.test.ts +++ b/test/smoke/src/areas/debug/debug.test.ts @@ -62,16 +62,16 @@ export function setup() { it('focus stack frames and variables', async function () { const app = this.app as Application; - await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); + await app.workbench.debug.waitForVariableCount(4); await app.workbench.debug.focusStackFrame('layer.js', 'looking for layer.js'); - await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 5, 'there should be 5 local variables'); + await app.workbench.debug.waitForVariableCount(5); await app.workbench.debug.focusStackFrame('route.js', 'looking for route.js'); - await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 3, 'there should be 3 local variables'); + await app.workbench.debug.waitForVariableCount(3); await app.workbench.debug.focusStackFrame('index.js', 'looking for index.js'); - await app.api.waitFor(() => app.workbench.debug.getLocalVariableCount(), c => c === 4, 'there should be 4 local variables'); + await app.workbench.debug.waitForVariableCount(4); }); it('stepOver, stepIn, stepOut', async function () { diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index f19b3b5143d..8ee59bb8675 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -5,7 +5,7 @@ import { Viewlet } from '../workbench/viewlet'; import { Commands } from '../workbench/workbench'; -import { API, findElement } from '../../api'; +import { Code, findElement } from '../../vscode/code'; import { Editors } from '../editor/editors'; import { Editor } from '../editor/editor'; import { IElement } from '../../vscode/driver'; @@ -50,30 +50,30 @@ function toStackFrame(element: IElement): IStackFrame { export class Debug extends Viewlet { - constructor(api: API, private commands: Commands, private editors: Editors, private editor: Editor) { - super(api); + constructor(code: Code, private commands: Commands, private editors: Editors, private editor: Editor) { + super(code); } async openDebugViewlet(): Promise { await this.commands.runCommand('workbench.view.debug'); - await this.api.waitForElement(DEBUG_VIEW); + await this.code.waitForElement(DEBUG_VIEW); } async configure(): Promise { - await this.api.waitAndClick(CONFIGURE); + await this.code.waitAndClick(CONFIGURE); await this.editors.waitForEditorFocus('launch.json'); } async setBreakpointOnLine(lineNumber: number): Promise { - await this.api.waitForElement(`${GLYPH_AREA}(${lineNumber})`); - await this.api.waitAndClick(`${GLYPH_AREA}(${lineNumber})`, 5, 5); - await this.api.waitForElement(BREAKPOINT_GLYPH); + await this.code.waitForElement(`${GLYPH_AREA}(${lineNumber})`); + await this.code.waitAndClick(`${GLYPH_AREA}(${lineNumber})`, 5, 5); + await this.code.waitForElement(BREAKPOINT_GLYPH); } async startDebugging(): Promise { await this.commands.runCommand('workbench.action.debug.start'); - await this.api.waitForElement(PAUSE); - await this.api.waitForElement(DEBUG_STATUS_BAR); + await this.code.waitForElement(PAUSE); + await this.code.waitForElement(DEBUG_STATUS_BAR); const portPrefix = 'Port: '; const output = await this.waitForOutput(output => output.some(line => line.indexOf(portPrefix) >= 0)); @@ -83,60 +83,60 @@ export class Debug extends Viewlet { } async stepOver(): Promise { - await this.api.waitAndClick(STEP_OVER); + await this.code.waitAndClick(STEP_OVER); } async stepIn(): Promise { - await this.api.waitAndClick(STEP_IN); + await this.code.waitAndClick(STEP_IN); } async stepOut(): Promise { - await this.api.waitAndClick(STEP_OUT); + await this.code.waitAndClick(STEP_OUT); } async continue(): Promise { - await this.api.waitAndClick(CONTINUE); + await this.code.waitAndClick(CONTINUE); await this.waitForStackFrameLength(0); } async stopDebugging(): Promise { - await this.api.waitAndClick(STOP); - await this.api.waitForElement(TOOLBAR_HIDDEN); - await this.api.waitForElement(NOT_DEBUG_STATUS_BAR); + await this.code.waitAndClick(STOP); + await this.code.waitForElement(TOOLBAR_HIDDEN); + await this.code.waitForElement(NOT_DEBUG_STATUS_BAR); } async waitForStackFrame(func: (stackFrame: IStackFrame) => boolean, message: string): Promise { - const elements = await this.api.waitForElements(STACK_FRAME, true, elements => elements.some(e => func(toStackFrame(e)))); + const elements = await this.code.waitForElements(STACK_FRAME, true, elements => elements.some(e => func(toStackFrame(e)))); return elements.map(toStackFrame).filter(s => func(s))[0]; } async waitForStackFrameLength(length: number): Promise { - await this.api.waitForElements(STACK_FRAME, false, result => result.length === length); + await this.code.waitForElements(STACK_FRAME, false, result => result.length === length); } async focusStackFrame(name: string, message: string): Promise { - await this.api.waitAndClick(SPECIFIC_STACK_FRAME(name)); + await this.code.waitAndClick(SPECIFIC_STACK_FRAME(name)); await this.editors.waitForTab(name); } async waitForReplCommand(text: string, accept: (result: string) => boolean): Promise { await this.commands.runCommand('Debug: Focus Debug Console'); - await this.api.waitForActiveElement(REPL_FOCUSED); - await this.api.setValue(REPL_FOCUSED, text); + await this.code.waitForActiveElement(REPL_FOCUSED); + await this.code.setValue(REPL_FOCUSED, text); // Wait for the keys to be picked up by the editor model such that repl evalutes what just got typed await this.editor.waitForEditorContents('debug:input', s => s.indexOf(text) >= 0); - await this.api.dispatchKeybinding('enter'); - await this.api.waitForElement(CONSOLE_INPUT_OUTPUT); + await this.code.dispatchKeybinding('enter'); + await this.code.waitForElement(CONSOLE_INPUT_OUTPUT); await this.waitForOutput(output => accept(output[output.length - 1] || '')); } - async getLocalVariableCount(): Promise { - return await this.api.getElementCount(VARIABLE); + async waitForVariableCount(count: number): Promise { + await this.code.waitForElements(VARIABLE, false, els => els.length === count); } private async waitForOutput(fn: (output: string[]) => boolean): Promise { - const elements = await this.api.waitForElements(CONSOLE_OUTPUT, false, elements => fn(elements.map(e => e.textContent))); + const elements = await this.code.waitForElements(CONSOLE_OUTPUT, false, elements => fn(elements.map(e => e.textContent))); return elements.map(e => e.textContent); } } diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index fdb5f4ca9c2..8bc52eaeaf5 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -5,7 +5,7 @@ import { References } from './peek'; import { Commands } from '../workbench/workbench'; -import { API } from '../../api'; +import { Code } from '../../vscode/code'; const RENAME_BOX = '.monaco-editor .monaco-editor.rename-box'; const RENAME_INPUT = `${RENAME_BOX} .rename-input`; @@ -18,12 +18,12 @@ export class Editor { private static readonly FOLDING_EXPANDED = '.monaco-editor .margin .margin-view-overlays>:nth-child(${INDEX}) .folding'; private static readonly FOLDING_COLLAPSED = `${Editor.FOLDING_EXPANDED}.collapsed`; - constructor(private api: API, private commands: Commands) { } + constructor(private code: Code, private commands: Commands) { } async findReferences(term: string, line: number): Promise { await this.clickOnTerm(term, line); await this.commands.runCommand('Find All References'); - const references = new References(this.api); + const references = new References(this.code); await references.waitUntilOpen(); return references; } @@ -32,10 +32,10 @@ export class Editor { await this.clickOnTerm(from, line); await this.commands.runCommand('Rename Symbol'); - await this.api.waitForActiveElement(RENAME_INPUT); - await this.api.setValue(RENAME_INPUT, to); + await this.code.waitForActiveElement(RENAME_INPUT); + await this.code.setValue(RENAME_INPUT, to); - await this.api.dispatchKeybinding('enter'); + await this.code.dispatchKeybinding('enter'); } async gotoDefinition(term: string, line: number): Promise { @@ -46,7 +46,7 @@ export class Editor { async peekDefinition(term: string, line: number): Promise { await this.clickOnTerm(term, line); await this.commands.runCommand('Peek Definition'); - const peek = new References(this.api); + const peek = new References(this.code); await peek.waitUntilOpen(); return peek; } @@ -54,7 +54,7 @@ export class Editor { async waitForHighlightingLine(line: number): Promise { const currentLineIndex = await this.getViewLineIndex(line); if (currentLineIndex) { - await this.api.waitForElement(`.monaco-editor .view-overlays>:nth-child(${currentLineIndex}) .current-line`); + await this.code.waitForElement(`.monaco-editor .view-overlays>:nth-child(${currentLineIndex}) .current-line`); return; } throw new Error('Cannot find line ' + line); @@ -68,14 +68,14 @@ export class Editor { async foldAtLine(line: number): Promise { const lineIndex = await this.getViewLineIndex(line); - await this.api.waitAndClick(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); - await this.api.waitForElement(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); + await this.code.waitAndClick(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); + await this.code.waitForElement(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); } async unfoldAtLine(line: number): Promise { const lineIndex = await this.getViewLineIndex(line); - await this.api.waitAndClick(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); - await this.api.waitForElement(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); + await this.code.waitAndClick(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); + await this.code.waitForElement(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); } async waitUntilShown(line: number): Promise { @@ -84,18 +84,18 @@ export class Editor { async clickOnTerm(term: string, line: number): Promise { const selector = await this.getSelector(term, line); - await this.api.waitAndClick(selector); + await this.code.waitAndClick(selector); } async waitForTypeInEditor(filename: string, text: string, selectorPrefix = ''): Promise { const editor = [selectorPrefix || '', EDITOR(filename)].join(' '); - await this.api.waitForElement(editor); + await this.code.waitForElement(editor); const textarea = `${editor} textarea`; - await this.api.waitForActiveElement(textarea); + await this.code.waitForActiveElement(textarea); - await this.api.typeInEditor(textarea, text); + await this.code.typeInEditor(textarea, text); await this.waitForEditorContents(filename, c => c.indexOf(text) > -1, selectorPrefix); } @@ -103,17 +103,17 @@ export class Editor { async waitForEditorContents(filename: string, accept: (contents: string) => boolean, selectorPrefix = ''): Promise { const selector = [selectorPrefix || '', `${EDITOR(filename)} .view-lines`].join(' '); - return this.api.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' '))); + return this.code.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' '))); } private async getClassSelectors(term: string, viewline: number): Promise { - const elements = await this.api.waitForElements(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, false, els => els.some(el => el.textContent === term)); + const elements = await this.code.waitForElements(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, false, els => els.some(el => el.textContent === term)); const { className } = elements.filter(r => r.textContent === term)[0]; return className.split(/\s/g); } private async getViewLineIndex(line: number): Promise { - const elements = await this.api.waitForElements(Editor.LINE_NUMBERS, false, els => { + const elements = await this.code.waitForElements(Editor.LINE_NUMBERS, false, els => { return els.some(el => el.textContent === `${line}`); }); diff --git a/test/smoke/src/areas/editor/editors.ts b/test/smoke/src/areas/editor/editors.ts index 300e57bf965..4ac026780e4 100644 --- a/test/smoke/src/areas/editor/editors.ts +++ b/test/smoke/src/areas/editor/editors.ts @@ -3,25 +3,25 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; import { Commands } from '../workbench/workbench'; +import { Code } from '../../vscode/code'; export class Editors { - constructor(private api: API, private commands: Commands) { } + constructor(private code: Code, private commands: Commands) { } async saveOpenedFile(): Promise { await this.commands.runCommand('workbench.action.files.save'); } async selectTab(tabName: string, untitled: boolean = false): Promise { - await this.api.waitAndClick(`.tabs-container div.tab[aria-label="${tabName}, tab"]`); + await this.code.waitAndClick(`.tabs-container div.tab[aria-label="${tabName}, tab"]`); await this.waitForEditorFocus(tabName, untitled); } async waitForActiveEditor(filename: string): Promise { const selector = `.editor-container .monaco-editor[data-uri$="${filename}"] textarea`; - return this.api.waitForActiveElement(selector); + return this.code.waitForActiveElement(selector); } async waitForEditorFocus(fileName: string, untitled: boolean = false): Promise { @@ -30,11 +30,11 @@ export class Editors { } async waitForActiveTab(fileName: string, isDirty: boolean = false): Promise { - await this.api.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); + await this.code.waitForElement(`.tabs-container div.tab.active${isDirty ? '.dirty' : ''}[aria-selected="true"][aria-label="${fileName}, tab"]`); } async waitForTab(fileName: string, isDirty: boolean = false): Promise { - await this.api.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); + await this.code.waitForElement(`.tabs-container div.tab${isDirty ? '.dirty' : ''}[aria-label="${fileName}, tab"]`); } async newUntitledFile(): Promise { diff --git a/test/smoke/src/areas/editor/peek.ts b/test/smoke/src/areas/editor/peek.ts index 4f0bd9170b2..55f7f5ece06 100644 --- a/test/smoke/src/areas/editor/peek.ts +++ b/test/smoke/src/areas/editor/peek.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; +import { Code } from '../../vscode/code'; export class References { @@ -12,29 +12,29 @@ export class References { private static readonly REFERENCES_TITLE_COUNT = `${References.REFERENCES_WIDGET} .head .peekview-title .meta`; private static readonly REFERENCES = `${References.REFERENCES_WIDGET} .body .ref-tree.inline .monaco-tree-row .reference`; - constructor(private api: API) { } + constructor(private code: Code) { } async waitUntilOpen(): Promise { - await this.api.waitForElement(References.REFERENCES_WIDGET); + await this.code.waitForElement(References.REFERENCES_WIDGET); } async waitForReferencesCountInTitle(count: number): Promise { - await this.api.waitForTextContent(References.REFERENCES_TITLE_COUNT, void 0, titleCount => { + await this.code.waitForTextContent(References.REFERENCES_TITLE_COUNT, void 0, titleCount => { const matches = titleCount.match(/\d+/); return matches ? parseInt(matches[0]) === count : false; }); } async waitForReferencesCount(count: number): Promise { - await this.api.waitForElements(References.REFERENCES, false, result => result && result.length === count); + await this.code.waitForElements(References.REFERENCES, false, result => result && result.length === count); } async waitForFile(file: string): Promise { - await this.api.waitForTextContent(References.REFERENCES_TITLE_FILE_NAME, file); + await this.code.waitForTextContent(References.REFERENCES_TITLE_FILE_NAME, file); } async close(): Promise { - await this.api.dispatchKeybinding('escape'); - await this.api.waitForElement(References.REFERENCES_WIDGET, element => !element); + await this.code.dispatchKeybinding('escape'); + await this.code.waitForElement(References.REFERENCES_WIDGET, element => !element); } } \ No newline at end of file diff --git a/test/smoke/src/areas/explorer/explorer.test.ts b/test/smoke/src/areas/explorer/explorer.test.ts index 425233c7ad7..946105649b7 100644 --- a/test/smoke/src/areas/explorer/explorer.test.ts +++ b/test/smoke/src/areas/explorer/explorer.test.ts @@ -21,7 +21,7 @@ export function setup() { await app.workbench.quickopen.openQuickOpen('.js'); await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.api.dispatchKeybinding('escape'); + await app.code.dispatchKeybinding('escape'); }); it('quick open respects fuzzy matching', async function () { @@ -34,7 +34,7 @@ export function setup() { await app.workbench.quickopen.openQuickOpen('a.s'); await app.workbench.quickopen.waitForQuickOpenElements(names => expectedNames.every(n => names.some(m => n === m))); - await app.api.dispatchKeybinding('escape'); + await app.code.dispatchKeybinding('escape'); }); }); } \ No newline at end of file diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index 956b29b488f..15dc32668ee 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -4,17 +4,17 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../api'; import { Editors } from '../editor/editors'; import { Commands } from '../workbench/workbench'; +import { Code } from '../../vscode/code'; export class Explorer extends Viewlet { private static readonly EXPLORER_VIEWLET = 'div[id="workbench.view.explorer"]'; private static readonly OPEN_EDITORS_VIEW = `${Explorer.EXPLORER_VIEWLET} .split-view-view:nth-child(1) .title`; - constructor(api: API, private commands: Commands, private editors: Editors) { - super(api); + constructor(code: Code, private commands: Commands, private editors: Editors) { + super(code); } openExplorerView(): Promise { @@ -22,11 +22,11 @@ export class Explorer extends Viewlet { } getOpenEditorsViewTitle(): Promise { - return this.api.waitForTextContent(Explorer.OPEN_EDITORS_VIEW); + return this.code.waitForTextContent(Explorer.OPEN_EDITORS_VIEW); } async openFile(fileName: string): Promise { - await this.api.waitAndDoubleClick(`div[class="monaco-icon-label file-icon ${fileName}-name-file-icon ${this.getExtensionSelector(fileName)} explorer-item"]`); + await this.code.waitAndDoubleClick(`div[class="monaco-icon-label file-icon ${fileName}-name-file-icon ${this.getExtensionSelector(fileName)} explorer-item"]`); await this.editors.waitForEditorFocus(fileName); } diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index bedca3d1aa1..386e521e5f8 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -4,15 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../api'; import { Commands } from '../workbench/workbench'; +import { Code } from '../../vscode/code'; const SEARCH_BOX = 'div.extensions-viewlet[id="workbench.view.extensions"] input.search-box'; export class Extensions extends Viewlet { - constructor(api: API, private commands: Commands) { - super(api); + constructor(code: Code, private commands: Commands) { + super(code); } async openExtensionsViewlet(): Promise { @@ -21,19 +21,19 @@ export class Extensions extends Viewlet { } async waitForExtensionsViewlet(): Promise { - await this.api.waitForActiveElement(SEARCH_BOX); + await this.code.waitForActiveElement(SEARCH_BOX); } async searchForExtension(name: string): Promise { - await this.api.waitAndClick(SEARCH_BOX); - await this.api.waitForActiveElement(SEARCH_BOX); - await this.api.setValue(SEARCH_BOX, name); + await this.code.waitAndClick(SEARCH_BOX); + await this.code.waitForActiveElement(SEARCH_BOX); + await this.code.setValue(SEARCH_BOX, name); } async installExtension(name: string): Promise { await this.searchForExtension(name); - await this.api.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`); - await this.api.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.reload`); + await this.code.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`); + await this.code.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.reload`); } } \ No newline at end of file diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index ab742c7ef44..e5c2669b722 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -34,7 +34,7 @@ export function setup() { await app.workbench.scm.openSCMViewlet(); await app.workbench.scm.openChange('app.js'); - await app.api.waitForElement(DIFF_EDITOR_LINE_INSERT); + await app.code.waitForElement(DIFF_EDITOR_LINE_INSERT); }); it('stages correctly', async function () { @@ -61,13 +61,13 @@ export function setup() { await app.workbench.scm.waitForChange('app.js', 'Index Modified'); await app.workbench.scm.commit('first commit'); - await app.api.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 1↑'); + await app.code.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 1↑'); await app.workbench.runCommand('Git: Stage All Changes'); await app.workbench.scm.waitForChange('index.jade', 'Index Modified'); await app.workbench.scm.commit('second commit'); - await app.api.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 2↑'); + await app.code.waitForTextContent(SYNC_STATUSBAR, ' 0↓ 2↑'); cp.execSync('git reset --hard origin/master', { cwd: app.workspacePath }); }); diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index 21a69240780..4543c6fc689 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API, findElement, findElements } from '../../api'; import { Commands } from '../workbench/workbench'; import { IElement } from '../../vscode/driver'; +import { findElement, findElements, Code } from '../../vscode/code'; const VIEWLET = 'div[id="workbench.view.scm"]'; const SCM_INPUT = `${VIEWLET} .scm-editor textarea`; @@ -41,44 +41,44 @@ function toChange(element: IElement): Change { export class SCM extends Viewlet { - constructor(api: API, private commands: Commands) { - super(api); + constructor(code: Code, private commands: Commands) { + super(code); } async openSCMViewlet(): Promise { await this.commands.runCommand('workbench.view.scm'); - await this.api.waitForElement(SCM_INPUT); + await this.code.waitForElement(SCM_INPUT); } async waitForChange(name: string, type?: string): Promise { const func = (change: Change) => change.name === name && (!type || change.type === type); - await this.api.waitForElements(SCM_RESOURCE, true, elements => elements.some(e => func(toChange(e)))); + await this.code.waitForElements(SCM_RESOURCE, true, elements => elements.some(e => func(toChange(e)))); } async refreshSCMViewlet(): Promise { - await this.api.waitAndClick(REFRESH_COMMAND); + await this.code.waitAndClick(REFRESH_COMMAND); } async openChange(name: string): Promise { - await this.api.waitAndClick(SCM_RESOURCE_CLICK(name)); + await this.code.waitAndClick(SCM_RESOURCE_CLICK(name)); } async stage(name: string): Promise { - await this.api.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Stage Changes')); + await this.code.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Stage Changes')); } async stageAll(): Promise { - await this.api.waitAndClick(SCM_RESOURCE_GROUP_COMMAND_CLICK('Stage All Changes')); + await this.code.waitAndClick(SCM_RESOURCE_GROUP_COMMAND_CLICK('Stage All Changes')); } async unstage(name: string): Promise { - await this.api.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Unstage Changes')); + await this.code.waitAndClick(SCM_RESOURCE_ACTION_CLICK(name, 'Unstage Changes')); } async commit(message: string): Promise { - await this.api.waitAndClick(SCM_INPUT); - await this.api.waitForActiveElement(SCM_INPUT); - await this.api.setValue(SCM_INPUT, message); - await this.api.waitAndClick(COMMIT_COMMAND); + await this.code.waitAndClick(SCM_INPUT); + await this.code.waitForActiveElement(SCM_INPUT); + await this.code.setValue(SCM_INPUT, message); + await this.code.waitAndClick(COMMIT_COMMAND); } } \ No newline at end of file diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index a5f47f25967..5b479677556 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -27,7 +27,7 @@ export function setup() { it('shows workspace name in title', async function () { const app = this.app as Application; - const title = await app.api.getTitle(); + const title = await app.code.getTitle(); assert.ok(title.indexOf('smoketest (Workspace)') >= 0); }); }); diff --git a/test/smoke/src/areas/preferences/keybindings.ts b/test/smoke/src/areas/preferences/keybindings.ts index 014dff290a3..98865e492c4 100644 --- a/test/smoke/src/areas/preferences/keybindings.ts +++ b/test/smoke/src/areas/preferences/keybindings.ts @@ -3,28 +3,28 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; import { Commands } from '../workbench/workbench'; +import { Code } from '../../vscode/code'; const SEARCH_INPUT = '.settings-search-input input'; export class KeybindingsEditor { - constructor(private api: API, private commands: Commands) { } + constructor(private code: Code, private commands: Commands) { } async updateKeybinding(command: string, keybinding: string, ariaLabel: string): Promise { await this.commands.runCommand('workbench.action.openGlobalKeybindings'); - await this.api.waitForActiveElement(SEARCH_INPUT); - await this.api.setValue(SEARCH_INPUT, command); + await this.code.waitForActiveElement(SEARCH_INPUT); + await this.code.setValue(SEARCH_INPUT, command); - await this.api.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item'); - await this.api.waitForElement('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item.focused.selected'); + await this.code.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item'); + await this.code.waitForElement('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item.focused.selected'); - await this.api.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item .action-item .icon.add'); - await this.api.waitForElement('.defineKeybindingWidget .monaco-inputbox.synthetic-focus'); + await this.code.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item .action-item .icon.add'); + await this.code.waitForElement('.defineKeybindingWidget .monaco-inputbox.synthetic-focus'); - await this.api.dispatchKeybinding(keybinding); - await this.api.dispatchKeybinding('enter'); - await this.api.waitForElement(`div[aria-label="Keybindings"] div[aria-label="Keybinding is ${ariaLabel}."]`); + await this.code.dispatchKeybinding(keybinding); + await this.code.dispatchKeybinding('enter'); + await this.code.waitForElement(`div[aria-label="Keybindings"] div[aria-label="Keybinding is ${ariaLabel}."]`); } } \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index 92c58ab4517..ecca6a44167 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -14,11 +14,11 @@ export function setup() { const app = this.app as Application; await app.workbench.explorer.openFile('app.js'); - await app.api.waitForElements('.line-numbers', false, elements => !!elements.length); + await app.code.waitForElements('.line-numbers', false, elements => !!elements.length); await app.workbench.settingsEditor.addUserSetting('editor.lineNumbers', '"off"'); await app.workbench.editors.selectTab('app.js'); - await app.api.waitForElements('.line-numbers', false, result => !result || result.length === 0); + await app.code.waitForElements('.line-numbers', false, result => !result || result.length === 0); }); it(`changes 'workbench.action.toggleSidebarPosition' command key binding and verifies it`, async function () { @@ -27,7 +27,7 @@ export function setup() { await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', 'ctrl+u', 'Control+U'); - await app.api.dispatchKeybinding('ctrl+u'); + await app.code.dispatchKeybinding('ctrl+u'); assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.RIGHT), 'Activity bar was not moved to right after toggling its position.'); }); diff --git a/test/smoke/src/areas/preferences/settings.ts b/test/smoke/src/areas/preferences/settings.ts index 915af0873ea..2c64ae89b12 100644 --- a/test/smoke/src/areas/preferences/settings.ts +++ b/test/smoke/src/areas/preferences/settings.ts @@ -5,10 +5,10 @@ import * as fs from 'fs'; import * as path from 'path'; -import { API } from '../../api'; import { Commands } from '../workbench/workbench'; import { Editor } from '../editor/editor'; import { Editors } from '../editor/editors'; +import { Code } from '../../vscode/code'; export enum ActivityBarPosition { LEFT = 0, @@ -20,17 +20,17 @@ const EDITOR = '.editable-preferences-editor-container .monaco-editor textarea'; export class SettingsEditor { - constructor(private api: API, private userDataPath: string, private commands: Commands, private editors: Editors, private editor: Editor) { } + constructor(private code: Code, private userDataPath: string, private commands: Commands, private editors: Editors, private editor: Editor) { } async addUserSetting(setting: string, value: string): Promise { await this.commands.runCommand('workbench.action.openGlobalSettings'); - await this.api.waitAndClick(SEARCH_INPUT); - await this.api.waitForActiveElement(SEARCH_INPUT); + await this.code.waitAndClick(SEARCH_INPUT); + await this.code.waitForActiveElement(SEARCH_INPUT); - await this.api.dispatchKeybinding('down'); - await this.api.waitForActiveElement(EDITOR); + await this.code.dispatchKeybinding('down'); + await this.code.waitForActiveElement(EDITOR); - await this.api.dispatchKeybinding('right'); + await this.code.dispatchKeybinding('right'); await this.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value}`, '.editable-preferences-editor-container'); await this.editors.saveOpenedFile(); } diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index 84a0b92c244..b5c671a9e70 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; import { Commands } from '../workbench/workbench'; +import { Code } from '../../vscode/code'; export enum ProblemSeverity { WARNING = 0, @@ -15,7 +15,7 @@ export class Problems { static PROBLEMS_VIEW_SELECTOR = '.panel.markers-panel'; - constructor(private api: API, private commands: Commands) { + constructor(private code: Code, private commands: Commands) { // noop } @@ -29,16 +29,16 @@ export class Problems { public async hideProblemsView(): Promise { if (await this.isVisible()) { await this.commands.runCommand('workbench.actions.view.problems'); - await this.api.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR, el => !el); + await this.code.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR, el => !el); } } isVisible(): Promise { - return this.api.doesElementExist(Problems.PROBLEMS_VIEW_SELECTOR); + return this.code.doesElementExist(Problems.PROBLEMS_VIEW_SELECTOR); } public async waitForProblemsView(): Promise { - await this.api.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR); + await this.code.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR); } public static getSelectorInProblemsView(problemType: ProblemSeverity): string { diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index 9d411f60d77..c580efdf69d 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; import { Editors } from '../editor/editors'; import { Commands } from '../workbench/workbench'; +import { Code } from '../../vscode/code'; export class QuickOpen { @@ -16,14 +16,14 @@ export class QuickOpen { static QUICK_OPEN_ENTRY_SELECTOR = 'div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties .monaco-tree-row .quick-open-entry'; static QUICK_OPEN_ENTRY_LABEL_SELECTOR = 'div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties .monaco-tree-row .quick-open-entry .label-name'; - constructor(private api: API, private commands: Commands, private editors: Editors) { } + constructor(private code: Code, private commands: Commands, private editors: Editors) { } async openQuickOpen(value: string): Promise { await this.commands.runCommand('workbench.action.quickOpen'); await this.waitForQuickOpenOpened(); if (value) { - await this.api.setValue(QuickOpen.QUICK_OPEN_INPUT, value); + await this.code.setValue(QuickOpen.QUICK_OPEN_INPUT, value); } } @@ -36,46 +36,46 @@ export class QuickOpen { await this.openQuickOpen(fileName); await this.waitForQuickOpenElements(names => names.some(n => n === fileName)); - await this.api.dispatchKeybinding('enter'); + await this.code.dispatchKeybinding('enter'); await this.editors.waitForActiveTab(fileName); await this.editors.waitForEditorFocus(fileName); } async waitForQuickOpenOpened(): Promise { - await this.api.waitForActiveElement(QuickOpen.QUICK_OPEN_INPUT); + await this.code.waitForActiveElement(QuickOpen.QUICK_OPEN_INPUT); } private async waitForQuickOpenClosed(): Promise { - await this.api.waitForElement(QuickOpen.QUICK_OPEN_HIDDEN); + await this.code.waitForElement(QuickOpen.QUICK_OPEN_HIDDEN); } async submit(text: string): Promise { - await this.api.setValue(QuickOpen.QUICK_OPEN_INPUT, text); - await this.api.dispatchKeybinding('enter'); + await this.code.setValue(QuickOpen.QUICK_OPEN_INPUT, text); + await this.code.dispatchKeybinding('enter'); await this.waitForQuickOpenClosed(); } async selectQuickOpenElement(index: number): Promise { await this.waitForQuickOpenOpened(); for (let from = 0; from < index; from++) { - await this.api.dispatchKeybinding('down'); + await this.code.dispatchKeybinding('down'); } - await this.api.dispatchKeybinding('enter'); + await this.code.dispatchKeybinding('enter'); await this.waitForQuickOpenClosed(); } async waitForQuickOpenElements(accept: (names: string[]) => boolean): Promise { - await this.api.waitForElements(QuickOpen.QUICK_OPEN_ENTRY_LABEL_SELECTOR, false, els => accept(els.map(e => e.textContent))); + await this.code.waitForElements(QuickOpen.QUICK_OPEN_ENTRY_LABEL_SELECTOR, false, els => accept(els.map(e => e.textContent))); } async runCommand(command: string): Promise { await this.openQuickOpen(`> ${command}`); // wait for best choice to be focused - await this.api.waitForTextContent(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT, command); + await this.code.waitForTextContent(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT, command); // wait and click on best choice - await this.api.waitAndClick(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT); + await this.code.waitAndClick(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT); } async openQuickOutline(): Promise { @@ -84,7 +84,7 @@ export class QuickOpen { while (++retries < 10) { await this.commands.runCommand('workbench.action.gotoSymbol'); - const text = await this.api.waitForTextContent('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); + const text = await this.code.waitForTextContent('div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties div.monaco-tree-row .quick-open-entry .monaco-icon-label .label-name .monaco-highlighted-label span'); if (text !== 'No symbol information for the file') { return; diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index 3976d4e64c6..8c3514ae1f3 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { Viewlet } from '../workbench/viewlet'; -import { API } from '../../api'; import { Commands } from '../workbench/workbench'; +import { Code } from '../../vscode/code'; const VIEWLET = 'div[id="workbench.view.search"] .search-view'; const INPUT = `${VIEWLET} .search-widget .search-container .monaco-inputbox input`; @@ -13,75 +13,75 @@ const INCLUDE_INPUT = `${VIEWLET} .query-details .monaco-inputbox input[aria-lab export class Search extends Viewlet { - constructor(api: API, private commands: Commands) { - super(api); + constructor(code: Code, private commands: Commands) { + super(code); } async openSearchViewlet(): Promise { await this.commands.runCommand('workbench.view.search'); - await this.api.waitForActiveElement(INPUT); + await this.code.waitForActiveElement(INPUT); } async searchFor(text: string): Promise { - await this.api.waitAndClick(INPUT); - await this.api.waitForActiveElement(INPUT); - await this.api.setValue(INPUT, text); + await this.code.waitAndClick(INPUT); + await this.code.waitForActiveElement(INPUT); + await this.code.setValue(INPUT, text); await this.submitSearch(); } async submitSearch(): Promise { - await this.api.waitAndClick(INPUT); - await this.api.waitForActiveElement(INPUT); + await this.code.waitAndClick(INPUT); + await this.code.waitForActiveElement(INPUT); - await this.api.dispatchKeybinding('enter'); - await this.api.waitForElement(`${VIEWLET} .messages[aria-hidden="false"]`); + await this.code.dispatchKeybinding('enter'); + await this.code.waitForElement(`${VIEWLET} .messages[aria-hidden="false"]`); } async setFilesToIncludeText(text: string): Promise { - await this.api.waitAndClick(INCLUDE_INPUT); - await this.api.waitForActiveElement(INCLUDE_INPUT); - await this.api.setValue(INCLUDE_INPUT, text || ''); + await this.code.waitAndClick(INCLUDE_INPUT); + await this.code.waitForActiveElement(INCLUDE_INPUT); + await this.code.setValue(INCLUDE_INPUT, text || ''); } async showQueryDetails(): Promise { if (!await this.areDetailsVisible()) { - await this.api.waitAndClick(`${VIEWLET} .query-details .more`); + await this.code.waitAndClick(`${VIEWLET} .query-details .more`); } } async hideQueryDetails(): Promise { if (await this.areDetailsVisible()) { - await this.api.waitAndClick(`${VIEWLET} .query-details.more .more`); + await this.code.waitAndClick(`${VIEWLET} .query-details.more .more`); } } areDetailsVisible(): Promise { - return this.api.doesElementExist(`${VIEWLET} .query-details.more`); + return this.code.doesElementExist(`${VIEWLET} .query-details.more`); } async removeFileMatch(index: number): Promise { - await this.api.waitAndMove(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); - const file = await this.api.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`); - await this.api.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-remove`); - await this.api.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`, void 0, result => result !== file); + await this.code.waitAndMove(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); + const file = await this.code.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`); + await this.code.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-remove`); + await this.code.waitForTextContent(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch a.label-name`, void 0, result => result !== file); } async expandReplace(): Promise { - await this.api.waitAndClick(`${VIEWLET} .search-widget .monaco-button.toggle-replace-button.collapse`); + await this.code.waitAndClick(`${VIEWLET} .search-widget .monaco-button.toggle-replace-button.collapse`); } async setReplaceText(text: string): Promise { - await this.api.waitAndClick(`${VIEWLET} .search-widget .replace-container .monaco-inputbox input[title="Replace"]`); - await this.api.waitForElement(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`); - await this.api.setValue(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`, text); + await this.code.waitAndClick(`${VIEWLET} .search-widget .replace-container .monaco-inputbox input[title="Replace"]`); + await this.code.waitForElement(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`); + await this.code.setValue(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`, text); } async replaceFileMatch(index: number): Promise { - await this.api.waitAndMove(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); - await this.api.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-replace-all`); + await this.code.waitAndMove(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch`); + await this.code.waitAndClick(`${VIEWLET} .results .monaco-tree-rows>:nth-child(${index}) .filematch .action-label.icon.action-replace-all`); } async waitForResultText(text: string): Promise { - await this.api.waitForTextContent(`${VIEWLET} .messages[aria-hidden="false"] .message>p`, text); + await this.code.waitForTextContent(`${VIEWLET} .messages[aria-hidden="false"] .message>p`, text); } } diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 3c748bde9bb..b5c119c0539 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -63,7 +63,7 @@ export function setup() { } await app.workbench.statusbar.clickOn(StatusBarElement.FEEDBACK_ICON); - await app.api.waitForElement('.feedback-form'); + await app.code.waitForElement('.feedback-form'); }); it(`checks if 'Go to Line' works if called from the status bar`, async function () { diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index 20ab92c96e3..e4b8237f49b 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; +import { Code } from '../../vscode/code'; export enum StatusBarElement { BRANCH_STATUS = 0, @@ -23,23 +23,22 @@ export class StatusBar { private readonly leftSelector = '.statusbar-item.left'; private readonly rightSelector = '.statusbar-item.right'; - constructor(private api: API) { - } + constructor(private code: Code) { } async waitForStatusbarElement(element: StatusBarElement): Promise { - await this.api.waitForElement(this.getSelector(element)); + await this.code.waitForElement(this.getSelector(element)); } async clickOn(element: StatusBarElement): Promise { - await this.api.waitAndClick(this.getSelector(element)); + await this.code.waitAndClick(this.getSelector(element)); } async waitForEOL(eol: string): Promise { - return this.api.waitForTextContent(this.getSelector(StatusBarElement.EOL_STATUS), eol); + return this.code.waitForTextContent(this.getSelector(StatusBarElement.EOL_STATUS), eol); } async getStatusbarTextByTitle(title: string): Promise { - return await this.api.waitForTextContent(`${this.mainSelector} span[title="smoke test"]`); + return await this.code.waitForTextContent(`${this.mainSelector} span[title="smoke test"]`); } private getSelector(element: StatusBarElement): string { diff --git a/test/smoke/src/areas/workbench/viewlet.ts b/test/smoke/src/areas/workbench/viewlet.ts index c76ddb6e41c..82978b7770d 100644 --- a/test/smoke/src/areas/workbench/viewlet.ts +++ b/test/smoke/src/areas/workbench/viewlet.ts @@ -3,15 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { API } from '../../api'; +'use strict'; + +import { Code } from '../../vscode/code'; export abstract class Viewlet { - constructor(protected api: API) { + constructor(protected code: Code) { // noop } async getTitle(): Promise { - return this.api.waitForTextContent('.monaco-workbench-container .part.sidebar > .title > .title-label > span'); + return this.code.waitForTextContent('.monaco-workbench-container .part.sidebar > .title > .title-label > span'); } } \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index 645466acd3b..d81733bb58b 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -15,8 +15,8 @@ import { StatusBar } from '../statusbar/statusbar'; import { Problems } from '../problems/problems'; import { SettingsEditor } from '../preferences/settings'; import { KeybindingsEditor } from '../preferences/keybindings'; -import { API } from '../../api'; import { Editors } from '../editor/editors'; +import { Code } from '../../vscode/code'; export interface Commands { runCommand(command: string): Promise; @@ -38,20 +38,20 @@ export class Workbench implements Commands { readonly settingsEditor: SettingsEditor; readonly keybindingsEditor: KeybindingsEditor; - constructor(private api: API, private keybindings: any[], userDataPath: string) { - this.editors = new Editors(api, this); - this.quickopen = new QuickOpen(api, this, this.editors); - this.explorer = new Explorer(api, this.quickopen, this.editors); - this.activitybar = new ActivityBar(api); - this.search = new Search(api, this); - this.extensions = new Extensions(api, this); - this.editor = new Editor(api, this); - this.scm = new SCM(api, this); - this.debug = new Debug(api, this, this.editors, this.editor); - this.statusbar = new StatusBar(api); - this.problems = new Problems(api, this); - this.settingsEditor = new SettingsEditor(api, userDataPath, this, this.editors, this.editor); - this.keybindingsEditor = new KeybindingsEditor(api, this); + constructor(private code: Code, private keybindings: any[], userDataPath: string) { + this.editors = new Editors(code, this); + this.quickopen = new QuickOpen(code, this, this.editors); + this.explorer = new Explorer(code, this.quickopen, this.editors); + this.activitybar = new ActivityBar(code); + this.search = new Search(code, this); + this.extensions = new Extensions(code, this); + this.editor = new Editor(code, this); + this.scm = new SCM(code, this); + this.debug = new Debug(code, this, this.editors, this.editor); + this.statusbar = new StatusBar(code); + this.problems = new Problems(code, this); + this.settingsEditor = new SettingsEditor(code, userDataPath, this, this.editors, this.editor); + this.keybindingsEditor = new KeybindingsEditor(code, this); } /** @@ -65,7 +65,7 @@ export class Workbench implements Commands { return; } - return this.api.dispatchKeybinding(binding.key); + return this.code.dispatchKeybinding(binding.key); } } diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index a5e0110b796..d76a45c7d80 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -6,7 +6,7 @@ import * as path from 'path'; import * as cp from 'child_process'; import { tmpName } from 'tmp'; -import { IDriver, connect as connectDriver, IDisposable } from './driver'; +import { IDriver, connect as connectDriver, IDisposable, IElement } from './driver'; const repoPath = path.join(__dirname, '../../../..'); @@ -56,29 +56,13 @@ function getBuildOutPath(root: string): string { } } -export class Code { - - constructor( - private process: cp.ChildProcess, - private client: IDisposable, - readonly driver: IDriver - ) { - - } - - dispose(): void { - this.client.dispose(); - this.process.kill(); - } -} - -export async function connect(child: cp.ChildProcess, outPath: string, handlePath: string): Promise { +async function connect(child: cp.ChildProcess, outPath: string, handlePath: string, verbose: boolean): Promise { let errCount = 0; while (true) { try { const { client, driver } = await connectDriver(outPath, handlePath); - return new Code(child, client, driver); + return new Code(child, client, driver, verbose); } catch (err) { if (++errCount > 50) { child.kill(); @@ -142,5 +126,240 @@ export async function spawn(options: SpawnOptions): Promise { instances.add(child); child.once('exit', () => instances.delete(child)); - return connect(child, outPath, handlePath); + return connect(child, outPath, handlePath, options.verbose); +} + +export class Code { + + private _activeWindowId: number | undefined = undefined; + + constructor( + private process: cp.ChildProcess, + private client: IDisposable, + private driver: IDriver, + private verbose: boolean + ) { } + + async dispatchKeybinding(keybinding: string): Promise { + if (this.verbose) { + console.log('- dispatchKeybinding:', keybinding); + } + + const windowId = await this.getActiveWindowId(); + await this.driver.dispatchKeybinding(windowId, keybinding); + } + + async waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { + if (this.verbose) { + console.log('- waitForTextContent:', selector); + } + + const windowId = await this.getActiveWindowId(); + accept = accept || (result => textContent !== void 0 ? textContent === result : !!result); + return await this.waitFor(() => this.driver.getElements(windowId, selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); + } + + async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { + if (this.verbose) { + console.log('- waitAndClick:', selector); + } + + const windowId = await this.getActiveWindowId(); + + // TODO should waitForClick + await this.waitForElement(selector); + await this.driver.click(windowId, selector, xoffset, yoffset); + } + + async waitAndDoubleClick(selector: string): Promise { + if (this.verbose) { + console.log('- waitAndDoubleClick:', selector); + } + + const windowId = await this.getActiveWindowId(); + + // TODO should waitForDoubleClick + await this.waitForElement(selector); + await this.driver.doubleClick(windowId, selector); + } + + async waitAndMove(selector: string): Promise { + if (this.verbose) { + console.log('- waitAndMove:', selector); + } + + const windowId = await this.getActiveWindowId(); + // TODO should waitForMove + await this.waitForElement(selector); + await this.driver.move(windowId, selector); + } + + // TODO should be waitForSetValue + async setValue(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- setValue:', selector); + } + + const windowId = await this.getActiveWindowId(); + // TODO should waitForSetValue + await this.waitForElement(selector); + await this.driver.setValue(windowId, selector, text); + } + + // TODO merge with getElements + async doesElementExist(selector: string): Promise { + if (this.verbose) { + console.log('- doesElementExist:', selector); + } + + const windowId = await this.getActiveWindowId(); + const elements = await this.driver.getElements(windowId, selector); + return elements.length > 0; + } + + // TODO merge with getElements + async getElementCount(selector: string): Promise { + if (this.verbose) { + console.log('- getElementCount:', selector); + } + + const windowId = await this.getActiveWindowId(); + const elements = await this.driver.getElements(windowId, selector); + return elements.length; + } + + async waitForElements(selector: string, recursive: boolean, accept: (result: IElement[]) => boolean = result => result.length > 0): Promise { + if (this.verbose) { + console.log('- waitForElements:', selector); + } + + const windowId = await this.getActiveWindowId(); + return await this.waitFor(() => this.driver.getElements(windowId, selector, recursive), accept, `elements with selector ${selector}`); + } + + async waitForElement(selector: string, accept: (result: IElement | undefined) => boolean = result => !!result): Promise { + if (this.verbose) { + console.log('- waitForElement:', selector); + } + + const windowId = await this.getActiveWindowId(); + return await this.waitFor(() => this.driver.getElements(windowId, selector).then(els => els[0]), accept, `element with selector ${selector}`); + } + + async waitForActiveElement(selector: string): Promise { + if (this.verbose) { + console.log('- waitForActiveElement:', selector); + } + + const windowId = await this.getActiveWindowId(); + return await this.waitFor(() => this.driver.isActiveElement(windowId, selector), undefined, `wait for active element: ${selector}`); + } + + // TODO make into waitForTitle + async getTitle(): Promise { + if (this.verbose) { + console.log('- getTitle'); + } + + const windowId = await this.getActiveWindowId(); + return await this.driver.getTitle(windowId); + } + + // TODO make into waitForTypeInEditor + async typeInEditor(selector: string, text: string): Promise { + if (this.verbose) { + console.log('- typeInEditor', selector, text); + } + + const windowId = await this.getActiveWindowId(); + await this.driver.typeInEditor(windowId, selector, text); + } + + // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding + // the time it takes for the actual retry call to complete + private readonly retryCount: number = 200; + private readonly retryDuration = 100; // in milliseconds + + // TODO: clean function interface + private async waitFor(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; + private async waitFor(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { + let trial = 1; + retryCount = typeof retryCount === 'number' ? retryCount : this.retryCount; + + while (true) { + if (trial > retryCount) { + throw new Error(`${timeoutMessage}: Timed out after ${(retryCount * this.retryDuration) / 1000} seconds.`); + } + + let result; + try { + result = await func(); + } catch (e) { + // console.warn(e); + + if (/Method not implemented/.test(e.message)) { + throw e; + } + } + + if (accept(result)) { + return result; + } + + await new Promise(resolve => setTimeout(resolve, this.retryDuration)); + trial++; + } + } + + // TODO: replace with waitForWindows + async getWindowIds(): Promise { + return await this.driver.getWindowIds(); + } + + private async getActiveWindowId(): Promise { + if (typeof this._activeWindowId !== 'number') { + const windows = await this.driver.getWindowIds(); + this._activeWindowId = windows[0]; + } + + return this._activeWindowId; + } + + dispose(): void { + this.client.dispose(); + this.process.kill(); + } +} + +export function findElement(element: IElement, fn: (element: IElement) => boolean): IElement | null { + const queue = [element]; + + while (queue.length > 0) { + const element = queue.shift()!; + + if (fn(element)) { + return element; + } + + queue.push(...element.children); + } + + return null; +} + +export function findElements(element: IElement, fn: (element: IElement) => boolean): IElement[] { + const result: IElement[] = []; + const queue = [element]; + + while (queue.length > 0) { + const element = queue.shift()!; + + if (fn(element)) { + result.push(element); + } + + queue.push(...element.children); + } + + return result; } \ No newline at end of file From da79ed6bb2fc70d038a7df0d95fca29dc74d93ff Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 16:21:33 +0200 Subject: [PATCH 128/710] allow to return results async and sync, #47475 --- src/vs/vscode.proposed.d.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index e20750ac7da..392b4cf9ab9 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -266,7 +266,7 @@ declare module 'vscode' { */ // todo@remote // ! throw error (ENOENT) when the file doesn't exist - stat(uri: Uri, token: CancellationToken): Thenable; + stat(uri: Uri, token: CancellationToken): FileStat2 | Thenable; /** * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) @@ -275,7 +275,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return A thenable that resolves to an array of tuples of file names and files stats. */ - readDirectory(uri: Uri, token: CancellationToken): Thenable<[string, FileStat2][]>; + readDirectory(uri: Uri, token: CancellationToken): [string, FileStat2][] | Thenable<[string, FileStat2][]>; /** * Read the entire contents of a file. @@ -284,7 +284,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return A thenable that resolves to an array of bytes. */ - readFile(uri: Uri, token: CancellationToken): Thenable; + readFile(uri: Uri, token: CancellationToken): Uint8Array | Thenable; /** * Write data to a file, replacing its entire contents. @@ -293,7 +293,7 @@ declare module 'vscode' { * @param content The new content of the file. * @param token A cancellation token. */ - writeFile(uri: Uri, content: Uint8Array, token: CancellationToken): Thenable; + writeFile(uri: Uri, content: Uint8Array, token: CancellationToken): void | Thenable; /** * Rename a file or folder. @@ -302,18 +302,18 @@ declare module 'vscode' { * @param newUri The target location * @param token A cancellation token. */ - rename(oldUri: Uri, newUri: Uri, token: CancellationToken): Thenable; + rename(oldUri: Uri, newUri: Uri, token: CancellationToken): FileStat2 | Thenable; // todo@remote // helps with performance bigly - // copy?(from: Uri, to: Uri): Thenable; + // copy?(from: Uri, to: Uri): FileStat2 | Thenable; // todo@remote // ? useTrash, expose trash - delete(uri: Uri, token: CancellationToken): Thenable; + delete(uri: Uri, token: CancellationToken): void | Thenable; // todo@remote - create(uri: Uri, options: { type: FileType2 }, token: CancellationToken): Thenable; + create(uri: Uri, options: { type: FileType2 }, token: CancellationToken): FileStat2 | Thenable; } export namespace workspace { From 68e36ecb872150a5020e622b7f2499953069527f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 16:48:42 +0200 Subject: [PATCH 129/710] more wait calls --- .../src/areas/activitybar/activityBar.ts | 2 +- test/smoke/src/areas/explorer/explorer.ts | 4 +-- .../src/areas/extensions/extensions.test.ts | 8 ++---- test/smoke/src/areas/extensions/extensions.ts | 1 - .../src/areas/multiroot/multiroot.test.ts | 4 +-- .../src/areas/preferences/preferences.test.ts | 6 ++--- test/smoke/src/areas/statusbar/statusbar.ts | 4 +-- .../areas/workbench/data-migration.test.ts | 27 +++++-------------- .../src/areas/workbench/localization.test.ts | 17 ++++-------- test/smoke/src/areas/workbench/viewlet.ts | 8 +++--- test/smoke/src/main.ts | 19 +++++-------- test/smoke/src/vscode/code.ts | 9 +++---- 12 files changed, 35 insertions(+), 74 deletions(-) diff --git a/test/smoke/src/areas/activitybar/activityBar.ts b/test/smoke/src/areas/activitybar/activityBar.ts index 22d43a8f8c9..a2acb1ac44d 100644 --- a/test/smoke/src/areas/activitybar/activityBar.ts +++ b/test/smoke/src/areas/activitybar/activityBar.ts @@ -14,7 +14,7 @@ export class ActivityBar { constructor(private code: Code) { } - async getActivityBar(position: ActivityBarPosition): Promise { + async waitForActivityBar(position: ActivityBarPosition): Promise { let positionClass: string; if (position === ActivityBarPosition.LEFT) { diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index 15dc32668ee..ef9231393ef 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -21,8 +21,8 @@ export class Explorer extends Viewlet { return this.commands.runCommand('workbench.view.explorer'); } - getOpenEditorsViewTitle(): Promise { - return this.code.waitForTextContent(Explorer.OPEN_EDITORS_VIEW); + async waitForOpenEditorsViewTitle(fn: (title: string) => boolean): Promise { + await this.code.waitForTextContent(Explorer.OPEN_EDITORS_VIEW, undefined, fn); } async openFile(fileName: string): Promise { diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index 2a5b2f89fab..ca3cbc1774f 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; import { Application, Quality } from '../../application'; export function setup() { @@ -19,15 +18,12 @@ export function setup() { const extensionName = 'vscode-smoketest-check'; await app.workbench.extensions.openExtensionsViewlet(); - const installed = await app.workbench.extensions.installExtension(extensionName); - assert.ok(installed); + await app.workbench.extensions.installExtension(extensionName); await app.reload(); await app.workbench.extensions.waitForExtensionsViewlet(); await app.workbench.runCommand('Smoke Test Check'); - - const statusbarText = await app.workbench.statusbar.getStatusbarTextByTitle('smoke test'); - assert.equal(statusbarText, 'VS Code Smoke Test Check'); + await app.workbench.statusbar.waitForStatusbarText('smoke test', 'VS Code Smoke Test Check'); }); }); } \ No newline at end of file diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index 386e521e5f8..017c39d7420 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -32,7 +32,6 @@ export class Extensions extends Viewlet { async installExtension(name: string): Promise { await this.searchForExtension(name); - await this.code.waitAndClick(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.install`); await this.code.waitForElement(`div.extensions-viewlet[id="workbench.view.extensions"] .monaco-list-row[aria-label="${name}"] .extension li[class='action-item'] .extension-action.reload`); } diff --git a/test/smoke/src/areas/multiroot/multiroot.test.ts b/test/smoke/src/areas/multiroot/multiroot.test.ts index 5b479677556..86449f54858 100644 --- a/test/smoke/src/areas/multiroot/multiroot.test.ts +++ b/test/smoke/src/areas/multiroot/multiroot.test.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; import { Application } from '../../application'; export function setup() { @@ -27,8 +26,7 @@ export function setup() { it('shows workspace name in title', async function () { const app = this.app as Application; - const title = await app.code.getTitle(); - assert.ok(title.indexOf('smoketest (Workspace)') >= 0); + await app.code.waitForTitle(title => /smoketest \(Workspace\)/i.test(title)); }); }); } \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/preferences.test.ts b/test/smoke/src/areas/preferences/preferences.test.ts index ecca6a44167..1b2bbbec548 100644 --- a/test/smoke/src/areas/preferences/preferences.test.ts +++ b/test/smoke/src/areas/preferences/preferences.test.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; - import { Application } from '../../application'; import { ActivityBarPosition } from '../activitybar/activityBar'; @@ -23,12 +21,12 @@ export function setup() { it(`changes 'workbench.action.toggleSidebarPosition' command key binding and verifies it`, async function () { const app = this.app as Application; - assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.LEFT), 'Activity bar should be positioned on the left.'); + await app.workbench.activitybar.waitForActivityBar(ActivityBarPosition.LEFT); await app.workbench.keybindingsEditor.updateKeybinding('workbench.action.toggleSidebarPosition', 'ctrl+u', 'Control+U'); await app.code.dispatchKeybinding('ctrl+u'); - assert.ok(await app.workbench.activitybar.getActivityBar(ActivityBarPosition.RIGHT), 'Activity bar was not moved to right after toggling its position.'); + await app.workbench.activitybar.waitForActivityBar(ActivityBarPosition.RIGHT); }); after(async function () { diff --git a/test/smoke/src/areas/statusbar/statusbar.ts b/test/smoke/src/areas/statusbar/statusbar.ts index e4b8237f49b..dd3392a5a9c 100644 --- a/test/smoke/src/areas/statusbar/statusbar.ts +++ b/test/smoke/src/areas/statusbar/statusbar.ts @@ -37,8 +37,8 @@ export class StatusBar { return this.code.waitForTextContent(this.getSelector(StatusBarElement.EOL_STATUS), eol); } - async getStatusbarTextByTitle(title: string): Promise { - return await this.code.waitForTextContent(`${this.mainSelector} span[title="smoke test"]`); + async waitForStatusbarText(title: string, text: string): Promise { + await this.code.waitForTextContent(`${this.mainSelector} span[title="${title}"]`, text); } private getSelector(element: StatusBarElement): string { diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 510cea17736..8fa282fd061 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -3,13 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; - import { Application, Quality } from '../../application'; import * as rimraf from 'rimraf'; export interface ICreateAppFn { - (quality: Quality): Application | null; + (quality: Quality): Application; } export function setup(userDataDir: string, createApp: ICreateAppFn) { @@ -40,14 +38,9 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { // Checking latest version for the restored state const app = createApp(Quality.Insiders); - if (!app) { - return assert(false); - } - await app.start(false); - assert.ok(await app.workbench.editors.waitForActiveTab('Untitled-1', true), `Untitled-1 tab is not present after migration.`); - + await app.workbench.editors.waitForActiveTab('Untitled-1', true); await app.workbench.editor.waitForEditorContents('Untitled-1', c => c.indexOf(textToType) > -1); await app.stop(); @@ -76,13 +69,9 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { // Checking latest version for the restored state const app = createApp(Quality.Insiders); - if (!app) { - return assert(false); - } - await app.start(false); - assert.ok(await app.workbench.editors.waitForActiveTab(fileName), `dirty file tab is not present after migration.`); + await app.workbench.editors.waitForActiveTab(fileName); await app.workbench.editor.waitForEditorContents(fileName, c => c.indexOf(textPart) > -1); await app.stop(); @@ -109,15 +98,11 @@ export function setup(userDataDir: string, createApp: ICreateAppFn) { const app = createApp(Quality.Insiders); - if (!app) { - return assert(false); - } - await app.start(false); - assert.ok(await app.workbench.editors.waitForTab(fileName1), `${fileName1} tab was not restored after migration.`); - assert.ok(await app.workbench.editors.waitForTab(fileName2), `${fileName2} tab was not restored after migration.`); - assert.ok(await app.workbench.editors.waitForTab(fileName3), `${fileName3} tab was not restored after migration.`); + await app.workbench.editors.waitForTab(fileName1); + await app.workbench.editors.waitForTab(fileName2); + await app.workbench.editors.waitForTab(fileName3); await app.stop(); }); diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index e3cc585758e..ea7a25bf8cf 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as assert from 'assert'; - import { Application, Quality } from '../../application'; export function setup() { @@ -27,24 +25,19 @@ export function setup() { return; } - let text = await app.workbench.explorer.getOpenEditorsViewTitle(); - assert(/geöffnete editoren/i.test(text)); + await app.workbench.explorer.waitForOpenEditorsViewTitle(title => /geöffnete editoren/i.test(title)); await app.workbench.search.openSearchViewlet(); - text = await app.workbench.search.getTitle(); - assert(/suchen/i.test(text)); + await app.workbench.search.waitForTitle(title => /suchen/i.test(title)); await app.workbench.scm.openSCMViewlet(); - text = await app.workbench.scm.getTitle(); - assert(/quellcodeverwaltung/i.test(text)); + await app.workbench.scm.waitForTitle(title => /quellcodeverwaltung/i.test(title)); await app.workbench.debug.openDebugViewlet(); - text = await app.workbench.debug.getTitle(); - assert(/debuggen/i.test(text)); + await app.workbench.debug.waitForTitle(title => /debuggen/i.test(title)); await app.workbench.extensions.openExtensionsViewlet(); - text = await app.workbench.extensions.getTitle(); - assert(/erweiterungen/i.test(text)); + await app.workbench.extensions.waitForTitle(title => /erweiterungen/i.test(title)); }); }); } \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/viewlet.ts b/test/smoke/src/areas/workbench/viewlet.ts index 82978b7770d..2293752b705 100644 --- a/test/smoke/src/areas/workbench/viewlet.ts +++ b/test/smoke/src/areas/workbench/viewlet.ts @@ -9,11 +9,9 @@ import { Code } from '../../vscode/code'; export abstract class Viewlet { - constructor(protected code: Code) { - // noop - } + constructor(protected code: Code) { } - async getTitle(): Promise { - return this.code.waitForTextContent('.monaco-workbench-container .part.sidebar > .title > .title-label > span'); + async waitForTitle(fn: (title: string) => boolean): Promise { + await this.code.waitForTextContent('.monaco-workbench-container .part.sidebar > .title > .title-label > span', undefined, fn); } } \ No newline at end of file diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index a534d232691..63149f3e522 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -100,16 +100,16 @@ function getBuildElectronPath(root: string): string { } let testCodePath = opts.build; -let stableCodePath = opts['stable-build']; +// let stableCodePath = opts['stable-build']; let electronPath: string; -let stablePath: string; +// let stablePath: string; if (testCodePath) { electronPath = getBuildElectronPath(testCodePath); - if (stableCodePath) { - stablePath = getBuildElectronPath(stableCodePath); - } + // if (stableCodePath) { + // stablePath = getBuildElectronPath(stableCodePath); + // } } else { testCodePath = getDevElectronPath(); electronPath = testCodePath; @@ -228,13 +228,7 @@ async function setup(): Promise { console.log('*** Smoketest setup done!\n'); } -function createApp(quality: Quality): Application | null { - const path = quality === Quality.Stable ? stablePath : electronPath; - - if (!path) { - return null; - } - +function createApp(quality: Quality): Application { return new Application({ quality, codePath: opts.build, @@ -246,6 +240,7 @@ function createApp(quality: Quality): Application | null { verbose: opts.verbose }); } + before(async function () { // allow two minutes for setup this.timeout(2 * 60 * 1000); diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index d76a45c7d80..2821a060e7b 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -246,23 +246,22 @@ export class Code { return await this.waitFor(() => this.driver.getElements(windowId, selector).then(els => els[0]), accept, `element with selector ${selector}`); } - async waitForActiveElement(selector: string): Promise { + async waitForActiveElement(selector: string): Promise { if (this.verbose) { console.log('- waitForActiveElement:', selector); } const windowId = await this.getActiveWindowId(); - return await this.waitFor(() => this.driver.isActiveElement(windowId, selector), undefined, `wait for active element: ${selector}`); + await this.waitFor(() => this.driver.isActiveElement(windowId, selector), undefined, `wait for active element: ${selector}`); } - // TODO make into waitForTitle - async getTitle(): Promise { + async waitForTitle(fn: (title: string) => boolean): Promise { if (this.verbose) { console.log('- getTitle'); } const windowId = await this.getActiveWindowId(); - return await this.driver.getTitle(windowId); + await this.waitFor(() => this.driver.getTitle(windowId), fn, 'wait for title: ${}'); } // TODO make into waitForTypeInEditor From b21e8d48fbe8367a45222f369154bb1da572d2d1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Apr 2018 16:55:18 +0200 Subject: [PATCH 130/710] :lipstick:, #47475 --- src/vs/platform/files/common/files.ts | 9 ++------- .../api/electron-browser/mainThreadFileSystem.ts | 2 +- .../services/files/electron-browser/remoteFileService.ts | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 5782c248f64..c2902838625 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -164,21 +164,16 @@ export interface IStat { } export interface IFileSystemProvider { - - onDidChange?: Event; - - // more... - // + onDidChange: Event; stat(resource: URI): TPromise; readFile(resource: URI): TPromise; writeFile(resource: URI, content: Uint8Array): TPromise; - move(from: URI, to: URI): TPromise; + rename(from: URI, to: URI): TPromise; mkdir(resource: URI): TPromise; readdir(resource: URI): TPromise<[string, IStat][]>; delete(resource: URI): TPromise; } - export enum FileOperation { CREATE, DELETE, diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 7e63bbd33d5..f9bf18fa750 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -110,7 +110,7 @@ class RemoteFileSystemProvider implements IFileSystemProvider { delete(resource: URI): TPromise { return this._proxy.$delete(this._handle, resource); } - move(resource: URI, target: URI): TPromise { + rename(resource: URI, target: URI): TPromise { return this._proxy.$move(this._handle, resource, target); } mkdir(resource: URI): TPromise { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 27316a8c33e..bfe2289123d 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -410,7 +410,7 @@ export class RemoteFileService extends FileService { : TPromise.as(null); return prepare.then(() => this._withProvider(source)).then(provider => { - return provider.move(source, target).then(stat => { + return provider.rename(source, target).then(stat => { return toIFileStat(provider, [target, stat]); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat)); From 3df5480a165eac0413921149f361ceda07c2f859 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 17:25:37 +0200 Subject: [PATCH 131/710] green tests, more cleanup --- test/smoke/src/areas/debug/debug.ts | 2 +- test/smoke/src/areas/editor/editor.ts | 5 +- test/smoke/src/areas/extensions/extensions.ts | 2 +- test/smoke/src/areas/git/scm.ts | 2 +- .../src/areas/preferences/keybindings.ts | 2 +- test/smoke/src/areas/preferences/settings.ts | 3 +- test/smoke/src/areas/problems/problems.ts | 20 +-- test/smoke/src/areas/quickopen/quickopen.ts | 4 +- test/smoke/src/areas/search/search.ts | 18 +-- .../areas/workbench/data-migration.test.ts | 121 +++++++-------- test/smoke/src/vscode/code.ts | 138 +++++------------- 11 files changed, 121 insertions(+), 196 deletions(-) diff --git a/test/smoke/src/areas/debug/debug.ts b/test/smoke/src/areas/debug/debug.ts index 8ee59bb8675..bf92dd930ff 100644 --- a/test/smoke/src/areas/debug/debug.ts +++ b/test/smoke/src/areas/debug/debug.ts @@ -122,7 +122,7 @@ export class Debug extends Viewlet { async waitForReplCommand(text: string, accept: (result: string) => boolean): Promise { await this.commands.runCommand('Debug: Focus Debug Console'); await this.code.waitForActiveElement(REPL_FOCUSED); - await this.code.setValue(REPL_FOCUSED, text); + await this.code.waitForSetValue(REPL_FOCUSED, text); // Wait for the keys to be picked up by the editor model such that repl evalutes what just got typed await this.editor.waitForEditorContents('debug:input', s => s.indexOf(text) >= 0); diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 8bc52eaeaf5..41a04d85412 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -33,7 +33,7 @@ export class Editor { await this.commands.runCommand('Rename Symbol'); await this.code.waitForActiveElement(RENAME_INPUT); - await this.code.setValue(RENAME_INPUT, to); + await this.code.waitForSetValue(RENAME_INPUT, to); await this.code.dispatchKeybinding('enter'); } @@ -95,14 +95,13 @@ export class Editor { const textarea = `${editor} textarea`; await this.code.waitForActiveElement(textarea); - await this.code.typeInEditor(textarea, text); + await this.code.waitForTypeInEditor(textarea, text); await this.waitForEditorContents(filename, c => c.indexOf(text) > -1, selectorPrefix); } async waitForEditorContents(filename: string, accept: (contents: string) => boolean, selectorPrefix = ''): Promise { const selector = [selectorPrefix || '', `${EDITOR(filename)} .view-lines`].join(' '); - return this.code.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' '))); } diff --git a/test/smoke/src/areas/extensions/extensions.ts b/test/smoke/src/areas/extensions/extensions.ts index 017c39d7420..64bfb07dd3d 100644 --- a/test/smoke/src/areas/extensions/extensions.ts +++ b/test/smoke/src/areas/extensions/extensions.ts @@ -27,7 +27,7 @@ export class Extensions extends Viewlet { async searchForExtension(name: string): Promise { await this.code.waitAndClick(SEARCH_BOX); await this.code.waitForActiveElement(SEARCH_BOX); - await this.code.setValue(SEARCH_BOX, name); + await this.code.waitForSetValue(SEARCH_BOX, name); } async installExtension(name: string): Promise { diff --git a/test/smoke/src/areas/git/scm.ts b/test/smoke/src/areas/git/scm.ts index 4543c6fc689..9c2a6f3e871 100644 --- a/test/smoke/src/areas/git/scm.ts +++ b/test/smoke/src/areas/git/scm.ts @@ -78,7 +78,7 @@ export class SCM extends Viewlet { async commit(message: string): Promise { await this.code.waitAndClick(SCM_INPUT); await this.code.waitForActiveElement(SCM_INPUT); - await this.code.setValue(SCM_INPUT, message); + await this.code.waitForSetValue(SCM_INPUT, message); await this.code.waitAndClick(COMMIT_COMMAND); } } \ No newline at end of file diff --git a/test/smoke/src/areas/preferences/keybindings.ts b/test/smoke/src/areas/preferences/keybindings.ts index 98865e492c4..807a971891e 100644 --- a/test/smoke/src/areas/preferences/keybindings.ts +++ b/test/smoke/src/areas/preferences/keybindings.ts @@ -15,7 +15,7 @@ export class KeybindingsEditor { async updateKeybinding(command: string, keybinding: string, ariaLabel: string): Promise { await this.commands.runCommand('workbench.action.openGlobalKeybindings'); await this.code.waitForActiveElement(SEARCH_INPUT); - await this.code.setValue(SEARCH_INPUT, command); + await this.code.waitForSetValue(SEARCH_INPUT, command); await this.code.waitAndClick('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item'); await this.code.waitForElement('div[aria-label="Keybindings"] .monaco-list-row.keybinding-item.focused.selected'); diff --git a/test/smoke/src/areas/preferences/settings.ts b/test/smoke/src/areas/preferences/settings.ts index 2c64ae89b12..3ac98059629 100644 --- a/test/smoke/src/areas/preferences/settings.ts +++ b/test/smoke/src/areas/preferences/settings.ts @@ -39,6 +39,7 @@ export class SettingsEditor { const settingsPath = path.join(this.userDataPath, 'User', 'settings.json'); await new Promise((c, e) => fs.writeFile(settingsPath, '{}', 'utf8', err => err ? e(err) : c())); - await this.editor.waitForEditorContents('settings.json', c => c.length === 0, '.editable-preferences-editor-container'); + await this.commands.runCommand('workbench.action.openGlobalSettings'); + await this.editor.waitForEditorContents('settings.json', c => c === '{}', '.editable-preferences-editor-container'); } } \ No newline at end of file diff --git a/test/smoke/src/areas/problems/problems.ts b/test/smoke/src/areas/problems/problems.ts index b5c671a9e70..0b82fa6914e 100644 --- a/test/smoke/src/areas/problems/problems.ts +++ b/test/smoke/src/areas/problems/problems.ts @@ -15,26 +15,16 @@ export class Problems { static PROBLEMS_VIEW_SELECTOR = '.panel.markers-panel'; - constructor(private code: Code, private commands: Commands) { - // noop - } + constructor(private code: Code, private commands: Commands) { } public async showProblemsView(): Promise { - if (!await this.isVisible()) { - await this.commands.runCommand('workbench.actions.view.problems'); - await this.waitForProblemsView(); - } + await this.commands.runCommand('workbench.actions.view.problems'); + await this.waitForProblemsView(); } public async hideProblemsView(): Promise { - if (await this.isVisible()) { - await this.commands.runCommand('workbench.actions.view.problems'); - await this.code.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR, el => !el); - } - } - - isVisible(): Promise { - return this.code.doesElementExist(Problems.PROBLEMS_VIEW_SELECTOR); + await this.commands.runCommand('workbench.actions.view.problems'); + await this.code.waitForElement(Problems.PROBLEMS_VIEW_SELECTOR, el => !el); } public async waitForProblemsView(): Promise { diff --git a/test/smoke/src/areas/quickopen/quickopen.ts b/test/smoke/src/areas/quickopen/quickopen.ts index c580efdf69d..35cc55464ff 100644 --- a/test/smoke/src/areas/quickopen/quickopen.ts +++ b/test/smoke/src/areas/quickopen/quickopen.ts @@ -23,7 +23,7 @@ export class QuickOpen { await this.waitForQuickOpenOpened(); if (value) { - await this.code.setValue(QuickOpen.QUICK_OPEN_INPUT, value); + await this.code.waitForSetValue(QuickOpen.QUICK_OPEN_INPUT, value); } } @@ -50,7 +50,7 @@ export class QuickOpen { } async submit(text: string): Promise { - await this.code.setValue(QuickOpen.QUICK_OPEN_INPUT, text); + await this.code.waitForSetValue(QuickOpen.QUICK_OPEN_INPUT, text); await this.code.dispatchKeybinding('enter'); await this.waitForQuickOpenClosed(); } diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index 8c3514ae1f3..632707e1bf9 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -25,7 +25,7 @@ export class Search extends Viewlet { async searchFor(text: string): Promise { await this.code.waitAndClick(INPUT); await this.code.waitForActiveElement(INPUT); - await this.code.setValue(INPUT, text); + await this.code.waitForSetValue(INPUT, text); await this.submitSearch(); } @@ -40,23 +40,15 @@ export class Search extends Viewlet { async setFilesToIncludeText(text: string): Promise { await this.code.waitAndClick(INCLUDE_INPUT); await this.code.waitForActiveElement(INCLUDE_INPUT); - await this.code.setValue(INCLUDE_INPUT, text || ''); + await this.code.waitForSetValue(INCLUDE_INPUT, text || ''); } async showQueryDetails(): Promise { - if (!await this.areDetailsVisible()) { - await this.code.waitAndClick(`${VIEWLET} .query-details .more`); - } + await this.code.waitAndClick(`${VIEWLET} .query-details .more`); } async hideQueryDetails(): Promise { - if (await this.areDetailsVisible()) { - await this.code.waitAndClick(`${VIEWLET} .query-details.more .more`); - } - } - - areDetailsVisible(): Promise { - return this.code.doesElementExist(`${VIEWLET} .query-details.more`); + await this.code.waitAndClick(`${VIEWLET} .query-details.more .more`); } async removeFileMatch(index: number): Promise { @@ -73,7 +65,7 @@ export class Search extends Viewlet { async setReplaceText(text: string): Promise { await this.code.waitAndClick(`${VIEWLET} .search-widget .replace-container .monaco-inputbox input[title="Replace"]`); await this.code.waitForElement(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`); - await this.code.setValue(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`, text); + await this.code.waitForSetValue(`${VIEWLET} .search-widget .replace-container .monaco-inputbox.synthetic-focus input[title="Replace"]`, text); } async replaceFileMatch(index: number): Promise { diff --git a/test/smoke/src/areas/workbench/data-migration.test.ts b/test/smoke/src/areas/workbench/data-migration.test.ts index 8fa282fd061..f4084ca624b 100644 --- a/test/smoke/src/areas/workbench/data-migration.test.ts +++ b/test/smoke/src/areas/workbench/data-migration.test.ts @@ -13,98 +13,99 @@ export interface ICreateAppFn { export function setup(userDataDir: string, createApp: ICreateAppFn) { describe('Data Migration', () => { + afterEach(async function () { await new Promise((c, e) => rimraf(userDataDir, { maxBusyTries: 10 }, err => err ? e(err) : c())); }); - it('checks if the Untitled file is restored migrating from stable to latest', async function () { - const stableApp = createApp(Quality.Stable); + // it('checks if the Untitled file is restored migrating from stable to latest', async function () { + // const stableApp = createApp(Quality.Stable); - if (!stableApp) { - this.skip(); - return; - } + // if (!stableApp) { + // this.skip(); + // return; + // } - await stableApp.start(); + // await stableApp.start(); - const textToType = 'Very dirty file'; + // const textToType = 'Very dirty file'; - await stableApp.workbench.editors.newUntitledFile(); - await stableApp.workbench.editor.waitForTypeInEditor('Untitled-1', textToType); + // await stableApp.workbench.editors.newUntitledFile(); + // await stableApp.workbench.editor.waitForTypeInEditor('Untitled-1', textToType); - await stableApp.stop(); - await new Promise(c => setTimeout(c, 500)); // wait until all resources are released (e.g. locked local storage) + // await stableApp.stop(); + // await new Promise(c => setTimeout(c, 500)); // wait until all resources are released (e.g. locked local storage) - // Checking latest version for the restored state - const app = createApp(Quality.Insiders); + // // Checking latest version for the restored state + // const app = createApp(Quality.Insiders); - await app.start(false); + // await app.start(false); - await app.workbench.editors.waitForActiveTab('Untitled-1', true); - await app.workbench.editor.waitForEditorContents('Untitled-1', c => c.indexOf(textToType) > -1); + // await app.workbench.editors.waitForActiveTab('Untitled-1', true); + // await app.workbench.editor.waitForEditorContents('Untitled-1', c => c.indexOf(textToType) > -1); - await app.stop(); - }); + // await app.stop(); + // }); - it('checks if the newly created dirty file is restored migrating from stable to latest', async function () { - const stableApp = createApp(Quality.Stable); + // it('checks if the newly created dirty file is restored migrating from stable to latest', async function () { + // const stableApp = createApp(Quality.Stable); - if (!stableApp) { - this.skip(); - return; - } + // if (!stableApp) { + // this.skip(); + // return; + // } - await stableApp.start(); + // await stableApp.start(); - const fileName = 'app.js'; - const textPart = 'This is going to be an unsaved file'; + // const fileName = 'app.js'; + // const textPart = 'This is going to be an unsaved file'; - await stableApp.workbench.quickopen.openFile(fileName); + // await stableApp.workbench.quickopen.openFile(fileName); - await stableApp.workbench.editor.waitForTypeInEditor(fileName, textPart); + // await stableApp.workbench.editor.waitForTypeInEditor(fileName, textPart); - await stableApp.stop(); - await new Promise(c => setTimeout(c, 500)); // wait until all resources are released (e.g. locked local storage) + // await stableApp.stop(); + // await new Promise(c => setTimeout(c, 500)); // wait until all resources are released (e.g. locked local storage) - // Checking latest version for the restored state - const app = createApp(Quality.Insiders); + // // Checking latest version for the restored state + // const app = createApp(Quality.Insiders); - await app.start(false); + // await app.start(false); - await app.workbench.editors.waitForActiveTab(fileName); - await app.workbench.editor.waitForEditorContents(fileName, c => c.indexOf(textPart) > -1); + // await app.workbench.editors.waitForActiveTab(fileName); + // await app.workbench.editor.waitForEditorContents(fileName, c => c.indexOf(textPart) > -1); - await app.stop(); - }); + // await app.stop(); + // }); - it('checks if opened tabs are restored migrating from stable to latest', async function () { - const stableApp = createApp(Quality.Stable); + // it('checks if opened tabs are restored migrating from stable to latest', async function () { + // const stableApp = createApp(Quality.Stable); - if (!stableApp) { - this.skip(); - return; - } + // if (!stableApp) { + // this.skip(); + // return; + // } - await stableApp.start(); + // await stableApp.start(); - const fileName1 = 'app.js', fileName2 = 'jsconfig.json', fileName3 = 'readme.md'; + // const fileName1 = 'app.js', fileName2 = 'jsconfig.json', fileName3 = 'readme.md'; - await stableApp.workbench.quickopen.openFile(fileName1); - await stableApp.workbench.runCommand('View: Keep Editor'); - await stableApp.workbench.quickopen.openFile(fileName2); - await stableApp.workbench.runCommand('View: Keep Editor'); - await stableApp.workbench.quickopen.openFile(fileName3); - await stableApp.stop(); + // await stableApp.workbench.quickopen.openFile(fileName1); + // await stableApp.workbench.runCommand('View: Keep Editor'); + // await stableApp.workbench.quickopen.openFile(fileName2); + // await stableApp.workbench.runCommand('View: Keep Editor'); + // await stableApp.workbench.quickopen.openFile(fileName3); + // await stableApp.stop(); - const app = createApp(Quality.Insiders); + // const app = createApp(Quality.Insiders); - await app.start(false); + // await app.start(false); - await app.workbench.editors.waitForTab(fileName1); - await app.workbench.editors.waitForTab(fileName2); - await app.workbench.editors.waitForTab(fileName3); + // await app.workbench.editors.waitForTab(fileName1); + // await app.workbench.editors.waitForTab(fileName2); + // await app.workbench.editors.waitForTab(fileName3); - await app.stop(); - }); + // await app.stop(); + // }); }); } \ No newline at end of file diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index 2821a060e7b..25638508589 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -132,146 +132,87 @@ export async function spawn(options: SpawnOptions): Promise { export class Code { private _activeWindowId: number | undefined = undefined; + private driver: IDriver; constructor( private process: cp.ChildProcess, private client: IDisposable, - private driver: IDriver, - private verbose: boolean - ) { } + driver: IDriver, + verbose: boolean + ) { + if (verbose) { + this.driver = new Proxy(driver, { + get(target, prop, receiver) { + if (typeof target[prop] !== 'function') { + return target[prop]; + } + + return function (...args) { + console.log('** ', prop, ...args.filter(a => typeof a === 'string')); + return target[prop].apply(this, args); + }; + } + }); + } else { + this.driver = driver; + } + } async dispatchKeybinding(keybinding: string): Promise { - if (this.verbose) { - console.log('- dispatchKeybinding:', keybinding); - } - const windowId = await this.getActiveWindowId(); await this.driver.dispatchKeybinding(windowId, keybinding); } async waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { - if (this.verbose) { - console.log('- waitForTextContent:', selector); - } - const windowId = await this.getActiveWindowId(); accept = accept || (result => textContent !== void 0 ? textContent === result : !!result); - return await this.waitFor(() => this.driver.getElements(windowId, selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); + return await this.poll(() => this.driver.getElements(windowId, selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); } async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { - if (this.verbose) { - console.log('- waitAndClick:', selector); - } - const windowId = await this.getActiveWindowId(); - - // TODO should waitForClick - await this.waitForElement(selector); - await this.driver.click(windowId, selector, xoffset, yoffset); + await this.poll(() => this.driver.click(windowId, selector, xoffset, yoffset), () => true); } async waitAndDoubleClick(selector: string): Promise { - if (this.verbose) { - console.log('- waitAndDoubleClick:', selector); - } - const windowId = await this.getActiveWindowId(); - - // TODO should waitForDoubleClick - await this.waitForElement(selector); - await this.driver.doubleClick(windowId, selector); + await this.poll(() => this.driver.doubleClick(windowId, selector), () => true); } async waitAndMove(selector: string): Promise { - if (this.verbose) { - console.log('- waitAndMove:', selector); - } - const windowId = await this.getActiveWindowId(); - // TODO should waitForMove - await this.waitForElement(selector); - await this.driver.move(windowId, selector); + await this.poll(() => this.driver.move(windowId, selector), () => true); } - // TODO should be waitForSetValue - async setValue(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- setValue:', selector); - } - + async waitForSetValue(selector: string, value: string): Promise { const windowId = await this.getActiveWindowId(); - // TODO should waitForSetValue - await this.waitForElement(selector); - await this.driver.setValue(windowId, selector, text); - } - - // TODO merge with getElements - async doesElementExist(selector: string): Promise { - if (this.verbose) { - console.log('- doesElementExist:', selector); - } - - const windowId = await this.getActiveWindowId(); - const elements = await this.driver.getElements(windowId, selector); - return elements.length > 0; - } - - // TODO merge with getElements - async getElementCount(selector: string): Promise { - if (this.verbose) { - console.log('- getElementCount:', selector); - } - - const windowId = await this.getActiveWindowId(); - const elements = await this.driver.getElements(windowId, selector); - return elements.length; + await this.poll(() => this.driver.setValue(windowId, selector, value), () => true); } async waitForElements(selector: string, recursive: boolean, accept: (result: IElement[]) => boolean = result => result.length > 0): Promise { - if (this.verbose) { - console.log('- waitForElements:', selector); - } - const windowId = await this.getActiveWindowId(); - return await this.waitFor(() => this.driver.getElements(windowId, selector, recursive), accept, `elements with selector ${selector}`); + return await this.poll(() => this.driver.getElements(windowId, selector, recursive), accept, `elements with selector ${selector}`); } async waitForElement(selector: string, accept: (result: IElement | undefined) => boolean = result => !!result): Promise { - if (this.verbose) { - console.log('- waitForElement:', selector); - } - const windowId = await this.getActiveWindowId(); - return await this.waitFor(() => this.driver.getElements(windowId, selector).then(els => els[0]), accept, `element with selector ${selector}`); + return await this.poll(() => this.driver.getElements(windowId, selector).then(els => els[0]), accept, `element with selector ${selector}`); } async waitForActiveElement(selector: string): Promise { - if (this.verbose) { - console.log('- waitForActiveElement:', selector); - } - const windowId = await this.getActiveWindowId(); - await this.waitFor(() => this.driver.isActiveElement(windowId, selector), undefined, `wait for active element: ${selector}`); + await this.poll(() => this.driver.isActiveElement(windowId, selector), undefined, `wait for active element: ${selector}`); } async waitForTitle(fn: (title: string) => boolean): Promise { - if (this.verbose) { - console.log('- getTitle'); - } - const windowId = await this.getActiveWindowId(); - await this.waitFor(() => this.driver.getTitle(windowId), fn, 'wait for title: ${}'); + await this.poll(() => this.driver.getTitle(windowId), fn, 'wait for title: ${}'); } // TODO make into waitForTypeInEditor - async typeInEditor(selector: string, text: string): Promise { - if (this.verbose) { - console.log('- typeInEditor', selector, text); - } - + async waitForTypeInEditor(selector: string, text: string): Promise { const windowId = await this.getActiveWindowId(); - await this.driver.typeInEditor(windowId, selector, text); + await this.poll(() => this.driver.typeInEditor(windowId, selector, text), () => true, 'wait for title: ${}'); } // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding @@ -280,8 +221,9 @@ export class Code { private readonly retryDuration = 100; // in milliseconds // TODO: clean function interface - private async waitFor(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; - private async waitFor(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { + // TODO: if accept function is missing, just dont use one, rely on exceptions + private async poll(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; + private async poll(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { let trial = 1; retryCount = typeof retryCount === 'number' ? retryCount : this.retryCount; @@ -293,6 +235,10 @@ export class Code { let result; try { result = await func(); + + if (accept(result)) { + return result; + } } catch (e) { // console.warn(e); @@ -301,10 +247,6 @@ export class Code { } } - if (accept(result)) { - return result; - } - await new Promise(resolve => setTimeout(resolve, this.retryDuration)); trial++; } From b4492b1f767be0995cc59db8653bee0d8198ea5b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Apr 2018 17:25:51 +0200 Subject: [PATCH 132/710] further cleanup of driver API --- test/smoke/src/application.ts | 15 ++--------- test/smoke/src/vscode/code.ts | 50 +++++++++++++++-------------------- 2 files changed, 23 insertions(+), 42 deletions(-) diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index b8f57eae65f..11dd14ea1a4 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -115,23 +115,12 @@ export class Application { } private async checkWindowReady(): Promise { - if (!this._code) { + if (!this.code) { console.error('No code instance found'); return; } - let retries = 0; - - while (++retries < 300) { // 30 seconds - const ids = await this._code.getWindowIds(); - - if (ids.length > 0) { - break; - } - - await new Promise(c => setTimeout(c, 100)); - } - + await this.code.waitForWindowIds(ids => ids.length > 0); await this.code.waitForElement('.monaco-workbench'); } diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index 25638508589..281c05eba80 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -158,6 +158,10 @@ export class Code { } } + async waitForWindowIds(fn: (windowIds: number[]) => boolean): Promise { + await this.poll(() => this.driver.getWindowIds(), fn, `get window ids`); + } + async dispatchKeybinding(keybinding: string): Promise { const windowId = await this.getActiveWindowId(); await this.driver.dispatchKeybinding(windowId, keybinding); @@ -166,75 +170,68 @@ export class Code { async waitForTextContent(selector: string, textContent?: string, accept?: (result: string) => boolean): Promise { const windowId = await this.getActiveWindowId(); accept = accept || (result => textContent !== void 0 ? textContent === result : !!result); - return await this.poll(() => this.driver.getElements(windowId, selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `getTextContent with selector ${selector}`); + return await this.poll(() => this.driver.getElements(windowId, selector).then(els => els[0].textContent), s => accept!(typeof s === 'string' ? s : ''), `get text content '${selector}'`); } async waitAndClick(selector: string, xoffset?: number, yoffset?: number): Promise { const windowId = await this.getActiveWindowId(); - await this.poll(() => this.driver.click(windowId, selector, xoffset, yoffset), () => true); + await this.poll(() => this.driver.click(windowId, selector, xoffset, yoffset), () => true, `click '${selector}'`); } async waitAndDoubleClick(selector: string): Promise { const windowId = await this.getActiveWindowId(); - await this.poll(() => this.driver.doubleClick(windowId, selector), () => true); + await this.poll(() => this.driver.doubleClick(windowId, selector), () => true, `double click '${selector}'`); } async waitAndMove(selector: string): Promise { const windowId = await this.getActiveWindowId(); - await this.poll(() => this.driver.move(windowId, selector), () => true); + await this.poll(() => this.driver.move(windowId, selector), () => true, `move '${selector}'`); } async waitForSetValue(selector: string, value: string): Promise { const windowId = await this.getActiveWindowId(); - await this.poll(() => this.driver.setValue(windowId, selector, value), () => true); + await this.poll(() => this.driver.setValue(windowId, selector, value), () => true, `set value '${selector}'`); } async waitForElements(selector: string, recursive: boolean, accept: (result: IElement[]) => boolean = result => result.length > 0): Promise { const windowId = await this.getActiveWindowId(); - return await this.poll(() => this.driver.getElements(windowId, selector, recursive), accept, `elements with selector ${selector}`); + return await this.poll(() => this.driver.getElements(windowId, selector, recursive), accept, `get elements '${selector}'`); } async waitForElement(selector: string, accept: (result: IElement | undefined) => boolean = result => !!result): Promise { const windowId = await this.getActiveWindowId(); - return await this.poll(() => this.driver.getElements(windowId, selector).then(els => els[0]), accept, `element with selector ${selector}`); + return await this.poll(() => this.driver.getElements(windowId, selector).then(els => els[0]), accept, `get element '${selector}'`); } async waitForActiveElement(selector: string): Promise { const windowId = await this.getActiveWindowId(); - await this.poll(() => this.driver.isActiveElement(windowId, selector), undefined, `wait for active element: ${selector}`); + await this.poll(() => this.driver.isActiveElement(windowId, selector), r => r, `is active element '${selector}'`); } async waitForTitle(fn: (title: string) => boolean): Promise { const windowId = await this.getActiveWindowId(); - await this.poll(() => this.driver.getTitle(windowId), fn, 'wait for title: ${}'); + await this.poll(() => this.driver.getTitle(windowId), fn, `get title`); } - // TODO make into waitForTypeInEditor async waitForTypeInEditor(selector: string, text: string): Promise { const windowId = await this.getActiveWindowId(); - await this.poll(() => this.driver.typeInEditor(windowId, selector, text), () => true, 'wait for title: ${}'); + await this.poll(() => this.driver.typeInEditor(windowId, selector, text), () => true, `type in editor '${selector}'`); } - // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding - // the time it takes for the actual retry call to complete - private readonly retryCount: number = 200; - private readonly retryDuration = 100; // in milliseconds + private static PollRetryCount: number = 200; + private static PollInterval = 100; // millis - // TODO: clean function interface - // TODO: if accept function is missing, just dont use one, rely on exceptions - private async poll(func: () => T | Promise, accept?: (result: T) => boolean | Promise, timeoutMessage?: string, retryCount?: number): Promise; - private async poll(func: () => T | Promise, accept: (result: T) => boolean | Promise = result => !!result, timeoutMessage?: string, retryCount?: number): Promise { + private async poll(fn: () => Promise, accept: (result: T) => boolean, timeoutMessage: string): Promise { let trial = 1; - retryCount = typeof retryCount === 'number' ? retryCount : this.retryCount; while (true) { - if (trial > retryCount) { - throw new Error(`${timeoutMessage}: Timed out after ${(retryCount * this.retryDuration) / 1000} seconds.`); + if (trial > Code.PollRetryCount) { + throw new Error(`Timeout: ${timeoutMessage} after ${(Code.PollRetryCount * Code.PollInterval) / 1000} seconds.`); } let result; try { - result = await func(); + result = await fn(); if (accept(result)) { return result; @@ -247,16 +244,11 @@ export class Code { } } - await new Promise(resolve => setTimeout(resolve, this.retryDuration)); + await new Promise(resolve => setTimeout(resolve, Code.PollInterval)); trial++; } } - // TODO: replace with waitForWindows - async getWindowIds(): Promise { - return await this.driver.getWindowIds(); - } - private async getActiveWindowId(): Promise { if (typeof this._activeWindowId !== 'number') { const windows = await this.driver.getWindowIds(); From 6bf56c43e1735a6a7aabaef065756c0d8a0bb3c8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 11 Apr 2018 17:54:32 +0200 Subject: [PATCH 133/710] Use items width to compute overflow --- src/vs/base/browser/ui/toolbar/toolbar.ts | 8 ++++++++ src/vs/workbench/browser/parts/panel/media/panelpart.css | 4 ---- src/vs/workbench/browser/parts/panel/panelPart.ts | 7 +------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/toolbar/toolbar.ts b/src/vs/base/browser/ui/toolbar/toolbar.ts index dfdab38d45c..cecc9f9831e 100644 --- a/src/vs/base/browser/ui/toolbar/toolbar.ts +++ b/src/vs/base/browser/ui/toolbar/toolbar.ts @@ -97,6 +97,14 @@ export class ToolBar { return this.actionBar.getContainer(); } + public getItemsWidth(): number { + let itemsWidth = 0; + for (let i = 0; i < this.actionBar.length(); i++) { + itemsWidth += this.actionBar.getWidth(i); + } + return itemsWidth; + } + public setAriaLabel(label: string): void { this.actionBar.setAriaLabel(label); } diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index fc207f64896..4b0a0a4c7e3 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -30,10 +30,6 @@ border-left-style: solid; } -.monaco-workbench > .part.panel > .composite.title > .title-actions { - flex-grow: 0; -} - .monaco-workbench > .part.panel > .title > .title-actions .monaco-action-bar .action-item .action-label { outline-offset: -2px; } diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 852757046ca..d2972c69150 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -43,7 +43,6 @@ export class PanelPart extends CompositePart implements IPanelService { private blockOpeningPanel: boolean; private compositeBar: CompositeBar; private dimension: Dimension; - private toolbarWidth = new Map(); constructor( id: string, @@ -258,11 +257,7 @@ export class PanelPart extends CompositePart implements IPanelService { if (!activePanel) { return 0; } - if (!this.toolbarWidth.has(activePanel.getId())) { - this.toolbarWidth.set(activePanel.getId(), this.toolBar.getContainer().offsetWidth); - } - - return this.toolbarWidth.get(activePanel.getId()); + return this.toolBar.getItemsWidth(); } } From 6f32564356f8e20a2f7788ef8ca93c7e787b84d7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 11 Apr 2018 18:00:42 +0200 Subject: [PATCH 134/710] Implement #22289 --- .../parts/markers/electron-browser/markers.ts | 87 +++++-- .../markers/electron-browser/markersModel.ts | 212 +++++++++-------- .../markers/electron-browser/markersPanel.ts | 91 +++++--- .../electron-browser/markersPanelActions.ts | 219 ++++++++++++++---- .../media/excludeSettings-dark.svg | 1 + .../media/excludeSettings.svg | 1 + .../electron-browser/media/markers.css | 43 +++- .../markers/electron-browser/messages.ts | 8 +- 8 files changed, 463 insertions(+), 199 deletions(-) create mode 100755 src/vs/workbench/parts/markers/electron-browser/media/excludeSettings-dark.svg create mode 100755 src/vs/workbench/parts/markers/electron-browser/media/excludeSettings.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/markers.ts b/src/vs/workbench/parts/markers/electron-browser/markers.ts index a15da7a99e9..2c104743afd 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markers.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markers.ts @@ -13,16 +13,26 @@ import Constants from './constants'; import URI from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { deepClone, mixin } from 'vs/base/common/objects'; +import { IExpression, getEmptyExpression } from 'vs/base/common/glob'; +import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { join, isAbsolute } from 'vs/base/common/paths'; export const IMarkersWorkbenchService = createDecorator('markersWorkbenchService'); +export interface IFilter { + filterText: string; + useFilesExclude: boolean; +} + export interface IMarkersWorkbenchService { _serviceBrand: any; - readonly onDidChangeMarkersForResources: Event; + readonly onDidChange: Event; readonly markersModel: MarkersModel; - filter(filter: string): void; + filter(filter: IFilter): void; } export class MarkersWorkbenchService extends Disposable implements IMarkersWorkbenchService { @@ -30,21 +40,30 @@ export class MarkersWorkbenchService extends Disposable implements IMarkersWorkb readonly markersModel: MarkersModel; - private readonly _onDidChangeMarkersForResources: Emitter = this._register(new Emitter()); - readonly onDidChangeMarkersForResources: Event = this._onDidChangeMarkersForResources.event; + private readonly _onDidChange: Emitter = this._register(new Emitter()); + readonly onDidChange: Event = this._onDidChange.event; + + private useFilesExclude: boolean = false; constructor( @IMarkerService private markerService: IMarkerService, + @IConfigurationService private configurationService: IConfigurationService, + @IWorkspaceContextService private workspaceContextService: IWorkspaceContextService, @IActivityService private activityService: IActivityService ) { super(); this.markersModel = this._register(new MarkersModel(this.readMarkers())); this._register(markerService.onMarkerChanged(resources => this.onMarkerChanged(resources))); + this._register(configurationService.onDidChangeConfiguration(e => { + if (this.useFilesExclude && e.affectsConfiguration('files.exclude')) { + this.doFilter(this.markersModel.filterOptions.filter, this.getExcludeExpression()); + } + })); } - filter(filter: string): void { - this.markersModel.updateFilterOptions(new FilterOptions(filter)); - this.refreshBadge(); + filter(filter: IFilter): void { + this.useFilesExclude = filter.useFilesExclude; + this.doFilter(filter.filterText, this.getExcludeExpression()); } private onMarkerChanged(resources: URI[]): void { @@ -54,19 +73,61 @@ export class MarkersWorkbenchService extends Disposable implements IMarkersWorkb } }); this.refreshBadge(); - this._onDidChangeMarkersForResources.fire(resources); + this._onDidChange.fire(resources); } private readMarkers(resource?: URI): IMarker[] { return this.markerService.read({ resource, severities: MarkerSeverity.Error | MarkerSeverity.Warning | MarkerSeverity.Info }); } + private getExcludeExpression(): IExpression { + if (this.useFilesExclude) { + const workspaceFolders = this.workspaceContextService.getWorkspace().folders; + if (workspaceFolders.length) { + const result = getEmptyExpression(); + for (const workspaceFolder of workspaceFolders) { + mixin(result, this.getExcludesForFolder(workspaceFolder)); + } + return result; + } else { + return this.getFilesExclude(); + } + } + return {}; + } + + private doFilter(filterText: string, filesExclude: IExpression): void { + this.markersModel.updateFilterOptions(new FilterOptions(filterText, filesExclude)); + this.refreshBadge(); + this._onDidChange.fire([]); + } + private refreshBadge(): void { - const { total, filtered } = this.markersModel.stats(); - const message = total === filtered ? localize('totalProblems', 'Total {0} Problems', total) : localize('filteredProblems', 'Showing {0} of {1} Problems', filtered, total); - this.activityService.showActivity(Constants.MARKERS_PANEL_ID, new NumberBadge(filtered, () => message)); + const { total } = this.markersModel.stats(); + const message = localize('totalProblems', 'Total {0} Problems', total); + this.activityService.showActivity(Constants.MARKERS_PANEL_ID, new NumberBadge(total, () => message)); + } + + private getExcludesForFolder(workspaceFolder: IWorkspaceFolder): IExpression { + const expression = this.getFilesExclude(workspaceFolder.uri); + return this.getAbsoluteExpression(expression, workspaceFolder.uri.fsPath); + } + + private getFilesExclude(resource?: URI): IExpression { + return deepClone(this.configurationService.getValue('files.exclude', { resource })) || {}; + } + + private getAbsoluteExpression(expr: IExpression, root: string): IExpression { + return Object.keys(expr) + .reduce((absExpr: IExpression, key: string) => { + if (expr[key] && !isAbsolute(key)) { + const absPattern = join(root, key); + absExpr[absPattern] = expr[key]; + } + + return absExpr; + }, Object.create(null)); } } - -registerSingleton(IMarkersWorkbenchService, MarkersWorkbenchService); +registerSingleton(IMarkersWorkbenchService, MarkersWorkbenchService); \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/electron-browser/markersModel.ts b/src/vs/workbench/parts/markers/electron-browser/markersModel.ts index 2dc945951f8..652e9c08a5b 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersModel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersModel.ts @@ -13,6 +13,8 @@ import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; import { Schemas } from 'vs/base/common/network'; import { groupBy, isFalsyOrEmpty, flatten } from 'vs/base/common/arrays'; import { values } from 'vs/base/common/map'; +import * as glob from 'vs/base/common/glob'; +import * as strings from 'vs/base/common/strings'; function compareUris(a: URI, b: URI) { if (a.toString() < b.toString()) { @@ -34,7 +36,9 @@ export class ResourceMarkers extends NodeWithId { private _path: string = null; readonly markers: Marker[]; - filteredCount: number = 0; + isExcluded: boolean = false; + isIncluded: boolean = false; + filteredCount: number; uriMatches: IMatch[] = []; constructor( @@ -127,21 +131,48 @@ export class FilterOptions { readonly filterErrors: boolean = false; readonly filterWarnings: boolean = false; readonly filterInfos: boolean = false; - readonly filter: string = ''; - readonly completeFilter: string = ''; + readonly excludePattern: glob.ParsedExpression = null; + readonly includePattern: glob.ParsedExpression = null; + readonly textFilter: string = ''; - constructor(filter: string = '') { - if (filter) { - this.completeFilter = filter; - this.filter = filter.trim(); - this.filterErrors = this.matches(this.filter, Messages.MARKERS_PANEL_FILTER_ERRORS); - this.filterWarnings = this.matches(this.filter, Messages.MARKERS_PANEL_FILTER_WARNINGS); - this.filterInfos = this.matches(this.filter, Messages.MARKERS_PANEL_FILTER_INFOS); + constructor(readonly filter: string = '', excludePatterns: glob.IExpression = {}) { + filter = filter.trim(); + for (const key of Object.keys(excludePatterns)) { + if (excludePatterns[key]) { + this.setPattern(excludePatterns, key); + } + delete excludePatterns[key]; } + const includePatterns: glob.IExpression = glob.getEmptyExpression(); + if (filter) { + const filters = glob.splitGlobAware(filter, ',').map(s => s.trim()).filter(s => !!s.length); + for (const f of filters) { + this.filterErrors = this.filterErrors || this.matches(f, Messages.MARKERS_PANEL_FILTER_ERRORS); + this.filterWarnings = this.filterWarnings || this.matches(f, Messages.MARKERS_PANEL_FILTER_WARNINGS); + this.filterInfos = this.filterInfos || this.matches(f, Messages.MARKERS_PANEL_FILTER_INFOS); + if (strings.startsWith(f, '!')) { + this.setPattern(excludePatterns, strings.ltrim(f, '!')); + } else { + this.setPattern(includePatterns, f); + this.textFilter += ` ${f}`; + } + } + } + if (Object.keys(excludePatterns).length) { + this.excludePattern = glob.parse(excludePatterns); + } + if (Object.keys(includePatterns).length) { + this.includePattern = glob.parse(includePatterns); + } + this.textFilter = this.textFilter.trim(); } - public hasFilters(): boolean { - return !!this.filter; + private setPattern(expression: glob.IExpression, pattern: string) { + if (pattern[0] === '.') { + pattern = '*' + pattern; // convert ".js" to "*.js" + } + expression[`**/${pattern}/**`] = true; + expression[`**/${pattern}`] = true; } private matches(prefix: string, word: string): boolean { @@ -229,89 +260,90 @@ export class MarkersModel { public updateFilterOptions(filterOptions: FilterOptions): void { this._filterOptions = filterOptions; - if (!this._filterOptions.hasFilters()) { - // reset all filters/matches - this._markersByResource.forEach(resource => { - resource.filteredCount = resource.markers.length; - resource.uriMatches = []; - - for (const marker of resource.markers) { - marker.isSelected = true; - marker.messageMatches = []; - marker.sourceMatches = []; - marker.resourceRelatedInformation.forEach(r => { - r.uriMatches = []; - r.messageMatches = []; - }); - } - }); - } else { - // update properly - this._markersByResource.forEach(resource => { - - resource.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(resource.uri.fsPath)) : []; - resource.filteredCount = 0; - - for (const marker of resource.markers) { - marker.messageMatches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, marker.raw.message) : []; - marker.sourceMatches = marker.raw.source && this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, marker.raw.source) : []; - marker.isSelected = this.filterMarker(marker.raw); - if (marker.isSelected) { - resource.filteredCount += 1; - } - marker.resourceRelatedInformation.forEach(r => { - r.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(r.raw.resource.fsPath)) : []; - r.messageMatches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, r.raw.message) : []; - }); - } - }); - } + this._markersByResource.forEach(resource => { + this.updateResource(resource); + for (const marker of resource.markers) { + this.updateMarker(marker, resource); + } + this.updateFilteredCount(resource); + }); } private createResource(uri: URI, rawMarkers: IMarker[]): ResourceMarkers { let markers: Marker[] = []; - let filteredCount = 0; - for (let i = 0; i < rawMarkers.length; i++) { - let marker = this.createMarker(rawMarkers[i], i, uri.toString()); - markers.push(marker); - if (marker.isSelected) { - filteredCount += 1; - } - } - const resource = new ResourceMarkers(uri, markers); - resource.filteredCount = filteredCount; - resource.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(uri.fsPath)) : []; + this.updateResource(resource); + + rawMarkers.forEach((rawMarker, index) => { + const marker = new Marker(uri.toString() + index, rawMarker); + if (rawMarker.relatedInformation) { + const groupedByResource = groupBy(rawMarker.relatedInformation, MarkersModel._compareMarkersByUri); + groupedByResource.sort((a, b) => compareUris(a[0].resource, b[0].resource)); + marker.resourceRelatedInformation = flatten(groupedByResource).map((r, index) => new RelatedInformation(marker.id + index, r)); + } + this.updateMarker(marker, resource); + markers.push(marker); + }); + + this.updateFilteredCount(resource); return resource; } - private createMarker(rawMarker: IMarker, index: number, uri: string): Marker { - const marker = new Marker(uri + index, rawMarker); - marker.messageMatches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, rawMarker.message) : []; - marker.sourceMatches = rawMarker.source && this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, rawMarker.source) : []; - marker.isSelected = this.filterMarker(rawMarker); - if (rawMarker.relatedInformation) { - const groupedByResource = groupBy(rawMarker.relatedInformation, MarkersModel._compareMarkersByUri); - groupedByResource.sort((a, b) => compareUris(a[0].resource, b[0].resource)); - marker.resourceRelatedInformation = flatten(groupedByResource).map((r, index) => { - const relatedInformation = new RelatedInformation(marker.id + index, r); - relatedInformation.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(r.resource.fsPath)) : []; - relatedInformation.messageMatches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, r.message) : []; - return relatedInformation; - }); - } - return marker; + private updateResource(resource: ResourceMarkers): void { + resource.isExcluded = this.isResourceExcluded(resource); + resource.isIncluded = this.isResourceIncluded(resource); + resource.uriMatches = this._filterOptions.textFilter ? FilterOptions._filter(this._filterOptions.textFilter, paths.basename(resource.uri.fsPath)) : []; } - private filterMarker(marker: IMarker): boolean { - if (!this._filterOptions.hasFilters()) { + private updateFilteredCount(resource: ResourceMarkers): void { + if (resource.isExcluded) { + resource.filteredCount = 0; + } else if (resource.isIncluded) { + resource.filteredCount = resource.markers.length; + } else { + resource.filteredCount = resource.markers.filter(m => m.isSelected).length; + } + } + + private updateMarker(marker: Marker, resource: ResourceMarkers): void { + marker.messageMatches = !resource.isExcluded && this._filterOptions.textFilter ? FilterOptions._fuzzyFilter(this._filterOptions.textFilter, marker.raw.message) : []; + marker.sourceMatches = !resource.isExcluded && marker.raw.source && this._filterOptions.textFilter ? FilterOptions._filter(this._filterOptions.textFilter, marker.raw.source) : []; + marker.resourceRelatedInformation.forEach(r => { + r.uriMatches = !resource.isExcluded && this._filterOptions.textFilter ? FilterOptions._filter(this._filterOptions.textFilter, paths.basename(r.raw.resource.fsPath)) : []; + r.messageMatches = !resource.isExcluded && this._filterOptions.textFilter ? FilterOptions._fuzzyFilter(this._filterOptions.textFilter, r.raw.message) : []; + }); + marker.isSelected = this.isMarkerSelected(marker.raw, resource); + } + + private isResourceExcluded(resource: ResourceMarkers): boolean { + if (resource.uri.scheme === Schemas.walkThrough || resource.uri.scheme === Schemas.walkThroughSnippet) { return true; } - if (marker.resource.scheme === Schemas.walkThrough || marker.resource.scheme === Schemas.walkThroughSnippet) { + if (this.filterOptions.excludePattern && !!this.filterOptions.excludePattern(resource.uri.fsPath)) { + return true; + } + return false; + } + + private isResourceIncluded(resource: ResourceMarkers): boolean { + if (this.filterOptions.includePattern && this.filterOptions.includePattern(resource.uri.fsPath)) { + return true; + } + if (this._filterOptions.textFilter && !!FilterOptions._filter(this._filterOptions.textFilter, paths.basename(resource.uri.fsPath))) { + return true; + } + return false; + } + + private isMarkerSelected(marker: IMarker, resource: ResourceMarkers): boolean { + if (resource.isExcluded) { return false; } + if (resource.isIncluded) { + return true; + } if (this._filterOptions.filterErrors && MarkerSeverity.Error === marker.severity) { return true; } @@ -321,18 +353,18 @@ export class MarkersModel { if (this._filterOptions.filterInfos && MarkerSeverity.Info === marker.severity) { return true; } - if (!!FilterOptions._fuzzyFilter(this._filterOptions.filter, marker.message)) { + if (!this._filterOptions.textFilter) { return true; } - if (!!FilterOptions._filter(this._filterOptions.filter, paths.basename(marker.resource.fsPath))) { + if (!!FilterOptions._fuzzyFilter(this._filterOptions.textFilter, marker.message)) { return true; } - if (!!marker.source && !!FilterOptions._filter(this._filterOptions.filter, marker.source)) { + if (!!marker.source && !!FilterOptions._filter(this._filterOptions.textFilter, marker.source)) { return true; } if (!!marker.relatedInformation && marker.relatedInformation.some(r => - !!FilterOptions._filter(this._filterOptions.filter, paths.basename(r.resource.fsPath)) || ! - !FilterOptions._filter(this._filterOptions.filter, r.message))) { + !!FilterOptions._filter(this._filterOptions.textFilter, paths.basename(r.resource.fsPath)) || ! + !FilterOptions._filter(this._filterOptions.textFilter, r.message))) { return true; } return false; @@ -341,16 +373,4 @@ export class MarkersModel { public dispose(): void { this._markersByResource.clear(); } - - public getMessage(): string { - if (this.hasFilteredResources()) { - return ''; - } - if (this.hasResources()) { - if (this._filterOptions.hasFilters()) { - return Messages.MARKERS_PANEL_NO_PROBLEMS_FILTERS; - } - } - return Messages.MARKERS_PANEL_NO_PROBLEMS_BUILT; - } } diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index e5b909416af..492fc1a1984 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -10,8 +10,7 @@ import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Delayer } from 'vs/base/common/async'; import * as dom from 'vs/base/browser/dom'; -import { IAction, Action } from 'vs/base/common/actions'; -import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IAction, IActionItem } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { Panel } from 'vs/workbench/browser/panel'; @@ -21,7 +20,7 @@ import { Marker, ResourceMarkers, RelatedInformation } from 'vs/workbench/parts/ import { Controller } from 'vs/workbench/parts/markers/electron-browser/markersTreeController'; import * as Viewer from 'vs/workbench/parts/markers/electron-browser/markersTreeViewer'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { CollapseAllAction, FilterAction, FilterInputBoxActionItem } from 'vs/workbench/parts/markers/electron-browser/markersPanelActions'; +import { CollapseAllAction, FilterInputActionItem, FilterByFilesExcludeAction, FilterAction } from 'vs/workbench/parts/markers/electron-browser/markersPanelActions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; import { RangeHighlightDecorations } from 'vs/workbench/browser/parts/editor/rangeDecorations'; @@ -31,6 +30,8 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { TreeResourceNavigator, WorkbenchTree } from 'vs/platform/list/browser/listService'; import { IMarkersWorkbenchService } from 'vs/workbench/parts/markers/electron-browser/markers'; import { SimpleFileResourceDragAndDrop } from 'vs/workbench/browser/dnd'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { Scope } from 'vs/workbench/common/memento'; export class MarkersPanel extends Panel { @@ -44,12 +45,14 @@ export class MarkersPanel extends Panel { private rangeHighlightDecorations: RangeHighlightDecorations; private actions: IAction[]; - private filterAction: FilterAction; private collapseAllAction: IAction; + private filterInputActionItem: FilterInputActionItem; + private filterByFilesExcludeAction: FilterByFilesExcludeAction; private treeContainer: HTMLElement; private messageBoxContainer: HTMLElement; private messageBox: HTMLElement; + private panelSettings: any; private currentResourceGotAddedToMarkersData: boolean = false; @@ -60,11 +63,13 @@ export class MarkersPanel extends Panel { @IConfigurationService private configurationService: IConfigurationService, @ITelemetryService telemetryService: ITelemetryService, @IThemeService themeService: IThemeService, - @IMarkersWorkbenchService private markersWorkbenchService: IMarkersWorkbenchService + @IMarkersWorkbenchService private markersWorkbenchService: IMarkersWorkbenchService, + @IStorageService storageService: IStorageService, ) { super(Constants.MARKERS_PANEL_ID, telemetryService, themeService); this.delayedRefresh = new Delayer(500); this.autoExpanded = new Set(); + this.panelSettings = this.getMemento(storageService, Scope.WORKSPACE); } public create(parent: HTMLElement): TPromise { @@ -79,9 +84,11 @@ export class MarkersPanel extends Panel { this.createMessageBox(container); this.createTree(container); - + this.createActions(); this.createListeners(); + this.updateFilter(); + return this.render(); } @@ -90,7 +97,10 @@ export class MarkersPanel extends Panel { } public layout(dimension: dom.Dimension): void { - this.tree.layout(dimension.height, dimension.width); + const height = dimension.height - 38; + this.treeContainer.style.height = `${height}px`; + this.tree.layout(height, dimension.width); + this.filterInputActionItem.toggleLayout(dimension.width < 1200); } public focus(): void { @@ -126,9 +136,8 @@ export class MarkersPanel extends Panel { public getActions(): IAction[] { if (!this.actions) { - this.actions = this.createActions(); + this.createActions(); } - this.collapseAllAction.enabled = this.markersWorkbenchService.markersModel.hasFilteredResources(); return this.actions; } @@ -172,11 +181,9 @@ export class MarkersPanel extends Panel { return TPromise.as(null); } - public updateFilter(filter: string) { - this.markersWorkbenchService.filter(filter); + private updateFilter() { this.autoExpanded = new Set(); - this.refreshPanel(); - this.autoReveal(); + this.markersWorkbenchService.filter({ filterText: this.filterInputActionItem.getFilterText(), useFilesExclude: this.filterByFilesExcludeAction.checked }); } private createMessageBox(parent: HTMLElement): void { @@ -221,28 +228,26 @@ export class MarkersPanel extends Panel { })); } - private createActions(): IAction[] { + private createActions(): void { this.collapseAllAction = this.instantiationService.createInstance(CollapseAllAction, this.tree, true); - this.filterAction = new FilterAction(); - const actions = [ - this.filterAction, - this.collapseAllAction - ]; - actions.forEach(a => { - this.toUnbind.push(a); - }); - return actions; + const filterAction = this.instantiationService.createInstance(FilterAction); + this.filterInputActionItem = this.instantiationService.createInstance(FilterInputActionItem, this.panelSettings['filter'], this.panelSettings['filterHistory'] || [], filterAction); + this.filterByFilesExcludeAction = new FilterByFilesExcludeAction(this.panelSettings['useFilesExclude']); + this.actions = [filterAction, this.filterByFilesExcludeAction, this.collapseAllAction]; } private createListeners(): void { - this.toUnbind.push(this.markersWorkbenchService.onDidChangeMarkersForResources(this.onMarkerChanged, this)); + this.toUnbind.push(this.markersWorkbenchService.onDidChange(resources => this.onDidChange(resources))); this.toUnbind.push(this.editorGroupService.onEditorsChanged(this.onEditorsChanged, this)); this.toUnbind.push(this.tree.onDidChangeSelection(() => this.onSelected())); + this.toUnbind.push(this.filterInputActionItem.onDidChange(() => this.updateFilter())); + this.toUnbind.push(this.filterByFilesExcludeAction.onDidCheck(() => this.updateFilter())); + this.actions.forEach(a => this.toUnbind.push(a)); } - private onMarkerChanged(changedResources: URI[]) { - this.currentResourceGotAddedToMarkersData = this.currentResourceGotAddedToMarkersData || this.isCurrentResourceGotAddedToMarkersData(changedResources); - this.updateResources(changedResources); + private onDidChange(resources: URI[]) { + this.currentResourceGotAddedToMarkersData = this.currentResourceGotAddedToMarkersData || this.isCurrentResourceGotAddedToMarkersData(resources); + this.updateResources(resources); this.delayedRefresh.trigger(() => { this.refreshPanel(); this.updateRangeHighlights(); @@ -295,10 +300,23 @@ export class MarkersPanel extends Panel { } private renderMessage(): void { - this.messageBox.textContent = this.markersWorkbenchService.markersModel.getMessage(); + this.messageBox.textContent = this.getMessage(); dom.toggleClass(this.messageBoxContainer, 'hidden', this.markersWorkbenchService.markersModel.hasFilteredResources()); } + private getMessage(): string { + if (this.markersWorkbenchService.markersModel.hasFilteredResources()) { + return ''; + } + if (this.markersWorkbenchService.markersModel.hasResources()) { + if (!this.markersWorkbenchService.markersModel.filterOptions.filter) { + return Messages.MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER; + } + return Messages.MARKERS_PANEL_NO_PROBLEMS_FILTERS; + } + return Messages.MARKERS_PANEL_NO_PROBLEMS_BUILT; + } + private autoExpand(): void { this.markersWorkbenchService.markersModel.forEachFilteredResource(resource => { if (!this.autoExpanded.has(resource.uri.toString())) { @@ -375,15 +393,24 @@ export class MarkersPanel extends Panel { } } - public getActionItem(action: Action): IActionItem { + public getFocusElement(): ResourceMarkers | Marker { + return this.tree.getFocus(); + } + + public getActionItem(action: IAction): IActionItem { if (action.id === FilterAction.ID) { - return this.instantiationService.createInstance(FilterInputBoxActionItem, this, action); + return this.filterInputActionItem; } return super.getActionItem(action); } - public getFocusElement(): ResourceMarkers | Marker { - return this.tree.getFocus(); + public shutdown(): void { + // store memento + this.panelSettings['filter'] = this.filterInputActionItem.getFilterText(); + this.panelSettings['filterHistory'] = this.filterInputActionItem.getFilterHistory(); + this.panelSettings['useFilesExclude'] = this.filterByFilesExcludeAction.checked; + + super.shutdown(); } public dispose(): void { diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts index 29fa7d076cc..df7193c9e30 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts @@ -5,10 +5,8 @@ import { Delayer } from 'vs/base/common/async'; import * as DOM from 'vs/base/browser/dom'; -import * as lifecycle from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IAction, Action } from 'vs/base/common/actions'; -import { BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { Action, IAction } from 'vs/base/common/actions'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; @@ -16,15 +14,20 @@ import { IContextViewService } from 'vs/platform/contextview/browser/contextView import { TogglePanelAction } from 'vs/workbench/browser/panel'; import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; import Constants from 'vs/workbench/parts/markers/electron-browser/constants'; -import { MarkersPanel } from 'vs/workbench/parts/markers/electron-browser/markersPanel'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CollapseAllAction as TreeCollapseAction } from 'vs/base/parts/tree/browser/treeDefaults'; import * as Tree from 'vs/base/parts/tree/browser/tree'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; +import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IMarkersWorkbenchService } from 'vs/workbench/parts/markers/electron-browser/markers'; +import { Event, Emitter } from 'vs/base/common/event'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { HistoryNavigator } from 'vs/base/common/history'; +import { BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { badgeBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { localize } from '../../../../nls'; export class ToggleMarkersPanelAction extends TogglePanelAction { @@ -34,8 +37,10 @@ export class ToggleMarkersPanelAction extends TogglePanelAction { constructor(id: string, label: string, @IPartService partService: IPartService, @IPanelService panelService: IPanelService, + @IMarkersWorkbenchService markersWorkbenchService: IMarkersWorkbenchService ) { super(id, label, Constants.MARKERS_PANEL_ID, panelService, partService); + this.enabled = markersWorkbenchService.markersModel.hasFilteredResources(); } } @@ -62,6 +67,34 @@ export class CollapseAllAction extends TreeCollapseAction { } } +export class FilterByFilesExcludeAction extends Action { + + public static readonly ID: string = 'workbench.actions.problems.useFilesExclude'; + + private readonly _onDidCheck: Emitter = new Emitter(); + readonly onDidCheck: Event = this._onDidCheck.event; + + private toDispose: IDisposable[] = []; + + constructor(checked: boolean) { + super(FilterByFilesExcludeAction.ID, checked ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE, 'markers-panel-action-files-exclude', true); + this.toDispose.push(this._onDidCheck); + this.checked = checked; + } + + public run(): TPromise { + this.checked = !this.checked; + this.tooltip = this.checked ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE; + this._onDidCheck.fire(this.checked); + return TPromise.as(null); + } + + dispose(): void { + this.toDispose = dispose(this.toDispose); + super.dispose(); + } +} + export class FilterAction extends Action { public static readonly ID: string = 'workbench.actions.problems.filter'; @@ -72,41 +105,151 @@ export class FilterAction extends Action { } -export class FilterInputBoxActionItem extends BaseActionItem { - protected toDispose: lifecycle.IDisposable[]; +export class FilterInputActionItem extends BaseActionItem { + + private _toDispose: IDisposable[] = []; + + private readonly _onDidChange: Emitter = this._register(new Emitter()); + readonly onDidChange: Event = this._onDidChange.event; private delayedFilterUpdate: Delayer; + private container: HTMLElement; + private filterInputBox: InputBox; + private filterHistory: HistoryNavigator; + private filterBadge: HTMLInputElement; - constructor(private markersPanel: MarkersPanel, action: IAction, + constructor( + private filterText: string, + filterHistory: string[], + action: IAction, @IContextViewService private contextViewService: IContextViewService, @IThemeService private themeService: IThemeService, @IMarkersWorkbenchService private markersWorkbenchService: IMarkersWorkbenchService, - @ITelemetryService private telemetryService: ITelemetryService) { - super(markersPanel, action); - this.toDispose = []; + @ITelemetryService private telemetryService: ITelemetryService + ) { + super(null, action); this.delayedFilterUpdate = new Delayer(500); + this.filterHistory = new HistoryNavigator(filterHistory); } - public render(container: HTMLElement): void { - DOM.addClass(container, 'markers-panel-action-filter'); - let filterInputBox = new InputBox(container, this.contextViewService, { + render(container: HTMLElement): void { + this.container = container; + DOM.addClass(this.container, 'markers-panel-action-filter'); + this.createInput(this.container); + this.createBadge(this.container); + } + + getFilterText(): string { + return this.filterText; + } + + getFilterHistory(): string[] { + return this.filterHistory.getHistory(); + } + + toggleLayout(small: boolean) { + if (this.container) { + DOM.toggleClass(this.container, 'small', small); + DOM.toggleClass(this.filterBadge, 'small', small); + } + } + + private createInput(container: HTMLElement): void { + this.filterInputBox = new InputBox(container, this.contextViewService, { placeholder: Messages.MARKERS_PANEL_FILTER_PLACEHOLDER, - ariaLabel: Messages.MARKERS_PANEL_FILTER_PLACEHOLDER + ariaLabel: Messages.MARKERS_PANEL_FILTER_ARIA_LABEL }); - this.toDispose.push(attachInputBoxStyler(filterInputBox, this.themeService)); - filterInputBox.value = this.markersWorkbenchService.markersModel.filterOptions.completeFilter; - this.toDispose.push(filterInputBox.onDidChange(filter => this.delayedFilterUpdate.trigger(() => this.updateFilter(filter)))); - this.toDispose.push(DOM.addStandardDisposableListener(filterInputBox.inputElement, 'keyup', (keyboardEvent) => this.onInputKeyUp(keyboardEvent, filterInputBox))); - this.toDispose.push(DOM.addStandardDisposableListener(container, 'keydown', this.handleKeyboardEvent)); - this.toDispose.push(DOM.addStandardDisposableListener(container, 'keyup', this.handleKeyboardEvent)); + this._register(attachInputBoxStyler(this.filterInputBox, this.themeService)); + this.filterInputBox.value = this.filterText; + this._register(this.filterInputBox.onDidChange(filter => this.delayedFilterUpdate.trigger(() => this.onDidInputChange()))); + this._register(DOM.addStandardDisposableListener(this.filterInputBox.inputElement, 'keydown', (keyboardEvent) => this.onInputKeyDown(keyboardEvent, this.filterInputBox))); + this._register(DOM.addStandardDisposableListener(container, 'keydown', this.handleKeyboardEvent)); + this._register(DOM.addStandardDisposableListener(container, 'keyup', this.handleKeyboardEvent)); } - private updateFilter(filter: string) { - this.markersPanel.updateFilter(filter); + private createBadge(container: HTMLElement): void { + this.filterBadge = DOM.append(container, DOM.$('.markers-panel-filter-badge')); + this._register(attachStylerCallback(this.themeService, { badgeBackground, contrastBorder }, colors => { + const background = colors.badgeBackground ? colors.badgeBackground.toString() : null; + const border = colors.contrastBorder ? colors.contrastBorder.toString() : null; + + this.filterBadge.style.backgroundColor = background; + + this.filterBadge.style.borderWidth = border ? '1px' : null; + this.filterBadge.style.borderStyle = border ? 'solid' : null; + this.filterBadge.style.borderColor = border; + })); + this._register(this.markersWorkbenchService.onDidChange(() => this.updateBadge())); + } + + private onDidInputChange() { + this.filterText = this.filterInputBox.value; + if (this.filterText && this.filterText !== this.filterHistory.current()) { + this.filterHistory.add(this.getFilterText()); + } + this._onDidChange.fire(); this.reportFilteringUsed(); } + private updateBadge(): void { + const { total, filtered } = this.markersWorkbenchService.markersModel.stats(); + DOM.toggleClass(this.filterBadge, 'hidden', total === filtered); + this.filterBadge.textContent = localize('showing filtered problems', "Showing {0} of {1}", filtered, total); + this.filterInputBox.inputElement.style.paddingRight = DOM.getTotalWidth(this.filterBadge) + 'px'; + } + + // Action toolbar is swallowing some keys for action items which should not be for an input box + private handleKeyboardEvent(e: IKeyboardEvent) { + switch (e.keyCode) { + case KeyCode.Space: + case KeyCode.LeftArrow: + case KeyCode.RightArrow: + case KeyCode.Escape: + e.stopPropagation(); + break; + } + } + + private showNextFilter() { + let next = this.filterHistory.next(); + if (next) { + this.filterInputBox.value = next; + } + } + + private showPreviousFilter() { + let previous = this.filterHistory.previous(); + if (this.filterInputBox.value) { + this.filterHistory.addIfNotPresent(this.filterInputBox.value); + } + if (previous) { + this.filterInputBox.value = previous; + } + } + + private onInputKeyDown(keyboardEvent: IKeyboardEvent, filterInputBox: InputBox) { + let handled = false; + switch (keyboardEvent.keyCode) { + case KeyCode.Escape: + filterInputBox.value = ''; + handled = true; + break; + case KeyCode.UpArrow: + this.showPreviousFilter(); + handled = true; + break; + case KeyCode.DownArrow: + this.showNextFilter(); + handled = true; + break; + } + if (handled) { + keyboardEvent.stopPropagation(); + keyboardEvent.preventDefault(); + } + } + private reportFilteringUsed(): void { let data = {}; data['errors'] = this.markersWorkbenchService.markersModel.filterOptions.filterErrors; @@ -122,30 +265,8 @@ export class FilterInputBoxActionItem extends BaseActionItem { this.telemetryService.publicLog('problems.filter', data); } - public dispose(): void { - this.toDispose = lifecycle.dispose(this.toDispose); - super.dispose(); + private _register(t: T): T { + this._toDispose.push(t); + return t; } - - // Action toolbar is swallowing some keys for action items which should not be for an input box - private handleKeyboardEvent(e: IKeyboardEvent) { - switch (e.keyCode) { - case KeyCode.Space: - case KeyCode.LeftArrow: - case KeyCode.RightArrow: - case KeyCode.Escape: - e.stopPropagation(); - break; - } - } - - private onInputKeyUp(keyboardEvent: IKeyboardEvent, filterInputBox: InputBox) { - switch (keyboardEvent.keyCode) { - case KeyCode.Escape: - filterInputBox.value = ''; - return; - default: - return; - } - } -} +} \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings-dark.svg b/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings-dark.svg new file mode 100755 index 00000000000..3eeedcb41c6 --- /dev/null +++ b/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings.svg b/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings.svg new file mode 100755 index 00000000000..79decb032b1 --- /dev/null +++ b/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/electron-browser/media/markers.css b/src/vs/workbench/parts/markers/electron-browser/media/markers.css index 3cf32eb0bcc..afcf024db82 100644 --- a/src/vs/workbench/parts/markers/electron-browser/media/markers.css +++ b/src/vs/workbench/parts/markers/electron-browser/media/markers.css @@ -4,11 +4,18 @@ *--------------------------------------------------------------------------------------------*/ .monaco-action-bar .action-item.markers-panel-action-filter { - max-width: 400px; - min-width: 150px; - flex: 1; cursor: default; margin: 4px 10px 0 0; + min-width: 150px; + max-width: 800px; +} + +.monaco-action-bar .action-item.markers-panel-action-filter { + flex: 0.7; +} + +.monaco-action-bar .action-item.markers-panel-action-filter.small { + flex: 0.5; } .monaco-action-bar .action-item.markers-panel-action-filter .monaco-inputbox { @@ -20,6 +27,19 @@ border: 1px solid #ddd; } +.markers-panel-action-filter > .markers-panel-filter-badge { + margin: 4px 0px; + padding: 0px 8px; + border-radius: 2px; + position: absolute; + top: 0px; + right: 4px; +} + +.markers-panel-action-filter > .markers-panel-filter-badge.small { + display: none; +} + .markers-panel .markers-panel-container { height: 100%; } @@ -37,10 +57,6 @@ display: none; } -.markers-panel .markers-panel-container .tree-container { - height: 100%; -} - .markers-panel .markers-panel-container .tree-container.hidden, .markers-panel .markers-panel-container .message-box-container.hidden { display: none; @@ -123,3 +139,16 @@ .vs-dark .markers-panel .icon.info { background: url('status-info-inverse.svg') center center no-repeat; } + +.vs .monaco-action-bar .action-item .icon.markers-panel-action-files-exclude { + background: url('excludeSettings.svg') center center no-repeat; +} + +.vs-dark .monaco-action-bar .action-item .icon.markers-panel-action-files-exclude, +.hc-black .monaco-action-bar .action-item .icon.markers-panel-action-files-exclude { + background: url('excludeSettings-dark.svg') center center no-repeat; +} + +.monaco-action-bar .action-item .icon.markers-panel-action-files-exclude:not(.checked) { + opacity: 0.5; +} diff --git a/src/vs/workbench/parts/markers/electron-browser/messages.ts b/src/vs/workbench/parts/markers/electron-browser/messages.ts index 03bc507f5d7..82eb776dda6 100644 --- a/src/vs/workbench/parts/markers/electron-browser/messages.ts +++ b/src/vs/workbench/parts/markers/electron-browser/messages.ts @@ -22,10 +22,14 @@ export default class Messages { public static MARKERS_PANEL_ARIA_LABEL_PROBLEMS_TREE: string = nls.localize('markers.panel.aria.label.problems.tree', "Problems grouped by files"); public static MARKERS_PANEL_NO_PROBLEMS_BUILT: string = nls.localize('markers.panel.no.problems.build', "No problems have been detected in the workspace so far."); - public static MARKERS_PANEL_NO_PROBLEMS_FILTERS: string = nls.localize('markers.panel.no.problems.filters', "No results found with provided filter criteria"); + public static MARKERS_PANEL_NO_PROBLEMS_FILTERS: string = nls.localize('markers.panel.no.problems.filters', "No results found with provided filter criteria."); + public static MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER: string = nls.localize('markers.panel.no.problems.file.exclusions', "No results found. Review your files exclusion setting."); + public static MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE: string = nls.localize('markers.panel.action.useFilesExclude', "Filter using Files Exclude Setting"); + public static MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE: string = nls.localize('markers.panel.action.donotUseFilesExclude', "Do not use Files Exclude Setting"); public static MARKERS_PANEL_ACTION_TOOLTIP_FILTER: string = nls.localize('markers.panel.action.filter', "Filter Problems"); - public static MARKERS_PANEL_FILTER_PLACEHOLDER: string = nls.localize('markers.panel.filter.placeholder', "Filter by type or text"); + public static MARKERS_PANEL_FILTER_ARIA_LABEL: string = nls.localize('markers.panel.filter.ariaLabel', "Filter Problems"); + public static MARKERS_PANEL_FILTER_PLACEHOLDER: string = nls.localize('markers.panel.filter.placeholder', "Filter by text, include/exclude file patterns. Examples: some text, **/*.ts, !**/node_modules/**"); public static MARKERS_PANEL_FILTER_ERRORS: string = nls.localize('markers.panel.filter.errors', "errors"); public static MARKERS_PANEL_FILTER_WARNINGS: string = nls.localize('markers.panel.filter.warnings', "warnings"); public static MARKERS_PANEL_FILTER_INFOS: string = nls.localize('markers.panel.filter.infos', "infos"); From 485a469b94b55f2af7e4b55eadc2bfe03d2a7639 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 11 Apr 2018 18:37:27 +0200 Subject: [PATCH 135/710] fix handleLocalStorage logic --- src/vs/code/electron-main/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 72ccf412cb8..f9004812666 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -329,7 +329,7 @@ export class CodeApplication { return exists(localStorageLevelDB).then(localStorageLevelDBExists => { return TPromise.join([ localStorageBackupFileExists ? unlink(localStorageBackupFile) : TPromise.as(null), - localStorageJournalBackupFile ? unlink(localStorageJournalBackupFile) : TPromise.as(null), + localStorageJournalBackupFileExists ? unlink(localStorageJournalBackupFile) : TPromise.as(null), localStorageLevelDBExists ? del(localStorageLevelDB) : TPromise.as(null) ]); }); From d0f6325130ae48fc6a087de134254f5749a1ee58 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 11 Apr 2018 10:04:23 -0700 Subject: [PATCH 136/710] Fix initial terminal API state --- .../api/electron-browser/mainThreadTerminalService.ts | 8 +++++++- src/vs/workbench/parts/terminal/common/terminal.ts | 2 ++ .../parts/terminal/electron-browser/terminalInstance.ts | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 51cd24cb54c..e5ad8960095 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -23,13 +23,19 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalService); this._toDispose = []; this._toDispose.push(terminalService.onInstanceCreated((terminalInstance) => { - // Delay this message so the TerminalInstance constructor has a change to finish and + // Delay this message so the TerminalInstance constructor has a chance to finish and // return the ID normally to the extension host. The ID that is passed here will be used // to register non-extension API terminals in the extension host. setTimeout(() => this._onTerminalOpened(terminalInstance), 100); })); this._toDispose.push(terminalService.onInstanceDisposed((terminalInstance) => this._onTerminalDisposed(terminalInstance))); this._toDispose.push(terminalService.onInstanceProcessIdReady((terminalInstance) => this._onTerminalProcessIdReady(terminalInstance))); + + // Set initial ext host state + this.terminalService.terminalInstances.forEach(t => { + this._onTerminalOpened(t); + t.processReady.then(() => this._onTerminalProcessIdReady(t)); + }); } public dispose(): void { diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 2fcfe1c89b7..079e4ac86d7 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -235,6 +235,8 @@ export interface ITerminalInstance { onProcessIdReady: Event; + processReady: TPromise; + /** * The title of the terminal. This is either title or the process currently running or an * explicit name given to the terminal instance through the extension API. diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index a7f25db2960..2333fd8b76e 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -107,7 +107,9 @@ export class TerminalInstance implements ITerminalInstance { public disableLayout: boolean; public get id(): number { return this._id; } + // TODO: Ideally processId would be merged into processReady public get processId(): number { return this._processId; } + public get processReady(): TPromise { return this._processReady; } public get onDisposed(): Event { return this._onDisposed.event; } public get onFocused(): Event { return this._onFocused.event; } public get onProcessIdReady(): Event { return this._onProcessIdReady.event; } From 27cd6f537ea29aae0f75783d312c2e1a48218636 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 11 Apr 2018 10:21:32 -0700 Subject: [PATCH 137/710] Allow processId and name access on disposed API Terminals --- src/vs/workbench/api/node/extHostTerminalService.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index b6026d73c0c..d45b8545b09 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -51,12 +51,10 @@ export class ExtHostTerminal implements vscode.Terminal { } public get name(): string { - this._checkDisposed(); return this._name; } public get processId(): Thenable { - this._checkDisposed(); return this._pidPromise; } From 4f626cf21c4954802864a0da27ae7d2759023710 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 11 Apr 2018 10:23:29 -0700 Subject: [PATCH 138/710] Remove obsolete TODOs --- src/vs/workbench/api/node/extHostTerminalService.ts | 4 ---- .../workbench/parts/terminal/electron-browser/terminalTab.ts | 2 -- 2 files changed, 6 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index d45b8545b09..4e993934fd2 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -149,9 +149,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { this._onDidCloseTerminal.fire(terminal); } - // TOOD: How do we set PID - // TODO: Make sure both API terminals and non-API terminals are created correctly - // TODO: Ensure the terminal that is opened when first launched gets added, I think it's set before the ext host is ready for it public $acceptTerminalOpened(id: number, name: string): void { let index = this._getTerminalIndexById(id); if (index !== null) { @@ -159,7 +156,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { this._onDidOpenTerminal.fire(this.terminals[index]); return; } - // TODO: Only create a terminal if it doesn't already exist for the ID let terminal = new ExtHostTerminal(this._proxy, name, id); this._terminals.push(terminal); this._onDidOpenTerminal.fire(terminal); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts index 30b324f6b3d..55eb0c497b3 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalTab.ts @@ -402,8 +402,6 @@ export class TerminalTab extends Disposable implements ITerminalTab { shellLaunchConfig); this._terminalInstances.splice(this._activeInstanceIndex + 1, 0, instance); this._initInstanceListeners(instance); - // TODO: Ensure change event is fired - // TODO: Fire create event on service this._setActiveInstance(instance); if (this._splitPaneContainer) { From ce699ee2034919b14cb91340244e6d552ee3961a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 11 Apr 2018 10:27:35 -0700 Subject: [PATCH 139/710] jsdoc --- src/vs/vscode.proposed.d.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 0647789fcf5..c519b350ef6 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -774,10 +774,16 @@ declare module 'vscode' { export namespace window { /** + * The currently active terminals or an empty array. + * * @readonly */ export let terminals: Terminal[]; + /** + * An [event](#Event) which fires when a terminal has been created, either through the + * [createTerminal](#window.createTerminal) API or commands. + */ export const onDidOpenTerminal: Event; } From 8cb7e80544e8fc637687888abbcf9cdec1f4e036 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 11 Apr 2018 11:49:02 -0700 Subject: [PATCH 140/710] Split out `Webview` from `WebviewEditor` in proposed API (#47370) * Split out `Webview` from `WebviewEditor` in API **Problem** The current proposed `Webview` interface has a few methods and properties that are very editor specific, such as `.reveal` and `.onDidChangeViewState`. These properies will not make sense if we ever allow webview to be displayed in other locations, such as in widgets **Proposal** Split the concepts of a `Webview` and of a `WebveiwEditor`. A webview is the html content itself. A `WebviewEditor` is an editor that displays a `Webview` This would allow us to easily add other types of `Webview` owning objects in the future without having to document that some methods only apply when a webview is used as an editor vs as a widget --- .../src/features/preview.ts | 36 ++-- .../src/features/previewManager.ts | 12 +- src/vs/vscode.proposed.d.ts | 162 ++++++++++-------- .../api/electron-browser/mainThreadWebview.ts | 2 +- src/vs/workbench/api/node/extHost.api.impl.ts | 6 +- src/vs/workbench/api/node/extHost.protocol.ts | 4 +- src/vs/workbench/api/node/extHostWebview.ts | 136 ++++++++++----- .../electron-browser/webviewEditorService.ts | 2 +- .../api/extHostWebview.test.ts | 18 +- 9 files changed, 230 insertions(+), 148 deletions(-) diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index bdf8134fc73..9d48d782ec0 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -20,7 +20,7 @@ export class MarkdownPreview { public static viewType = 'markdown.preview'; - private readonly webview: vscode.Webview; + private readonly editor: vscode.WebviewEditor; private throttleTimer: any; private line: number | undefined = undefined; private readonly disposables: vscode.Disposable[] = []; @@ -32,7 +32,7 @@ export class MarkdownPreview { public static async revive( - webview: vscode.Webview, + webview: vscode.WebviewEditor, state: any, contentProvider: MarkdownContentProvider, previewConfigurations: MarkdownPreviewConfigurationManager, @@ -69,7 +69,7 @@ export class MarkdownPreview { topmostLineMonitor: MarkdownFileTopmostLineMonitor, contributions: MarkdownContributions ): MarkdownPreview { - const webview = vscode.window.createWebview( + const webview = vscode.window.createWebviewEditor( MarkdownPreview.viewType, MarkdownPreview.getPreviewTitle(resource, locked), previewColumn, { @@ -90,7 +90,7 @@ export class MarkdownPreview { } private constructor( - webview: vscode.Webview, + webview: vscode.WebviewEditor, private _resource: vscode.Uri, public locked: boolean, private readonly contentProvider: MarkdownContentProvider, @@ -98,17 +98,17 @@ export class MarkdownPreview { private readonly logger: Logger, topmostLineMonitor: MarkdownFileTopmostLineMonitor ) { - this.webview = webview; + this.editor = webview; - this.webview.onDidDispose(() => { + this.editor.onDidDispose(() => { this.dispose(); }, null, this.disposables); - this.webview.onDidChangeViewState(e => { + this.editor.onDidChangeViewState(e => { this._onDidChangeViewStateEmitter.fire(e); }, null, this.disposables); - this.webview.onDidReceiveMessage(e => { + this.editor.webview.onDidReceiveMessage(e => { if (e.source !== this._resource.toString()) { return; } @@ -155,7 +155,7 @@ export class MarkdownPreview { private readonly _onDisposeEmitter = new vscode.EventEmitter(); public readonly onDispose = this._onDisposeEmitter.event; - private readonly _onDidChangeViewStateEmitter = new vscode.EventEmitter(); + private readonly _onDidChangeViewStateEmitter = new vscode.EventEmitter(); public readonly onDidChangeViewState = this._onDidChangeViewStateEmitter.event; public get resource(): vscode.Uri { @@ -180,7 +180,7 @@ export class MarkdownPreview { this._onDisposeEmitter.dispose(); this._onDidChangeViewStateEmitter.dispose(); - this.webview.dispose(); + this.editor.dispose(); disposeAll(this.disposables); } @@ -224,15 +224,15 @@ export class MarkdownPreview { } public get viewColumn(): vscode.ViewColumn | undefined { - return this.webview.viewColumn; + return this.editor.viewColumn; } public isPreviewOf(resource: vscode.Uri): boolean { return this._resource.fsPath === resource.fsPath; } - public isWebviewOf(webview: vscode.Webview): boolean { - return this.webview === webview; + public isWebviewOf(webview: vscode.WebviewEditor): boolean { + return this.editor === webview; } public matchesResource( @@ -256,12 +256,12 @@ export class MarkdownPreview { } public reveal(viewColumn: vscode.ViewColumn) { - this.webview.reveal(viewColumn); + this.editor.reveal(viewColumn); } public toggleLock() { this.locked = !this.locked; - this.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this.locked); + this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this.locked); } private static getPreviewTitle(resource: vscode.Uri, locked: boolean): string { @@ -293,7 +293,7 @@ export class MarkdownPreview { private postMessage(msg: any) { if (!this._disposed) { - this.webview.postMessage(msg); + this.editor.webview.postMessage(msg); } } @@ -315,8 +315,8 @@ export class MarkdownPreview { this.currentVersion = { resource, version: document.version }; const content = await this.contentProvider.provideTextDocumentContent(document, this.previewConfigurations, this.line); if (this._resource === resource) { - this.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this.locked); - this.webview.html = content; + this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this.locked); + this.editor.webview.html = content; } } diff --git a/extensions/markdown-language-features/src/features/previewManager.ts b/extensions/markdown-language-features/src/features/previewManager.ts index 3f458a7fa91..e64a1f1b400 100644 --- a/extensions/markdown-language-features/src/features/previewManager.ts +++ b/extensions/markdown-language-features/src/features/previewManager.ts @@ -14,7 +14,7 @@ import { isMarkdownFile } from '../util/file'; import { MarkdownPreviewConfigurationManager } from './previewConfig'; import { MarkdownContributions } from '../markdownExtensions'; -export class MarkdownPreviewManager implements vscode.WebviewSerializer { +export class MarkdownPreviewManager implements vscode.WebviewEditorSerializer { private static readonly markdownPreviewActiveContextKey = 'markdownPreviewFocus'; private readonly topmostLineMonitor = new MarkdownFileTopmostLineMonitor(); @@ -36,7 +36,7 @@ export class MarkdownPreviewManager implements vscode.WebviewSerializer { } }, null, this.disposables); - this.disposables.push(vscode.window.registerWebviewSerializer(MarkdownPreview.viewType, this)); + this.disposables.push(vscode.window.registerWebviewEditorSerializer(MarkdownPreview.viewType, this)); } public dispose(): void { @@ -88,8 +88,8 @@ export class MarkdownPreviewManager implements vscode.WebviewSerializer { } } - public async deserializeWebview( - webview: vscode.Webview, + public async deserializeWebviewEditor( + webview: vscode.WebviewEditor, state: any ): Promise { const preview = await MarkdownPreview.revive( @@ -103,8 +103,8 @@ export class MarkdownPreviewManager implements vscode.WebviewSerializer { this.registerPreview(preview); } - public async serializeWebview( - webview: vscode.Webview, + public async serializeWebviewEditor( + webview: vscode.WebviewEditor, ): Promise { const preview = this.previews.find(preview => preview.isWebviewOf(webview)); return preview ? preview.state : undefined; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 392b4cf9ab9..cbf65a404c4 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -593,28 +593,6 @@ declare module 'vscode' { */ readonly enableCommandUris?: boolean; - /** - * Should the find widget be enabled in the webview? - * - * Defaults to false. - */ - readonly enableFindWidget?: boolean; - - /** - * Should the webview's context be kept around even when the webview is no longer visible? - * - * Normally a webview's context is created when the webview becomes visible - * and destroyed when the webview is hidden. Apps that have complex state - * or UI can set the `retainContextWhenHidden` to make VS Code keep the webview - * context around, even when the webview moves to a background tab. When - * the webview becomes visible again, the context is automatically restored - * in the exact same state it was in originally. - * - * `retainContextWhenHidden` has a high memory overhead and should only be used if - * your webview's context cannot be quickly saved and restored. - */ - readonly retainContextWhenHidden?: boolean; - /** * Root paths from which the webview can load local (filesystem) resources using the `vscode-resource:` scheme. * @@ -625,20 +603,10 @@ declare module 'vscode' { readonly localResourceRoots?: Uri[]; } - export interface WebviewOnDidChangeViewStateEvent { - readonly viewColumn: ViewColumn; - readonly active: boolean; - } - /** * A webview displays html content, like an iframe. */ export interface Webview { - /** - * The type of the webview, such as `'markdown.preview'` - */ - readonly viewType: string; - /** * Content settings for the webview. */ @@ -656,26 +624,11 @@ declare module 'vscode' { */ html: string; - /** - * The column in which the webview is showing. - */ - readonly viewColumn?: ViewColumn; - /** * Fired when the webview content posts a message. */ readonly onDidReceiveMessage: Event; - /** - * Fired when the webview is disposed. - */ - readonly onDidDispose: Event; - - /** - * Fired when the webview's view state changes. - */ - readonly onDidChangeViewState: Event; - /** * Post a message to the webview content. * @@ -684,9 +637,77 @@ declare module 'vscode' { * @param message Body of the message. */ postMessage(message: any): Thenable; + } + + /** + * Content settings for a webview editor. + */ + export interface WebviewEditorOptions { + /** + * Should the find widget be enabled in the editor? + * + * Defaults to false. + */ + readonly enableFindWidget?: boolean; /** - * Shows the webview in a given column. + * Should the webview editor's content (iframe) be kept around even when the editor + * is no longer visible? + * + * Normally the editor's html context is created when the editor becomes visible + * and destroyed when it is is hidden. Apps that have complex state + * or UI can set the `retainContextWhenHidden` to make VS Code keep the webview + * context around, even when the webview moves to a background tab. When + * the editor becomes visible again, the context is automatically restored + * in the exact same state it was in originally. + * + * `retainContextWhenHidden` has a high memory overhead and should only be used if + * your editor's context cannot be quickly saved and restored. + */ + readonly retainContextWhenHidden?: boolean; + } + + /** + * An editor that contains a webview. + */ + interface WebviewEditor { + /** + * The type of the webview editor, such as `'markdown.preview'`. + */ + readonly viewType: string; + + /** + * The webview belonging to the editor. + */ + readonly webview: Webview; + + /** + * Content settings for the webview editor. + */ + readonly options: WebviewEditorOptions; + + /** + * The column in which the editor is showing. + */ + readonly viewColumn?: ViewColumn; + + /** + * Fired when the editor's view state changes. + */ + readonly onDidChangeViewState: Event; + + /** + * Fired when the editor is disposed. + * + * This may be because the user closed the editor or because `.dispose()` was + * called on it. + * + * Trying to use the webview after it has been disposed throws an exception. + */ + readonly onDidDispose: Event; + + /** + * Shows the webview editor in a given column. * * A webview may only be in a single column at a time. If it is already showing, this * command moves it to a new column. @@ -694,64 +715,69 @@ declare module 'vscode' { reveal(viewColumn: ViewColumn): void; /** - * Dispose of the the webview. + * Dispose of the webview editor. * * This closes the webview if it showing and disposes of the resources owned by the webview. * Webview are also disposed when the user closes the webview editor. Both cases fire `onDispose` - * event. Trying to use the webview after it has been disposed throws an exception. + * event. */ dispose(): any; } + export interface WebviewEditorOnDidChangeViewStateEvent { + readonly viewColumn: ViewColumn; + readonly active: boolean; + } + /** - * Save and restore webviews that have been persisted when vscode shuts down. + * Save and restore webview editors that have been persisted when vscode shuts down. */ - interface WebviewSerializer { + interface WebviewEditorSerializer { /** - * Save a webview's `state`. + * Save a webview editors's `state`. * - * Called before shutdown. Webview may or may not be visible. + * Called before shutdown. Webview editor may or may not be visible. * - * @param webview Webview to serialize. + * @param webviewEditor Webview editor to serialize. * * @returns JSON serializable state blob. */ - serializeWebview(webview: Webview): Thenable; + serializeWebviewEditor(webviewEditor: WebviewEditor): Thenable; /** - * Restore a webview from its `state`. + * Restore a webview editor from its `state`. * * Called when a serialized webview first becomes active. * - * @param webview Webview to restore. The serializer should take ownership of this webview. + * @param webviewEditor Webview editor to restore. The serializer should take ownership of this editor. * @param state Persisted state. */ - deserializeWebview(webview: Webview, state: any): Thenable; + deserializeWebviewEditor(webviewEditor: WebviewEditor, state: any): Thenable; } namespace window { /** - * Create and show a new webview. + * Create and show a new webview editor. * - * @param viewType Identifies the type of the webview. + * @param viewType Identifies the type of the webview editor. * @param title Title of the webview. - * @param column Editor column to show the new webview in. - * @param options Content settings for the webview. + * @param column Editor column to show the new webview editor in. + * @param editorOptions Settings for the webview editor. */ - export function createWebview(viewType: string, title: string, column: ViewColumn, options: WebviewOptions): Webview; + export function createWebviewEditor(viewType: string, title: string, column: ViewColumn, options: WebviewEditorOptions & WebviewOptions): WebviewEditor; /** - * Registers a webview serializer. + * Registers a webview editor serializer. * * Extensions that support reviving should have an `"onView:viewType"` activation method and - * make sure that `registerWebviewSerializer` is called during activation. + * make sure that `registerWebviewEditorSerializer` is called during activation. * * Only a single serializer may be registered at a time for a given `viewType`. * - * @param viewType Type of the webview that can be serialized. + * @param viewType Type of the webview editor that can be serialized. * @param reviver Webview serializer. */ - export function registerWebviewSerializer(viewType: string, reviver: WebviewSerializer): Disposable; + export function registerWebviewEditorSerializer(viewType: string, reviver: WebviewEditorSerializer): Disposable; } //#endregion diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 0bf8ddedefa..06d13f379f8 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -129,7 +129,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv this._webviews.set(handle, webview); webview._events = this.createWebviewEventDelegate(handle); - return this._proxy.$deserializeWebview(handle, webview.state.viewType, webview.state.state, webview.position, webview.options) + return this._proxy.$deserializeWebview(handle, webview.state.viewType, webview.getTitle(), webview.state.state, webview.position, webview.options) .then(undefined, () => { webview.html = MainThreadWebviews.getDeserializationFailedContents(viewType); }); diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index fb844f52ef5..e25283c3f7c 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -416,11 +416,11 @@ export function createApiFactory( registerDecorationProvider: proposedApiFunction(extension, (provider: vscode.DecorationProvider) => { return extHostDecorations.registerDecorationProvider(provider, extension.id); }), - createWebview: proposedApiFunction(extension, (viewType: string, title: string, column: vscode.ViewColumn, options: vscode.WebviewOptions) => { + createWebviewEditor: proposedApiFunction(extension, (viewType: string, title: string, column: vscode.ViewColumn, options: vscode.WebviewEditorOptions & vscode.WebviewOptions) => { return extHostWebviews.createWebview(viewType, title, column, options, extension.extensionFolderPath); }), - registerWebviewSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewSerializer) => { - return extHostWebviews.registerWebviewSerializer(viewType, serializer); + registerWebviewEditorSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewEditorSerializer) => { + return extHostWebviews.registerWebviewEditorSerializer(viewType, serializer); }) }; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 3c4042cd144..f7a1a1d069a 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -350,7 +350,7 @@ export interface MainThreadTelemetryShape extends IDisposable { export type WebviewHandle = string; export interface MainThreadWebviewsShape extends IDisposable { - $createWebview(handle: WebviewHandle, viewType: string, title: string, column: EditorPosition, options: vscode.WebviewOptions, extensionFolderPath: string): void; + $createWebview(handle: WebviewHandle, viewType: string, title: string, column: EditorPosition, options: vscode.WebviewEditorOptions & vscode.WebviewOptions, extensionFolderPath: string): void; $disposeWebview(handle: WebviewHandle): void; $reveal(handle: WebviewHandle, column: EditorPosition): void; $setTitle(handle: WebviewHandle, value: string): void; @@ -365,7 +365,7 @@ export interface ExtHostWebviewsShape { $onMessage(handle: WebviewHandle, message: any): void; $onDidChangeWeviewViewState(handle: WebviewHandle, active: boolean, position: EditorPosition): void; $onDidDisposeWeview(handle: WebviewHandle): Thenable; - $deserializeWebview(newWebviewHandle: WebviewHandle, viewType: string, state: any, position: EditorPosition, options: vscode.WebviewOptions): Thenable; + $deserializeWebview(newWebviewHandle: WebviewHandle, viewType: string, title: string, state: any, position: EditorPosition, options: vscode.WebviewOptions): Thenable; $serializeWebview(webviewHandle: WebviewHandle): Thenable; } diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index f706dd2a7d7..c834a803153 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -12,58 +12,35 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Disposable } from './extHostTypes'; export class ExtHostWebview implements vscode.Webview { - private readonly _handle: WebviewHandle; - private readonly _viewType: string; private readonly _proxy: MainThreadWebviewsShape; private _title: string; private _html: string; private _options: vscode.WebviewOptions; private _isDisposed: boolean = false; - private _viewColumn: vscode.ViewColumn; - private _active: boolean; public readonly onMessageEmitter = new Emitter(); public readonly onDidReceiveMessage: Event = this.onMessageEmitter.event; - public readonly onDisposeEmitter = new Emitter(); - public readonly onDidDispose: Event = this.onDisposeEmitter.event; - - public readonly onDidChangeViewStateEmitter = new Emitter(); - public readonly onDidChangeViewState: Event = this.onDidChangeViewStateEmitter.event; + public readonly onDidChangeViewStateEmitter = new Emitter(); + public readonly onDidChangeViewState: Event = this.onDidChangeViewStateEmitter.event; constructor( handle: WebviewHandle, proxy: MainThreadWebviewsShape, - viewType: string, - viewColumn: vscode.ViewColumn, + title: string, options: vscode.WebviewOptions ) { this._handle = handle; this._proxy = proxy; - this._viewType = viewType; - this._viewColumn = viewColumn; + this._title = title; this._options = options; } - public dispose() { - if (this._isDisposed) { - return; - } - - this._isDisposed = true; - this._proxy.$disposeWebview(this._handle); - - this.onDisposeEmitter.dispose(); - this.onMessageEmitter.dispose(); + dispose() { this.onDidChangeViewStateEmitter.dispose(); } - get viewType(): string { - this.assertNotDisposed(); - return this._viewType; - } - get title(): string { this.assertNotDisposed(); return this._title; @@ -95,6 +72,84 @@ export class ExtHostWebview implements vscode.Webview { return this._options; } + public postMessage(message: any): Thenable { + this.assertNotDisposed(); + return this._proxy.$sendMessage(this._handle, message); + } + + public reveal(viewColumn: vscode.ViewColumn): void { + this.assertNotDisposed(); + this._proxy.$reveal(this._handle, typeConverters.fromViewColumn(viewColumn)); + } + + private assertNotDisposed() { + if (this._isDisposed) { + throw new Error('Webview is disposed'); + } + } +} + +export class ExtHostWebviewEditor implements vscode.WebviewEditor { + + private readonly _handle: WebviewHandle; + private readonly _viewType: string; + private readonly _options: vscode.WebviewEditorOptions; + private readonly _proxy: MainThreadWebviewsShape; + private _isDisposed: boolean = false; + private _viewColumn: vscode.ViewColumn; + private _active: boolean; + + public readonly onDisposeEmitter = new Emitter(); + public readonly onDidDispose: Event = this.onDisposeEmitter.event; + + public readonly onDidChangeViewStateEmitter = new Emitter(); + public readonly onDidChangeViewState: Event = this.onDidChangeViewStateEmitter.event; + + private _webview: ExtHostWebview; + + constructor( + handle: WebviewHandle, + proxy: MainThreadWebviewsShape, + viewType: string, + title: string, + viewColumn: vscode.ViewColumn, + editorOptions: vscode.WebviewEditorOptions, + webviewOptions: vscode.WebviewOptions + ) { + this._handle = handle; + this._proxy = proxy; + this._viewType = viewType; + this._options = editorOptions; + this._viewColumn = viewColumn; + this._webview = new ExtHostWebview(handle, proxy, title, webviewOptions); + } + + public dispose() { + if (this._isDisposed) { + return; + } + + this._isDisposed = true; + this._proxy.$disposeWebview(this._handle); + + this.onDisposeEmitter.dispose(); + this.onDidChangeViewStateEmitter.dispose(); + } + + get webview() { + this.assertNotDisposed(); + return this._webview; + } + + get viewType(): string { + this.assertNotDisposed(); + return this._viewType; + } + + get options() { + return this._options; + } + get viewColumn(): vscode.ViewColumn { this.assertNotDisposed(); return this._viewColumn; @@ -137,8 +192,8 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { private readonly _proxy: MainThreadWebviewsShape; - private readonly _webviews = new Map(); - private readonly _serializers = new Map(); + private readonly _webviews = new Map(); + private readonly _serializers = new Map(); constructor( mainContext: IMainContext @@ -150,20 +205,20 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { viewType: string, title: string, viewColumn: vscode.ViewColumn, - options: vscode.WebviewOptions, + options: vscode.WebviewEditorOptions & vscode.WebviewOptions, extensionFolderPath: string - ): vscode.Webview { + ): vscode.WebviewEditor { const handle = ExtHostWebviews.webviewHandlePool++ + ''; this._proxy.$createWebview(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath); - const webview = new ExtHostWebview(handle, this._proxy, viewType, viewColumn, options); + const webview = new ExtHostWebviewEditor(handle, this._proxy, viewType, title, viewColumn, options, options); this._webviews.set(handle, webview); return webview; } - registerWebviewSerializer( + registerWebviewEditorSerializer( viewType: string, - serializer: vscode.WebviewSerializer + serializer: vscode.WebviewEditorSerializer ): vscode.Disposable { if (this._serializers.has(viewType)) { throw new Error(`Serializer for '${viewType}' already registered`); @@ -181,7 +236,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { $onMessage(handle: WebviewHandle, message: any): void { const webview = this.getWebview(handle); if (webview) { - webview.onMessageEmitter.fire(message); + webview.webview.onMessageEmitter.fire(message); } } @@ -209,6 +264,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { $deserializeWebview( webviewHandle: WebviewHandle, viewType: string, + title: string, state: any, position: Position, options: vscode.WebviewOptions @@ -218,9 +274,9 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { return TPromise.wrapError(new Error(`No serializer found for '${viewType}'`)); } - const revivedWebview = new ExtHostWebview(webviewHandle, this._proxy, viewType, typeConverters.toViewColumn(position), options); + const revivedWebview = new ExtHostWebviewEditor(webviewHandle, this._proxy, viewType, title, typeConverters.toViewColumn(position), options as vscode.WebviewEditorOptions, options as vscode.WebviewOptions); this._webviews.set(webviewHandle, revivedWebview); - return serializer.deserializeWebview(revivedWebview, state); + return serializer.deserializeWebviewEditor(revivedWebview, state); } $serializeWebview( @@ -236,10 +292,10 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { return TPromise.as(undefined); } - return serialzer.serializeWebview(webview); + return serialzer.serializeWebviewEditor(webview); } - private getWebview(handle: WebviewHandle): ExtHostWebview | undefined { + private getWebview(handle: WebviewHandle): ExtHostWebviewEditor | undefined { return this._webviews.get(handle); } } \ No newline at end of file diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts index f271757a4f4..c3430389305 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts @@ -67,7 +67,7 @@ export interface WebviewEvents { onDidClickLink?(link: URI, options: vscode.WebviewOptions): void; } -export interface WebviewInputOptions extends vscode.WebviewOptions { +export interface WebviewInputOptions extends vscode.WebviewOptions, vscode.WebviewEditorOptions { tryRestoreScrollPosition?: boolean; } diff --git a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts index d4bb00a2bc4..196fe045ae7 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts @@ -21,12 +21,12 @@ suite('ExtHostWebview', function () { const shape = createNoopMainThreadWebviews(); const extHostWebviews = new ExtHostWebviews(SingleProxyRPCProtocol(shape)); - let lastInvokedDeserializer: vscode.WebviewSerializer | undefined = undefined; + let lastInvokedDeserializer: vscode.WebviewEditorSerializer | undefined = undefined; - class NoopSerializer implements vscode.WebviewSerializer { - async serializeWebview(webview: vscode.Webview): Promise { /* noop */ } + class NoopSerializer implements vscode.WebviewEditorSerializer { + async serializeWebviewEditor(webview: vscode.WebviewEditor): Promise { /* noop */ } - async deserializeWebview(webview: vscode.Webview, state: any): Promise { + async deserializeWebviewEditor(webview: vscode.WebviewEditor, state: any): Promise { lastInvokedDeserializer = this; } } @@ -34,20 +34,20 @@ suite('ExtHostWebview', function () { const serializerA = new NoopSerializer(); const serializerB = new NoopSerializer(); - const serializerARegistration = extHostWebviews.registerWebviewSerializer(viewType, serializerA); + const serializerARegistration = extHostWebviews.registerWebviewEditorSerializer(viewType, serializerA); - await extHostWebviews.$deserializeWebview('x', viewType, {}, EditorPosition.ONE, {}); + await extHostWebviews.$deserializeWebview('x', viewType, 'title', {}, EditorPosition.ONE, {}); assert.strictEqual(lastInvokedDeserializer, serializerA); assert.throws( - () => extHostWebviews.registerWebviewSerializer(viewType, serializerB), + () => extHostWebviews.registerWebviewEditorSerializer(viewType, serializerB), 'Should throw when registering two serializers for the same view'); serializerARegistration.dispose(); - extHostWebviews.registerWebviewSerializer(viewType, serializerB); + extHostWebviews.registerWebviewEditorSerializer(viewType, serializerB); - await extHostWebviews.$deserializeWebview('x', viewType, {}, EditorPosition.ONE, {}); + await extHostWebviews.$deserializeWebview('x', viewType, 'title', {}, EditorPosition.ONE, {}); assert.strictEqual(lastInvokedDeserializer, serializerB); }); }); From 5a2a746bd97f7f0627b432ea720d2b6e22d8e8dc Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 11 Apr 2018 22:52:49 +0200 Subject: [PATCH 141/710] #22289 Show messages with actions --- .../markers/electron-browser/markersPanel.ts | 57 +++++++++++++------ .../electron-browser/markersPanelActions.ts | 15 ++++- .../electron-browser/media/markers.css | 7 ++- .../markers/electron-browser/messages.ts | 2 +- 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index 492fc1a1984..a91fc30f143 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -32,6 +32,7 @@ import { IMarkersWorkbenchService } from 'vs/workbench/parts/markers/electron-br import { SimpleFileResourceDragAndDrop } from 'vs/workbench/browser/dnd'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { Scope } from 'vs/workbench/common/memento'; +import { localize } from 'vs/nls'; export class MarkersPanel extends Panel { @@ -51,7 +52,6 @@ export class MarkersPanel extends Panel { private treeContainer: HTMLElement; private messageBoxContainer: HTMLElement; - private messageBox: HTMLElement; private panelSettings: any; private currentResourceGotAddedToMarkersData: boolean = false; @@ -116,7 +116,7 @@ export class MarkersPanel extends Panel { this.highlightCurrentSelectedMarkerRange(); this.autoReveal(true); } else { - this.messageBox.focus(); + this.messageBoxContainer.focus(); } } @@ -188,8 +188,6 @@ export class MarkersPanel extends Panel { private createMessageBox(parent: HTMLElement): void { this.messageBoxContainer = dom.append(parent, dom.$('.message-box-container')); - this.messageBox = dom.append(this.messageBoxContainer, dom.$('span')); - this.messageBox.setAttribute('tabindex', '0'); } private createTree(parent: HTMLElement): void { @@ -231,7 +229,7 @@ export class MarkersPanel extends Panel { private createActions(): void { this.collapseAllAction = this.instantiationService.createInstance(CollapseAllAction, this.tree, true); const filterAction = this.instantiationService.createInstance(FilterAction); - this.filterInputActionItem = this.instantiationService.createInstance(FilterInputActionItem, this.panelSettings['filter'], this.panelSettings['filterHistory'] || [], filterAction); + this.filterInputActionItem = this.instantiationService.createInstance(FilterInputActionItem, this.panelSettings['filter'] || '', this.panelSettings['filterHistory'] || [], filterAction); this.filterByFilesExcludeAction = new FilterByFilesExcludeAction(this.panelSettings['useFilesExclude']); this.actions = [filterAction, this.filterByFilesExcludeAction, this.collapseAllAction]; } @@ -300,21 +298,44 @@ export class MarkersPanel extends Panel { } private renderMessage(): void { - this.messageBox.textContent = this.getMessage(); - dom.toggleClass(this.messageBoxContainer, 'hidden', this.markersWorkbenchService.markersModel.hasFilteredResources()); + const markersModel = this.markersWorkbenchService.markersModel; + const hasFilteredResources = markersModel.hasFilteredResources(); + dom.clearNode(this.messageBoxContainer); + dom.toggleClass(this.messageBoxContainer, 'hidden', hasFilteredResources); + if (!hasFilteredResources) { + if (markersModel.hasResources()) { + if (markersModel.filterOptions.filter) { + this.renderFilteredByFilterMessage(this.messageBoxContainer); + } else { + this.renderFilteredByFilesExcludeMessage(this.messageBoxContainer); + } + } else { + this.renderNoProblemsMessage(this.messageBoxContainer); + } + } } - private getMessage(): string { - if (this.markersWorkbenchService.markersModel.hasFilteredResources()) { - return ''; - } - if (this.markersWorkbenchService.markersModel.hasResources()) { - if (!this.markersWorkbenchService.markersModel.filterOptions.filter) { - return Messages.MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER; - } - return Messages.MARKERS_PANEL_NO_PROBLEMS_FILTERS; - } - return Messages.MARKERS_PANEL_NO_PROBLEMS_BUILT; + private renderFilteredByFilesExcludeMessage(container: HTMLElement) { + const span1 = dom.append(container, dom.$('span')); + span1.textContent = Messages.MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER; + const link = dom.append(container, dom.$('a.messageAction')); + link.textContent = localize('disableFilesExclude', "Disable Files Exclude."); + link.setAttribute('tabIndex', '0'); + dom.addDisposableListener(link, dom.EventType.CLICK, () => this.filterByFilesExcludeAction.checked = false); + } + + private renderFilteredByFilterMessage(container: HTMLElement) { + const span1 = dom.append(container, dom.$('span')); + span1.textContent = Messages.MARKERS_PANEL_NO_PROBLEMS_FILTERS; + const link = dom.append(container, dom.$('a.messageAction')); + link.textContent = localize('clearFilter', "Clear Filter."); + link.setAttribute('tabIndex', '0'); + dom.addDisposableListener(link, dom.EventType.CLICK, () => this.filterInputActionItem.clear()); + } + + private renderNoProblemsMessage(container: HTMLElement) { + const span = dom.append(container, dom.$('span')); + span.textContent = Messages.MARKERS_PANEL_NO_PROBLEMS_BUILT; } private autoExpand(): void { diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts index df7193c9e30..763965a94d5 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts @@ -27,7 +27,8 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { HistoryNavigator } from 'vs/base/common/history'; import { BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { badgeBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { localize } from '../../../../nls'; +import { localize } from 'vs/nls'; +import { isUndefined } from 'vs/base/common/types'; export class ToggleMarkersPanelAction extends TogglePanelAction { @@ -80,12 +81,16 @@ export class FilterByFilesExcludeAction extends Action { super(FilterByFilesExcludeAction.ID, checked ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE, 'markers-panel-action-files-exclude', true); this.toDispose.push(this._onDidCheck); this.checked = checked; + this.toDispose.push(this.onDidChange(e => { + if (e && !isUndefined(e.checked)) { + this._onDidCheck.fire(this.checked); + } + })); } public run(): TPromise { this.checked = !this.checked; this.tooltip = this.checked ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE; - this._onDidCheck.fire(this.checked); return TPromise.as(null); } @@ -140,6 +145,10 @@ export class FilterInputActionItem extends BaseActionItem { this.createBadge(this.container); } + clear(): void { + this.filterInputBox.value = ''; + } + getFilterText(): string { return this.filterText; } @@ -194,7 +203,7 @@ export class FilterInputActionItem extends BaseActionItem { private updateBadge(): void { const { total, filtered } = this.markersWorkbenchService.markersModel.stats(); - DOM.toggleClass(this.filterBadge, 'hidden', total === filtered); + DOM.toggleClass(this.filterBadge, 'hidden', total === filtered || filtered === 0); this.filterBadge.textContent = localize('showing filtered problems', "Showing {0} of {1}", filtered, total); this.filterInputBox.inputElement.style.paddingRight = DOM.getTotalWidth(this.filterBadge) + 'px'; } diff --git a/src/vs/workbench/parts/markers/electron-browser/media/markers.css b/src/vs/workbench/parts/markers/electron-browser/media/markers.css index afcf024db82..e5fecf0b02e 100644 --- a/src/vs/workbench/parts/markers/electron-browser/media/markers.css +++ b/src/vs/workbench/parts/markers/electron-browser/media/markers.css @@ -36,6 +36,7 @@ right: 4px; } +.markers-panel-action-filter > .markers-panel-filter-badge.hidden, .markers-panel-action-filter > .markers-panel-filter-badge.small { display: none; } @@ -49,8 +50,10 @@ padding-left: 20px; } -.markers-panel .markers-panel-container .message-box-container span:focus { - outline: none; +.markers-panel .markers-panel-container .message-box-container .messageAction { + margin-left: 4px; + cursor: pointer; + text-decoration: underline; } .markers-panel .markers-panel-container .hidden { diff --git a/src/vs/workbench/parts/markers/electron-browser/messages.ts b/src/vs/workbench/parts/markers/electron-browser/messages.ts index 82eb776dda6..3ddba82d3e5 100644 --- a/src/vs/workbench/parts/markers/electron-browser/messages.ts +++ b/src/vs/workbench/parts/markers/electron-browser/messages.ts @@ -23,7 +23,7 @@ export default class Messages { public static MARKERS_PANEL_NO_PROBLEMS_BUILT: string = nls.localize('markers.panel.no.problems.build', "No problems have been detected in the workspace so far."); public static MARKERS_PANEL_NO_PROBLEMS_FILTERS: string = nls.localize('markers.panel.no.problems.filters', "No results found with provided filter criteria."); - public static MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER: string = nls.localize('markers.panel.no.problems.file.exclusions', "No results found. Review your files exclusion setting."); + public static MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER: string = nls.localize('markers.panel.no.problems.file.exclusions', "All problems are hidden because files exculde filter is enabled."); public static MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE: string = nls.localize('markers.panel.action.useFilesExclude', "Filter using Files Exclude Setting"); public static MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE: string = nls.localize('markers.panel.action.donotUseFilesExclude', "Do not use Files Exclude Setting"); From 93582ce6de0a0a85ce9a8f290defcf6a7bdee7c1 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 11 Apr 2018 14:32:54 -0700 Subject: [PATCH 142/710] Fix #47228 - Don't autofix JSON incorrectly when the user has only typed a key and colon --- extensions/configuration-editing/src/extension.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/extensions/configuration-editing/src/extension.ts b/extensions/configuration-editing/src/extension.ts index 4b7b3e678aa..5aa5ebed1eb 100644 --- a/extensions/configuration-editing/src/extension.ts +++ b/extensions/configuration-editing/src/extension.ts @@ -70,7 +70,12 @@ function autoFixSettingsJSON(willSaveEvent: vscode.TextDocumentWillSaveEvent): v onError(error: ParseErrorCode, offset: number, length: number): void { if (error === ParseErrorCode.CommaExpected && lastEndOfSomething > -1) { const fixPosition = document.positionAt(lastEndOfSomething); - edit.insert(document.uri, fixPosition, ','); + + // Don't insert a comma immediately before a : or ' :' + const colonRange = document.getWordRangeAtPosition(fixPosition, / *:/); + if (!colonRange) { + edit.insert(document.uri, fixPosition, ','); + } } } }); From c1b9138a23a6a70a507cadb047ce51a36a281c63 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 11 Apr 2018 23:39:22 +0200 Subject: [PATCH 143/710] #22289 Show files exclude filter inside inputbox --- .../markers/electron-browser/markersPanel.ts | 21 ++-- .../electron-browser/markersPanelActions.ts | 108 ++++++++++-------- .../electron-browser/media/markers.css | 46 ++++---- 3 files changed, 95 insertions(+), 80 deletions(-) diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index a91fc30f143..34c5ce22c69 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -20,7 +20,7 @@ import { Marker, ResourceMarkers, RelatedInformation } from 'vs/workbench/parts/ import { Controller } from 'vs/workbench/parts/markers/electron-browser/markersTreeController'; import * as Viewer from 'vs/workbench/parts/markers/electron-browser/markersTreeViewer'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { CollapseAllAction, FilterInputActionItem, FilterByFilesExcludeAction, FilterAction } from 'vs/workbench/parts/markers/electron-browser/markersPanelActions'; +import { CollapseAllAction, MarkersFilterActionItem, MarkersFilterAction } from 'vs/workbench/parts/markers/electron-browser/markersPanelActions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; import { RangeHighlightDecorations } from 'vs/workbench/browser/parts/editor/rangeDecorations'; @@ -47,8 +47,7 @@ export class MarkersPanel extends Panel { private actions: IAction[]; private collapseAllAction: IAction; - private filterInputActionItem: FilterInputActionItem; - private filterByFilesExcludeAction: FilterByFilesExcludeAction; + private filterInputActionItem: MarkersFilterActionItem; private treeContainer: HTMLElement; private messageBoxContainer: HTMLElement; @@ -183,7 +182,7 @@ export class MarkersPanel extends Panel { private updateFilter() { this.autoExpanded = new Set(); - this.markersWorkbenchService.filter({ filterText: this.filterInputActionItem.getFilterText(), useFilesExclude: this.filterByFilesExcludeAction.checked }); + this.markersWorkbenchService.filter({ filterText: this.filterInputActionItem.getFilterText(), useFilesExclude: this.filterInputActionItem.useFilesExclude }); } private createMessageBox(parent: HTMLElement): void { @@ -228,10 +227,9 @@ export class MarkersPanel extends Panel { private createActions(): void { this.collapseAllAction = this.instantiationService.createInstance(CollapseAllAction, this.tree, true); - const filterAction = this.instantiationService.createInstance(FilterAction); - this.filterInputActionItem = this.instantiationService.createInstance(FilterInputActionItem, this.panelSettings['filter'] || '', this.panelSettings['filterHistory'] || [], filterAction); - this.filterByFilesExcludeAction = new FilterByFilesExcludeAction(this.panelSettings['useFilesExclude']); - this.actions = [filterAction, this.filterByFilesExcludeAction, this.collapseAllAction]; + const filterAction = this.instantiationService.createInstance(MarkersFilterAction); + this.filterInputActionItem = this.instantiationService.createInstance(MarkersFilterActionItem, { filterText: this.panelSettings['filter'] || '', filterHistory: this.panelSettings['filterHistory'] || [], useFilesExclude: !!this.panelSettings['useFilesExclude'] }, filterAction); + this.actions = [filterAction, this.collapseAllAction]; } private createListeners(): void { @@ -239,7 +237,6 @@ export class MarkersPanel extends Panel { this.toUnbind.push(this.editorGroupService.onEditorsChanged(this.onEditorsChanged, this)); this.toUnbind.push(this.tree.onDidChangeSelection(() => this.onSelected())); this.toUnbind.push(this.filterInputActionItem.onDidChange(() => this.updateFilter())); - this.toUnbind.push(this.filterByFilesExcludeAction.onDidCheck(() => this.updateFilter())); this.actions.forEach(a => this.toUnbind.push(a)); } @@ -321,7 +318,7 @@ export class MarkersPanel extends Panel { const link = dom.append(container, dom.$('a.messageAction')); link.textContent = localize('disableFilesExclude', "Disable Files Exclude."); link.setAttribute('tabIndex', '0'); - dom.addDisposableListener(link, dom.EventType.CLICK, () => this.filterByFilesExcludeAction.checked = false); + dom.addDisposableListener(link, dom.EventType.CLICK, () => this.filterInputActionItem.useFilesExclude = false); } private renderFilteredByFilterMessage(container: HTMLElement) { @@ -419,7 +416,7 @@ export class MarkersPanel extends Panel { } public getActionItem(action: IAction): IActionItem { - if (action.id === FilterAction.ID) { + if (action.id === MarkersFilterAction.ID) { return this.filterInputActionItem; } return super.getActionItem(action); @@ -429,7 +426,7 @@ export class MarkersPanel extends Panel { // store memento this.panelSettings['filter'] = this.filterInputActionItem.getFilterText(); this.panelSettings['filterHistory'] = this.filterInputActionItem.getFilterHistory(); - this.panelSettings['useFilesExclude'] = this.filterByFilesExcludeAction.checked; + this.panelSettings['useFilesExclude'] = this.filterInputActionItem.useFilesExclude; super.shutdown(); } diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts index 763965a94d5..074b2b70348 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts @@ -20,15 +20,15 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CollapseAllAction as TreeCollapseAction } from 'vs/base/parts/tree/browser/treeDefaults'; import * as Tree from 'vs/base/parts/tree/browser/tree'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { attachInputBoxStyler, attachStylerCallback, attachCheckboxStyler } from 'vs/platform/theme/common/styler'; import { IMarkersWorkbenchService } from 'vs/workbench/parts/markers/electron-browser/markers'; import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { HistoryNavigator } from 'vs/base/common/history'; import { BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { badgeBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { localize } from 'vs/nls'; -import { isUndefined } from 'vs/base/common/types'; +import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; export class ToggleMarkersPanelAction extends TogglePanelAction { @@ -68,50 +68,24 @@ export class CollapseAllAction extends TreeCollapseAction { } } -export class FilterByFilesExcludeAction extends Action { - - public static readonly ID: string = 'workbench.actions.problems.useFilesExclude'; - - private readonly _onDidCheck: Emitter = new Emitter(); - readonly onDidCheck: Event = this._onDidCheck.event; - - private toDispose: IDisposable[] = []; - - constructor(checked: boolean) { - super(FilterByFilesExcludeAction.ID, checked ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE, 'markers-panel-action-files-exclude', true); - this.toDispose.push(this._onDidCheck); - this.checked = checked; - this.toDispose.push(this.onDidChange(e => { - if (e && !isUndefined(e.checked)) { - this._onDidCheck.fire(this.checked); - } - })); - } - - public run(): TPromise { - this.checked = !this.checked; - this.tooltip = this.checked ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE; - return TPromise.as(null); - } - - dispose(): void { - this.toDispose = dispose(this.toDispose); - super.dispose(); - } -} - -export class FilterAction extends Action { +export class MarkersFilterAction extends Action { public static readonly ID: string = 'workbench.actions.problems.filter'; constructor() { - super(FilterAction.ID, Messages.MARKERS_PANEL_ACTION_TOOLTIP_FILTER, 'markers-panel-action-filter', true); + super(MarkersFilterAction.ID, Messages.MARKERS_PANEL_ACTION_TOOLTIP_FILTER, 'markers-panel-action-filter', true); } } -export class FilterInputActionItem extends BaseActionItem { +export interface IMarkersFilterActionItemOptions { + filterText: string; + filterHistory: string[]; + useFilesExclude: boolean; +} + +export class MarkersFilterActionItem extends BaseActionItem { private _toDispose: IDisposable[] = []; @@ -122,11 +96,12 @@ export class FilterInputActionItem extends BaseActionItem { private container: HTMLElement; private filterInputBox: InputBox; private filterHistory: HistoryNavigator; + private controlsContainer: HTMLInputElement; private filterBadge: HTMLInputElement; + private filesExcludeFilter: Checkbox; constructor( - private filterText: string, - filterHistory: string[], + private itemOptions: IMarkersFilterActionItemOptions, action: IAction, @IContextViewService private contextViewService: IContextViewService, @IThemeService private themeService: IThemeService, @@ -135,14 +110,15 @@ export class FilterInputActionItem extends BaseActionItem { ) { super(null, action); this.delayedFilterUpdate = new Delayer(500); - this.filterHistory = new HistoryNavigator(filterHistory); + this.filterHistory = new HistoryNavigator(itemOptions.filterHistory || []); } render(container: HTMLElement): void { this.container = container; DOM.addClass(this.container, 'markers-panel-action-filter'); this.createInput(this.container); - this.createBadge(this.container); + this.createControls(this.container); + this.adjustInputBox(); } clear(): void { @@ -150,13 +126,26 @@ export class FilterInputActionItem extends BaseActionItem { } getFilterText(): string { - return this.filterText; + return this.filterInputBox ? this.filterInputBox.value : this.itemOptions.filterText; } getFilterHistory(): string[] { return this.filterHistory.getHistory(); } + get useFilesExclude(): boolean { + return this.filesExcludeFilter ? this.filesExcludeFilter.checked : this.itemOptions.useFilesExclude; + } + + set useFilesExclude(useFilesExclude: boolean) { + if (this.filesExcludeFilter) { + if (this.filesExcludeFilter.checked !== useFilesExclude) { + this.filesExcludeFilter.checked = useFilesExclude; + this._onDidChange.fire(); + } + } + } + toggleLayout(small: boolean) { if (this.container) { DOM.toggleClass(this.container, 'small', small); @@ -170,13 +159,19 @@ export class FilterInputActionItem extends BaseActionItem { ariaLabel: Messages.MARKERS_PANEL_FILTER_ARIA_LABEL }); this._register(attachInputBoxStyler(this.filterInputBox, this.themeService)); - this.filterInputBox.value = this.filterText; + this.filterInputBox.value = this.itemOptions.filterText; this._register(this.filterInputBox.onDidChange(filter => this.delayedFilterUpdate.trigger(() => this.onDidInputChange()))); this._register(DOM.addStandardDisposableListener(this.filterInputBox.inputElement, 'keydown', (keyboardEvent) => this.onInputKeyDown(keyboardEvent, this.filterInputBox))); this._register(DOM.addStandardDisposableListener(container, 'keydown', this.handleKeyboardEvent)); this._register(DOM.addStandardDisposableListener(container, 'keyup', this.handleKeyboardEvent)); } + private createControls(container: HTMLElement): void { + this.controlsContainer = DOM.append(container, DOM.$('.markers-panel-filter-controls')); + this.createBadge(this.controlsContainer); + this.createFilesExcludeCheckbox(this.controlsContainer); + } + private createBadge(container: HTMLElement): void { this.filterBadge = DOM.append(container, DOM.$('.markers-panel-filter-badge')); this._register(attachStylerCallback(this.themeService, { badgeBackground, contrastBorder }, colors => { @@ -189,12 +184,27 @@ export class FilterInputActionItem extends BaseActionItem { this.filterBadge.style.borderStyle = border ? 'solid' : null; this.filterBadge.style.borderColor = border; })); + this.updateBadge(); this._register(this.markersWorkbenchService.onDidChange(() => this.updateBadge())); } + private createFilesExcludeCheckbox(container: HTMLElement): void { + this.filesExcludeFilter = new Checkbox({ + actionClassName: 'markers-panel-filter-filesExclude', + title: this.itemOptions.useFilesExclude ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE, + isChecked: this.itemOptions.useFilesExclude, + onChange: () => { + this.filesExcludeFilter.domNode.title = this.filesExcludeFilter.checked ? Messages.MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE : Messages.MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE; + this._onDidChange.fire(); + } + }); + this._register(attachCheckboxStyler(this.filesExcludeFilter, this.themeService)); + container.appendChild(this.filesExcludeFilter.domNode); + } + private onDidInputChange() { - this.filterText = this.filterInputBox.value; - if (this.filterText && this.filterText !== this.filterHistory.current()) { + const filterText = this.filterInputBox.value; + if (filterText && filterText !== this.filterHistory.current()) { this.filterHistory.add(this.getFilterText()); } this._onDidChange.fire(); @@ -205,7 +215,11 @@ export class FilterInputActionItem extends BaseActionItem { const { total, filtered } = this.markersWorkbenchService.markersModel.stats(); DOM.toggleClass(this.filterBadge, 'hidden', total === filtered || filtered === 0); this.filterBadge.textContent = localize('showing filtered problems', "Showing {0} of {1}", filtered, total); - this.filterInputBox.inputElement.style.paddingRight = DOM.getTotalWidth(this.filterBadge) + 'px'; + this.adjustInputBox(); + } + + private adjustInputBox(): void { + this.filterInputBox.inputElement.style.paddingRight = (DOM.getTotalWidth(this.controlsContainer) || 20) + 'px'; } // Action toolbar is swallowing some keys for action items which should not be for an input box diff --git a/src/vs/workbench/parts/markers/electron-browser/media/markers.css b/src/vs/workbench/parts/markers/electron-browser/media/markers.css index e5fecf0b02e..5e5a917d3de 100644 --- a/src/vs/workbench/parts/markers/electron-browser/media/markers.css +++ b/src/vs/workbench/parts/markers/electron-browser/media/markers.css @@ -7,7 +7,7 @@ cursor: default; margin: 4px 10px 0 0; min-width: 150px; - max-width: 800px; + max-width: 1000px; } .monaco-action-bar .action-item.markers-panel-action-filter { @@ -27,20 +27,37 @@ border: 1px solid #ddd; } -.markers-panel-action-filter > .markers-panel-filter-badge { - margin: 4px 0px; - padding: 0px 8px; - border-radius: 2px; +.markers-panel-action-filter > .markers-panel-filter-controls { position: absolute; top: 0px; right: 4px; + display: flex; } -.markers-panel-action-filter > .markers-panel-filter-badge.hidden, -.markers-panel-action-filter > .markers-panel-filter-badge.small { +.markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-badge { + margin: 4px 0px; + padding: 0px 8px; + border-radius: 2px; +} + +.markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-badge.hidden, +.markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-badge.small { display: none; } +.markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude { + margin: 3px 0 0 3px; +} + +.vs .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude { + background: url('excludeSettings.svg') center center no-repeat; +} + +.vs-dark .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude, +.hc-black .markers-panel-action-filter > .markers-panel-filter-controls > .markers-panel-filter-filesExclude { + background: url('excludeSettings-dark.svg') center center no-repeat; +} + .markers-panel .markers-panel-container { height: 100%; } @@ -141,17 +158,4 @@ .vs-dark .markers-panel .icon.info { background: url('status-info-inverse.svg') center center no-repeat; -} - -.vs .monaco-action-bar .action-item .icon.markers-panel-action-files-exclude { - background: url('excludeSettings.svg') center center no-repeat; -} - -.vs-dark .monaco-action-bar .action-item .icon.markers-panel-action-files-exclude, -.hc-black .monaco-action-bar .action-item .icon.markers-panel-action-files-exclude { - background: url('excludeSettings-dark.svg') center center no-repeat; -} - -.monaco-action-bar .action-item .icon.markers-panel-action-files-exclude:not(.checked) { - opacity: 0.5; -} +} \ No newline at end of file From c17fb0ebffeb68ed8ff54d874c35f3866ac610fe Mon Sep 17 00:00:00 2001 From: Pine Wu Date: Tue, 10 Apr 2018 12:38:40 -0700 Subject: [PATCH 144/710] temp --- .../css-language-features/.vscode/launch.json | 4 +- .../server/src/cssServerMain.ts | 2 +- .../server/src/pathCompletion.ts | 145 +++++++++++------- .../server/src/modes/pathCompletion.ts | 7 +- 4 files changed, 92 insertions(+), 66 deletions(-) diff --git a/extensions/css-language-features/.vscode/launch.json b/extensions/css-language-features/.vscode/launch.json index 68f7c70e450..43e9880333e 100644 --- a/extensions/css-language-features/.vscode/launch.json +++ b/extensions/css-language-features/.vscode/launch.json @@ -17,8 +17,8 @@ ], "stopOnEntry": false, "sourceMaps": true, - "outFiles": ["${workspaceFolder}/client/out/**/*.js"], - "preLaunchTask": "npm" + "outFiles": ["${workspaceFolder}/client/out/**/*.js"] + // "preLaunchTask": "npm" }, { "name": "Launch Tests", diff --git a/extensions/css-language-features/server/src/cssServerMain.ts b/extensions/css-language-features/server/src/cssServerMain.ts index aba96f5ff6a..77eedcb624d 100644 --- a/extensions/css-language-features/server/src/cssServerMain.ts +++ b/extensions/css-language-features/server/src/cssServerMain.ts @@ -49,7 +49,7 @@ connection.onShutdown(() => { }); let scopedSettingsSupport = false; -let workspaceFolders: WorkspaceFolder[] | undefined; +let workspaceFolders: WorkspaceFolder[]; // After the server has started the client sends an initilize request. The server receives // in the passed params the rootPath of the workspace plus the client capabilities. diff --git a/extensions/css-language-features/server/src/pathCompletion.ts b/extensions/css-language-features/server/src/pathCompletion.ts index 1f8ddfc2df1..9bf9df83e5e 100644 --- a/extensions/css-language-features/server/src/pathCompletion.ts +++ b/extensions/css-language-features/server/src/pathCompletion.ts @@ -10,75 +10,67 @@ import URI from 'vscode-uri'; import { TextDocument, CompletionList, CompletionItemKind, CompletionItem, TextEdit, Range, Position } from 'vscode-languageserver-types'; import { WorkspaceFolder } from 'vscode-languageserver'; -import { ICompletionParticipant, URILiteralCompletionContext } from 'vscode-css-languageservice'; +import { ICompletionParticipant } from 'vscode-css-languageservice'; import { startsWith } from './utils/strings'; export function getPathCompletionParticipant( document: TextDocument, - workspaceFolders: WorkspaceFolder[] | undefined, + workspaceFolders: WorkspaceFolder[], result: CompletionList ): ICompletionParticipant { return { - onURILiteralValue: (context: URILiteralCompletionContext) => { - if (!workspaceFolders || workspaceFolders.length === 0) { - return; - } - const workspaceRoot = resolveWorkspaceRoot(document, workspaceFolders); + onURILiteralValue: ({ position, range, uriValue }) => { + const fullValue = stripQuotes(uriValue); - // Handle quoted values - let uriValue = context.uriValue; - let range = context.range; - if (startsWith(uriValue, `'`) || startsWith(uriValue, `"`)) { - uriValue = uriValue.slice(1, -1); - range = getRangeWithoutQuotes(range); - } + if (shouldDoPathCompletion(fullValue)) { + if (!workspaceFolders || workspaceFolders.length === 0) { + return; + } + const workspaceRoot = resolveWorkspaceRoot(document, workspaceFolders); - const suggestions = providePathSuggestions(uriValue, range, URI.parse(document.uri).fsPath, workspaceRoot); - result.items = [...suggestions, ...result.items]; + const paths = providePaths(fullValue, URI.parse(document.uri).fsPath, workspaceRoot); + result.items = [...paths.map(p => pathToSuggestion(p, fullValue, fullValue, range)), ...result.items]; + } } }; } -export function providePathSuggestions(value: string, range: Range, activeDocFsPath: string, root?: string): CompletionItem[] { - if (startsWith(value, '/') && !root) { +function stripQuotes(fullValue: string) { + if (startsWith(fullValue, `'`) || startsWith(fullValue, `"`)) { + return fullValue.slice(1, -1); + } else { + return fullValue; + } +} + +function shouldDoPathCompletion(fullValue: string) { + if (fullValue === '.') { + return false; + } + return true; +} + +/** + * Get a list of path suggestions. Folder suggestions are suffixed with a slash. + */ +function providePaths(valueBeforeCursor: string, activeDocFsPath: string, root?: string): string[] { + if (startsWith(valueBeforeCursor, '/') && !root) { return []; } - let replaceRange: Range; - const lastIndexOfSlash = value.lastIndexOf('/'); - if (lastIndexOfSlash === -1) { - replaceRange = getFullReplaceRange(range); - } else { - const valueAfterLastSlash = value.slice(lastIndexOfSlash + 1); - replaceRange = getReplaceRange(range, valueAfterLastSlash); - } + const lastIndexOfSlash = valueBeforeCursor.lastIndexOf('/'); + const valueBeforeLastSlash = valueBeforeCursor.slice(0, lastIndexOfSlash + 1); - const valueBeforeLastSlash = value.slice(0, lastIndexOfSlash + 1); - - const parentDir = startsWith(value, '/') + const parentDir = startsWith(valueBeforeCursor, '/') ? path.resolve(root, '.' + valueBeforeLastSlash) : path.resolve(activeDocFsPath, '..', valueBeforeLastSlash); try { return fs.readdirSync(parentDir).map(f => { - if (isDir(path.resolve(parentDir, f))) { - return { - label: f + '/', - kind: CompletionItemKind.Folder, - textEdit: TextEdit.replace(replaceRange, f + '/'), - command: { - title: 'Suggest', - command: 'editor.action.triggerSuggest' - } - }; - } else { - return { - label: f, - kind: CompletionItemKind.File, - textEdit: TextEdit.replace(replaceRange, f) - }; - } + return isDir(path.resolve(parentDir, f)) + ? f + '/' + : f; }); } catch (e) { return []; @@ -93,6 +85,48 @@ const isDir = (p: string) => { } }; +function pathToSuggestion(p: string, valueBeforeCursor: string, fullValue: string, range: Range): CompletionItem { + const isDir = p[p.length - 1] === '/'; + + let replaceRange: Range; + const lastIndexOfSlash = valueBeforeCursor.lastIndexOf('/'); + if (lastIndexOfSlash === -1) { + replaceRange = shiftRange(range, 1, -1); + } else { + // For cases where cursor is in the middle of attribute value, like ', { items: [ { label: 'location', resultText: '' }, diff --git a/extensions/html-language-features/server/src/test/folding.test.ts b/extensions/html-language-features/server/src/test/folding.test.ts index 801344428a1..c64621a9e07 100644 --- a/extensions/html-language-features/server/src/test/folding.test.ts +++ b/extensions/html-language-features/server/src/test/folding.test.ts @@ -88,7 +88,7 @@ suite('HTML Folding', () => { assertRanges(input, [r(0, 7), r(5, 6)]); }); - test('Fold commment', () => { + test('Fold comment', () => { let input = [ /*0*/'', - /*3*/'', - ]; - assertRanges(input, [r(0, 2, 'comment'), r(3, 4, 'comment')]); - }); - - test('Fold regions', () => { - let input = [ - /*0*/'', - /*1*/'', - /*2*/'', - /*3*/'', - ]; - assertRanges(input, [r(0, 3, 'region'), r(1, 2, 'region')]); - }); test('Embedded JavaScript', () => { let input = [ @@ -177,6 +108,61 @@ suite('HTML Folding', () => { assertRanges(input, [r(0, 9), r(1, 8), r(2, 7), r(3, 7, 'region'), r(4, 6, 'region')]); }); + test('Embedded CSS', () => { + let input = [ + /* 0*/'', + /* 1*/'', + /* 2*/'', + /* 8*/'', + /* 9*/'', + ]; + assertRanges(input, [r(0, 8), r(1, 7), r(2, 6), r(3, 5)]); + }); + + test('Embedded CSS - multiple areas', () => { + let input = [ + /* 0*/'', + /* 1*/'', + /* 2*/'', + /* 8*/'', + /*13*/'', + /*14*/'', + ]; + assertRanges(input, [r(0, 13), r(1, 12), r(2, 6), r(3, 6, 'comment'), r(8, 11), r(9, 10)]); + }); + + test('Embedded CSS - regions', () => { + let input = [ + /* 0*/'', + /* 1*/'', + /* 2*/'', + /* 9*/'', + /*10*/'', + ]; + assertRanges(input, [r(0, 9), r(1, 8), r(2, 7), r(3, 7, 'region'), r(4, 6, 'region')]); + }); + + // test('Embedded JavaScript - multi line comment', () => { // let input = [ // /* 0*/'', @@ -192,50 +178,6 @@ suite('HTML Folding', () => { // assertRanges(input, [r(0, 7), r(1, 6), r(2, 5), r(3, 5, 'comment')]); // }); - test('Fold incomplete', () => { - let input = [ - /*0*/'', - /*1*/'

', - /*2*/'Hello', - /*3*/'', - /*4*/'', - ]; - assertRanges(input, [r(0, 3)]); - }); - - test('Fold incomplete 2', () => { - let input = [ - /*0*/'
', - /*1*/'', - /*2*/'
', - ]; - assertRanges(input, [r(0, 1)]); - }); - - test('Fold intersecting region', () => { - let input = [ - /*0*/'', - /*1*/'', - /*2*/'Hello', - /*3*/'
', - /*4*/'', - /*5*/'', - ]; - assertRanges(input, [r(0, 3)]); - }); - - test('Fold intersecting region 2', () => { - let input = [ - /*0*/'', - /*1*/'', - /*2*/'Hello', - /*3*/'', - /*4*/'
', - /*5*/'', - ]; - assertRanges(input, [r(0, 3, 'region')]); - }); - test('Test limit', () => { let input = [ /* 0*/'
', diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 5452722642d..1c58a8ba9ff 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -18,9 +18,9 @@ jsonc-parser@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" -vscode-css-languageservice@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.8.tgz#dc27a2f6eefd191bc603be6b9c0a59232a4c2b9f" +vscode-css-languageservice@^3.0.9-next.6: + version "3.0.9-next.6" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.6.tgz#4da4d25eabb101713f21e8eb60b6042e504fbd97" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" @@ -33,9 +33,9 @@ vscode-emmet-helper@1.2.5: jsonc-parser "^1.0.0" vscode-languageserver-types "^3.6.0-next.1" -vscode-html-languageservice@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.2.tgz#a492d4d3baaa88ce015179f1e985d91eddba9904" +vscode-html-languageservice@^2.1.3-next.1: + version "2.1.3-next.1" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.3-next.1.tgz#bf8a36fc87d10b833211ff7adeb142a06fd18c61" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From 948897cd130a5b9c401f70c1ed2fe5549cb5f95e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 16 Apr 2018 14:32:51 -0700 Subject: [PATCH 336/710] Start of allowing terminal process to live on extension host --- .../mainThreadTerminalService.ts | 6 +++ src/vs/workbench/api/node/extHost.protocol.ts | 9 +++++ .../api/node/extHostTerminalService.ts | 6 ++- .../parts/terminal/common/terminal.ts | 31 ++++++++++----- .../parts/terminal/common/terminalService.ts | 39 ++++++++----------- .../electron-browser/terminalInstance.ts | 33 ++++++++++------ .../terminalProcessManager.ts | 14 +++++-- .../workbench/parts/terminal/node/terminal.ts | 29 ++++++++++++++ .../node/terminalProcessExtHostBridge.ts | 29 ++++++++++++++ 9 files changed, 149 insertions(+), 47 deletions(-) create mode 100644 src/vs/workbench/parts/terminal/node/terminal.ts create mode 100644 src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 8e974b94935..5f574cedd71 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -30,6 +30,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape })); this._toDispose.push(terminalService.onInstanceDisposed((terminalInstance) => this._onTerminalDisposed(terminalInstance))); this._toDispose.push(terminalService.onInstanceProcessIdReady((terminalInstance) => this._onTerminalProcessIdReady(terminalInstance))); + this._toDispose.push(terminalService.onInstanceRequestExtHostProcess((terminalInstance) => this._onTerminalRequestExtHostProcess(terminalInstance))); // Set initial ext host state this.terminalService.terminalInstances.forEach(t => { @@ -97,4 +98,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _onTerminalProcessIdReady(terminalInstance: ITerminalInstance): void { this._proxy.$acceptTerminalProcessId(terminalInstance.id, terminalInstance.processId); } + + private _onTerminalRequestExtHostProcess(terminalInstance: ITerminalInstance): void { + console.log('mainThreadTerminalService#_onTerminalRequestExtHostProcess', arguments); + this._proxy.$createProcess(null, 0, 0); + } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 4d160267c77..324697c269a 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -727,10 +727,19 @@ export interface ExtHostQuickOpenShape { $validateInput(input: string): TPromise; } +export interface ShellLaunchConfigDto { + name?: string; + executable?: string; + args?: string[] | string; + cwd?: string; + env?: { [key: string]: string }; +} + export interface ExtHostTerminalServiceShape { $acceptTerminalClosed(id: number): void; $acceptTerminalOpened(id: number, name: string): void; $acceptTerminalProcessId(id: number, processId: number): void; + $createProcess(shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; } export interface ExtHostSCMShape { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 4e993934fd2..c1632fc7629 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext } from './extHost.protocol'; +import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto } from 'vs/workbench/api/node/extHost.protocol'; export class ExtHostTerminal implements vscode.Terminal { @@ -168,6 +168,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } } + public $createProcess(shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void { + console.log('$createProcess'); + } + private _getTerminalById(id: number): ExtHostTerminal { let index = this._getTerminalIndexById(id); return index !== null ? this._terminals[index] : null; diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 299cf7327ed..ef1de21977d 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -103,26 +103,35 @@ export interface ITerminalFont { } export interface IShellLaunchConfig { - /** The name of the terminal, if this is not set the name of the process will be used. */ + /** + * The name of the terminal, if this is not set the name of the process will be used. + */ name?: string; - /** The shell executable (bash, cmd, etc.). */ + + /** + * The shell executable (bash, cmd, etc.). + */ executable?: string; + /** * The CLI arguments to use with executable, a string[] is in argv format and will be escaped, * a string is in "CommandLine" pre-escaped format and will be used as is. The string option is * only supported on Windows and will throw an exception if used on macOS or Linux. */ args?: string[] | string; + /** * The current working directory of the terminal, this overrides the `terminal.integrated.cwd` * settings key. */ cwd?: string; + /** * A custom environment for the terminal, if this is not set the environment will be inherited * from the VS Code process. */ env?: { [key: string]: string }; + /** * Whether to ignore a custom cwd from the `terminal.integrated.cwd` settings key (eg. if the * shell is being launched by an extension). @@ -139,6 +148,11 @@ export interface IShellLaunchConfig { * of the terminal. Use \x1b over \033 or \e for the escape control character. */ initialText?: string; + + /** + * Whether the process should live on the extension host, not the renderer process. + */ + extensionHostOwned?: boolean; } export interface ITerminalService { @@ -151,6 +165,7 @@ export interface ITerminalService { onInstanceCreated: Event; onInstanceDisposed: Event; onInstanceProcessIdReady: Event; + onInstanceRequestExtHostProcess: Event; onInstancesChanged: Event; onInstanceTitleChanged: Event; terminalInstances: ITerminalInstance[]; @@ -226,9 +241,10 @@ export interface ITerminalInstance { id: number; /** - * The process ID of the shell process. + * The process ID of the shell process, this is undefined when there is no process associated + * with this terminal. */ - processId: number; + processId: number | undefined; /** * An event that fires when the terminal instance's title changes. @@ -244,6 +260,8 @@ export interface ITerminalInstance { onProcessIdReady: Event; + onRequestExtHostProcess: Event; + processReady: TPromise; /** @@ -466,11 +484,6 @@ export interface ITerminalCommandTracker { selectToNextCommand(): void; } -export interface ITerminalProcessMessage { - type: 'pid' | 'data' | 'title'; - content: number | string; -} - export interface ITerminalProcessManager extends IDisposable { readonly processState: ProcessState; readonly ptyProcessReady: TPromise; diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index 69fcd5c98f4..08ff3e7ddea 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -22,29 +22,32 @@ export abstract class TerminalService implements ITerminalService { protected _terminalFocusContextKey: IContextKey; protected _findWidgetVisible: IContextKey; protected _terminalContainer: HTMLElement; - protected _onInstancesChanged: Emitter; - protected _onTabDisposed: Emitter; - protected _onInstanceCreated: Emitter; - protected _onInstanceDisposed: Emitter; - protected _onInstanceProcessIdReady: Emitter; - protected _onInstanceTitleChanged: Emitter; protected _terminalTabs: ITerminalTab[]; protected abstract _terminalInstances: ITerminalInstance[]; private _activeTabIndex: number; - private readonly _onActiveTabChanged: Emitter; public get activeTabIndex(): number { return this._activeTabIndex; } - public get onActiveTabChanged(): Event { return this._onActiveTabChanged.event; } - public get onTabDisposed(): Event { return this._onTabDisposed.event; } - public get onInstanceCreated(): Event { return this._onInstanceCreated.event; } - public get onInstanceDisposed(): Event { return this._onInstanceDisposed.event; } - public get onInstanceProcessIdReady(): Event { return this._onInstanceProcessIdReady.event; } - public get onInstanceTitleChanged(): Event { return this._onInstanceTitleChanged.event; } - public get onInstancesChanged(): Event { return this._onInstancesChanged.event; } public get terminalInstances(): ITerminalInstance[] { return this._terminalInstances; } public get terminalTabs(): ITerminalTab[] { return this._terminalTabs; } + private readonly _onActiveTabChanged: Emitter = new Emitter(); + public get onActiveTabChanged(): Event { return this._onActiveTabChanged.event; } + protected readonly _onInstanceCreated: Emitter = new Emitter(); + public get onInstanceCreated(): Event { return this._onInstanceCreated.event; } + protected readonly _onInstanceDisposed: Emitter = new Emitter(); + public get onInstanceDisposed(): Event { return this._onInstanceDisposed.event; } + protected readonly _onInstanceProcessIdReady: Emitter = new Emitter(); + public get onInstanceProcessIdReady(): Event { return this._onInstanceProcessIdReady.event; } + protected readonly _onInstanceRequestExtHostProcess: Emitter = new Emitter(); + public get onInstanceRequestExtHostProcess(): Event { return this._onInstanceRequestExtHostProcess.event; } + protected readonly _onInstancesChanged: Emitter = new Emitter(); + public get onInstancesChanged(): Event { return this._onInstancesChanged.event; } + protected readonly _onInstanceTitleChanged: Emitter = new Emitter(); + public get onInstanceTitleChanged(): Event { return this._onInstanceTitleChanged.event; } + protected readonly _onTabDisposed: Emitter = new Emitter(); + public get onTabDisposed(): Event { return this._onTabDisposed.event; } + public abstract get configHelper(): ITerminalConfigHelper; constructor( @@ -57,14 +60,6 @@ export abstract class TerminalService implements ITerminalService { this._activeTabIndex = 0; this._isShuttingDown = false; - this._onActiveTabChanged = new Emitter(); - this._onTabDisposed = new Emitter(); - this._onInstanceCreated = new Emitter(); - this._onInstanceDisposed = new Emitter(); - this._onInstanceProcessIdReady = new Emitter(); - this._onInstanceTitleChanged = new Emitter(); - this._onInstancesChanged = new Emitter(); - lifecycleService.onWillShutdown(event => event.veto(this._onWillShutdown())); lifecycleService.onShutdown(() => this._onShutdown()); this._terminalFocusContextKey = KEYBINDING_CONTEXT_TERMINAL_FOCUS.bindTo(this._contextKeyService); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 9db5b91c7d3..245ab95e82f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -71,24 +71,27 @@ export class TerminalInstance implements ITerminalInstance { public disableLayout: boolean; public get id(): number { return this._id; } // TODO: Ideally processId would be merged into processReady - public get processId(): number { return this._processManager.shellProcessId; } + public get processId(): number | undefined { return this._processManager ? this._processManager.shellProcessId : undefined; } + // TODO: How does this work with detached processes? // TODO: Should this be an event as it can fire twice? - public get processReady(): TPromise { return this._processManager.ptyProcessReady; } + public get processReady(): TPromise { return this._processManager ? this._processManager.ptyProcessReady : TPromise.as(void 0); } public get title(): string { return this._title; } public get hadFocusOnExit(): boolean { return this._hadFocusOnExit; } public get isTitleSetByProcess(): boolean { return !!this._messageTitleDisposable; } public get shellLaunchConfig(): IShellLaunchConfig { return Object.freeze(this._shellLaunchConfig); } public get commandTracker(): TerminalCommandTracker { return this._commandTracker; } - private readonly _onDisposed: Emitter = new Emitter(); - private readonly _onFocused: Emitter = new Emitter(); - private readonly _onProcessIdReady: Emitter = new Emitter(); - private readonly _onTitleChanged: Emitter = new Emitter(); + private readonly _onDisposed: Emitter = new Emitter(); public get onDisposed(): Event { return this._onDisposed.event; } + private readonly _onFocused: Emitter = new Emitter(); public get onFocused(): Event { return this._onFocused.event; } + private readonly _onProcessIdReady: Emitter = new Emitter(); public get onProcessIdReady(): Event { return this._onProcessIdReady.event; } + private readonly _onTitleChanged: Emitter = new Emitter(); public get onTitleChanged(): Event { return this._onTitleChanged.event; } + private readonly _onRequestExtHostProcess: Emitter = new Emitter(); + public get onRequestExtHostProcess(): Event { return this._onRequestExtHostProcess.event; } public constructor( private _terminalFocusContextKey: IContextKey, @@ -106,6 +109,9 @@ export class TerminalInstance implements ITerminalInstance { @IConfigurationService private readonly _configurationService: IConfigurationService, @ILogService private _logService: ILogService ) { + this._shellLaunchConfig.extensionHostOwned = true; + this._shellLaunchConfig.name = 'Test terminal renderer'; + this._disposables = []; this._skipTerminalCommands = []; this._onLineDataListeners = []; @@ -267,8 +273,9 @@ export class TerminalInstance implements ITerminalInstance { if (this._processManager) { this._processManager.onProcessData(data => this._sendPtyDataToXterm(data)); this._xterm.on('data', data => this._processManager.write(data)); + // TODO: How does the cwd work on detached processes? + this._linkHandler = this._instantiationService.createInstance(TerminalLinkHandler, this._xterm, platform.platform, this._processManager.initialCwd); } - this._linkHandler = this._instantiationService.createInstance(TerminalLinkHandler, this._xterm, platform.platform, this._processManager.initialCwd); this._commandTracker = new TerminalCommandTracker(this._xterm); this._disposables.push(this._themeService.onThemeChange(theme => this._updateTheme(theme))); } @@ -394,10 +401,13 @@ export class TerminalInstance implements ITerminalInstance { })); this._wrapperElement.appendChild(this._xtermElement); - this._widgetManager = new TerminalWidgetManager(this._wrapperElement); - this._linkHandler.setWidgetManager(this._widgetManager); this._container.appendChild(this._wrapperElement); + if (this._processManager) { + this._widgetManager = new TerminalWidgetManager(this._wrapperElement); + this._linkHandler.setWidgetManager(this._widgetManager); + } + const computedStyle = window.getComputedStyle(this._container); const width = parseInt(computedStyle.getPropertyValue('width').replace('px', ''), 10); const height = parseInt(computedStyle.getPropertyValue('height').replace('px', ''), 10); @@ -578,7 +588,6 @@ export class TerminalInstance implements ITerminalInstance { } protected _createProcess(): void { - // TODO: This should be injected in to the terminal instance (from service?) this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._configHelper); this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this)); this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); @@ -862,7 +871,9 @@ export class TerminalInstance implements ITerminalInstance { } } - this._processManager.ptyProcessReady.then(() => this._processManager.setDimensions(this._cols, this._rows)); + if (this._processManager) { + this._processManager.ptyProcessReady.then(() => this._processManager.setDimensions(this._cols, this._rows)); + } } public setTitle(title: string, eventFromProcess: boolean): void { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts index b98130fa468..88defa05bbb 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts @@ -9,13 +9,15 @@ import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; import Uri from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { ProcessState, ITerminalProcessManager, ITerminalProcessMessage, IShellLaunchConfig, ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal'; +import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal'; import { TPromise } from 'vs/base/common/winjs.base'; import { ILogService } from 'vs/platform/log/common/log'; import { Emitter, Event } from 'vs/base/common/event'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { ITerminalChildProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; +import { TerminalProcessExtHostBridge } from 'vs/workbench/parts/terminal/node/terminalProcessExtHostBridge'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; @@ -34,7 +36,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { public shellProcessId: number; public initialCwd: string; - private _process: cp.ChildProcess; + private _process: ITerminalChildProcess; private _preLaunchInputQueue: string[] = []; private _disposables: IDisposable[] = []; @@ -112,7 +114,11 @@ export class TerminalProcessManager implements ITerminalProcessManager { const cwd = Uri.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath; const options = { env, cwd }; this._logService.debug(`Terminal process launching`, options); - this._process = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], options); + if (shellLaunchConfig.extensionHostOwned) { + this._process = new TerminalProcessExtHostBridge(); + } else { + this._process = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], options); + } this.processState = ProcessState.LAUNCHING; this._process.on('message', message => this._onMessage(message)); @@ -152,7 +158,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { } } - private _onMessage(message: ITerminalProcessMessage): void { + private _onMessage(message: IMessageFromTerminalProcess): void { this._logService.trace(`terminalProcessManager#_onMessage (shellProcessId: ${this.shellProcessId}`, message); switch (message.type) { case 'data': diff --git a/src/vs/workbench/parts/terminal/node/terminal.ts b/src/vs/workbench/parts/terminal/node/terminal.ts new file mode 100644 index 00000000000..2abad57488d --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/terminal.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface IMessageFromTerminalProcess { + type: 'pid' | 'data' | 'title'; + content: number | string; +} + +export interface IMessageToTerminalProcess { + event: 'resize' | 'input' | 'shutdown'; + data?: string; + cols?: number; + rows?: number; +} + +/** + * An interface representing a raw terminal child process, this is a subset of the + * child_process.ChildProcess node.js interface. + */ +export interface ITerminalChildProcess { + readonly connected: boolean; + + send(message: IMessageToTerminalProcess): boolean; + + on(event: 'exit', listener: (code: number) => void): this; + on(event: 'message', listener: (message: IMessageFromTerminalProcess) => void): this; +} diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts new file mode 100644 index 00000000000..76f6bd169d3 --- /dev/null +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ITerminalChildProcess, IMessageToTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; +import { EventEmitter } from 'events'; + +export class TerminalProcessExtHostBridge extends EventEmitter implements ITerminalChildProcess { + public connected: boolean; + + constructor() { + super(); + + let i = 0; + setTimeout(() => { + this.emit('message', { type: 'pid', content: -1 }); + this.emit('message', { type: 'data', content: `test ${i++}\r\n` }); + }, 0); + setInterval(() => { + this.emit('message', { type: 'data', content: `test ${i++}\r\n` }); + }, 1000); + } + + public send(message: IMessageToTerminalProcess): boolean { + console.log('TerminalProcessExtHostBridge#send', arguments); + return true; + } +} \ No newline at end of file From 28ab61469c74a806b4a79c7f42aa2eebb1d61459 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 16 Apr 2018 14:42:03 -0700 Subject: [PATCH 337/710] Type messages emitted from terminal ext host bridge --- .../parts/terminal/node/terminalProcessExtHostBridge.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts index 76f6bd169d3..08cd5e2d2a6 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ITerminalChildProcess, IMessageToTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; +import { ITerminalChildProcess, IMessageToTerminalProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; import { EventEmitter } from 'events'; export class TerminalProcessExtHostBridge extends EventEmitter implements ITerminalChildProcess { @@ -14,11 +14,11 @@ export class TerminalProcessExtHostBridge extends EventEmitter implements ITermi let i = 0; setTimeout(() => { - this.emit('message', { type: 'pid', content: -1 }); - this.emit('message', { type: 'data', content: `test ${i++}\r\n` }); + this.emit('message', { type: 'pid', content: -1 } as IMessageFromTerminalProcess); + this.emit('message', { type: 'data', content: `test ${i++}\r\n` } as IMessageFromTerminalProcess); }, 0); setInterval(() => { - this.emit('message', { type: 'data', content: `test ${i++}\r\n` }); + this.emit('message', { type: 'data', content: `test ${i++}\r\n` } as IMessageFromTerminalProcess); }, 1000); } From 76403b07c9d679d02a1ee849294a8d10b5169c39 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 16 Apr 2018 14:45:25 -0700 Subject: [PATCH 338/710] More types! --- .../node/terminalProcessExtHostBridge.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts index 08cd5e2d2a6..9b3107576b4 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts @@ -14,14 +14,25 @@ export class TerminalProcessExtHostBridge extends EventEmitter implements ITermi let i = 0; setTimeout(() => { - this.emit('message', { type: 'pid', content: -1 } as IMessageFromTerminalProcess); - this.emit('message', { type: 'data', content: `test ${i++}\r\n` } as IMessageFromTerminalProcess); + this._emitPid(-1); + this._emitTitle('test title'); + this._emitData(`test ${i++}\r\n`); }, 0); setInterval(() => { - this.emit('message', { type: 'data', content: `test ${i++}\r\n` } as IMessageFromTerminalProcess); + this._emitData(`test ${i++}\r\n`); }, 1000); } + private _emitData(data: string): void { + this.emit('message', { type: 'data', content: data } as IMessageFromTerminalProcess); + } + private _emitTitle(title: string): void { + this.emit('message', { type: 'data', content: title } as IMessageFromTerminalProcess); + } + private _emitPid(pid: number): void { + this.emit('message', { type: 'data', content: pid } as IMessageFromTerminalProcess); + } + public send(message: IMessageToTerminalProcess): boolean { console.log('TerminalProcessExtHostBridge#send', arguments); return true; From c66b54a1bad0d910b11c59ea93e78cff45095a78 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 16 Apr 2018 14:46:59 -0700 Subject: [PATCH 339/710] translation reminder typo --- build/lib/tslint/translationRemindRule.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/lib/tslint/translationRemindRule.ts b/build/lib/tslint/translationRemindRule.ts index 6bc2a191619..2c5adcc4c49 100644 --- a/build/lib/tslint/translationRemindRule.ts +++ b/build/lib/tslint/translationRemindRule.ts @@ -67,7 +67,7 @@ class TranslationRemindRuleWalker extends Lint.RuleWalker { }); if (!resourceDefined) { - this.addFailureAtNode(node, `Please add '${resource}' to ./builds/lib/i18n.resources.json file to use translations here.`); + this.addFailureAtNode(node, `Please add '${resource}' to ./build/lib/i18n.resources.json file to use translations here.`); } } } From 7fc439997de39f680b29067b3d42a52eaf03b1ac Mon Sep 17 00:00:00 2001 From: Niklas Mollenhauer Date: Tue, 17 Apr 2018 00:04:54 +0200 Subject: [PATCH 340/710] Change Hover#range to be optional The docs of `Hover#range` state: > When missing, the editor will use the range at the current position or the current position itself. This implies that the `range` field should be optional as it can be missing. --- src/vs/editor/common/modes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 7d9701574ec..5c09c49af21 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -230,7 +230,7 @@ export interface Hover { * editor will use the range at the current position or the * current position itself. */ - range: IRange; + range?: IRange; } /** From 2840741d5e2b3a9b6478f7ae74edb31388022d01 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 16 Apr 2018 13:48:16 -0700 Subject: [PATCH 341/710] Update js/ts grammar --- .../syntaxes/JavaScript.tmLanguage.json | 123 +++++++++++++++--- .../syntaxes/JavaScriptReact.tmLanguage.json | 123 +++++++++++++++--- .../syntaxes/TypeScript.tmLanguage.json | 115 +++++++++++++--- .../syntaxes/TypeScriptReact.tmLanguage.json | 123 +++++++++++++++--- 4 files changed, 404 insertions(+), 80 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index d425b739890..7b306b3f963 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/5c237f767c5cff27910946a3ba65261cc3b6f4bf", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/929ee616cc9c299c5ed09d6051277a9c34e2d6e9", "name": "JavaScript (with React support)", "scopeName": "source.js", "patterns": [ @@ -291,7 +291,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.js", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.js entity.name.function.js" @@ -525,7 +525,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.js" @@ -751,7 +751,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.js entity.name.function.js" @@ -1036,7 +1036,7 @@ }, { "name": "meta.arrow.js", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.js" @@ -1875,18 +1875,44 @@ "name": "keyword.control.switch.js" } }, - "end": ":", - "endCaptures": { - "0": { - "name": "punctuation.definition.section.case-statement.js" - } - }, + "end": "(?=:)", "patterns": [ { "include": "#expression" } ] }, + { + "begin": "(:)\\s*(\\{)", + "beginCaptures": { + "1": { + "name": "case-clause.expr.js punctuation.definition.section.case-statement.js" + }, + "2": { + "name": "meta.block.js punctuation.definition.block.js" + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "meta.block.js punctuation.definition.block.js" + } + }, + "contentName": "meta.block.js", + "patterns": [ + { + "include": "#statements" + } + ] + }, + { + "match": "(:)", + "captures": { + "0": { + "name": "case-clause.expr.js punctuation.definition.section.case-statement.js" + } + } + }, { "include": "#statements" } @@ -1959,7 +1985,7 @@ }, "after-operator-block-as-object-literal": { "name": "meta.objectliteral.js", - "begin": "(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.js" @@ -2112,6 +2138,61 @@ }, "end": "(?=,|\\})", "patterns": [ + { + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.js" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, + { + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js" + }, + "2": { + "name": "meta.brace.round.js" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#expression" } @@ -2142,13 +2223,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.js", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2798,7 +2879,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.js" @@ -4365,8 +4446,8 @@ ] }, "jsx-tag-in-expression": { - "begin": "(?x)\n (?:*]|&&|\\|\\||\\?|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", - "end": "(?!(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "begin": "(?x)\n (?:*]|&&|\\|\\||\\?|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "end": "(?!(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", "patterns": [ { "include": "#jsx-tag" @@ -4375,7 +4456,7 @@ }, "jsx-tag": { "name": "meta.tag.js", - "begin": "(?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "begin": "(?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", "end": "(/>)|(?:())", "endCaptures": { "1": { @@ -4402,7 +4483,7 @@ }, "patterns": [ { - "begin": "(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>)", + "begin": "(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>)", "beginCaptures": { "1": { "name": "punctuation.definition.tag.begin.js" diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json index 1501020eeb4..a92b07303c2 100644 --- a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/5c237f767c5cff27910946a3ba65261cc3b6f4bf", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/929ee616cc9c299c5ed09d6051277a9c34e2d6e9", "name": "JavaScript (with React support)", "scopeName": "source.js.jsx", "patterns": [ @@ -291,7 +291,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.js.jsx", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.js.jsx entity.name.function.js.jsx" @@ -525,7 +525,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.js.jsx" @@ -751,7 +751,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.js.jsx entity.name.function.js.jsx" @@ -1036,7 +1036,7 @@ }, { "name": "meta.arrow.js.jsx", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.js.jsx" @@ -1875,18 +1875,44 @@ "name": "keyword.control.switch.js.jsx" } }, - "end": ":", - "endCaptures": { - "0": { - "name": "punctuation.definition.section.case-statement.js.jsx" - } - }, + "end": "(?=:)", "patterns": [ { "include": "#expression" } ] }, + { + "begin": "(:)\\s*(\\{)", + "beginCaptures": { + "1": { + "name": "case-clause.expr.js.jsx punctuation.definition.section.case-statement.js.jsx" + }, + "2": { + "name": "meta.block.js.jsx punctuation.definition.block.js.jsx" + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "meta.block.js.jsx punctuation.definition.block.js.jsx" + } + }, + "contentName": "meta.block.js.jsx", + "patterns": [ + { + "include": "#statements" + } + ] + }, + { + "match": "(:)", + "captures": { + "0": { + "name": "case-clause.expr.js.jsx punctuation.definition.section.case-statement.js.jsx" + } + } + }, { "include": "#statements" } @@ -1959,7 +1985,7 @@ }, "after-operator-block-as-object-literal": { "name": "meta.objectliteral.js.jsx", - "begin": "(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.js.jsx" @@ -2112,6 +2138,61 @@ }, "end": "(?=,|\\})", "patterns": [ + { + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js.jsx" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.js.jsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js.jsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, + { + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js.jsx" + }, + "2": { + "name": "meta.brace.round.js.jsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js.jsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#expression" } @@ -2142,13 +2223,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.js.jsx", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2798,7 +2879,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.js.jsx" @@ -4365,8 +4446,8 @@ ] }, "jsx-tag-in-expression": { - "begin": "(?x)\n (?:*]|&&|\\|\\||\\?|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", - "end": "(?!(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "begin": "(?x)\n (?:*]|&&|\\|\\||\\?|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "end": "(?!(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", "patterns": [ { "include": "#jsx-tag" @@ -4375,7 +4456,7 @@ }, "jsx-tag": { "name": "meta.tag.js.jsx", - "begin": "(?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "begin": "(?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", "end": "(/>)|(?:())", "endCaptures": { "1": { @@ -4402,7 +4483,7 @@ }, "patterns": [ { - "begin": "(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>)", + "begin": "(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>)", "beginCaptures": { "1": { "name": "punctuation.definition.tag.begin.js.jsx" diff --git a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json index 10e0aacba78..2856d4ed0e9 100644 --- a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/5c237f767c5cff27910946a3ba65261cc3b6f4bf", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/929ee616cc9c299c5ed09d6051277a9c34e2d6e9", "name": "TypeScript", "scopeName": "source.ts", "patterns": [ @@ -288,7 +288,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.ts", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.ts entity.name.function.ts" @@ -522,7 +522,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.ts" @@ -748,7 +748,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.ts entity.name.function.ts" @@ -1033,7 +1033,7 @@ }, { "name": "meta.arrow.ts", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.ts" @@ -1872,18 +1872,44 @@ "name": "keyword.control.switch.ts" } }, - "end": ":", - "endCaptures": { - "0": { - "name": "punctuation.definition.section.case-statement.ts" - } - }, + "end": "(?=:)", "patterns": [ { "include": "#expression" } ] }, + { + "begin": "(:)\\s*(\\{)", + "beginCaptures": { + "1": { + "name": "case-clause.expr.ts punctuation.definition.section.case-statement.ts" + }, + "2": { + "name": "meta.block.ts punctuation.definition.block.ts" + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "meta.block.ts punctuation.definition.block.ts" + } + }, + "contentName": "meta.block.ts", + "patterns": [ + { + "include": "#statements" + } + ] + }, + { + "match": "(:)", + "captures": { + "0": { + "name": "case-clause.expr.ts punctuation.definition.section.case-statement.ts" + } + } + }, { "include": "#statements" } @@ -1956,7 +1982,7 @@ }, "after-operator-block-as-object-literal": { "name": "meta.objectliteral.ts", - "begin": "(?)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.ts" @@ -2109,6 +2135,61 @@ }, "end": "(?=,|\\})", "patterns": [ + { + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.ts" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, + { + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.ts" + }, + "2": { + "name": "meta.brace.round.ts" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#expression" } @@ -2139,13 +2220,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.ts", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2832,7 +2913,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.ts" diff --git a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json index 97e76452d41..4c68fdc923c 100644 --- a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/5c237f767c5cff27910946a3ba65261cc3b6f4bf", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/929ee616cc9c299c5ed09d6051277a9c34e2d6e9", "name": "TypeScriptReact", "scopeName": "source.tsx", "patterns": [ @@ -291,7 +291,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.tsx", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.tsx entity.name.function.tsx" @@ -525,7 +525,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.tsx" @@ -751,7 +751,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.tsx entity.name.function.tsx" @@ -1036,7 +1036,7 @@ }, { "name": "meta.arrow.tsx", - "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.tsx" @@ -1875,18 +1875,44 @@ "name": "keyword.control.switch.tsx" } }, - "end": ":", - "endCaptures": { - "0": { - "name": "punctuation.definition.section.case-statement.tsx" - } - }, + "end": "(?=:)", "patterns": [ { "include": "#expression" } ] }, + { + "begin": "(:)\\s*(\\{)", + "beginCaptures": { + "1": { + "name": "case-clause.expr.tsx punctuation.definition.section.case-statement.tsx" + }, + "2": { + "name": "meta.block.tsx punctuation.definition.block.tsx" + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "meta.block.tsx punctuation.definition.block.tsx" + } + }, + "contentName": "meta.block.tsx", + "patterns": [ + { + "include": "#statements" + } + ] + }, + { + "match": "(:)", + "captures": { + "0": { + "name": "case-clause.expr.tsx punctuation.definition.section.case-statement.tsx" + } + } + }, { "include": "#statements" } @@ -1959,7 +1985,7 @@ }, "after-operator-block-as-object-literal": { "name": "meta.objectliteral.tsx", - "begin": "(?)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.tsx" @@ -2112,6 +2138,61 @@ }, "end": "(?=,|\\})", "patterns": [ + { + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.tsx" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.tsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.tsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, + { + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.tsx" + }, + "2": { + "name": "meta.brace.round.tsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.tsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + }, { "include": "#expression" } @@ -2142,13 +2223,13 @@ ] }, "function-call": { - "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", - "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "name": "meta.function-call.tsx", "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", - "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", + "end": "(?=\\s*(\\?\\.\\s*)?(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)?\\()", "patterns": [ { "include": "#literal" @@ -2798,7 +2879,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.tsx" @@ -4365,8 +4446,8 @@ ] }, "jsx-tag-in-expression": { - "begin": "(?x)\n (?:*]|&&|\\|\\||\\?|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", - "end": "(?!(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "begin": "(?x)\n (?:*]|&&|\\|\\||\\?|^return|[^\\._$[:alnum:]]return|^default|[^\\._$[:alnum:]]default|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "end": "(?!(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", "patterns": [ { "include": "#jsx-tag" @@ -4375,7 +4456,7 @@ }, "jsx-tag": { "name": "meta.tag.tsx", - "begin": "(?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", + "begin": "(?=(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>))", "end": "(/>)|(?:())", "endCaptures": { "1": { @@ -4402,7 +4483,7 @@ }, "patterns": [ { - "begin": "(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>)", + "begin": "(<)\\s*(?:([_$a-zA-Z][-$\\w.]*)(?\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>)?\\s+(?!\\?)|\\/?>)", "beginCaptures": { "1": { "name": "punctuation.definition.tag.begin.tsx" From bc6a2d52acfb5ffaa9ffb5f7176b4e728071bd20 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 16 Apr 2018 15:12:52 -0700 Subject: [PATCH 342/710] Move onDidChangeActiveTextEditor into Preview --- .../src/features/preview.ts | 40 ++++++++++++------- .../src/features/previewManager.ts | 17 ++------ 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index 003872372e5..a6e37d28d82 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -14,12 +14,16 @@ import * as nls from 'vscode-nls'; import { getVisibleLine, MarkdownFileTopmostLineMonitor } from '../util/topmostLineMonitor'; import { MarkdownPreviewConfigurationManager } from './previewConfig'; import { MarkdownContributions } from '../markdownExtensions'; +import { isMarkdownFile } from '../util/file'; const localize = nls.loadMessageBundle(); export class MarkdownPreview { public static viewType = 'markdown.preview'; + private _resource: vscode.Uri; + private _locked: boolean; + private readonly editor: vscode.WebviewPanel; private throttleTimer: any; private line: number | undefined = undefined; @@ -91,13 +95,15 @@ export class MarkdownPreview { private constructor( webview: vscode.WebviewPanel, - private _resource: vscode.Uri, - public locked: boolean, - private readonly contentProvider: MarkdownContentProvider, - private readonly previewConfigurations: MarkdownPreviewConfigurationManager, - private readonly logger: Logger, + resource: vscode.Uri, + locked: boolean, + private readonly _contentProvider: MarkdownContentProvider, + private readonly _previewConfigurations: MarkdownPreviewConfigurationManager, + private readonly _logger: Logger, topmostLineMonitor: MarkdownFileTopmostLineMonitor ) { + this._resource = resource; + this._locked = locked; this.editor = webview; this.editor.onDidDispose(() => { @@ -150,6 +156,12 @@ export class MarkdownPreview { }); } }, null, this.disposables); + + vscode.window.onDidChangeActiveTextEditor(editor => { + if (editor && isMarkdownFile(editor.document) && !this._locked) { + this.update(editor.document.uri); + } + }, null, this.disposables); } private readonly _onDisposeEmitter = new vscode.EventEmitter(); @@ -165,7 +177,7 @@ export class MarkdownPreview { public get state() { return { resource: this.resource.toString(), - locked: this.locked, + locked: this._locked, line: this.line }; } @@ -218,7 +230,7 @@ export class MarkdownPreview { } public updateConfiguration() { - if (this.previewConfigurations.hasConfigurationChanged(this._resource)) { + if (this._previewConfigurations.hasConfigurationChanged(this._resource)) { this.refresh(); } } @@ -244,7 +256,7 @@ export class MarkdownPreview { return false; } - if (this.locked) { + if (this._locked) { return otherLocked && this.isPreviewOf(otherResource); } else { return !otherLocked; @@ -252,7 +264,7 @@ export class MarkdownPreview { } public matches(otherPreview: MarkdownPreview): boolean { - return this.matchesResource(otherPreview._resource, otherPreview.position, otherPreview.locked); + return this.matchesResource(otherPreview._resource, otherPreview.position, otherPreview._locked); } public reveal(viewColumn: vscode.ViewColumn) { @@ -260,8 +272,8 @@ export class MarkdownPreview { } public toggleLock() { - this.locked = !this.locked; - this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this.locked); + this._locked = !this._locked; + this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); } private static getPreviewTitle(resource: vscode.Uri, locked: boolean): string { @@ -281,7 +293,7 @@ export class MarkdownPreview { } if (typeof topLine === 'number') { - this.logger.log('updateForView', { markdownFile: resource }); + this._logger.log('updateForView', { markdownFile: resource }); this.line = topLine; this.postMessage({ type: 'updateView', @@ -313,9 +325,9 @@ export class MarkdownPreview { this.forceUpdate = false; this.currentVersion = { resource, version: document.version }; - const content = await this.contentProvider.provideTextDocumentContent(document, this.previewConfigurations, this.line); + const content = await this._contentProvider.provideTextDocumentContent(document, this._previewConfigurations, this.line); if (this._resource === resource) { - this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this.locked); + this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); this.editor.webview.html = content; } } diff --git a/extensions/markdown-language-features/src/features/previewManager.ts b/extensions/markdown-language-features/src/features/previewManager.ts index bffab3ac74b..ec59ba12f3b 100644 --- a/extensions/markdown-language-features/src/features/previewManager.ts +++ b/extensions/markdown-language-features/src/features/previewManager.ts @@ -4,15 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; - import { Logger } from '../logger'; -import { MarkdownContentProvider } from './previewContentProvider'; -import { MarkdownPreview, PreviewSettings } from './preview'; +import { MarkdownContributions } from '../markdownExtensions'; import { disposeAll } from '../util/dispose'; import { MarkdownFileTopmostLineMonitor } from '../util/topmostLineMonitor'; -import { isMarkdownFile } from '../util/file'; +import { MarkdownPreview, PreviewSettings } from './preview'; import { MarkdownPreviewConfigurationManager } from './previewConfig'; -import { MarkdownContributions } from '../markdownExtensions'; +import { MarkdownContentProvider } from './previewContentProvider'; + export class MarkdownPreviewManager implements vscode.WebviewPanelSerializer { private static readonly markdownPreviewActiveContextKey = 'markdownPreviewFocus'; @@ -28,14 +27,6 @@ export class MarkdownPreviewManager implements vscode.WebviewPanelSerializer { private readonly logger: Logger, private readonly contributions: MarkdownContributions ) { - vscode.window.onDidChangeActiveTextEditor(editor => { - if (editor && isMarkdownFile(editor.document)) { - for (const preview of this.previews.filter(preview => !preview.locked)) { - preview.update(editor.document.uri); - } - } - }, null, this.disposables); - this.disposables.push(vscode.window.registerWebviewPanelSerializer(MarkdownPreview.viewType, this)); } From 3a14fde91d1fd0b3060b9eefb0780dd8d8b80e18 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 16 Apr 2018 15:21:24 -0700 Subject: [PATCH 343/710] Fix double click md preview when source document is not showing Fixes #47188 --- .../markdown-language-features/src/features/preview.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index a6e37d28d82..a1c2cf45a13 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -239,10 +239,6 @@ export class MarkdownPreview { return this.editor.position; } - public isPreviewOf(resource: vscode.Uri): boolean { - return this._resource.fsPath === resource.fsPath; - } - public isWebviewOf(webview: vscode.WebviewPanel): boolean { return this.editor === webview; } @@ -276,6 +272,10 @@ export class MarkdownPreview { this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); } + private isPreviewOf(resource: vscode.Uri): boolean { + return this._resource.fsPath === resource.fsPath; + } + private static getPreviewTitle(resource: vscode.Uri, locked: boolean): string { return locked ? localize('lockedPreviewTitle', '[Preview] {0}', path.basename(resource.fsPath)) @@ -377,6 +377,8 @@ export class MarkdownPreview { return; } } + + vscode.workspace.openTextDocument(this._resource).then(vscode.window.showTextDocument); } } From ab56a0952b9c2ff7add6404f80ebf9398cf8ae51 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 16 Apr 2018 17:08:33 -0700 Subject: [PATCH 344/710] Fix #47733. when check char code we need to validate if it is at the end of a node. --- .../pieceTreeTextBuffer/pieceTreeBase.ts | 24 +++++++++++++------ .../pieceTreeTextBuffer.test.ts | 22 +++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts index 3e7787756a2..360bbb4fa59 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts @@ -536,14 +536,24 @@ export class PieceTreeBase { } public getLineCharCode(lineNumber: number, index: number): number { - return this.getLineContent(lineNumber).charCodeAt(index); - // TODO@peng: optimize the implementation to not allocate a string - // let nodePos = this.nodeAt2(lineNumber, index + 1); - // let buffer = this._buffers[nodePos.node.piece.bufferIndex]; - // let startOffset = this.offsetInBuffer(nodePos.node.piece.bufferIndex, nodePos.node.piece.start); - // let targetOffset = startOffset + nodePos.remainder; + let nodePos = this.nodeAt2(lineNumber, index + 1); + if (nodePos.remainder === nodePos.node.piece.length) { + // the char we want to fetch is at the head of next node. + let matchingNode = nodePos.node.next(); + if (!matchingNode) { + return 0; + } - // return buffer.buffer.charCodeAt(targetOffset); + let buffer = this._buffers[matchingNode.piece.bufferIndex]; + let startOffset = this.offsetInBuffer(matchingNode.piece.bufferIndex, matchingNode.piece.start); + return buffer.buffer.charCodeAt(startOffset); + } else { + let buffer = this._buffers[nodePos.node.piece.bufferIndex]; + let startOffset = this.offsetInBuffer(nodePos.node.piece.bufferIndex, nodePos.node.piece.start); + let targetOffset = startOffset + nodePos.remainder; + + return buffer.buffer.charCodeAt(targetOffset); + } } public getLineLength(lineNumber: number): number { diff --git a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts index 717870f0b59..089c17be083 100644 --- a/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts +++ b/src/vs/editor/test/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.test.ts @@ -1613,6 +1613,28 @@ suite('buffer api', () => { test('getLineCharCode - issue #45735', () => { let pieceTable = createTextBuffer(['LINE1\nline2']); + assert.equal(pieceTable.getLineCharCode(1, 0), 'L'.charCodeAt(0), 'L'); + assert.equal(pieceTable.getLineCharCode(1, 1), 'I'.charCodeAt(0), 'I'); + assert.equal(pieceTable.getLineCharCode(1, 2), 'N'.charCodeAt(0), 'N'); + assert.equal(pieceTable.getLineCharCode(1, 3), 'E'.charCodeAt(0), 'E'); + assert.equal(pieceTable.getLineCharCode(1, 4), '1'.charCodeAt(0), '1'); + assert.equal(pieceTable.getLineCharCode(1, 5), '\n'.charCodeAt(0), '\\n'); + assert.equal(pieceTable.getLineCharCode(2, 0), 'l'.charCodeAt(0), 'l'); + assert.equal(pieceTable.getLineCharCode(2, 1), 'i'.charCodeAt(0), 'i'); + assert.equal(pieceTable.getLineCharCode(2, 2), 'n'.charCodeAt(0), 'n'); + assert.equal(pieceTable.getLineCharCode(2, 3), 'e'.charCodeAt(0), 'e'); + assert.equal(pieceTable.getLineCharCode(2, 4), '2'.charCodeAt(0), '2'); + }); + + + test('getLineCharCode - issue #47733', () => { + let pieceTable = createTextBuffer(['', 'LINE1\n', 'line2']); + assert.equal(pieceTable.getLineCharCode(1, 0), 'L'.charCodeAt(0), 'L'); + assert.equal(pieceTable.getLineCharCode(1, 1), 'I'.charCodeAt(0), 'I'); + assert.equal(pieceTable.getLineCharCode(1, 2), 'N'.charCodeAt(0), 'N'); + assert.equal(pieceTable.getLineCharCode(1, 3), 'E'.charCodeAt(0), 'E'); + assert.equal(pieceTable.getLineCharCode(1, 4), '1'.charCodeAt(0), '1'); + assert.equal(pieceTable.getLineCharCode(1, 5), '\n'.charCodeAt(0), '\\n'); assert.equal(pieceTable.getLineCharCode(2, 0), 'l'.charCodeAt(0), 'l'); assert.equal(pieceTable.getLineCharCode(2, 1), 'i'.charCodeAt(0), 'i'); assert.equal(pieceTable.getLineCharCode(2, 2), 'n'.charCodeAt(0), 'n'); From 0a60dbc4a85bad5491196e674b9094d1c0202470 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 09:18:13 +0200 Subject: [PATCH 345/710] run smoketest in continuous build --- build/tfs/continuous-build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 72d1e573fc2..511c37476e1 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -18,6 +18,7 @@ phases: - powershell: | .\scripts\test.bat --tfs .\scripts\test-integration.bat + yarn smoketest name: test - task: PublishTestResults@2 inputs: @@ -77,6 +78,7 @@ phases: - script: | ./scripts/test.sh --tfs ./scripts/test-integration.sh + yarn smoketest name: test - task: PublishTestResults@2 inputs: From 7287c6d1fb4248b6ff0e4ff4832275335657613a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 09:20:07 +0200 Subject: [PATCH 346/710] empty From 3e7d870627dec135d7c2c6be33d9e1422b9d8650 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Tue, 17 Apr 2018 09:20:37 +0200 Subject: [PATCH 347/710] refactoring --- .../files/electron-browser/fileActions.ts | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 8cc50654caf..3927971926e 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1364,9 +1364,9 @@ export function validateFileName(parent: ExplorerItem, name: string, allowOverwr return nls.localize('fileNameExistsError', "A file or folder **{0}** already exists at this location. Please choose a different name.", name); } - // a file must always be a leaf - if (pathMapping.last.isFile) { - return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", pathMapping.last.name); + // A file must always be a leaf + if (pathMapping.lastExistingPathSegment.isFile) { + return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", pathMapping.lastExistingPathSegment.name); } // Invalid File name @@ -1388,32 +1388,27 @@ export function validateFileName(parent: ExplorerItem, name: string, allowOverwr interface IMappedPath { fullPathAlreadyExists: boolean; - last: { + lastExistingPathSegment: { isFile: boolean; name: string; }; } function mapPathsToExistingFolders(parent: ExplorerItem, pathNames: string[]): IMappedPath { - let fullPathAlreadyExists = true; - let lastPath = { isFile: false, name: '' }; + let lastExistingPathSegment = { isFile: false, name: '' }; for (const name of pathNames) { const { exists, child } = alreadyExists(parent, name); - if (!exists) { - fullPathAlreadyExists = false; - break; + if (exists) { + lastExistingPathSegment = { isFile: !child.isDirectory, name }; + parent = child; + } else { + return { fullPathAlreadyExists: false, lastExistingPathSegment }; } - - const isFile: boolean = !child.isDirectory; - lastPath.isFile = isFile; - lastPath.name = name; - - parent = child; } - return { fullPathAlreadyExists, last: lastPath }; + return { fullPathAlreadyExists: true, lastExistingPathSegment }; } From f373a15de059b7ed4918797172eeea224a7a939c Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Tue, 17 Apr 2018 09:57:07 +0200 Subject: [PATCH 348/710] Committing new JS file --- build/lib/tslint/translationRemindRule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/lib/tslint/translationRemindRule.js b/build/lib/tslint/translationRemindRule.js index 1409dc54951..ec56aff1535 100644 --- a/build/lib/tslint/translationRemindRule.js +++ b/build/lib/tslint/translationRemindRule.js @@ -71,7 +71,7 @@ var TranslationRemindRuleWalker = /** @class */ (function (_super) { } }); if (!resourceDefined) { - this.addFailureAtNode(node, "Please add '" + resource + "' to ./builds/lib/i18n.resources.json file to use translations here."); + this.addFailureAtNode(node, "Please add '" + resource + "' to ./build/lib/i18n.resources.json file to use translations here."); } }; TranslationRemindRuleWalker.NLS_MODULE = 'vs/nls'; From 403511b55cfff0fe2e063eb9610d6aaf8b92f428 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 10:02:50 +0200 Subject: [PATCH 349/710] missing compile --- build/lib/tslint/translationRemindRule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/lib/tslint/translationRemindRule.js b/build/lib/tslint/translationRemindRule.js index 1409dc54951..ec56aff1535 100644 --- a/build/lib/tslint/translationRemindRule.js +++ b/build/lib/tslint/translationRemindRule.js @@ -71,7 +71,7 @@ var TranslationRemindRuleWalker = /** @class */ (function (_super) { } }); if (!resourceDefined) { - this.addFailureAtNode(node, "Please add '" + resource + "' to ./builds/lib/i18n.resources.json file to use translations here."); + this.addFailureAtNode(node, "Please add '" + resource + "' to ./build/lib/i18n.resources.json file to use translations here."); } }; TranslationRemindRuleWalker.NLS_MODULE = 'vs/nls'; From c22eeb001ece79b23cc555d2566f327d6c7ae01d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 10:04:18 +0200 Subject: [PATCH 350/710] download builtin extensions in continuous build --- build/tfs/continuous-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 511c37476e1..009250e7ac0 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -14,6 +14,7 @@ phases: npm run gulp -- hygiene .\node_modules\.bin\tsc -p .\src\tsconfig.monaco.json --noEmit npm run compile + node build/lib/builtInExtensions.js name: build - powershell: | .\scripts\test.bat --tfs @@ -49,6 +50,7 @@ phases: npm run gulp -- hygiene ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit npm run compile + node build/lib/builtInExtensions.js name: build - script: | DISPLAY=:10 ./scripts/test.sh --tfs @@ -74,6 +76,7 @@ phases: npm run gulp -- hygiene ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit npm run compile + node build/lib/builtInExtensions.js name: build - script: | ./scripts/test.sh --tfs From fffc6c3b1c22abf926ad0e5f6fdc63add677bc85 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 10:33:13 +0200 Subject: [PATCH 351/710] fix bad reload call --- src/vs/platform/driver/electron-main/driver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 1f055e46285..858618480d1 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -68,7 +68,7 @@ export class Driver implements IDriver, IWindowDriverRegistry { const window = this.windowsService.getWindowById(windowId); this.reloadingWindowIds.add(windowId); - window.reload(); + this.windowsService.reload(window); } async dispatchKeybinding(windowId: number, keybinding: string): TPromise { From f60e0f914896925287b2ed347d57e8655ab68618 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 17 Apr 2018 10:43:33 +0200 Subject: [PATCH 352/710] - Add to composite bar when new composite is added - Sequential order for in-built viewlets --- src/vs/workbench/browser/composite.ts | 5 +++++ .../workbench/browser/parts/activitybar/activitybarPart.ts | 4 +++- src/vs/workbench/browser/parts/compositePart.ts | 2 +- src/vs/workbench/browser/parts/compositebar/compositeBar.ts | 6 ++++-- src/vs/workbench/browser/parts/panel/panelPart.ts | 4 +++- .../parts/debug/electron-browser/debug.contribution.ts | 2 +- .../extensions/electron-browser/extensions.contribution.ts | 2 +- .../parts/scm/electron-browser/scm.contribution.ts | 2 +- .../parts/search/electron-browser/search.contribution.ts | 2 +- src/vs/workbench/services/viewlet/browser/viewlet.ts | 1 + src/vs/workbench/services/viewlet/browser/viewletService.ts | 1 + 11 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index 04e72f4dfa8..545f12395cf 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -242,6 +242,10 @@ export abstract class CompositeDescriptor { } export abstract class CompositeRegistry { + + private readonly _onDidRegister: Emitter> = new Emitter>(); + readonly onDidRegister: Event> = this._onDidRegister.event; + private composites: CompositeDescriptor[]; constructor() { @@ -254,6 +258,7 @@ export abstract class CompositeRegistry { } this.composites.push(descriptor); + this._onDidRegister.fire(descriptor); } public getComposite(id: string): CompositeDescriptor { diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 298b44a0160..0fc2fd42342 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -87,6 +87,8 @@ export class ActivitybarPart extends Part { private registerListeners(): void { + this.toUnbind.push(this.viewletService.onDidViewletRegister(viewletDescriptor => this.compositeBar.addComposite(viewletDescriptor, false))); + // Activate viewlet action on opening of a viewlet this.toUnbind.push(this.viewletService.onDidViewletOpen(viewlet => this.compositeBar.activateComposite(viewlet.getId()))); @@ -95,7 +97,7 @@ export class ActivitybarPart extends Part { this.toUnbind.push(this.compositeBar.onDidContextMenu(e => this.showContextMenu(e))); this.toUnbind.push(this.viewletService.onDidViewletEnablementChange(({ id, enabled }) => { if (enabled) { - this.compositeBar.addComposite(this.viewletService.getViewlet(id)); + this.compositeBar.addComposite(this.viewletService.getViewlet(id), true); } else { this.compositeBar.removeComposite(id); } diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index e9b89555eea..5e919a5668c 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -77,7 +77,7 @@ export abstract class CompositePart extends Part { private keybindingService: IKeybindingService, protected instantiationService: IInstantiationService, themeService: IThemeService, - private registry: CompositeRegistry, + protected readonly registry: CompositeRegistry, private activeCompositeSettingsKey: string, private defaultCompositeId: string, private nameForTelemetry: string, diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 6b6e3cd458d..682931b6b8f 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -80,7 +80,7 @@ export class CompositeBar implements ICompositeBar { return this._onDidContextMenu.event; } - public addComposite(compositeData: { id: string; name: string, order: number }): void { + public addComposite(compositeData: { id: string; name: string, order: number }, pin: boolean): void { if (this.options.composites.filter(c => c.id === compositeData.id).length) { return; } @@ -89,7 +89,9 @@ export class CompositeBar implements ICompositeBar { i++; } this.options.composites.push(compositeData); - this.pin(compositeData.id, true, i); + if (pin) { + this.pin(compositeData.id, true, i); + } } public removeComposite(id: string): void { diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index d2972c69150..747f4c56d68 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -100,6 +100,8 @@ export class PanelPart extends CompositePart implements IPanelService { private registerListeners(): void { + this.toUnbind.push(this.registry.onDidRegister(panelDescriptor => this.compositeBar.addComposite(panelDescriptor, false))); + // Activate panel action on opening of a panel this.toUnbind.push(this.onDidPanelOpen(panel => { this.compositeBar.activateComposite(panel.getId()); @@ -180,7 +182,7 @@ export class PanelPart extends CompositePart implements IPanelService { if (descriptor && descriptor.enabled !== enabled) { descriptor.enabled = enabled; if (enabled) { - this.compositeBar.addComposite(descriptor); + this.compositeBar.addComposite(descriptor, true); } else { this.compositeBar.removeComposite(id); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 2b6f3550af8..c3f0e87d3df 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -86,7 +86,7 @@ Registry.as(ViewletExtensions.Viewlets).registerViewlet(new Vie VIEWLET_ID, nls.localize('debug', "Debug"), 'debug', - 40 + 3 )); const openViewletKb: IKeybindings = { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index 17911ae1a23..c884bb1d179 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -120,7 +120,7 @@ const viewletDescriptor = new ViewletDescriptor( VIEWLET_ID, localize('extensions', "Extensions"), 'extensions', - 100 + 4 ); Registry.as(ViewletExtensions.Viewlets) 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 9b3b978ffcf..95bc4991d0f 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -39,7 +39,7 @@ const viewletDescriptor = new ViewletDescriptor( VIEWLET_ID, localize('source control', "Source Control"), 'scm', - 36 + 2 ); Registry.as(ViewletExtensions.Viewlets) diff --git a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts index 5b65ba18480..90b31f579d5 100644 --- a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts @@ -420,7 +420,7 @@ Registry.as(ViewletExtensions.Viewlets).registerViewlet(new Vie VIEW_ID, nls.localize('name', "Search"), 'search', - 10 + 1 )); Registry.as(PanelExtensions.Panels).registerPanel(new PanelDescriptor( diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index ba1f9f17a5f..02006a2397a 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -16,6 +16,7 @@ export const IViewletService = createDecorator('viewletService' export interface IViewletService { _serviceBrand: ServiceIdentifier; + onDidViewletRegister: Event; onDidViewletOpen: Event; onDidViewletClose: Event; onDidViewletEnablementChange: Event<{ id: string, enabled: boolean }>; diff --git a/src/vs/workbench/services/viewlet/browser/viewletService.ts b/src/vs/workbench/services/viewlet/browser/viewletService.ts index a54cd61ec89..0a5271c8081 100644 --- a/src/vs/workbench/services/viewlet/browser/viewletService.ts +++ b/src/vs/workbench/services/viewlet/browser/viewletService.ts @@ -33,6 +33,7 @@ export class ViewletService implements IViewletService { private _onDidViewletEnable = new Emitter<{ id: string, enabled: boolean }>(); private disposables: IDisposable[] = []; + public get onDidViewletRegister(): Event { return >this.viewletRegistry.onDidRegister; } public get onDidViewletOpen(): Event { return this.sidebarPart.onDidViewletOpen; } public get onDidViewletClose(): Event { return this.sidebarPart.onDidViewletClose; } public get onDidViewletEnablementChange(): Event<{ id: string, enabled: boolean }> { return this._onDidViewletEnable.event; } From 2bd7803ed4e4587161a270fd82708d6d921e5c60 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 10:54:00 +0200 Subject: [PATCH 353/710] smoketest --- build/tfs/continuous-build.yml | 9 --------- build/tfs/product-build.yml | 9 +++++++++ package.json | 1 - test/electron/index.js | 6 ------ yarn.lock | 34 ---------------------------------- 5 files changed, 9 insertions(+), 50 deletions(-) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 009250e7ac0..7e75b568ede 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -21,9 +21,6 @@ phases: .\scripts\test-integration.bat yarn smoketest name: test - - task: PublishTestResults@2 - inputs: - testResultsFiles: '.build\tests\unit-test-results.xml' - phase: Linux queue: Hosted Linux Preview @@ -56,9 +53,6 @@ phases: DISPLAY=:10 ./scripts/test.sh --tfs # DISPLAY=:10 ./scripts/test-integration.sh name: test - - task: PublishTestResults@2 - inputs: - testResultsFiles: '.build/tests/unit-test-results.xml' - phase: macOS queue: Hosted macOS Preview @@ -83,6 +77,3 @@ phases: ./scripts/test-integration.sh yarn smoketest name: test - - task: PublishTestResults@2 - inputs: - testResultsFiles: '.build/tests/unit-test-results.xml' diff --git a/build/tfs/product-build.yml b/build/tfs/product-build.yml index 3b67df7dcf4..2727f5eed1c 100644 --- a/build/tfs/product-build.yml +++ b/build/tfs/product-build.yml @@ -29,6 +29,7 @@ phases: $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin node build/tfs/common/installDistro.js + node build/lib/builtInExtensions.js - powershell: | $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" @@ -39,6 +40,7 @@ phases: - powershell: | npm run gulp -- "electron-$(VSCODE_ARCH)" .\scripts\test.bat --build --tfs + yarn smoketest -- --build "$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)" name: test - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 @@ -253,6 +255,7 @@ phases: npm run monaco-compile-check VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin node build/tfs/common/installDistro.js + node build/lib/builtInExtensions.js - script: | VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min @@ -261,6 +264,7 @@ phases: - script: | npm run gulp -- "electron-$(VSCODE_ARCH)" DISPLAY=:10 ./scripts/test.sh --build --tfs + # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" name: test - script: | @@ -303,6 +307,7 @@ phases: npm run monaco-compile-check VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin node build/tfs/common/installDistro.js + node build/lib/builtInExtensions.js - script: | VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min @@ -311,6 +316,7 @@ phases: - script: | npm run gulp -- "electron-$(VSCODE_ARCH)" DISPLAY=:10 ./scripts/test.sh --build --tfs + # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" name: test - script: | @@ -345,6 +351,7 @@ phases: npm run monaco-compile-check VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin node build/tfs/common/installDistro.js + node build/lib/builtInExtensions.js - script: | VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \ @@ -354,6 +361,8 @@ phases: - script: | ./scripts/test.sh --build --tfs + APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`" + yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" name: test - script: | diff --git a/package.json b/package.json index 1e15784e1b8..5714b70e29c 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,6 @@ "minimatch": "^2.0.10", "mkdirp": "^0.5.0", "mocha": "^2.2.5", - "mocha-junit-reporter": "^1.17.0", "object-assign": "^4.0.1", "optimist": "0.3.5", "p-all": "^1.0.0", diff --git a/test/electron/index.js b/test/electron/index.js index 770bb853d4c..ee98b8f8ea3 100644 --- a/test/electron/index.js +++ b/test/electron/index.js @@ -8,7 +8,6 @@ const { tmpdir } = require('os'); const { join } = require('path'); const path = require('path'); const mocha = require('mocha'); -const JUnitReporter = require('mocha-junit-reporter'); const events = require('events'); const defaultReporterName = process.platform === 'win32' ? 'list' : 'spec'; @@ -143,11 +142,6 @@ app.on('ready', () => { if (argv.tfs) { new TFSReporter(runner); - new JUnitReporter(runner, { - reporterOptions: { - mochaFile: '.build/tests/unit-test-results.xml' - } - }); } else { const reporterPath = path.join(path.dirname(require.resolve('mocha')), 'lib', 'reporters', argv.reporter); let Reporter; diff --git a/yarn.lock b/yarn.lock index 38c1ea2a301..139077c5c6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -602,10 +602,6 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" -charenc@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - cheerio@^1.0.0-rc.1: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" @@ -885,10 +881,6 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -crypt@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" @@ -2753,10 +2745,6 @@ is-buffer@^1.0.2: version "1.1.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" -is-buffer@~1.1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" @@ -3510,14 +3498,6 @@ math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" -md5@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - dependencies: - charenc "~0.0.1" - crypt "~0.0.1" - is-buffer "~1.1.1" - mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -3671,16 +3651,6 @@ mksnapshot@^0.3.0: fs-extra "0.26.7" request "^2.79.0" -mocha-junit-reporter@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.17.0.tgz#2e5149ed40fc5d2e3ca71e42db5ab1fec9c6d85c" - dependencies: - debug "^2.2.0" - md5 "^2.1.0" - mkdirp "~0.5.1" - strip-ansi "^4.0.0" - xml "^1.0.0" - mocha@^2.0.1, mocha@^2.2.5: version "2.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" @@ -6029,10 +5999,6 @@ xml2js@^0.4.19: sax ">=0.6.0" xmlbuilder "~9.0.1" -xml@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" - xmlbuilder@0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-0.4.3.tgz#c4614ba74e0ad196e609c9272cd9e1ddb28a8a58" From 4f5e60649757f1c66c2dd6a9047784b34b960f28 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Tue, 17 Apr 2018 11:04:47 +0200 Subject: [PATCH 354/710] fixes #46744: inputbox hides again if all slashes are removed --- .../parts/files/electron-browser/views/explorerViewer.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 05492a17ba5..a2dc9890670 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -356,6 +356,9 @@ export class FileRenderer implements IRenderer { formatContent: true }); } + else { // fixes #46744: inputbox hides again if all slashes are removed + inputBox.hideMessage(); + } } } } From 98c8026784b976f879a794858bcce3691f45bf2d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 17 Apr 2018 11:07:53 +0200 Subject: [PATCH 355/710] just have `createDirectory`, #47475 --- src/vs/vscode.proposed.d.ts | 13 +++++++++---- src/vs/workbench/api/node/extHostFileSystem.ts | 16 +++++----------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b28b3f0c0ef..1a9db25a0f5 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -232,7 +232,7 @@ declare module 'vscode' { // todo@joh add open/close calls? export interface FileSystemProvider2 { - _version: 5; + _version: 6; /** * An event to signal that a resource has been created, changed, or deleted. @@ -258,6 +258,14 @@ declare module 'vscode' { */ readDirectory(uri: Uri, token: CancellationToken): [string, FileStat2][] | Thenable<[string, FileStat2][]>; + /** + * Create a new directory. *Note* that new files are created via `write`-calls. + * + * @param uri The uri of the *new* folder. + * @param token A cancellation token. + */ + createDirectory(uri: Uri, token: CancellationToken): FileStat2 | Thenable; + /** * Read the entire contents of a file. * @@ -292,9 +300,6 @@ declare module 'vscode' { // todo@remote // ? useTrash, expose trash delete(uri: Uri, token: CancellationToken): void | Thenable; - - // todo@remote - create(uri: Uri, options: { type: FileType2 }, token: CancellationToken): FileStat2 | Thenable; } export namespace workspace { diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 23c778ef52c..965c01793e6 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -59,7 +59,7 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { class FileSystemProviderShim implements vscode.FileSystemProvider2 { - _version: 5; + _version: 6; onDidChange: vscode.Event; @@ -131,14 +131,8 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { } }); } - create(resource: vscode.Uri, options: { type: vscode.FileType2; }): Thenable { - if (options.type === FileType2.Directory) { - return this._delegate.mkdir(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); - } else { - return this._delegate.write(resource, Buffer.from([])) - .then(() => this._delegate.stat(resource)) - .then(stat => FileSystemProviderShim._modernizeFileStat(stat)); - } + createDirectory(resource: vscode.Uri): Thenable { + return this._delegate.mkdir(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } // --- read/write @@ -174,7 +168,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 5) { + if (newProvider && newProvider._version === 6) { return this._doRegisterFileSystemProvider(scheme, newProvider); } else if (provider) { return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); @@ -257,7 +251,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), { flags }, token)); } $mkdir(handle: number, resource: UriComponents): TPromise { - return asWinJsPromise(token => this._fsProvider.get(handle).create(URI.revive(resource), { type: FileType2.Directory }, token)); + return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), token)); } $provideFileSearchResults(handle: number, session: number, query: string): TPromise { From a54b4e57c8778dfd129ab7d639b6ca4112e17fe0 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 11:14:06 +0200 Subject: [PATCH 356/710] backslash --- build/tfs/product-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/product-build.yml b/build/tfs/product-build.yml index 2727f5eed1c..e8ff8a943b8 100644 --- a/build/tfs/product-build.yml +++ b/build/tfs/product-build.yml @@ -40,7 +40,7 @@ phases: - powershell: | npm run gulp -- "electron-$(VSCODE_ARCH)" .\scripts\test.bat --build --tfs - yarn smoketest -- --build "$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)" + yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" name: test - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 From 46737fb68db3327ed0393dadf9d1d4515f8e86f0 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 11:27:44 +0200 Subject: [PATCH 357/710] Check in missing monaco.d.ts --- src/vs/monaco.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index c690f0d6e17..b6a73b5120e 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -4556,7 +4556,7 @@ declare namespace monaco.languages { * editor will use the range at the current position or the * current position itself. */ - range: IRange; + range?: IRange; } /** From 523abdc0c922bb8b87643ecc9635ee9ab61ae600 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 17 Apr 2018 11:32:11 +0200 Subject: [PATCH 358/710] Fix #47748 --- src/vs/editor/common/services/resourceConfigurationImpl.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/services/resourceConfigurationImpl.ts b/src/vs/editor/common/services/resourceConfigurationImpl.ts index a407bf1c698..6b75152e474 100644 --- a/src/vs/editor/common/services/resourceConfigurationImpl.ts +++ b/src/vs/editor/common/services/resourceConfigurationImpl.ts @@ -11,6 +11,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { IPosition, Position } from 'vs/editor/common/core/position'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IModelService } from 'vs/editor/common/services/modelService'; +import { basename } from 'vs/base/common/paths'; export class TextResourceConfigurationService extends Disposable implements ITextResourceConfigurationService { @@ -42,6 +43,6 @@ export class TextResourceConfigurationService extends Disposable implements ITex if (model) { return position ? this.modeService.getLanguageIdentifier(model.getLanguageIdAtPosition(position.lineNumber, position.column)).language : model.getLanguageIdentifier().language; } - return this.modeService.getModeIdByFilenameOrFirstLine(resource.fsPath); + return this.modeService.getModeIdByFilenameOrFirstLine(basename(resource.path)); } } \ No newline at end of file From 5b7d632f60cf6da7c65060c8a6ce6d01fb48146a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 11:34:34 +0200 Subject: [PATCH 359/710] scm viewlet: persist view states --- .../browser/parts/views/contributableViews.ts | 59 ++++++++++++++++++- .../parts/scm/electron-browser/scmViewlet.ts | 12 +++- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/contributableViews.ts b/src/vs/workbench/browser/parts/views/contributableViews.ts index cb97555cfa2..bcad61e4d88 100644 --- a/src/vs/workbench/browser/parts/views/contributableViews.ts +++ b/src/vs/workbench/browser/parts/views/contributableViews.ts @@ -3,11 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ViewsRegistry, IViewDescriptor, ViewLocation } from 'vs/workbench/common/views'; import { IContextKeyService, IContextKeyChangeEvent, IReadableSet } from 'vs/platform/contextkey/common/contextkey'; import { Event, chain, filterEvent, Emitter } from 'vs/base/common/event'; import { sortedDiff, firstIndex, move } from 'vs/base/common/arrays'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; function filterViewEvent(location: ViewLocation, event: Event): Event { return chain(event) @@ -161,6 +163,10 @@ class ViewDescriptorCollection { private isViewDescriptorActive(viewDescriptor: IViewDescriptor): boolean { return !viewDescriptor.when || this.contextKeyService.contextMatchesRules(viewDescriptor.when); } + + dispose(): void { + this.disposables = dispose(this.disposables); + } } export interface IView { @@ -180,7 +186,7 @@ export interface IViewDescriptorRef { export class ContributableViewsModel { - private viewStates = new Map(); + protected viewStates = new Map(); readonly viewDescriptors: IViewDescriptor[] = []; get visibleViewDescriptors(): IViewDescriptor[] { @@ -203,6 +209,7 @@ export class ContributableViewsModel { @IContextKeyService contextKeyService: IContextKeyService ) { const viewDescriptorCollection = new ViewDescriptorCollection(location, contextKeyService); + this.disposables.push(viewDescriptorCollection); viewDescriptorCollection.onDidChange(() => this.onDidChangeViewDescriptors(viewDescriptorCollection.viewDescriptors), this, this.disposables); this.onDidChangeViewDescriptors(viewDescriptorCollection.viewDescriptors); @@ -346,4 +353,52 @@ export class ContributableViewsModel { this.viewDescriptors.splice(0, this.viewDescriptors.length, ...viewDescriptors); } + + dispose(): void { + this.disposables = dispose(this.disposables); + } +} + +interface ISerializedViewState { + id: string; + state: IViewState; +} + +export class PersistentContributableViewsModel extends ContributableViewsModel { + + constructor( + location: ViewLocation, + private readonly viewletStateStorageId: string, + @IContextKeyService contextKeyService: IContextKeyService, + @IStorageService private storageService: IStorageService, + @IWorkspaceContextService private contextService: IWorkspaceContextService + ) { + super(location, contextKeyService); + this.loadViewsStates(); + } + + saveViewsStates(): void { + const serializedViewStates: ISerializedViewState[] = []; + this.viewStates.forEach((state, id) => serializedViewStates.push({ id, state })); + const raw = JSON.stringify(serializedViewStates); + + const scope = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? StorageScope.WORKSPACE : StorageScope.GLOBAL; + this.storageService.store(this.viewletStateStorageId, raw, scope); + } + + private loadViewsStates(): void { + const scope = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? StorageScope.WORKSPACE : StorageScope.GLOBAL; + const raw = this.storageService.get(this.viewletStateStorageId, scope, '[]'); + const serializedViewsStates = JSON.parse(raw) as ISerializedViewState[]; + console.log(serializedViewsStates); + + for (const { id, state } of serializedViewsStates) { + this.viewStates.set(id, state); + } + } + + dispose(): void { + this.saveViewsStates(); + super.dispose(); + } } \ No newline at end of file diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 3c08d19d5ce..035623c0973 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -57,7 +57,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ThrottledDelayer } from 'vs/base/common/async'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { ContributableViewsModel, IViewDescriptorRef } from 'vs/workbench/browser/parts/views/contributableViews'; +import { IViewDescriptorRef, PersistentContributableViewsModel } from 'vs/workbench/browser/parts/views/contributableViews'; import { ViewLocation, IViewDescriptor } from 'vs/workbench/common/views'; import { ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; @@ -1050,7 +1050,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { get repositories(): ISCMRepository[] { return this._repositories; } get selectedRepositories(): ISCMRepository[] { return this.repositoryPanels.map(p => p.repository); } - private contributedViews: ContributableViewsModel; + private contributedViews: PersistentContributableViewsModel; private contextMenuDisposables: IDisposable[] = []; constructor( @@ -1077,7 +1077,8 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { this.menus = instantiationService.createInstance(SCMMenus, undefined); this.menus.onDidChangeTitle(this.updateTitleArea, this, this.disposables); - this.contributedViews = new ContributableViewsModel(ViewLocation.SCM, contextKeyService); + this.contributedViews = new PersistentContributableViewsModel(ViewLocation.SCM, 'scm.views', contextKeyService, storageService, contextService); + this.disposables.push(this.contributedViews); } async create(parent: HTMLElement): TPromise { @@ -1393,6 +1394,11 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { this.mainPanel.hide(repository); } + shutdown(): void { + this.contributedViews.saveViewsStates(); + super.shutdown(); + } + dispose(): void { this.disposables = dispose(this.disposables); this.contextMenuDisposables = dispose(this.contextMenuDisposables); From 829f62a7df830506a36ec290ea571f6da43fb2af Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 11:36:04 +0200 Subject: [PATCH 360/710] remove console.log --- src/vs/workbench/browser/parts/views/contributableViews.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/views/contributableViews.ts b/src/vs/workbench/browser/parts/views/contributableViews.ts index bcad61e4d88..dfcb0227897 100644 --- a/src/vs/workbench/browser/parts/views/contributableViews.ts +++ b/src/vs/workbench/browser/parts/views/contributableViews.ts @@ -390,7 +390,6 @@ export class PersistentContributableViewsModel extends ContributableViewsModel { const scope = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? StorageScope.WORKSPACE : StorageScope.GLOBAL; const raw = this.storageService.get(this.viewletStateStorageId, scope, '[]'); const serializedViewsStates = JSON.parse(raw) as ISerializedViewState[]; - console.log(serializedViewsStates); for (const { id, state } of serializedViewsStates) { this.viewStates.set(id, state); From 8c1e3a7b3cf2ada5671ff5e804b351342e52e5a2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 17 Apr 2018 11:40:05 +0200 Subject: [PATCH 361/710] allow to return range or range and placeholder, #7340 --- src/vs/editor/common/modes.ts | 7 +++- src/vs/editor/contrib/rename/rename.ts | 40 ++++++++++--------- .../editor/contrib/rename/renameInputField.ts | 4 +- src/vs/monaco.d.ts | 7 +++- src/vs/vscode.proposed.d.ts | 2 +- .../mainThreadLanguageFeatures.ts | 4 +- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- .../api/node/extHostLanguageFeatures.ts | 26 +++++++++--- src/vs/workbench/api/node/extHostTypes.ts | 2 +- 9 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 5c09c49af21..46e81803edc 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -929,9 +929,14 @@ export interface WorkspaceEdit { rejectReason?: string; // TODO@joh, move to rename } +export interface RenameLocation { + range: IRange; + text: string; +} + export interface RenameProvider { provideRenameEdits(model: model.ITextModel, position: Position, newName: string, token: CancellationToken): WorkspaceEdit | Thenable; - resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): IRange | Thenable; + resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): RenameLocation | Thenable; } diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/rename.ts index 8c1b35360ea..803d4ac0b8c 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/rename.ts @@ -23,10 +23,10 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { asWinJsPromise } from 'vs/base/common/async'; -import { WorkspaceEdit, RenameProviderRegistry, RenameProvider } from 'vs/editor/common/modes'; +import { WorkspaceEdit, RenameProviderRegistry, RenameProvider, RenameLocation } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import { alert } from 'vs/base/browser/ui/aria/aria'; -import { Range, IRange } from 'vs/editor/common/core/range'; +import { Range } from 'vs/editor/common/core/range'; import { MessageController } from 'vs/editor/contrib/message/messageController'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/browser/core/editorState'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -47,23 +47,26 @@ class RenameSkeleton { return this._provider.length > 0; } - async resolveRenameLocation(): TPromise { + async resolveRenameLocation(): TPromise { let [provider] = this._provider; - let range: IRange; + let res: RenameLocation; if (provider.resolveRenameLocation) { - range = await asWinJsPromise(token => provider.resolveRenameLocation(this.model, this.position, token)); + res = await asWinJsPromise(token => provider.resolveRenameLocation(this.model, this.position, token)); } - if (!range) { + if (!res) { let word = this.model.getWordAtPosition(this.position); if (word) { - range = new Range(this.position.lineNumber, word.startColumn, this.position.lineNumber, word.endColumn); + res = { + range: new Range(this.position.lineNumber, word.startColumn, this.position.lineNumber, word.endColumn), + text: word.word + }; } } - return range; + return res; } async provideRenameEdits(newName: string, i: number = 0, rejects: string[] = [], position: Position = this.position): TPromise { @@ -131,30 +134,29 @@ class RenameController implements IEditorContribution { const position = this.editor.getPosition(); const skeleton = new RenameSkeleton(this.editor.getModel(), position); - let range: IRange; + let loc: RenameLocation; try { - range = await skeleton.resolveRenameLocation(); + loc = await skeleton.resolveRenameLocation(); } catch (e) { MessageController.get(this.editor).showMessage(e, position); return undefined; } - if (!range) { + if (!loc) { return undefined; } - let text = this.editor.getModel().getValueInRange(range); let selection = this.editor.getSelection(); let selectionStart = 0; - let selectionEnd = text.length; + let selectionEnd = loc.text.length; - if (!selection.isEmpty() && selection.startLineNumber === selection.endLineNumber) { - selectionStart = Math.max(0, selection.startColumn - range.startColumn); - selectionEnd = Math.min(range.endColumn, selection.endColumn) - range.startColumn; + if (!Range.isEmpty(selection) && !Range.spansMultipleLines(selection) && Range.containsRange(loc.range, selection)) { + selectionStart = Math.max(0, selection.startColumn - loc.range.startColumn); + selectionEnd = Math.min(loc.range.endColumn, selection.endColumn) - loc.range.startColumn; } this._renameInputVisible.set(true); - return this._renameInputField.getInput(Range.lift(range), text, selectionStart, selectionEnd).then(newNameOrFocusFlag => { + return this._renameInputField.getInput(loc.range, loc.text, selectionStart, selectionEnd).then(newNameOrFocusFlag => { this._renameInputVisible.reset(); if (typeof newNameOrFocusFlag === 'boolean') { @@ -169,7 +171,7 @@ class RenameController implements IEditorContribution { const edit = new BulkEdit(this.editor, null, this._textModelResolverService, this._fileService); const state = new EditorState(this.editor, CodeEditorStateFlag.Position | CodeEditorStateFlag.Value | CodeEditorStateFlag.Selection | CodeEditorStateFlag.Scroll); - const renameOperation = skeleton.provideRenameEdits(newNameOrFocusFlag, 0, [], Range.lift(range).getStartPosition()).then(result => { + const renameOperation = skeleton.provideRenameEdits(newNameOrFocusFlag, 0, [], Range.lift(loc.range).getStartPosition()).then(result => { if (result.rejectReason) { if (state.validate(this.editor)) { MessageController.get(this.editor).showMessage(result.rejectReason, this.editor.getPosition()); @@ -185,7 +187,7 @@ class RenameController implements IEditorContribution { this.editor.setSelection(selection); } // alert - alert(nls.localize('aria', "Successfully renamed '{0}' to '{1}'. Summary: {2}", text, newNameOrFocusFlag, edit.ariaMessage())); + alert(nls.localize('aria', "Successfully renamed '{0}' to '{1}'. Summary: {2}", loc.text, newNameOrFocusFlag, edit.ariaMessage())); }); }, err => { diff --git a/src/vs/editor/contrib/rename/renameInputField.ts b/src/vs/editor/contrib/rename/renameInputField.ts index 4eb6d89148d..e7f6c7df33a 100644 --- a/src/vs/editor/contrib/rename/renameInputField.ts +++ b/src/vs/editor/contrib/rename/renameInputField.ts @@ -9,7 +9,7 @@ import 'vs/css!./renameInputField'; import { localize } from 'vs/nls'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; -import { Range } from 'vs/editor/common/core/range'; +import { Range, IRange } from 'vs/editor/common/core/range'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { inputBackground, inputBorder, inputForeground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; @@ -123,7 +123,7 @@ export default class RenameInputField implements IContentWidget, IDisposable { } } - public getInput(where: Range, value: string, selectionStart: number, selectionEnd: number): TPromise { + public getInput(where: IRange, value: string, selectionStart: number, selectionEnd: number): TPromise { this._position = new Position(where.startLineNumber, where.startColumn); this._inputField.value = value; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index b6a73b5120e..d7164a77c2e 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -5016,9 +5016,14 @@ declare namespace monaco.languages { rejectReason?: string; } + export interface RenameLocation { + range: IRange; + text: string; + } + export interface RenameProvider { provideRenameEdits(model: editor.ITextModel, position: Position, newName: string, token: CancellationToken): WorkspaceEdit | Thenable; - resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): IRange | Thenable; + resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): RenameLocation | Thenable; } export interface Command { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 1a9db25a0f5..01ee496996d 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -503,7 +503,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return The range of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`. */ - resolveRenameLocation?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; + resolveRenameLocation?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; } diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index d9057794eab..edebb1a5bd2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -13,7 +13,7 @@ import { WorkspaceSymbolProviderRegistry, IWorkspaceSymbolProvider } from 'vs/wo import { wireCancellationToken } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Position as EditorPosition } from 'vs/editor/common/core/position'; -import { Range as EditorRange, IRange } from 'vs/editor/common/core/range'; +import { Range as EditorRange } from 'vs/editor/common/core/range'; import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ISerializedLanguageConfiguration, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, LocationDto, SymbolInformationDto, CodeActionDto, reviveWorkspaceEditDto, ISerializedDocumentFilter } from '../node/extHost.protocol'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { LanguageConfiguration, IndentationRule, OnEnterRule } from 'vs/editor/common/modes/languageConfiguration'; @@ -258,7 +258,7 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha return wireCancellationToken(token, this._proxy.$provideRenameEdits(handle, model.uri, position, newName)).then(reviveWorkspaceEditDto); }, resolveRenameLocation: supportResolveLocation - ? (model: ITextModel, position: EditorPosition, token: CancellationToken): Thenable => wireCancellationToken(token, this._proxy.$resolveRenameLocation(handle, model.uri, position)) + ? (model: ITextModel, position: EditorPosition, token: CancellationToken): Thenable => wireCancellationToken(token, this._proxy.$resolveRenameLocation(handle, model.uri, position)) : undefined }); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 4d160267c77..2301dee43bc 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -710,7 +710,7 @@ export interface ExtHostLanguageFeaturesShape { $resolveWorkspaceSymbol(handle: number, symbol: SymbolInformationDto): TPromise; $releaseWorkspaceSymbols(handle: number, id: number): void; $provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string): TPromise; - $resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition): TPromise; + $resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition): TPromise; $provideCompletionItems(handle: number, resource: UriComponents, position: IPosition, context: modes.SuggestContext): TPromise; $resolveCompletionItem(handle: number, resource: UriComponents, position: IPosition, suggestion: modes.ISuggestion): TPromise; $releaseCompletionItems(handle: number, id: number): void; diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 0d4825c77bd..2c5b7c4eb7d 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -22,6 +22,7 @@ import { regExpLeadsToEndlessLoop } from 'vs/base/common/strings'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { isObject } from 'vs/base/common/types'; // --- adapter @@ -506,7 +507,7 @@ class RenameAdapter { }); } - resolveRenameLocation(resource: URI, position: IPosition): TPromise { + resolveRenameLocation(resource: URI, position: IPosition): TPromise { if (typeof this._provider.resolveRenameLocation !== 'function') { return TPromise.as(undefined); } @@ -514,15 +515,28 @@ class RenameAdapter { let doc = this._documents.getDocumentData(resource).document; let pos = TypeConverters.toPosition(position); - return asWinJsPromise(token => this._provider.resolveRenameLocation(doc, pos, token)).then(range => { + return asWinJsPromise(token => this._provider.resolveRenameLocation(doc, pos, token)).then(rangeOrLocation => { + + let range: vscode.Range; + let text: string; + if (Range.isRange(rangeOrLocation)) { + range = rangeOrLocation; + text = doc.getText(rangeOrLocation); + + } else if (isObject(rangeOrLocation)) { + range = rangeOrLocation.range; + text = rangeOrLocation.placeholder; + } + if (!range) { return undefined; } - if (range && (!range.isSingleLine || range.start.line !== pos.line)) { - console.warn('INVALID rename context, range must be single line and on the same line'); + + if (!range.contains(pos)) { + console.warn('INVALID rename location: range must contain position'); return undefined; } - return TypeConverters.fromRange(range); + return { range: TypeConverters.fromRange(range), text }; }); } } @@ -1088,7 +1102,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, RenameAdapter, adapter => adapter.provideRenameEdits(URI.revive(resource), position, newName)); } - $resolveRenameLocation(handle: number, resource: URI, position: IPosition): TPromise { + $resolveRenameLocation(handle: number, resource: URI, position: IPosition): TPromise { return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameLocation(resource, position)); } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 1423c277882..d988a15447d 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -208,7 +208,7 @@ export class Position { export class Range { - static isRange(thing: any): thing is Range { + static isRange(thing: any): thing is vscode.Range { if (thing instanceof Range) { return true; } From 6428c00286eadee204eea5d746ddd1a70dc0b857 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 17 Apr 2018 11:54:45 +0200 Subject: [PATCH 362/710] move api to stable, #7340 --- src/vs/vscode.d.ts | 12 ++++++++++++ src/vs/vscode.proposed.d.ts | 19 ------------------- .../api/node/extHostLanguageFeatures.ts | 6 +++--- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index f637aad8448..9ce91242cb1 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2746,6 +2746,18 @@ declare module 'vscode' { * signaled by returning `undefined` or `null`. */ provideRenameEdits(document: TextDocument, position: Position, newName: string, token: CancellationToken): ProviderResult; + + /** + * Optional function for resolving and validating a position *before* running rename. The result can + * be a range or a range and a placeholder text. The placeholder text should be the identifier of the symbol + * which is being renamed - when omitted the text in the returned range is used. + * + * @param document The document in which rename will be invoked. + * @param position The position at which rename will be invoked. + * @param token A cancellation token. + * @return The range or range and placeholder text of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`. + */ + resolveRenameLocation?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; } /** diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 01ee496996d..454722f40c5 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -490,25 +490,6 @@ declare module 'vscode' { //#endregion - //#region Joh: rename context - - export interface RenameProvider2 extends RenameProvider { - - /** - * Optional function for resolving and validating a position at which rename is - * being carried out. - * - * @param document The document in which rename will be invoked. - * @param position The position at which rename will be invoked. - * @param token A cancellation token. - * @return The range of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`. - */ - resolveRenameLocation?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - - } - - //#endregion - //#region Joao: SCM validation /** diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 2c5b7c4eb7d..5e99422f862 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -467,14 +467,14 @@ class NavigateTypeAdapter { class RenameAdapter { - static supportsResolving(provider: vscode.RenameProvider2): boolean { + static supportsResolving(provider: vscode.RenameProvider): boolean { return typeof provider.resolveRenameLocation === 'function'; } private _documents: ExtHostDocuments; - private _provider: vscode.RenameProvider2; + private _provider: vscode.RenameProvider; - constructor(documents: ExtHostDocuments, provider: vscode.RenameProvider2) { + constructor(documents: ExtHostDocuments, provider: vscode.RenameProvider) { this._documents = documents; this._provider = provider; } From 9396ee524821f98a03d545e02203e499cdf13e6e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 12:22:30 +0200 Subject: [PATCH 363/710] Fixes #12887 --- .../common/controller/cursorWordOperations.ts | 15 +++++++++------ .../editor/test/browser/controller/cursor.test.ts | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/controller/cursorWordOperations.ts b/src/vs/editor/common/controller/cursorWordOperations.ts index 24bbcac19c3..e14d715fbbf 100644 --- a/src/vs/editor/common/controller/cursorWordOperations.ts +++ b/src/vs/editor/common/controller/cursorWordOperations.ts @@ -384,20 +384,20 @@ export class WordOperations { public static word(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean, position: Position): SingleCursorState { const wordSeparators = getMapForWordSeparators(config.wordSeparators); let prevWord = WordOperations._findPreviousWordOnLine(wordSeparators, model, position); - let isInPrevWord = (prevWord && prevWord.wordType === WordType.Regular && prevWord.start < position.column - 1 && position.column - 1 <= prevWord.end); let nextWord = WordOperations._findNextWordOnLine(wordSeparators, model, position); - let isInNextWord = (nextWord && nextWord.wordType === WordType.Regular && nextWord.start < position.column - 1 && position.column - 1 <= nextWord.end); if (!inSelectionMode) { // Entering word selection for the first time + const isTouchingPrevWord = (prevWord && prevWord.wordType === WordType.Regular && prevWord.start <= position.column - 1 && position.column - 1 <= prevWord.end); + const isTouchingNextWord = (nextWord && nextWord.wordType === WordType.Regular && nextWord.start <= position.column - 1 && position.column - 1 <= nextWord.end); let startColumn: number; let endColumn: number; - if (isInPrevWord) { + if (isTouchingPrevWord) { startColumn = prevWord.start + 1; endColumn = prevWord.end + 1; - } else if (isInNextWord) { + } else if (isTouchingNextWord) { startColumn = nextWord.start + 1; endColumn = nextWord.end + 1; } else { @@ -419,13 +419,16 @@ export class WordOperations { ); } + const isInsidePrevWord = (prevWord && prevWord.wordType === WordType.Regular && prevWord.start < position.column - 1 && position.column - 1 < prevWord.end); + const isInsideNextWord = (nextWord && nextWord.wordType === WordType.Regular && nextWord.start < position.column - 1 && position.column - 1 < nextWord.end); + let startColumn: number; let endColumn: number; - if (isInPrevWord) { + if (isInsidePrevWord) { startColumn = prevWord.start + 1; endColumn = prevWord.end + 1; - } else if (isInNextWord) { + } else if (isInsideNextWord) { startColumn = nextWord.start + 1; endColumn = nextWord.end + 1; } else { diff --git a/src/vs/editor/test/browser/controller/cursor.test.ts b/src/vs/editor/test/browser/controller/cursor.test.ts index 288be626ea3..b33aeef085a 100644 --- a/src/vs/editor/test/browser/controller/cursor.test.ts +++ b/src/vs/editor/test/browser/controller/cursor.test.ts @@ -1802,6 +1802,21 @@ suite('Editor Controller - Regression tests', () => { model.dispose(); }); + test('issue #12887: Double-click highlighting separating white space', () => { + let model = createTextModel( + [ + 'abc def' + ].join('\n') + ); + + withTestCodeEditor(null, { model: model }, (editor, cursor) => { + CoreNavigationCommands.WordSelect.runCoreEditorCommand(cursor, { position: new Position(1, 5) }); + assert.deepEqual(cursor.getSelection(), new Selection(1, 5, 1, 8)); + }); + + model.dispose(); + }); + test('issue #9675: Undo/Redo adds a stop in between CHN Characters', () => { usingCursor({ text: [ From 3bc224fb0d0c92efba67f0ed4a8b2ac0a01dcdb1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 12:49:44 +0200 Subject: [PATCH 364/710] Fixes #15761 --- src/vs/editor/common/commonCodeEditor.ts | 2 +- .../test/browser/controller/cursor.test.ts | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 7424170f20c..9f4fcd3c175 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -797,7 +797,7 @@ export abstract class CommonCodeEditor extends Disposable { } this.model.pushEditOperations(this.cursor.getSelections(), edits, () => { - return endCursorState ? endCursorState : this.cursor.getSelections(); + return endCursorState ? endCursorState : null; }); if (endCursorState) { diff --git a/src/vs/editor/test/browser/controller/cursor.test.ts b/src/vs/editor/test/browser/controller/cursor.test.ts index b33aeef085a..59d193db530 100644 --- a/src/vs/editor/test/browser/controller/cursor.test.ts +++ b/src/vs/editor/test/browser/controller/cursor.test.ts @@ -2090,6 +2090,41 @@ suite('Editor Controller - Regression tests', () => { model.dispose(); }); + + test('issue #15761: Cursor doesn\'t move in a redo operation', () => { + let model = createTextModel( + [ + 'hello' + ].join('\n') + ); + + withTestCodeEditor(null, { model: model }, (editor, cursor) => { + editor.setSelections([ + new Selection(1, 4, 1, 4) + ]); + + editor.executeEdits('test', [{ + range: new Range(1, 1, 1, 1), + text: '*', + forceMoveMarkers: true + }]); + assertCursor(cursor, [ + new Selection(1, 5, 1, 5), + ]); + + cursorCommand(cursor, H.Undo, null, 'keyboard'); + assertCursor(cursor, [ + new Selection(1, 4, 1, 4), + ]); + + cursorCommand(cursor, H.Redo, null, 'keyboard'); + assertCursor(cursor, [ + new Selection(1, 5, 1, 5), + ]); + }); + + model.dispose(); + }); }); suite('Editor Controller - Cursor Configuration', () => { From c3b31c0446ab13690e0e51a4e704c82409eb53d4 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 13:05:31 +0200 Subject: [PATCH 365/710] debug: remove type and label from IDebuggerContribution fixes #46550 --- src/vs/workbench/parts/debug/common/debug.ts | 7 +- .../parts/debug/node/debugAdapter.ts | 78 +++++++++---------- 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 5f43b0a3c1a..bc9a8c933fb 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -404,8 +404,6 @@ export interface IAdapterExecutable { } export interface IPlatformSpecificAdapterContribution { - type?: string; // TODO: doesn't belong here - label?: string; // TODO: doesn't belong here program?: string; args?: string[]; runtime?: string; @@ -413,9 +411,8 @@ export interface IPlatformSpecificAdapterContribution { } export interface IDebuggerContribution extends IPlatformSpecificAdapterContribution { - // type: string; // TODO: host from IPlatformSpecificAdapterContribution - // label?: string; // TODO: host from IPlatformSpecificAdapterContribution - + type?: string; + label?: string; // debug adapter executable adapterExecutableCommand?: string; win?: IPlatformSpecificAdapterContribution; diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index 381b7def6f0..f09c6fadc0e 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -16,14 +16,14 @@ import { Emitter, Event } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import { ExtensionsChannelId } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; -import * as debug from 'vs/workbench/parts/debug/common/debug'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; +import { IDebugAdapter, IAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution } from 'vs/workbench/parts/debug/common/debug'; /** * Abstract implementation of the low level API for a debug adapter. * Missing is how this API communicates with the debug adapter. */ -export abstract class AbstractDebugAdapter implements debug.IDebugAdapter { +export abstract class AbstractDebugAdapter implements IDebugAdapter { private sequence: number; private pendingRequests: Map void>; @@ -57,14 +57,14 @@ export abstract class AbstractDebugAdapter implements debug.IDebugAdapter { return this._onExit.event; } - public onEvent(callback: (event: DebugProtocol.Event) => void) { + public onEvent(callback: (event: DebugProtocol.Event) => void): void { if (this.eventCallback) { this._onError.fire(new Error(`attempt to set more than one 'Event' callback`)); } this.eventCallback = callback; } - public onRequest(callback: (request: DebugProtocol.Request) => void) { + public onRequest(callback: (request: DebugProtocol.Request) => void): void { if (this.requestCallback) { this._onError.fire(new Error(`attempt to set more than one 'Request' callback`)); } @@ -96,7 +96,7 @@ export abstract class AbstractDebugAdapter implements debug.IDebugAdapter { } } - public acceptMessage(message: DebugProtocol.ProtocolMessage) { + public acceptMessage(message: DebugProtocol.ProtocolMessage): void { switch (message.type) { case 'event': if (this.eventCallback) { @@ -219,7 +219,7 @@ export class DebugAdapter extends StreamDebugAdapter { private _serverProcess: cp.ChildProcess; - constructor(private _debugType: string, private _adapterExecutable: debug.IAdapterExecutable | null, extensionDescriptions: IExtensionDescription[], private _outputService?: IOutputService) { + constructor(private _debugType: string, private _adapterExecutable: IAdapterExecutable | null, extensionDescriptions: IExtensionDescription[], private _outputService?: IOutputService) { super(); if (!this._adapterExecutable) { @@ -306,61 +306,61 @@ export class DebugAdapter extends StreamDebugAdapter { } } - private static extract(dbg: debug.IDebuggerContribution, extensionFolderPath: string) { - if (!dbg) { + private static extract(contribution: IDebuggerContribution, extensionFolderPath: string): IDebuggerContribution { + if (!contribution) { return undefined; } - let x: debug.IDebuggerContribution = {}; + let result: IDebuggerContribution = {}; - if (dbg.runtime) { - if (dbg.runtime.indexOf('./') === 0) { // TODO - x.runtime = paths.join(extensionFolderPath, dbg.runtime); + if (contribution.runtime) { + if (contribution.runtime.indexOf('./') === 0) { // TODO + result.runtime = paths.join(extensionFolderPath, contribution.runtime); } else { - x.runtime = dbg.runtime; + result.runtime = contribution.runtime; } } - if (dbg.runtimeArgs) { - x.runtimeArgs = dbg.runtimeArgs; + if (contribution.runtimeArgs) { + result.runtimeArgs = contribution.runtimeArgs; } - if (dbg.program) { - if (!paths.isAbsolute(dbg.program)) { - x.program = paths.join(extensionFolderPath, dbg.program); + if (contribution.program) { + if (!paths.isAbsolute(contribution.program)) { + result.program = paths.join(extensionFolderPath, contribution.program); } else { - x.program = dbg.program; + result.program = contribution.program; } } - if (dbg.args) { - x.args = dbg.args; + if (contribution.args) { + result.args = contribution.args; } - if (dbg.win) { - x.win = DebugAdapter.extract(dbg.win, extensionFolderPath); + if (contribution.win) { + result.win = DebugAdapter.extract(contribution.win, extensionFolderPath); } - if (dbg.winx86) { - x.winx86 = DebugAdapter.extract(dbg.winx86, extensionFolderPath); + if (contribution.winx86) { + result.winx86 = DebugAdapter.extract(contribution.winx86, extensionFolderPath); } - if (dbg.windows) { - x.windows = DebugAdapter.extract(dbg.windows, extensionFolderPath); + if (contribution.windows) { + result.windows = DebugAdapter.extract(contribution.windows, extensionFolderPath); } - if (dbg.osx) { - x.osx = DebugAdapter.extract(dbg.osx, extensionFolderPath); + if (contribution.osx) { + result.osx = DebugAdapter.extract(contribution.osx, extensionFolderPath); } - if (dbg.linux) { - x.linux = DebugAdapter.extract(dbg.linux, extensionFolderPath); + if (contribution.linux) { + result.linux = DebugAdapter.extract(contribution.linux, extensionFolderPath); } - return x; + return result; } - static platformAdapterExecutable(extensionDescriptions: IExtensionDescription[], debugType: string): debug.IAdapterExecutable { + static platformAdapterExecutable(extensionDescriptions: IExtensionDescription[], debugType: string): IAdapterExecutable { - let result: debug.IDebuggerContribution = {}; + let result: IDebuggerContribution = {}; debugType = debugType.toLowerCase(); // merge all contributions into one for (const ed of extensionDescriptions) { if (ed.contributes) { - const debuggers = ed.contributes['debuggers']; + const debuggers = ed.contributes['debuggers']; if (debuggers && debuggers.length > 0) { const dbgs = debuggers.filter(d => strings.equalsIgnoreCase(d.type, debugType)); for (const dbg of dbgs) { @@ -376,7 +376,7 @@ export class DebugAdapter extends StreamDebugAdapter { } // select the right platform - let platformInfo: debug.IPlatformSpecificAdapterContribution; + let platformInfo: IPlatformSpecificAdapterContribution; if (platform.isWindows && !process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432')) { platformInfo = result.winx86 || result.win || result.windows; } else if (platform.isWindows) { @@ -410,7 +410,7 @@ export class DebugAdapter extends StreamDebugAdapter { // path hooks helpers -export function convertToDAPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePaths: (source: DebugProtocol.Source) => void) { +export function convertToDAPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePaths: (source: DebugProtocol.Source) => void): void { convertPaths(msg, (toDA: boolean, source: DebugProtocol.Source | undefined) => { if (toDA && source) { fixSourcePaths(source); @@ -418,7 +418,7 @@ export function convertToDAPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePa }); } -export function convertToVSCPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePaths: (source: DebugProtocol.Source) => void) { +export function convertToVSCPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePaths: (source: DebugProtocol.Source) => void): void { convertPaths(msg, (toDA: boolean, source: DebugProtocol.Source | undefined) => { if (!toDA && source) { fixSourcePaths(source); @@ -426,7 +426,7 @@ export function convertToVSCPaths(msg: DebugProtocol.ProtocolMessage, fixSourceP }); } -function convertPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePaths: (toDA: boolean, source: DebugProtocol.Source | undefined) => void) { +function convertPaths(msg: DebugProtocol.ProtocolMessage, fixSourcePaths: (toDA: boolean, source: DebugProtocol.Source | undefined) => void): void { switch (msg.type) { case 'event': const event = msg; From f31add9188b8116efc0d341dd5017c95658b501c Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 17 Apr 2018 13:14:29 +0200 Subject: [PATCH 366/710] add comments --- .../api/electron-browser/mainThreadDebugService.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts index 84b6d6bf048..90cfc0c9ca2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts @@ -239,6 +239,9 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape { } } +/** + * DebugAdapter that communicates via extension protocol with another debug adapter. + */ class ExtensionHostDebugAdapter extends AbstractDebugAdapter { constructor(private _handle: number, private _proxy: ExtHostDebugServiceShape, private _debugType: string, private _adapterExecutable: IAdapterExecutable | null) { @@ -275,6 +278,9 @@ class ExtensionHostDebugAdapter extends AbstractDebugAdapter { } } +/** + * Interim abstraction for managing debug funtionality in EH. + */ class ExtensionHostDebugAdapterProvider { private _debugAdapters: Map; From e7b8bd21db19b239c0f56defa0595656b6ba35d3 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 17 Apr 2018 13:17:06 +0200 Subject: [PATCH 367/710] drop column attribute if value is 0; see #46784 --- src/vs/workbench/api/electron-browser/mainThreadDebugService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts index 90cfc0c9ca2..aa94358afa5 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts @@ -109,7 +109,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape { id: l.id, enabled: l.enabled, lineNumber: l.line + 1, - column: l.character > 0 ? l.character + 1 : 0, + column: l.character > 0 ? l.character + 1 : undefined, // a column value of 0 results in an omitted column attribute; see #46784 condition: l.condition, hitCondition: l.hitCondition, logMessage: l.logMessage From 66581ee33848e60a3526eba268d9bcc69b3012e3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 17 Apr 2018 14:13:14 +0200 Subject: [PATCH 368/710] smoketest: configure git user name and email --- test/smoke/src/areas/git/git.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index e5c2669b722..498bfd7780e 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -11,6 +11,13 @@ const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[t export function setup() { describe('Git', () => { + before(async function () { + const app = this.app as Application; + + cp.execSync('git config user.name testuser', { cwd: app.workspacePath }); + cp.execSync('git config user.email monacotools@microsoft.com', { cwd: app.workspacePath }); + }); + it('reflects working tree changes', async function () { const app = this.app as Application; From 7ba3b0cd2f09422e08de3cdaab9554ebc2eaca49 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 17 Apr 2018 14:23:49 +0200 Subject: [PATCH 369/710] add fwd link to doc-page, #21886 --- src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index dc3145effd1..ee9475f99b7 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -145,7 +145,7 @@ export function createApiFactory( let checkSelector = (function () { let done = initData.environment.extensionDevelopmentPath !== extension.extensionFolderPath; function inform(selector: vscode.DocumentSelector) { - console.info(`Extension '${extension.id}' uses a document selector that applies to all schemes.}`); + console.info(`Extension '${extension.id}' uses a document selector without scheme. Learn more about this: https://go.microsoft.com/fwlink/?linkid=872305`); done = true; } return function perform(selector: vscode.DocumentSelector): vscode.DocumentSelector { From 446b5551f9a6c08e53b7d5df952eaac12b3841e0 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 14:27:46 +0200 Subject: [PATCH 370/710] Improve code style --- .../editor/contrib/multicursor/multicursor.ts | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/contrib/multicursor/multicursor.ts b/src/vs/editor/contrib/multicursor/multicursor.ts index 931c4f02404..42ba791f862 100644 --- a/src/vs/editor/contrib/multicursor/multicursor.ts +++ b/src/vs/editor/contrib/multicursor/multicursor.ts @@ -113,31 +113,28 @@ class InsertCursorAtEndOfEachLineSelected extends EditorAction { }); } - private getCursorsForSelection(selection: Selection, editor: ICodeEditor): Selection[] { + private getCursorsForSelection(selection: Selection, model: ITextModel, result: Selection[]): void { if (selection.isEmpty()) { - return []; + return; } - let model = editor.getModel(); - let newSelections: Selection[] = []; for (let i = selection.startLineNumber; i < selection.endLineNumber; i++) { let currentLineMaxColumn = model.getLineMaxColumn(i); - newSelections.push(new Selection(i, currentLineMaxColumn, i, currentLineMaxColumn)); + result.push(new Selection(i, currentLineMaxColumn, i, currentLineMaxColumn)); } if (selection.endColumn > 1) { - newSelections.push(new Selection(selection.endLineNumber, selection.endColumn, selection.endLineNumber, selection.endColumn)); + result.push(new Selection(selection.endLineNumber, selection.endColumn, selection.endLineNumber, selection.endColumn)); } - - return newSelections; } public run(accessor: ServicesAccessor, editor: ICodeEditor): void { - let selections = editor.getSelections(); - let newSelections = selections - .map((selection) => this.getCursorsForSelection(selection, editor)) - .reduce((prev, curr) => { return prev.concat(curr); }); + const model = editor.getModel(); + const selections = editor.getSelections(); + let newSelections: Selection[] = []; + selections.forEach((sel) => this.getCursorsForSelection(sel, model, newSelections)); if (newSelections.length > 0) { + console.log(`calling setSelections with ${newSelections.length}`); editor.setSelections(newSelections); } } From 25ecfcf145f2f9728803411896f78b91ae5a3c26 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 17 Apr 2018 14:33:27 +0200 Subject: [PATCH 371/710] fold ExtensionHostDebugAdapterProvider into MainThreadDebugService --- .../mainThreadDebugService.ts | 66 ++++++------------- 1 file changed, 21 insertions(+), 45 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts index aa94358afa5..b7a7c7017d0 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts @@ -6,7 +6,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import uri from 'vs/base/common/uri'; -import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint, IBreakpointData, IAdapterExecutable, ITerminalSettings, IDebugAdapter } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint, IBreakpointData, IAdapterExecutable, ITerminalSettings, IDebugAdapter, IDebugAdapterProvider } from 'vs/workbench/parts/debug/common/debug'; import { TPromise } from 'vs/base/common/winjs.base'; import { ExtHostContext, ExtHostDebugServiceShape, MainThreadDebugServiceShape, DebugSessionUUID, MainContext, @@ -19,12 +19,14 @@ import * as paths from 'vs/base/common/paths'; @extHostNamedCustomer(MainContext.MainThreadDebugService) -export class MainThreadDebugService implements MainThreadDebugServiceShape { +export class MainThreadDebugService implements MainThreadDebugServiceShape, IDebugAdapterProvider { private _proxy: ExtHostDebugServiceShape; private _toDispose: IDisposable[]; private _breakpointEventsActive: boolean; - private _extensionHostDebugAdapterProvider: ExtensionHostDebugAdapterProvider; + private _debugAdapters: Map; + private _debugAdaptersHandleCounter = 1; + constructor( extHostContext: IExtHostContext, @@ -50,12 +52,22 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape { } } })); - - this._extensionHostDebugAdapterProvider = new ExtensionHostDebugAdapterProvider(this._proxy); + this._debugAdapters = new Map(); } public $registerDebugTypes(debugTypes: string[]) { - this._toDispose.push(this.debugService.getConfigurationManager().registerDebugAdapterProvider(debugTypes, this._extensionHostDebugAdapterProvider)); + this._toDispose.push(this.debugService.getConfigurationManager().registerDebugAdapterProvider(debugTypes, this)); + } + + createDebugAdapter(debugType: string, adapterInfo): IDebugAdapter { + const handle = this._debugAdaptersHandleCounter++; + const da = new ExtensionHostDebugAdapter(handle, this._proxy, debugType, adapterInfo); + this._debugAdapters.set(handle, da); + return da; + } + + runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise { + return this._proxy.$runInTerminal(args, config); } public dispose(): void { @@ -227,15 +239,15 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape { } }); - this._extensionHostDebugAdapterProvider.acceptMessage(handle, message); + this._debugAdapters.get(handle).acceptMessage(message); } public $acceptDAError(handle: number, name: string, message: string, stack: string) { - this._extensionHostDebugAdapterProvider.acceptDAError(handle, new Error(`${name}: ${message}\n${stack}`)); + this._debugAdapters.get(handle).fireError(handle, new Error(`${name}: ${message}\n${stack}`)); } public $acceptDAExit(handle: number, code: number, signal: string) { - this._extensionHostDebugAdapterProvider.acceptDAExit(handle, code, signal); + this._debugAdapters.get(handle).fireExit(handle, code, signal); } } @@ -277,39 +289,3 @@ class ExtensionHostDebugAdapter extends AbstractDebugAdapter { return this._proxy.$stopDASession(this._handle); } } - -/** - * Interim abstraction for managing debug funtionality in EH. - */ -class ExtensionHostDebugAdapterProvider { - - private _debugAdapters: Map; - private _debugAdaptersHandleCounter = 1; - - constructor(private _proxy: ExtHostDebugServiceShape) { - this._debugAdapters = new Map(); - } - - acceptMessage(handle: number, message: DebugProtocol.ProtocolMessage) { - this._debugAdapters.get(handle).acceptMessage(message); - } - - acceptDAError(handle: number, error: Error) { - this._debugAdapters.get(handle).fireError(handle, error); - } - - acceptDAExit(handle: number, code: number, signal: string) { - this._debugAdapters.get(handle).fireExit(handle, code, signal); - } - - createDebugAdapter(debugType: string, adapterInfo): IDebugAdapter { - const handle = this._debugAdaptersHandleCounter++; - const da = new ExtensionHostDebugAdapter(handle, this._proxy, debugType, adapterInfo); - this._debugAdapters.set(handle, da); - return da; - } - - runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise { - return this._proxy.$runInTerminal(args, config); - } -} From 11f8cd3cbe0441342dc2de278cae4ba9c978ed41 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 14:40:42 +0200 Subject: [PATCH 372/710] Move TestNotificationService down to /platform/ --- .../test/common/testNotificationService.ts | 34 +++++++++++++++++++ .../extensionsTipsService.test.ts | 3 +- .../backupFileService.test.ts | 3 +- .../configurationEditingService.test.ts | 3 +- .../configurationService.test.ts | 3 +- .../test/electron-browser/fileService.test.ts | 3 +- .../keybindingEditing.test.ts | 3 +- .../workbench/test/workbenchTestServices.ts | 30 ++-------------- 8 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 src/vs/platform/notification/test/common/testNotificationService.ts diff --git a/src/vs/platform/notification/test/common/testNotificationService.ts b/src/vs/platform/notification/test/common/testNotificationService.ts new file mode 100644 index 00000000000..d2d4021d653 --- /dev/null +++ b/src/vs/platform/notification/test/common/testNotificationService.ts @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { INotificationService, INotificationHandle, NoOpNotification, Severity, INotification, IPromptChoice } from 'vs/platform/notification/common/notification'; + +export class TestNotificationService implements INotificationService { + + public _serviceBrand: any; + + private static readonly NO_OP: INotificationHandle = new NoOpNotification(); + + public info(message: string): INotificationHandle { + return this.notify({ severity: Severity.Info, message }); + } + + public warn(message: string): INotificationHandle { + return this.notify({ severity: Severity.Warning, message }); + } + + public error(error: string | Error): INotificationHandle { + return this.notify({ severity: Severity.Error, message: error }); + } + + public notify(notification: INotification): INotificationHandle { + return TestNotificationService.NO_OP; + } + + public prompt(severity: Severity, message: string, choices: IPromptChoice[], onCancel?: () => void): INotificationHandle { + return TestNotificationService.NO_OP; + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts index 3d75afd31e8..e99f9a52370 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts @@ -23,7 +23,8 @@ import { Emitter } from 'vs/base/common/event'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { TestTextResourceConfigurationService, TestContextService, TestLifecycleService, TestEnvironmentService, TestNotificationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextResourceConfigurationService, TestContextService, TestLifecycleService, TestEnvironmentService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import URI from 'vs/base/common/uri'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; diff --git a/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts index fc79fe68eeb..3af98297733 100644 --- a/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts @@ -16,7 +16,8 @@ import Uri from 'vs/base/common/uri'; import { BackupFileService, BackupFilesModel } from 'vs/workbench/services/backup/node/backupFileService'; import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { TextModel, createTextBufferFactory } from 'vs/editor/common/model/textModel'; -import { TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestEnvironmentService, TestNotificationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestEnvironmentService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { DefaultEndOfLine } from 'vs/editor/common/model'; diff --git a/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts index 4aa21047fda..0e42aaccf0c 100644 --- a/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts @@ -18,7 +18,8 @@ import { parseArgs } from 'vs/platform/environment/node/argv'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import * as extfs from 'vs/base/node/extfs'; -import { TestTextFileService, TestTextResourceConfigurationService, workbenchInstantiationService, TestLifecycleService, TestEnvironmentService, TestStorageService, TestNotificationService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextFileService, TestTextResourceConfigurationService, workbenchInstantiationService, TestLifecycleService, TestEnvironmentService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import * as uuid from 'vs/base/common/uuid'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { WorkspaceService } from 'vs/workbench/services/configuration/node/configurationService'; diff --git a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts index 42eb0daf902..a04189f3079 100644 --- a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts @@ -24,7 +24,8 @@ import { ConfigurationEditingErrorCode } from 'vs/workbench/services/configurati import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; import { ConfigurationTarget, IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { workbenchInstantiationService, TestTextResourceConfigurationService, TestTextFileService, TestLifecycleService, TestEnvironmentService, TestStorageService, TestNotificationService } from 'vs/workbench/test/workbenchTestServices'; +import { workbenchInstantiationService, TestTextResourceConfigurationService, TestTextFileService, TestLifecycleService, TestEnvironmentService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts b/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts index a9ebd0e8c95..822b9dc356d 100644 --- a/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts +++ b/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts @@ -18,7 +18,8 @@ import * as uuid from 'vs/base/common/uuid'; import * as pfs from 'vs/base/node/pfs'; import * as encodingLib from 'vs/base/node/encoding'; import * as utils from 'vs/workbench/services/files/test/electron-browser/utils'; -import { TestEnvironmentService, TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestNotificationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestEnvironmentService, TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TextModel } from 'vs/editor/common/model/textModel'; diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 5d78d2c0752..80766a0ed14 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -16,7 +16,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { KeyCode, SimpleKeybinding, ChordKeybinding } from 'vs/base/common/keyCodes'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import * as extfs from 'vs/base/node/extfs'; -import { TestTextFileService, TestEditorGroupService, TestLifecycleService, TestBackupFileService, TestContextService, TestTextResourceConfigurationService, TestHashService, TestEnvironmentService, TestStorageService, TestNotificationService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextFileService, TestEditorGroupService, TestLifecycleService, TestBackupFileService, TestContextService, TestTextResourceConfigurationService, TestHashService, TestEnvironmentService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { IWorkspaceContextService, Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import * as uuid from 'vs/base/common/uuid'; import { ConfigurationService } from 'vs/platform/configuration/node/configurationService'; diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 3994a0ca72b..18b929cfb78 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -63,7 +63,8 @@ import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKe import { ITextBufferFactory, DefaultEndOfLine, EndOfLinePreference } from 'vs/editor/common/model'; import { Range } from 'vs/editor/common/core/range'; import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions } from 'vs/platform/dialogs/common/dialogs'; -import { INotificationService, INotificationHandle, INotification, NoOpNotification, IPromptChoice } from 'vs/platform/notification/common/notification'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { return instantiationService.createInstance(FileEditorInput, resource, void 0); @@ -306,33 +307,6 @@ export class TestHistoryService implements IHistoryService { } } -export class TestNotificationService implements INotificationService { - - public _serviceBrand: any; - - private static readonly NO_OP: INotificationHandle = new NoOpNotification(); - - public info(message: string): INotificationHandle { - return this.notify({ severity: Severity.Info, message }); - } - - public warn(message: string): INotificationHandle { - return this.notify({ severity: Severity.Warning, message }); - } - - public error(error: string | Error): INotificationHandle { - return this.notify({ severity: Severity.Error, message: error }); - } - - public notify(notification: INotification): INotificationHandle { - return TestNotificationService.NO_OP; - } - - public prompt(severity: Severity, message: string, choices: IPromptChoice[], onCancel?: () => void): INotificationHandle { - return TestNotificationService.NO_OP; - } -} - export class TestDialogService implements IDialogService { public _serviceBrand: any; From 605ed530daeb9bfc148e58fa4edf4b35112332b1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 14:49:49 +0200 Subject: [PATCH 373/710] Fixes #28121: Enforce a maximum cursor count limit --- src/vs/editor/browser/codeEditor.ts | 6 ++++-- src/vs/editor/browser/widget/codeEditorWidget.ts | 6 ++++-- .../editor/browser/widget/embeddedCodeEditorWidget.ts | 5 +++-- src/vs/editor/common/commonCodeEditor.ts | 11 ++++++++++- src/vs/editor/common/controller/cursor.ts | 10 ++++++++++ src/vs/editor/contrib/multicursor/multicursor.ts | 1 - .../editor/contrib/suggest/test/suggestModel.test.ts | 8 ++++++-- .../editor/standalone/browser/standaloneCodeEditor.ts | 10 ++++++---- src/vs/editor/standalone/browser/standaloneEditor.ts | 3 ++- src/vs/editor/test/browser/testCodeEditor.ts | 6 +++++- .../parts/debug/electron-browser/simpleDebugEditor.ts | 6 ++++-- .../walkThrough/electron-browser/walkThroughPart.ts | 5 +++-- 12 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src/vs/editor/browser/codeEditor.ts b/src/vs/editor/browser/codeEditor.ts index 1c5ed6d9b6b..160eac3591e 100644 --- a/src/vs/editor/browser/codeEditor.ts +++ b/src/vs/editor/browser/codeEditor.ts @@ -12,6 +12,7 @@ import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { EditorAction, EditorExtensionsRegistry, IEditorContributionCtor } from 'vs/editor/browser/editorExtensions'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { INotificationService } from 'vs/platform/notification/common/notification'; export class CodeEditor extends CodeEditorWidget { @@ -22,9 +23,10 @@ export class CodeEditor extends CodeEditorWidget { @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @INotificationService notificationService: INotificationService ) { - super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService); + super(domElement, options, false, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); } protected _getContributions(): IEditorContributionCtor[] { diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 7192a5a2c99..7103fb97b39 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -34,6 +34,7 @@ import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { ClassName } from 'vs/editor/common/model/intervalTree'; import { ITextModel, IModelDecorationOptions } from 'vs/editor/common/model'; import { ICommandDelegate } from 'vs/editor/browser/view/viewController'; +import { INotificationService } from 'vs/platform/notification/common/notification'; export abstract class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor { @@ -92,9 +93,10 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @INotificationService notificationService: INotificationService ) { - super(domElement, options, isSimpleWidget, instantiationService, contextKeyService); + super(domElement, options, isSimpleWidget, instantiationService, contextKeyService, notificationService); this._codeEditorService = codeEditorService; this._commandService = commandService; this._themeService = themeService; diff --git a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts index 68a61cec024..b24d4a9b62d 100644 --- a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts +++ b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts @@ -30,9 +30,10 @@ export class EmbeddedCodeEditorWidget extends CodeEditor { @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @INotificationService notificationService: INotificationService ) { - super(domElement, parentEditor.getRawConfiguration(), instantiationService, codeEditorService, commandService, contextKeyService, themeService); + super(domElement, parentEditor.getRawConfiguration(), instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); this._parentEditor = parentEditor; this._overwriteOptions = options; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 9f4fcd3c175..c37585f2df6 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import * as nls from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -30,6 +31,7 @@ import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceCompute import * as modes from 'vs/editor/common/modes'; import { Schemas } from 'vs/base/common/network'; import { ITextModel, EndOfLinePreference, IIdentifiedSingleEditOperation, IModelDecorationsChangeAccessor, IModelDecoration, IModelDeltaDecoration, IModelDecorationOptions } from 'vs/editor/common/model'; +import { INotificationService } from 'vs/platform/notification/common/notification'; let EDITOR_ID = 0; @@ -104,6 +106,7 @@ export abstract class CommonCodeEditor extends Disposable { protected readonly _instantiationService: IInstantiationService; protected readonly _contextKeyService: IContextKeyService; + protected readonly _notificationService: INotificationService; /** * map from "parent" decoration type to live decoration ids. @@ -117,7 +120,8 @@ export abstract class CommonCodeEditor extends Disposable { options: editorOptions.IEditorOptions, isSimpleWidget: boolean, instantiationService: IInstantiationService, - contextKeyService: IContextKeyService + contextKeyService: IContextKeyService, + notificationService: INotificationService, ) { super(); this.domElement = domElement; @@ -137,6 +141,7 @@ export abstract class CommonCodeEditor extends Disposable { })); this._contextKeyService = this._register(contextKeyService.createScoped(this.domElement)); + this._notificationService = notificationService; this._register(new EditorContextKeysManager(this, this._contextKeyService)); this._register(new EditorModeContext(this, this._contextKeyService)); @@ -966,6 +971,10 @@ export abstract class CommonCodeEditor extends Disposable { this._createView(); + this.listenersToRemove.push(this.cursor.onDidReachMaxCursorCount(() => { + this._notificationService.warn(nls.localize('cursors.maximum', "The number of cursors has been limited to {0}.", Cursor.MAX_CURSOR_COUNT)); + })); + this.listenersToRemove.push(this.cursor.onDidChange((e: CursorStateChangedEvent) => { let positions: Position[] = []; diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 25a0704c6f2..60219208a56 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -87,6 +87,11 @@ export class CursorModelState { export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { + public static MAX_CURSOR_COUNT = 10000; + + private readonly _onDidReachMaxCursorCount: Emitter = this._register(new Emitter()); + public readonly onDidReachMaxCursorCount: Event = this._onDidReachMaxCursorCount.event; + private readonly _onDidChange: Emitter = this._register(new Emitter()); public readonly onDidChange: Event = this._onDidChange.event; @@ -185,6 +190,11 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { } public setStates(source: string, reason: CursorChangeReason, states: CursorState[]): void { + if (states.length > Cursor.MAX_CURSOR_COUNT) { + states = states.slice(0, Cursor.MAX_CURSOR_COUNT); + this._onDidReachMaxCursorCount.fire(void 0); + } + const oldState = new CursorModelState(this._model, this); this._cursors.setStates(states); diff --git a/src/vs/editor/contrib/multicursor/multicursor.ts b/src/vs/editor/contrib/multicursor/multicursor.ts index 42ba791f862..f13b5d6167f 100644 --- a/src/vs/editor/contrib/multicursor/multicursor.ts +++ b/src/vs/editor/contrib/multicursor/multicursor.ts @@ -134,7 +134,6 @@ class InsertCursorAtEndOfEachLineSelected extends EditorAction { selections.forEach((sel) => this.getCursorsForSelection(sel, model, newSelections)); if (newSelections.length > 0) { - console.log(`calling setSelections with ${newSelections.length}`); editor.setSelections(newSelections); } } diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts index efaf16b11a9..c6e4aa184b2 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts @@ -31,17 +31,21 @@ import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { TokenizationResult2 } from 'vs/editor/common/core/token'; import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; +import { INotificationService } from 'vs/platform/notification/common/notification'; function createMockEditor(model: TextModel): TestCodeEditor { const contextKeyService = new MockContextKeyService(); const telemetryService = NullTelemetryService; + const notificationService = new TestNotificationService(); const instantiationService = new InstantiationService(new ServiceCollection( [IContextKeyService, contextKeyService], [ITelemetryService, telemetryService], - [IStorageService, NullStorageService] + [IStorageService, NullStorageService], + [INotificationService, TestNotificationService] )); - const editor = new TestCodeEditor(new MockScopeLocation(), {}, false, instantiationService, contextKeyService); + const editor = new TestCodeEditor(new MockScopeLocation(), {}, false, instantiationService, contextKeyService, notificationService); editor.setModel(model); return editor; } diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 14e25fa01f9..53a9a83ed47 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -164,7 +164,8 @@ export class StandaloneCodeEditor extends CodeEditor implements IStandaloneCodeE @ICommandService commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, @IKeybindingService keybindingService: IKeybindingService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @INotificationService notificationService: INotificationService ) { options = options || {}; options.ariaLabel = options.ariaLabel || nls.localize('editorViewAccessibleLabel', "Editor content"); @@ -173,7 +174,7 @@ export class StandaloneCodeEditor extends CodeEditor implements IStandaloneCodeE ? nls.localize('accessibilityHelpMessageIE', "Press Ctrl+F1 for Accessibility Options.") : nls.localize('accessibilityHelpMessage', "Press Alt+F1 for Accessibility Options.") ); - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); if (keybindingService instanceof StandaloneKeybindingService) { this._standaloneKeybindingService = keybindingService; @@ -295,7 +296,8 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon @IContextKeyService contextKeyService: IContextKeyService, @IKeybindingService keybindingService: IKeybindingService, @IContextViewService contextViewService: IContextViewService, - @IStandaloneThemeService themeService: IStandaloneThemeService + @IStandaloneThemeService themeService: IStandaloneThemeService, + @INotificationService notificationService: INotificationService, ) { options = options || {}; if (typeof options.theme === 'string') { @@ -303,7 +305,7 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon } let model: ITextModel = options.model; delete options.model; - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, themeService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, themeService, notificationService); this._contextViewService = contextViewService; this._register(toDispose); diff --git a/src/vs/editor/standalone/browser/standaloneEditor.ts b/src/vs/editor/standalone/browser/standaloneEditor.ts index 53493117eb5..f6fbf6ba71d 100644 --- a/src/vs/editor/standalone/browser/standaloneEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneEditor.ts @@ -89,7 +89,8 @@ export function create(domElement: HTMLElement, options?: IEditorConstructionOpt services.get(IContextKeyService), services.get(IKeybindingService), services.get(IContextViewService), - services.get(IStandaloneThemeService) + services.get(IStandaloneThemeService), + services.get(INotificationService) ); }); } diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index 675277aed4d..0c0759e7a08 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -24,6 +24,8 @@ import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { TPromise } from 'vs/base/common/winjs.base'; import { onUnexpectedError } from 'vs/base/common/errors'; import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; +import { INotificationService } from 'vs/platform/notification/common/notification'; export class TestCodeEditor extends CommonCodeEditor implements editorBrowser.ICodeEditor { @@ -168,12 +170,14 @@ export function createTestCodeEditor(model: ITextModel): TestCodeEditor { function _createTestCodeEditor(options: TestCodeEditorCreationOptions): TestCodeEditor { let contextKeyService = new MockContextKeyService(); + let notificationService = new TestNotificationService(); let services = options.serviceCollection || new ServiceCollection(); services.set(IContextKeyService, contextKeyService); + services.set(INotificationService, notificationService); let instantiationService = new InstantiationService(services); - let editor = new TestCodeEditor(new MockScopeLocation(), options, false, instantiationService, contextKeyService); + let editor = new TestCodeEditor(new MockScopeLocation(), options, false, instantiationService, contextKeyService, notificationService); editor.setModel(options.model); return editor; } diff --git a/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts b/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts index de7fbfcc013..fd1e6e04bf5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts +++ b/src/vs/workbench/parts/debug/electron-browser/simpleDebugEditor.ts @@ -19,6 +19,7 @@ import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; import { TabCompletionController } from 'vs/workbench/parts/snippets/electron-browser/tabCompletion'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { INotificationService } from 'vs/platform/notification/common/notification'; export class SimpleDebugEditor extends CodeEditorWidget { constructor( @@ -28,9 +29,10 @@ export class SimpleDebugEditor extends CodeEditorWidget { @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @INotificationService notificationService: INotificationService, ) { - super(domElement, options, true, instantiationService, codeEditorService, commandService, contextKeyService, themeService); + super(domElement, options, true, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); } protected _getContributions(): IEditorContributionCtor[] { diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index b89a6530b6c..8198c3ea31c 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -65,9 +65,10 @@ class WalkThroughCodeEditor extends CodeEditor { @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @INotificationService notificationService: INotificationService, ) { - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService, notificationService); } getTelemetryData() { From d85116c239630bcc55677a9ea7663c5fa2e375f1 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 15:04:49 +0200 Subject: [PATCH 374/710] explorer commands: fix computing context fixes #47121 --- src/vs/workbench/parts/files/browser/files.ts | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/files.ts b/src/vs/workbench/parts/files/browser/files.ts index 2665af86fe9..e1c25edab60 100644 --- a/src/vs/workbench/parts/files/browser/files.ts +++ b/src/vs/workbench/parts/files/browser/files.ts @@ -12,7 +12,6 @@ import { ExplorerItem, OpenEditor } from 'vs/workbench/parts/files/common/explor import { toResource } from 'vs/workbench/common/editor'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { List } from 'vs/base/browser/ui/list/listWidget'; -import { IFileStat } from 'vs/platform/files/common/files'; // Commands can get exeucted from a command pallete, from a context menu or from some list using a keybinding // To cover all these cases we need to properly compute the resource on which the command is being executed @@ -23,7 +22,16 @@ export function getResourceForCommand(resource: URI | object, listService: IList let list = listService.lastFocusedList; if (list && list.isDOMFocused()) { - const focus = list.getFocus(); + let focus: any; + if (list instanceof List) { + const focused = list.getFocusedElements(); + if (focused.length) { + focus = focused[0]; + } + } else { + focus = list.getFocus(); + } + if (focus instanceof ExplorerItem) { return focus.resource; } else if (focus instanceof OpenEditor) { @@ -39,27 +47,25 @@ export function getMultiSelectedResources(resource: URI | object, listService: I if (list && list.isDOMFocused()) { // Explorer if (list instanceof Tree) { - const focus: IFileStat = list.getFocus(); + const selection = list.getSelection().map((fs: ExplorerItem) => fs.resource); + const focus = list.getFocus(); + const mainUriStr = URI.isUri(resource) ? resource.toString() : focus instanceof ExplorerItem ? focus.resource.toString() : undefined; // If the resource is passed it has to be a part of the returned context. - if (focus && (!URI.isUri(resource) || focus.resource.toString() === resource.toString())) { - const selection = list.getSelection(); - // We only respect the selection if it contains the focused element. - if (selection && selection.indexOf(focus) >= 0) { - return selection.map(fs => fs.resource); - } + // We only respect the selection if it contains the focused element. + if (selection.some(s => s.toString() === mainUriStr)) { + return selection; } } // Open editors view if (list instanceof List) { - const focus = list.getFocusedElements(); - // If the resource is passed it has to be a part of the returned context. - if (focus.length && (!URI.isUri(resource) || (focus[0] instanceof OpenEditor && focus[0].getResource().toString() === resource.toString()))) { - const selection = list.getSelectedElements(); - // We only respect the selection if it contains the focused element. - if (selection && selection.indexOf(focus[0]) >= 0) { - return selection.filter(s => s instanceof OpenEditor).map((oe: OpenEditor) => oe.getResource()); - } + const selection = list.getSelectedElements().filter(s => s instanceof OpenEditor).map((oe: OpenEditor) => oe.getResource()); + const focusedElements = list.getFocusedElements(); + const focus = focusedElements.length ? focusedElements[0] : undefined; + const mainUriStr = URI.isUri(resource) ? resource.toString() : (focus instanceof OpenEditor) ? focus.getResource().toString() : undefined; + // We only respect the selection if it contains the main element. + if (selection.some(s => s.toString() === mainUriStr)) { + return selection; } } } From 7d2d20a3940ec74ee14a51f4543857448892d3a6 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 15:15:25 +0200 Subject: [PATCH 375/710] reveal in os and copy path can work on active editor, no need for explorer focus fixes #47947 --- src/vs/workbench/parts/files/electron-browser/fileCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts index 53619978a5f..cefd90ed0e8 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts @@ -396,7 +396,7 @@ function revealResourcesInOS(resources: URI[], windowsService: IWindowsService, KeybindingsRegistry.registerCommandAndKeybindingRule({ id: REVEAL_IN_OS_COMMAND_ID, weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ExplorerFocusCondition, + when: undefined, primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R, win: { primary: KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_R @@ -430,7 +430,7 @@ function resourcesToClipboard(resources: URI[], clipboardService: IClipboardServ } KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: ExplorerFocusCondition, + when: undefined, primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_C, win: { primary: KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_C From cacb9a00d4022f80b1edea4ada5f2e8781290b17 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 15:15:32 +0200 Subject: [PATCH 376/710] Fixes #27187: Keep the top-most visible line constant --- src/vs/editor/browser/editorBrowser.ts | 5 --- src/vs/editor/common/commonCodeEditor.ts | 7 --- .../editor/common/viewModel/viewModelImpl.ts | 45 +++++++------------ src/vs/monaco.d.ts | 4 -- 4 files changed, 15 insertions(+), 46 deletions(-) diff --git a/src/vs/editor/browser/editorBrowser.ts b/src/vs/editor/browser/editorBrowser.ts index 79d5d54e20b..ff17e8b8e36 100644 --- a/src/vs/editor/browser/editorBrowser.ts +++ b/src/vs/editor/browser/editorBrowser.ts @@ -619,11 +619,6 @@ export interface ICodeEditor extends editorCommon.IEditor { */ getLayoutInfo(): editorOptions.EditorLayoutInfo; - /** - * Returns the range that is currently centered in the view port. - */ - getCenteredRangeInViewport(): Range; - /** * Returns the ranges that are currently visible. * Does not account for horizontal scrolling. diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index c37585f2df6..b233f9e4f2c 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -253,13 +253,6 @@ export abstract class CommonCodeEditor extends Disposable { } } - public getCenteredRangeInViewport(): Range { - if (!this.hasView) { - return null; - } - return this.viewModel.getCenteredRangeInViewport(); - } - public getVisibleRanges(): Range[] { if (!this.hasView) { return []; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index fa9273c3f0b..3f9ff85de8c 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -33,6 +33,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel private readonly configuration: editorCommon.IConfiguration; private readonly model: ITextModel; private hasFocus: boolean; + private viewportStartLine: number; private viewportStartLineTrackedRange: string; private viewportStartLineTop: number; private readonly lines: IViewModelLinesCollection; @@ -41,8 +42,6 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel private readonly decorations: ViewModelDecorations; - private _centeredViewLine: number; - constructor(editorId: number, configuration: editorCommon.IConfiguration, model: ITextModel, scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable) { super(); @@ -50,6 +49,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel this.configuration = configuration; this.model = model; this.hasFocus = false; + this.viewportStartLine = -1; this.viewportStartLineTrackedRange = null; this.viewportStartLineTop = 0; @@ -89,8 +89,6 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel } })); - this._centeredViewLine = -1; - this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.lines, this.coordinatesConverter); this._registerModelEvents(); @@ -130,8 +128,12 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel private _onConfigurationChanged(eventsCollector: viewEvents.ViewEventsCollector, e: IConfigurationChangedEvent): void { // We might need to restore the current centered view range, so save it (if available) - const previousCenteredModelRange = this.getCenteredRangeInViewport(); - let revealPreviousCenteredModelRange = false; + let previousViewportStartModelPosition: Position = null; + if (this.viewportStartLine !== -1) { + let previousViewportStartViewPosition = new Position(this.viewportStartLine, this.getLineMinColumn(this.viewportStartLine)); + previousViewportStartModelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(previousViewportStartViewPosition); + } + let restorePreviousViewportStart = false; const conf = this.configuration.editor; @@ -144,7 +146,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel if (this.viewLayout.getCurrentScrollTop() !== 0) { // Never change the scroll position from 0 to something else... - revealPreviousCenteredModelRange = true; + restorePreviousViewportStart = true; } } @@ -157,17 +159,10 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel eventsCollector.emit(new viewEvents.ViewConfigurationChangedEvent(e)); this.viewLayout.onConfigurationChanged(e); - if (revealPreviousCenteredModelRange && previousCenteredModelRange) { - // modelLine -> viewLine - const newCenteredViewRange = this.coordinatesConverter.convertModelRangeToViewRange(previousCenteredModelRange); - - // Send a reveal event to restore the centered content - eventsCollector.emit(new viewEvents.ViewRevealRangeRequestEvent( - newCenteredViewRange, - viewEvents.VerticalRevealType.Center, - false, - editorCommon.ScrollType.Immediate - )); + if (restorePreviousViewportStart && previousViewportStartModelPosition) { + const viewPosition = this.coordinatesConverter.convertModelPositionToViewPosition(previousViewportStartModelPosition); + const viewPositionTop = this.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); + this.viewLayout.deltaScrollNow(0, viewPositionTop - this.viewportStartLineTop); } } @@ -247,7 +242,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel } // Update the configuration and reset the centered view line - this._centeredViewLine = -1; + this.viewportStartLine = -1; this.configuration.setMaxLineNumber(this.model.getLineCount()); // Recover viewport @@ -332,16 +327,6 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel } } - public getCenteredRangeInViewport(): Range { - if (this._centeredViewLine === -1) { - // Never got rendered or not rendered since last content change event - return null; - } - let viewLineNumber = this._centeredViewLine; - let currentCenteredViewRange = new Range(viewLineNumber, this.getLineMinColumn(viewLineNumber), viewLineNumber, this.getLineMaxColumn(viewLineNumber)); - return this.coordinatesConverter.convertViewRangeToModelRange(currentCenteredViewRange); - } - public getVisibleRanges(): Range[] { const visibleViewRange = this.getCompletelyVisibleViewRange(); const visibleRange = this.coordinatesConverter.convertViewRangeToModelRange(visibleViewRange); @@ -458,9 +443,9 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel * Gives a hint that a lot of requests are about to come in for these line numbers. */ public setViewport(startLineNumber: number, endLineNumber: number, centeredLineNumber: number): void { - this._centeredViewLine = centeredLineNumber; this.lines.warmUpLookupCache(startLineNumber, endLineNumber); + this.viewportStartLine = startLineNumber; let position = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(startLineNumber, this.getLineMinColumn(startLineNumber))); this.viewportStartLineTrackedRange = this.model._setTrackedRange(this.viewportStartLineTrackedRange, new Range(position.lineNumber, position.column, position.lineNumber, position.column), TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges); this.viewportStartLineTop = this.viewLayout.getVerticalOffsetForLineNumber(startLineNumber); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index d7164a77c2e..effd0f9e66d 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3782,10 +3782,6 @@ declare namespace monaco.editor { * Get the layout info for the editor. */ getLayoutInfo(): EditorLayoutInfo; - /** - * Returns the range that is currently centered in the view port. - */ - getCenteredRangeInViewport(): Range; /** * Returns the ranges that are currently visible. * Does not account for horizontal scrolling. From 048af51863c1f204f158f5a303afbbac61d754a3 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 15:38:14 +0200 Subject: [PATCH 377/710] debug: Log Point to new breakpoint menu entry fixes #47777 --- src/vs/code/electron-main/menus.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index dad88c4fc00..8cc7ad73dd1 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -854,6 +854,7 @@ export class CodeMenu { breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint..."), 'editor.debug.action.conditionalBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miColumnBreakpoint', comment: ['&& denotes a mnemonic'] }, "C&&olumn Breakpoint"), 'editor.debug.action.toggleColumnBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miFunctionBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Function Breakpoint..."), 'workbench.debug.viewlet.action.addFunctionBreakpointAction')); + breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miLogPoint', comment: ['&& denotes a mnemonic'] }, "&&Log Point..."), 'editor.debug.action.toggleLogPoint')); const newBreakpoints = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&New Breakpoint")), submenu: breakpointsMenu }); const enableAllBreakpoints = this.createMenuItem(nls.localize({ key: 'miEnableAllBreakpoints', comment: ['&& denotes a mnemonic'] }, "Enable All Breakpoints"), 'workbench.debug.viewlet.action.enableAllBreakpoints'); const disableAllBreakpoints = this.createMenuItem(nls.localize({ key: 'miDisableAllBreakpoints', comment: ['&& denotes a mnemonic'] }, "Disable A&&ll Breakpoints"), 'workbench.debug.viewlet.action.disableAllBreakpoints'); From fe3d91bd6d55f18ccc5222b20685e1c3e9af0df6 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 15:47:15 +0200 Subject: [PATCH 378/710] fixes #47208 --- .../parts/files/electron-browser/media/explorerviewlet.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css b/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css index 9cd2408fa2c..eb657380a67 100644 --- a/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css +++ b/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css @@ -109,7 +109,6 @@ .monaco-workbench.linux .explorer-viewlet .explorer-item .monaco-inputbox, .monaco-workbench.mac .explorer-viewlet .explorer-item .monaco-inputbox { height: 22px; - margin-left: -1px; } .explorer-viewlet .explorer-item .monaco-inputbox > .wrapper > .input { From 9fb03b619a2cc582f7f0defe76bba22454961dfb Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 16:04:47 +0200 Subject: [PATCH 379/710] Fixes #22611: Reveal selections after inserting a snippet --- src/vs/editor/contrib/snippet/snippetSession.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index a101e5e16bb..be8168b070e 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -367,13 +367,15 @@ export class SnippetSession { const { edits, snippets } = SnippetSession.createEditsAndSnippets(this._editor, this._template, this._overwriteBefore, this._overwriteAfter, false); this._snippets = snippets; - this._editor.setSelections(model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { + const selections = model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { if (this._snippets[0].hasPlaceholder) { return this._move(true); } else { return undoEdits.map(edit => Selection.fromPositions(edit.range.getEndPosition())); } - })); + }); + this._editor.setSelections(selections); + this._editor.revealRange(selections[0]); } merge(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { From 3521655d332ab536c7f5c34494e9614fc4081a9e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 16:23:15 +0200 Subject: [PATCH 380/710] Rename context key --- src/vs/editor/contrib/message/messageController.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/message/messageController.ts b/src/vs/editor/contrib/message/messageController.ts index 90982184a1c..60dabff0219 100644 --- a/src/vs/editor/contrib/message/messageController.ts +++ b/src/vs/editor/contrib/message/messageController.ts @@ -24,7 +24,7 @@ export class MessageController implements editorCommon.IEditorContribution { private static readonly _id = 'editor.contrib.messageController'; - static CONTEXT_SNIPPET_MODE = new RawContextKey('messageVisible', false); + static MESSAGE_VISIBLE = new RawContextKey('messageVisible', false); static get(editor: ICodeEditor): MessageController { return editor.getContribution(MessageController._id); @@ -44,7 +44,7 @@ export class MessageController implements editorCommon.IEditorContribution { @IContextKeyService contextKeyService: IContextKeyService ) { this._editor = editor; - this._visible = MessageController.CONTEXT_SNIPPET_MODE.bindTo(contextKeyService); + this._visible = MessageController.MESSAGE_VISIBLE.bindTo(contextKeyService); } dispose(): void { @@ -103,7 +103,7 @@ const MessageCommand = EditorCommand.bindToContribution(Messa registerEditorCommand(new MessageCommand({ id: 'leaveEditorMessage', - precondition: MessageController.CONTEXT_SNIPPET_MODE, + precondition: MessageController.MESSAGE_VISIBLE, handler: c => c.closeMessage(), kbOpts: { weight: KeybindingsRegistry.WEIGHT.editorContrib(30), From 0349c7af1f44bf5d40f6dbaac02ae3b6bd07d98a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 16:24:22 +0200 Subject: [PATCH 381/710] Fixes #37496: Add message when attempting to edit in a read-only editor --- src/vs/editor/browser/editorBrowser.ts | 6 ++++++ src/vs/editor/common/commonCodeEditor.ts | 7 +++++++ src/vs/editor/common/controller/cursor.ts | 4 ++++ src/vs/editor/contrib/message/messageController.ts | 12 ++++++++++-- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/editorBrowser.ts b/src/vs/editor/browser/editorBrowser.ts index ff17e8b8e36..18810f9d54f 100644 --- a/src/vs/editor/browser/editorBrowser.ts +++ b/src/vs/editor/browser/editorBrowser.ts @@ -391,6 +391,12 @@ export interface ICodeEditor extends editorCommon.IEditor { * @internal */ onDidType(listener: (text: string) => void): IDisposable; + /** + * An event emitted when editing failed because the editor is read-only. + * @event + * @internal + */ + onDidAttemptReadOnlyEdit(listener: () => void): IDisposable; /** * An event emitted when users paste text in the editor. * @event diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index b233f9e4f2c..99b0be6b3aa 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -67,6 +67,9 @@ export abstract class CommonCodeEditor extends Disposable { private readonly _onDidChangeCursorSelection: Emitter = this._register(new Emitter()); public readonly onDidChangeCursorSelection: Event = this._onDidChangeCursorSelection.event; + private readonly _onDidAttemptReadOnlyEdit: Emitter = this._register(new Emitter()); + public readonly onDidAttemptReadOnlyEdit: Event = this._onDidAttemptReadOnlyEdit.event; + private readonly _onDidLayoutChange: Emitter = this._register(new Emitter()); public readonly onDidLayoutChange: Event = this._onDidLayoutChange.event; @@ -968,6 +971,10 @@ export abstract class CommonCodeEditor extends Disposable { this._notificationService.warn(nls.localize('cursors.maximum', "The number of cursors has been limited to {0}.", Cursor.MAX_CURSOR_COUNT)); })); + this.listenersToRemove.push(this.cursor.onDidAttemptReadOnlyEdit(() => { + this._onDidAttemptReadOnlyEdit.fire(void 0); + })); + this.listenersToRemove.push(this.cursor.onDidChange((e: CursorStateChangedEvent) => { let positions: Position[] = []; diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 60219208a56..36833531a0a 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -92,6 +92,9 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { private readonly _onDidReachMaxCursorCount: Emitter = this._register(new Emitter()); public readonly onDidReachMaxCursorCount: Event = this._onDidReachMaxCursorCount.event; + private readonly _onDidAttemptReadOnlyEdit: Emitter = this._register(new Emitter()); + public readonly onDidAttemptReadOnlyEdit: Event = this._onDidAttemptReadOnlyEdit.event; + private readonly _onDidChange: Emitter = this._register(new Emitter()); public readonly onDidChange: Event = this._onDidChange.event; @@ -466,6 +469,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { if (this._configuration.editor.readOnly) { // All the remaining handlers will try to edit the model, // but we cannot edit when read only... + this._onDidAttemptReadOnlyEdit.fire(void 0); return; } diff --git a/src/vs/editor/contrib/message/messageController.ts b/src/vs/editor/contrib/message/messageController.ts index 60dabff0219..e80d0f6b90c 100644 --- a/src/vs/editor/contrib/message/messageController.ts +++ b/src/vs/editor/contrib/message/messageController.ts @@ -6,9 +6,10 @@ 'use strict'; import 'vs/css!./messageController'; +import * as nls from 'vs/nls'; import { setDisposableTimeout } from 'vs/base/common/async'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -20,7 +21,7 @@ import { registerThemingParticipant, HIGH_CONTRAST } from 'vs/platform/theme/com import { inputValidationInfoBorder, inputValidationInfoBackground } from 'vs/platform/theme/common/colorRegistry'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; -export class MessageController implements editorCommon.IEditorContribution { +export class MessageController extends Disposable implements editorCommon.IEditorContribution { private static readonly _id = 'editor.contrib.messageController'; @@ -43,11 +44,14 @@ export class MessageController implements editorCommon.IEditorContribution { editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService ) { + super(); this._editor = editor; this._visible = MessageController.MESSAGE_VISIBLE.bindTo(contextKeyService); + this._register(this._editor.onDidAttemptReadOnlyEdit(() => this._onDidAttemptReadOnlyEdit())); } dispose(): void { + super.dispose(); this._visible.reset(); } @@ -96,6 +100,10 @@ export class MessageController implements editorCommon.IEditorContribution { this._messageListeners = dispose(this._messageListeners); this._messageListeners.push(MessageWidget.fadeOut(this._messageWidget)); } + + private _onDidAttemptReadOnlyEdit(): void { + this.showMessage(nls.localize('editor.readonly', "Cannot edit in read-only editor"), this._editor.getPosition()); + } } const MessageCommand = EditorCommand.bindToContribution(MessageController.get); From 9222cf5474d7982a6d882ad20a07f31535de8c5b Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 16:36:25 +0200 Subject: [PATCH 382/710] debug actions: disable those depending on evaluateName when evaluateName is not present fixes #47078 --- src/vs/workbench/parts/debug/browser/debugActions.ts | 11 +++++++---- .../debug/electron-browser/electronDebugActions.ts | 9 ++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index ccb596753d1..529dde3128c 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -11,7 +11,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IFileService } from 'vs/platform/files/common/files'; -import { IDebugService, State, IProcess, IThread, IEnablement, IBreakpoint, IStackFrame, IExpression, REPL_ID, ProcessState } +import { IDebugService, State, IProcess, IThread, IEnablement, IBreakpoint, IStackFrame, REPL_ID, ProcessState } from 'vs/workbench/parts/debug/common/debug'; import { Variable, Expression, Thread, Breakpoint, Process } from 'vs/workbench/parts/debug/common/debugModel'; import { IPartService } from 'vs/workbench/services/part/common/partService'; @@ -600,15 +600,18 @@ export class AddToWatchExpressionsAction extends AbstractDebugAction { static readonly ID = 'workbench.debug.viewlet.action.addToWatchExpressions'; static LABEL = nls.localize('addToWatchExpressions', "Add to Watch"); - constructor(id: string, label: string, private expression: IExpression, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) { + constructor(id: string, label: string, private variable: Variable, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) { super(id, label, 'debug-action add-to-watch', debugService, keybindingService); + this.updateEnablement(); } public run(): TPromise { - const name = this.expression instanceof Variable ? this.expression.evaluateName : this.expression.name; - this.debugService.addWatchExpression(name); + this.debugService.addWatchExpression(this.variable.evaluateName); return TPromise.as(undefined); + } + protected isEnabled(state: State): boolean { + return super.isEnabled(state) && this.variable && !!this.variable.evaluateName; } } diff --git a/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts b/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts index 4709acbb680..e38f831bf0e 100644 --- a/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts +++ b/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts @@ -18,6 +18,7 @@ export class CopyValueAction extends Action { constructor(id: string, label: string, private value: any, @IDebugService private debugService: IDebugService) { super(id, label, 'debug-action copy-value'); + this._enabled = typeof this.value === 'string' || (this.value instanceof Variable && !!this.value.evaluateName); } public run(): TPromise { @@ -38,15 +39,13 @@ export class CopyEvaluatePathAction extends Action { static readonly ID = 'workbench.debug.viewlet.action.copyEvaluatePath'; static LABEL = nls.localize('copyAsExpression', "Copy as Expression"); - constructor(id: string, label: string, private value: any) { + constructor(id: string, label: string, private value: Variable) { super(id, label); + this._enabled = this.value && !!this.value.evaluateName; } public run(): TPromise { - if (this.value instanceof Variable) { - clipboard.writeText(this.value.evaluateName); - } - + clipboard.writeText(this.value.evaluateName); return TPromise.as(null); } } From 367aef325372e6446640546caccb21484e926110 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 16:50:21 +0200 Subject: [PATCH 383/710] Fixes #35574 --- .../browser/services/codeEditorServiceImpl.ts | 24 ++++++++++++++++++- src/vs/editor/common/model.ts | 4 ++++ src/vs/editor/common/model/textModel.ts | 2 ++ .../common/viewLayout/lineDecorations.ts | 2 +- .../common/viewLayout/viewLineRenderer.ts | 2 +- src/vs/editor/common/viewModel/viewModel.ts | 3 ++- .../common/viewModel/viewModelDecorations.ts | 2 +- src/vs/monaco.d.ts | 4 ++++ 8 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 99999ad1cab..64938f0b602 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -126,6 +126,7 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { public className: string; public inlineClassName: string; + public inlineClassNameAffectsLetterSpacing: boolean; public beforeContentClassName: string; public afterContentClassName: string; public glyphMarginClassName: string; @@ -145,9 +146,21 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { } return void 0; }; + let createInlineCSSRules = (type: ModelDecorationCSSRuleType) => { + let rules = new DecorationCSSRules(type, providerArgs, themeService); + if (rules.hasContent) { + this._disposables.push(rules); + return { className: rules.className, hasLetterSpacing: rules.hasLetterSpacing }; + } + return null; + }; this.className = createCSSRules(ModelDecorationCSSRuleType.ClassName); - this.inlineClassName = createCSSRules(ModelDecorationCSSRuleType.InlineClassName); + const inlineData = createInlineCSSRules(ModelDecorationCSSRuleType.InlineClassName); + if (inlineData) { + this.inlineClassName = inlineData.className; + this.inlineClassNameAffectsLetterSpacing = inlineData.hasLetterSpacing; + } this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.BeforeContentClassName); this.afterContentClassName = createCSSRules(ModelDecorationCSSRuleType.AfterContentClassName); this.glyphMarginClassName = createCSSRules(ModelDecorationCSSRuleType.GlyphMarginClassName); @@ -232,6 +245,7 @@ class DecorationCSSRules { private _className: string; private _unThemedSelector: string; private _hasContent: boolean; + private _hasLetterSpacing: boolean; private _ruleType: ModelDecorationCSSRuleType; private _themeListener: IDisposable; private _providerArgs: ProviderArguments; @@ -243,6 +257,7 @@ class DecorationCSSRules { this._providerArgs = providerArgs; this._usesThemeColors = false; this._hasContent = false; + this._hasLetterSpacing = false; let className = CSSNameHelper.getClassName(this._providerArgs.key, ruleType); if (this._providerArgs.parentTypeKey) { @@ -278,6 +293,10 @@ class DecorationCSSRules { return this._hasContent; } + public get hasLetterSpacing(): boolean { + return this._hasLetterSpacing; + } + public get className(): string { return this._className; } @@ -359,6 +378,9 @@ class DecorationCSSRules { } let cssTextArr: string[] = []; this.collectCSSText(opts, ['fontStyle', 'fontWeight', 'textDecoration', 'cursor', 'color', 'opacity', 'letterSpacing'], cssTextArr); + if (opts.letterSpacing) { + this._hasLetterSpacing = true; + } return cssTextArr.join(''); } diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 703a8edb897..607b70ac557 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -109,6 +109,10 @@ export interface IModelDecorationOptions { * to have a background color decoration. */ inlineClassName?: string; + /** + * If there is an `inlineClassName` which affects letter spacing. + */ + inlineClassNameAffectsLetterSpacing?: boolean; /** * If set, the decoration will be rendered before the text with this CSS class name. */ diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 8a32b369276..b22db35807d 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -2619,6 +2619,7 @@ export class ModelDecorationOptions implements model.IModelDecorationOptions { readonly linesDecorationsClassName: string; readonly marginClassName: string; readonly inlineClassName: string; + readonly inlineClassNameAffectsLetterSpacing: boolean; readonly beforeContentClassName: string; readonly afterContentClassName: string; @@ -2635,6 +2636,7 @@ export class ModelDecorationOptions implements model.IModelDecorationOptions { this.linesDecorationsClassName = options.linesDecorationsClassName ? cleanClassName(options.linesDecorationsClassName) : strings.empty; this.marginClassName = options.marginClassName ? cleanClassName(options.marginClassName) : strings.empty; this.inlineClassName = options.inlineClassName ? cleanClassName(options.inlineClassName) : strings.empty; + this.inlineClassNameAffectsLetterSpacing = options.inlineClassNameAffectsLetterSpacing || false; this.beforeContentClassName = options.beforeContentClassName ? cleanClassName(options.beforeContentClassName) : strings.empty; this.afterContentClassName = options.afterContentClassName ? cleanClassName(options.afterContentClassName) : strings.empty; } diff --git a/src/vs/editor/common/viewLayout/lineDecorations.ts b/src/vs/editor/common/viewLayout/lineDecorations.ts index a791061e928..fe3397d94de 100644 --- a/src/vs/editor/common/viewLayout/lineDecorations.ts +++ b/src/vs/editor/common/viewLayout/lineDecorations.ts @@ -58,7 +58,7 @@ export class LineDecoration { continue; } - if (range.isEmpty() && d.type === InlineDecorationType.Regular) { + if (range.isEmpty() && (d.type === InlineDecorationType.Regular || d.type === InlineDecorationType.RegularAffectingLetterSpacing)) { // Ignore empty range decorations continue; } diff --git a/src/vs/editor/common/viewLayout/viewLineRenderer.ts b/src/vs/editor/common/viewLayout/viewLineRenderer.ts index c6faa239326..f35989d4101 100644 --- a/src/vs/editor/common/viewLayout/viewLineRenderer.ts +++ b/src/vs/editor/common/viewLayout/viewLineRenderer.ts @@ -248,7 +248,7 @@ export function renderViewLine(input: RenderLineInput, sb: IStringBuilder): Rend let classNames: string[] = []; for (let i = 0, len = input.lineDecorations.length; i < len; i++) { const lineDecoration = input.lineDecorations[i]; - if (lineDecoration.type !== InlineDecorationType.Regular) { + if (lineDecoration.type !== InlineDecorationType.Regular && lineDecoration.type !== InlineDecorationType.RegularAffectingLetterSpacing) { classNames.push(input.lineDecorations[i].className); containsForeignElements = true; } diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 1ade6a4fd4a..b9ce5b257ce 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -270,7 +270,8 @@ export class ViewLineRenderingData { export const enum InlineDecorationType { Regular = 0, Before = 1, - After = 2 + After = 2, + RegularAffectingLetterSpacing = 3 } export class InlineDecoration { diff --git a/src/vs/editor/common/viewModel/viewModelDecorations.ts b/src/vs/editor/common/viewModel/viewModelDecorations.ts index 7f69b5af0c2..7faf9dfb56f 100644 --- a/src/vs/editor/common/viewModel/viewModelDecorations.ts +++ b/src/vs/editor/common/viewModel/viewModelDecorations.ts @@ -124,7 +124,7 @@ export class ViewModelDecorations implements IDisposable { decorationsInViewport[decorationsInViewportLen++] = viewModelDecoration; if (decorationOptions.inlineClassName) { - let inlineDecoration = new InlineDecoration(viewRange, decorationOptions.inlineClassName, InlineDecorationType.Regular); + let inlineDecoration = new InlineDecoration(viewRange, decorationOptions.inlineClassName, decorationOptions.inlineClassNameAffectsLetterSpacing ? InlineDecorationType.RegularAffectingLetterSpacing : InlineDecorationType.Regular); let intersectedStartLineNumber = Math.max(startLineNumber, viewRange.startLineNumber); let intersectedEndLineNumber = Math.min(endLineNumber, viewRange.endLineNumber); for (let j = intersectedStartLineNumber; j <= intersectedEndLineNumber; j++) { diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index effd0f9e66d..28b6ac3ffaf 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1220,6 +1220,10 @@ declare namespace monaco.editor { * to have a background color decoration. */ inlineClassName?: string; + /** + * If there is an `inlineClassName` which affects letter spacing. + */ + inlineClassNameAffectsLetterSpacing?: boolean; /** * If set, the decoration will be rendered before the text with this CSS class name. */ From fc2609a5f4de5d16bdac0453500ddbd1d6448909 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 17:32:27 +0200 Subject: [PATCH 384/710] Fixes #33376: push undo stops when updating the model via `IModelService.updateModel` --- src/vs/editor/common/services/modelServiceImpl.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 98d71e09f7d..6490f6d7a0e 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -429,12 +429,14 @@ export class ModelServiceImpl implements IModelService { } // Otherwise find a diff between the values and update model + model.pushStackElement(); model.setEOL(textBuffer.getEOL() === '\r\n' ? EndOfLineSequence.CRLF : EndOfLineSequence.LF); model.pushEditOperations( [], ModelServiceImpl._computeEdits(model, textBuffer), (inverseEditOperations: IIdentifiedSingleEditOperation[]) => [] ); + model.pushStackElement(); } private static _commonPrefix(a: ILineSequence, aLen: number, aDelta: number, b: ILineSequence, bLen: number, bDelta: number): number { From ded36ac6f26736607b7bb78c685fe74476792d0b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 17 Apr 2018 17:33:27 +0200 Subject: [PATCH 385/710] add mkdirp-option and honor it in the remote file service, #48062 --- src/vs/platform/files/common/files.ts | 5 ++++ .../electron-browser/remoteFileService.ts | 28 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 541acb7a66d..d859f958b2e 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -576,6 +576,11 @@ export interface IUpdateContentOptions { * The etag of the file. This can be used to prevent dirty writes. */ etag?: string; + + /** + * Run mkdirp before saving. + */ + mkdirp?: boolean; } export interface IResolveFileOptions { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 6a30bb3eb8e..dadfcbd23dc 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -305,10 +305,15 @@ export class RemoteFileService extends FileService { } } - updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): TPromise { + async updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): TPromise { if (resource.scheme === Schemas.file) { return super.updateContent(resource, value, options); } else { + if (options && options.mkdirp) { + // use the lack of options and or the lack of an etag as a hint that + // the parent directories might not exist. + await this._mkdirp(resource.with({ path: posix.dirname(resource.path) })); + } return this._withProvider(resource).then(provider => { const snapshot = typeof value === 'string' ? new StringSnapshot(value) : value; return this._writeFile(provider, resource, snapshot, options || {}, FileOpenFlags.Write); @@ -346,6 +351,27 @@ export class RemoteFileService extends FileService { }); } + private async _mkdirp(directory: URI): Promise { + let basenames: string[] = []; + while (directory.path !== '/') { + try { + let stat = await this.resolveFile(directory); + if (!stat.isDirectory) { + throw new Error(`${directory.toString()} is not a directory`); + } + } catch (e) { + // ENOENT + basenames.push(posix.basename(directory.path)); + directory = directory.with({ path: posix.dirname(directory.path) }); + } + break; + } + for (let i = basenames.length - 1; i >= 0; i--) { + directory = directory.with({ path: posix.join(directory.path, basenames[i]) }); + await this.createFolder(directory); + } + } + // --- delete del(resource: URI, useTrash?: boolean): TPromise { From 676e978a6733a3651aace1f80ffd20984f9c1cb9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 17 Apr 2018 17:34:12 +0200 Subject: [PATCH 386/710] fix bad imports --- .../electron-browser/processExplorer/processExplorerMain.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 7ef69f73710..a6ec588d5a6 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -12,7 +12,7 @@ import { repeat } from 'vs/base/common/strings'; import { totalmem } from 'os'; import product from 'vs/platform/node/product'; import { localize } from 'vs/nls'; -import { ProcessExplorerData, ProcessExplorerStyles } from '../../../platform/issue/common/issue'; +import { ProcessExplorerStyles, ProcessExplorerData } from 'vs/platform/issue/common/issue'; import * as browser from 'vs/base/browser/browser'; import * as platform from 'vs/base/common/platform'; From d0c5dad20b55bfaab7ad3302b377828d7e50505e Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 17:50:12 +0200 Subject: [PATCH 387/710] debug model: use a ReadOnlyArray --- .../api/electron-browser/mainThreadDebugService.ts | 2 +- .../workbench/parts/debug/browser/breakpointsView.ts | 2 +- src/vs/workbench/parts/debug/browser/debugActions.ts | 4 ++-- src/vs/workbench/parts/debug/common/debug.ts | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts index b7a7c7017d0..c43140980b6 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts @@ -141,7 +141,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb return void 0; } - private convertToDto(bps: (IBreakpoint | IFunctionBreakpoint)[]): (ISourceBreakpointDto | IFunctionBreakpointDto)[] { + private convertToDto(bps: (ReadonlyArray)): (ISourceBreakpointDto | IFunctionBreakpointDto)[] { return bps.map(bp => { if ('name' in bp) { const fbp = bp; diff --git a/src/vs/workbench/parts/debug/browser/breakpointsView.ts b/src/vs/workbench/parts/debug/browser/breakpointsView.ts index f1413ed1e93..a4d5380cde6 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointsView.ts @@ -202,7 +202,7 @@ export class BreakpointsView extends ViewsViewletPanel { private get elements(): IEnablement[] { const model = this.debugService.getModel(); - const elements = (model.getExceptionBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints()); + const elements = (>model.getExceptionBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getBreakpoints()); return elements; } diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index 529dde3128c..5b4232955dc 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -453,7 +453,7 @@ export class EnableAllBreakpointsAction extends AbstractDebugAction { protected isEnabled(state: State): boolean { const model = this.debugService.getModel(); - return super.isEnabled(state) && (model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => !bp.enabled); + return super.isEnabled(state) && (>model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => !bp.enabled); } } @@ -472,7 +472,7 @@ export class DisableAllBreakpointsAction extends AbstractDebugAction { protected isEnabled(state: State): boolean { const model = this.debugService.getModel(); - return super.isEnabled(state) && (model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => bp.enabled); + return super.isEnabled(state) && (>model.getBreakpoints()).concat(model.getFunctionBreakpoints()).concat(model.getExceptionBreakpoints()).some(bp => bp.enabled); } } diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index bc9a8c933fb..1909b03c8e9 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -306,13 +306,13 @@ export interface IViewModel extends ITreeElement { } export interface IModel extends ITreeElement { - getProcesses(): IProcess[]; - getBreakpoints(): IBreakpoint[]; + getProcesses(): ReadonlyArray; + getBreakpoints(): ReadonlyArray; areBreakpointsActivated(): boolean; - getFunctionBreakpoints(): IFunctionBreakpoint[]; - getExceptionBreakpoints(): IExceptionBreakpoint[]; - getWatchExpressions(): IExpression[]; - getReplElements(): IReplElement[]; + getFunctionBreakpoints(): ReadonlyArray; + getExceptionBreakpoints(): ReadonlyArray; + getWatchExpressions(): ReadonlyArray; + getReplElements(): ReadonlyArray; onDidChangeBreakpoints: Event; onDidChangeCallStack: Event; From 8516f3b5e8790ca71bcbf2dfeb3eae0d8f22820b Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 17 Apr 2018 17:56:51 +0200 Subject: [PATCH 388/710] debug: rename resolveConfiguration to substiuteVariables. Also getEnabledBreakpointsForResource should also respect enabled property --- src/vs/workbench/parts/debug/common/debug.ts | 2 +- src/vs/workbench/parts/debug/common/debugModel.ts | 4 ++-- .../parts/debug/electron-browser/debugConfigurationManager.ts | 2 +- src/vs/workbench/parts/debug/electron-browser/debugService.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 1909b03c8e9..5b177840f30 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -542,7 +542,7 @@ export interface ILaunch { * Returns the resolved configuration. * Replaces os specific values, system variables, interactive variables. */ - resolveConfiguration(config: IConfig): TPromise; + substituteVariables(config: IConfig): TPromise; /** * Opens the launch.json file. Creates if it does not exist. diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 8824e849194..3007f9cafbf 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -875,10 +875,10 @@ export class Model implements IModel { return this.breakpoints.filter(bp => bp.uri.toString() === uriString); } - public getActivatedBreakpointsForResource(resource: uri): IBreakpoint[] { + public getEnabledBreakpointsForResource(resource: uri): IBreakpoint[] { if (this.breakpointsActivated) { const uriString = resource.toString(); - return this.breakpoints.filter(bp => bp.uri.toString() === uriString); + return this.breakpoints.filter(bp => bp.uri.toString() === uriString && bp.enabled); } return []; } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index 8f07813290a..e7b737dfddc 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -619,7 +619,7 @@ class Launch implements ILaunch { return undefined; } - public resolveConfiguration(config: IConfig): TPromise { + public substituteVariables(config: IConfig): TPromise { const result = objects.deepClone(config) as IConfig; // Set operating system specific properties #1873 const setOSProperties = (flag: boolean, osConfig: IEnvConfig) => { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 8b5c9af6ba9..1550004184a 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -788,7 +788,7 @@ export class DebugService implements debug.IDebugService { private createProcess(launch: debug.ILaunch, config: debug.IConfig, sessionId: string): TPromise { return this.textFileService.saveAll().then(() => - (launch ? launch.resolveConfiguration(config) : TPromise.as(config)).then(resolvedConfig => { + (launch ? launch.substituteVariables(config) : TPromise.as(config)).then(resolvedConfig => { if (!resolvedConfig) { // User canceled resolving of interactive variables, silently return return undefined; @@ -1205,7 +1205,7 @@ export class DebugService implements debug.IDebugService { return TPromise.as(null); } - const breakpointsToSend = this.model.getActivatedBreakpointsForResource(modelUri).filter(bp => bp.enabled); + const breakpointsToSend = this.model.getEnabledBreakpointsForResource(modelUri); const source = process.getSourceForUri(modelUri); let rawSource: DebugProtocol.Source; From a3a044d1c732297cd092165009dec86e1edfda99 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 17 Apr 2018 17:38:19 +0200 Subject: [PATCH 389/710] :lipstick: #48062 --- .../services/files/electron-browser/remoteFileService.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index dadfcbd23dc..7728937a544 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -310,8 +310,6 @@ export class RemoteFileService extends FileService { return super.updateContent(resource, value, options); } else { if (options && options.mkdirp) { - // use the lack of options and or the lack of an etag as a hint that - // the parent directories might not exist. await this._mkdirp(resource.with({ path: posix.dirname(resource.path) })); } return this._withProvider(resource).then(provider => { From bb1119e0b1c7ed8e53ba3acafb925339980fc5a3 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Tue, 17 Apr 2018 09:18:02 -0700 Subject: [PATCH 390/710] Open script on single click --- extensions/npm/package.json | 6 +++--- extensions/npm/src/npmView.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index e0a9a124f32..6e4547123c2 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -80,17 +80,17 @@ "group": "navigation" }, { - "command": "npm.runScript", + "command": "npm.openScript", "when": "view == npm && viewItem == script", "group": "navigation@1" }, { - "command": "npm.debugScript", + "command": "npm.runScript", "when": "view == npm && viewItem == script", "group": "navigation@2" }, { - "command": "npm.openScript", + "command": "npm.debugScript", "when": "view == npm && viewItem == script", "group": "navigation@3" } diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index a88e836ff38..3bc7e0958e6 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -73,7 +73,7 @@ class NpmScript extends TreeItem { this.task = task; this.command = { title: 'Run Script', - command: 'npm.runScript', + command: 'npm.openScript', arguments: [this] }; this.iconPath = { From 99f945917445ffa2930d457999e8109536c09456 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 17 Apr 2018 11:13:34 +0200 Subject: [PATCH 391/710] [css] remove emmet dependency --- .../css-language-features/server/package.json | 1 - .../server/src/test/emmet.test.ts | 71 ------------------- .../css-language-features/server/yarn.lock | 20 ------ 3 files changed, 92 deletions(-) delete mode 100644 extensions/css-language-features/server/src/test/emmet.test.ts diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 34f651fbe34..50b6ff3a2c7 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -9,7 +9,6 @@ }, "dependencies": { "vscode-css-languageservice": "^3.0.9-next.5", - "vscode-emmet-helper": "^1.2.4", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^1.0.1" }, diff --git a/extensions/css-language-features/server/src/test/emmet.test.ts b/extensions/css-language-features/server/src/test/emmet.test.ts deleted file mode 100644 index e7fe76d7be3..00000000000 --- a/extensions/css-language-features/server/src/test/emmet.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import 'mocha'; -import * as assert from 'assert'; -import { getCSSLanguageService, getSCSSLanguageService } from 'vscode-css-languageservice'; -import { TextDocument, CompletionList } from 'vscode-languageserver-types'; -import { getEmmetCompletionParticipants } from 'vscode-emmet-helper'; - -suite('CSS Emmet Support', () => { - - const cssLanguageService = getCSSLanguageService(); - const scssLanguageService = getSCSSLanguageService(); - - function assertCompletions(syntax: string, value: string, expectedProposal: string | null, expectedProposalDoc: string | null): void { - const offset = value.indexOf('|'); - value = value.substr(0, offset) + value.substr(offset + 1); - - const document = TextDocument.create('test://test/test.' + syntax, syntax, 0, value); - const position = document.positionAt(offset); - const emmetCompletionList: CompletionList = { - isIncomplete: true, - items: [] - }; - const languageService = syntax === 'scss' ? scssLanguageService : cssLanguageService; - languageService.setCompletionParticipants([getEmmetCompletionParticipants(document, position, document.languageId, {}, emmetCompletionList)]); - const stylesheet = languageService.parseStylesheet(document); - const list = languageService.doComplete(document, position, stylesheet); - - assert.ok(list); - assert.ok(emmetCompletionList); - - if (expectedProposal && expectedProposalDoc) { - let actualLabels = (emmetCompletionList!.items || []).map(c => c.label).sort(); - let actualDocs = (emmetCompletionList!.items || []).map(c => c.documentation).sort(); - assert.ok(actualLabels.indexOf(expectedProposal) !== -1, 'Not found:' + expectedProposal + ' is ' + actualLabels.join(', ')); - assert.ok(actualDocs.indexOf(expectedProposalDoc) !== -1, 'Not found:' + expectedProposalDoc + ' is ' + actualDocs.join(', ')); - } else { - assert.ok(!emmetCompletionList || !emmetCompletionList.items); - } - } - - test('Css Emmet Completions', function (this: any): any { - this.skip(); // disabled again (see #29113) - - assertCompletions('css', '.foo { display: none; m10| }', 'margin: 10px;', 'margin: 10px;'); - assertCompletions('css', 'foo { display: none; pos:f| }', 'position: fixed;', 'position: fixed;'); - assertCompletions('css', 'foo { display: none; margin: a| }', null, null); - assertCompletions('css', 'foo| { display: none; }', null, null); - assertCompletions('css', 'foo {| display: none; }', null, null); - assertCompletions('css', 'foo { display: none;| }', null, null); - assertCompletions('css', 'foo { display: none|; }', null, null); - assertCompletions('css', '.foo { display: none; -m-m10| }', 'margin: 10px;', '-moz-margin: 10px;\nmargin: 10px;'); - }); - - test('Scss Emmet Completions', function (this: any): any { - this.skip(); // disabled again (see #29113) - - assertCompletions('scss', '.foo { display: none; .bar { m10| } }', 'margin: 10px;', 'margin: 10px;'); - assertCompletions('scss', 'foo { display: none; .bar { pos:f| } }', 'position: fixed;', 'position: fixed;'); - assertCompletions('scss', 'foo { display: none; margin: a| .bar {}}', null, null); - assertCompletions('scss', 'foo| { display: none; }', null, null); - assertCompletions('scss', 'foo {| display: none; }', null, null); - assertCompletions('scss', 'foo { display: none;| }', null, null); - assertCompletions('scss', 'foo { display: none|; }', null, null); - assertCompletions('scss', '.foo { display: none; -m-m10| }', 'margin: 10px;', '-moz-margin: 10px;\nmargin: 10px;'); - }); -}); \ No newline at end of file diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 789b9b16ab1..3ee6a0d6448 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -2,10 +2,6 @@ # yarn lockfile v1 -"@emmetio/extract-abbreviation@0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@emmetio/extract-abbreviation/-/extract-abbreviation-0.1.6.tgz#e4a9856c1057f0aff7d443b8536477c243abe28c" - "@types/mocha@2.2.33": version "2.2.33" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.33.tgz#d79a0061ec270379f4d9e225f4096fb436669def" @@ -14,10 +10,6 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -jsonc-parser@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" - vscode-css-languageservice@^3.0.9-next.5: version "3.0.9-next.5" resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.5.tgz#854048eafc91406af4b276d9f812e24c677e262e" @@ -25,14 +17,6 @@ vscode-css-languageservice@^3.0.9-next.5: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" -vscode-emmet-helper@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.4.tgz#48056974d13036722af019235b9f750a495de728" - dependencies: - "@emmetio/extract-abbreviation" "0.1.6" - jsonc-parser "^1.0.0" - vscode-languageserver-types "^3.6.0-next.1" - vscode-jsonrpc@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" @@ -55,10 +39,6 @@ vscode-languageserver-types@^3.6.0, vscode-languageserver-types@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz#4bc06a48dff653495f12f94b8b1e228988a1748d" -vscode-languageserver-types@^3.6.0-next.1: - version "3.6.0-next.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.0-next.1.tgz#98e488d3f87b666b4ee1a3d89f0023e246d358f3" - vscode-languageserver@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-4.0.0.tgz#8b792f0d6d10acfe363d02371ed4ce53d08af88a" From a509b1797b67f4231d2933f1b8d79e023fae47c7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 17 Apr 2018 12:05:30 +0200 Subject: [PATCH 392/710] [css] fix path completion participant --- extensions/css-language-features/server/src/pathCompletion.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/css-language-features/server/src/pathCompletion.ts b/extensions/css-language-features/server/src/pathCompletion.ts index 9f3c7818508..b072c4136f6 100644 --- a/extensions/css-language-features/server/src/pathCompletion.ts +++ b/extensions/css-language-features/server/src/pathCompletion.ts @@ -20,7 +20,7 @@ export function getPathCompletionParticipant( result: CompletionList ): ICompletionParticipant { return { - onURILiteralValue: ({ position, range, uriValue }) => { + onCssURILiteralValue: ({ position, range, uriValue }) => { const isValueQuoted = startsWith(uriValue, `'`) || startsWith(uriValue, `"`); const fullValue = stripQuotes(uriValue); const valueBeforeCursor = isValueQuoted From e09c8a7086a28d53f786a99da71ffd95250e217c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 17 Apr 2018 18:18:03 +0200 Subject: [PATCH 393/710] [css] adopt folding apis --- .../client/src/cssMain.ts | 28 ++++++++++++++----- extensions/css-language-features/package.json | 8 +++--- .../css-language-features/server/package.json | 4 +-- .../server/src/cssServerMain.ts | 23 +++++++++------ .../css-language-features/server/yarn.lock | 12 ++++---- extensions/css-language-features/yarn.lock | 6 ++-- 6 files changed, 50 insertions(+), 31 deletions(-) diff --git a/extensions/css-language-features/client/src/cssMain.ts b/extensions/css-language-features/client/src/cssMain.ts index 22285fb91bf..ac1a1b7493e 100644 --- a/extensions/css-language-features/client/src/cssMain.ts +++ b/extensions/css-language-features/client/src/cssMain.ts @@ -10,7 +10,7 @@ const localize = nls.loadMessageBundle(); import { languages, window, commands, ExtensionContext, Range, Position, TextDocument, CompletionItem, CompletionItemKind, TextEdit, SnippetString, FoldingRangeList, FoldingRange, FoldingContext, CancellationToken } from 'vscode'; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, Disposable } from 'vscode-languageclient'; -import { FoldingRangesRequest, FoldingRangeRequestParam } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; // this method is called when vs code is activated export function activate(context: ExtensionContext) { @@ -42,6 +42,21 @@ export function activate(context: ExtensionContext) { // Create the language client and start the client. let client = new LanguageClient('css', localize('cssserver.name', 'CSS Language Server'), serverOptions, clientOptions); client.registerProposedFeatures(); + client.registerFeature({ + fillClientCapabilities(capabilities: FoldingRangeClientCapabilities): void { + let textDocumentCap = capabilities.textDocument; + if (!textDocumentCap) { + textDocumentCap = capabilities.textDocument = {}; + } + textDocumentCap.foldingRange = { + dynamicRegistration: false, + rangeLimit: 5000, + lineFoldingOnly: true + }; + }, + initialize(capabilities, documentSelector): void { + } + }); let disposable = client.start(); // Push the disposable to the context's subscriptions so that the @@ -105,16 +120,15 @@ export function activate(context: ExtensionContext) { return languages.registerFoldingProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { const param: FoldingRangeRequestParam = { - textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), - maxRanges: context.maxRanges + textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) }; - return client.sendRequest(FoldingRangesRequest.type, param, token).then(res => { - if (res && Array.isArray(res.ranges)) { - return new FoldingRangeList(res.ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.type))); + return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { + if (Array.isArray(ranges)) { + return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind))); } return null; }, error => { - client.logFailedRequest(FoldingRangesRequest.type, error); + client.logFailedRequest(FoldingRangeRequest.type, error); return null; }); } diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index f1eede08701..4179c9fef2c 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -21,9 +21,9 @@ "postinstall": "cd server && yarn install", "install-client-next": "yarn add vscode-languageclient@next" }, - "categories": [ - "Programming Languages" - ], + "categories": [ + "Programming Languages" + ], "contributes": { "configuration": [ { @@ -696,7 +696,7 @@ }, "dependencies": { "vscode-languageclient": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1", + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.1" }, "devDependencies": { diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 50b6ff3a2c7..060c0ee7732 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -8,9 +8,9 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.5", + "vscode-css-languageservice": "^3.0.9-next.7", "vscode-languageserver": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1" + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2" }, "devDependencies": { "@types/mocha": "2.2.33", diff --git a/extensions/css-language-features/server/src/cssServerMain.ts b/extensions/css-language-features/server/src/cssServerMain.ts index a42cad484fe..b78b9e4e40d 100644 --- a/extensions/css-language-features/server/src/cssServerMain.ts +++ b/extensions/css-language-features/server/src/cssServerMain.ts @@ -15,7 +15,7 @@ import { getLanguageModelCache } from './languageModelCache'; import { formatError, runSafe } from './utils/runner'; import URI from 'vscode-uri'; import { getPathCompletionParticipant } from './pathCompletion'; -import { FoldingProviderServerCapabilities, FoldingRangesRequest } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeServerCapabilities, FoldingRangeRequest } from 'vscode-languageserver-protocol-foldingprovider'; export interface Settings { css: LanguageSettings; @@ -49,6 +49,7 @@ connection.onShutdown(() => { }); let scopedSettingsSupport = false; +let foldingRangeLimit = Number.MAX_VALUE; let workspaceFolders: WorkspaceFolder[]; // After the server has started the client sends an initialize request. The server receives @@ -62,18 +63,22 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { } } - function hasClientCapability(name: string) { + function getClientCapability(name: string, def: T) { let keys = name.split('.'); let c: any = params.capabilities; for (let i = 0; c && i < keys.length; i++) { + if (!c.hasOwnProperty(keys[i])) { + return def; + } c = c[keys[i]]; } - return !!c; + return c; } - let snippetSupport = hasClientCapability('textDocument.completion.completionItem.snippetSupport'); - scopedSettingsSupport = hasClientCapability('workspace.configuration'); + let snippetSupport = !!getClientCapability('textDocument.completion.completionItem.snippetSupport', false); + scopedSettingsSupport = !!getClientCapability('workspace.configuration', false); + foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); - let capabilities: ServerCapabilities & FoldingProviderServerCapabilities = { + let capabilities: ServerCapabilities & FoldingRangeServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, completionProvider: snippetSupport ? { resolveProvider: false, triggerCharacters: ['/'] } : undefined, @@ -85,7 +90,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { codeActionProvider: true, renameProvider: true, colorProvider: true, - foldingProvider: true + foldingRangeProvider: true }; return { capabilities }; }); @@ -276,10 +281,10 @@ connection.onRenameRequest((renameParameters, token) => { }, null, `Error while computing renames for ${renameParameters.textDocument.uri}`, token); }); -connection.onRequest(FoldingRangesRequest.type, (params, token) => { +connection.onRequest(FoldingRangeRequest.type, (params, token) => { return runSafe(() => { let document = documents.get(params.textDocument.uri); - return getLanguageService(document).getFoldingRanges(document, { maxRanges: params.maxRanges }); + return getLanguageService(document).getFoldingRanges(document, { rangeLimit: foldingRangeLimit }); }, null, `Error while computing folding ranges for ${params.textDocument.uri}`, token); }); diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 3ee6a0d6448..06e9bd19565 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -10,9 +10,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.9-next.5: - version "3.0.9-next.5" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.5.tgz#854048eafc91406af4b276d9f812e24c677e262e" +vscode-css-languageservice@^3.0.9-next.7: + version "3.0.9-next.7" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.7.tgz#1eb8deadaa6bfaf55187656ea6fb6b7e8d71cd7f" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" @@ -21,9 +21,9 @@ vscode-jsonrpc@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0" diff --git a/extensions/css-language-features/yarn.lock b/extensions/css-language-features/yarn.lock index 7b01c6fe5ce..37c6473e3aa 100644 --- a/extensions/css-language-features/yarn.lock +++ b/extensions/css-language-features/yarn.lock @@ -16,9 +16,9 @@ vscode-languageclient@^4.0.0: dependencies: vscode-languageserver-protocol "^3.6.0" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0" From c8b4f0d05d2df2a0bd95f89e5b4ed8215f845ec3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 17 Apr 2018 18:38:17 +0200 Subject: [PATCH 394/710] move proposed search api logic into its own world, #47058 --- .../extensionHost.contribution.ts | 1 + .../electron-browser/mainThreadFileSystem.ts | 132 +--------------- .../api/electron-browser/mainThreadSearch.ts | 148 ++++++++++++++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 4 +- src/vs/workbench/api/node/extHost.protocol.ts | 12 +- .../workbench/api/node/extHostFileSystem.ts | 43 ----- src/vs/workbench/api/node/extHostSearch.ts | 64 ++++++++ 7 files changed, 231 insertions(+), 173 deletions(-) create mode 100644 src/vs/workbench/api/electron-browser/mainThreadSearch.ts create mode 100644 src/vs/workbench/api/node/extHostSearch.ts diff --git a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts index 3418ddaf1a2..13d824066d0 100644 --- a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts @@ -39,6 +39,7 @@ import './mainThreadOutputService'; import './mainThreadProgress'; import './mainThreadQuickOpen'; import './mainThreadSCM'; +import './mainThreadSearch'; import './mainThreadSaveParticipant'; import './mainThreadStatusBar'; import './mainThreadStorage'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 8517ec69fe6..d48c4b7ba43 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -4,28 +4,23 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import URI, { UriComponents } from 'vs/base/common/uri'; -import { TPromise, PPromise } from 'vs/base/common/winjs.base'; -import { ExtHostContext, MainContext, IExtHostContext, MainThreadFileSystemShape, ExtHostFileSystemShape, IFileChangeDto } from '../node/extHost.protocol'; -import { IFileService, IStat, IFileChange, ISimpleReadWriteProvider, IFileSystemProviderBase, FileOpenFlags } from 'vs/platform/files/common/files'; +import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Event, Emitter } from 'vs/base/common/event'; +import URI from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { FileOpenFlags, IFileChange, IFileService, IFileSystemProviderBase, ISimpleReadWriteProvider, IStat } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ISearchResultProvider, ISearchQuery, ISearchComplete, ISearchProgressItem, QueryType, IFileMatch, ISearchService, ILineMatch } from 'vs/platform/search/common/search'; -import { values } from 'vs/base/common/map'; -import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadFileSystem) export class MainThreadFileSystem implements MainThreadFileSystemShape { private readonly _proxy: ExtHostFileSystemShape; private readonly _fileProvider = new Map(); - private readonly _searchProvider = new Map(); constructor( extHostContext: IExtHostContext, - @IFileService private readonly _fileService: IFileService, - @ISearchService private readonly _searchService: ISearchService + @IFileService private readonly _fileService: IFileService ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostFileSystem); } @@ -38,27 +33,14 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { $registerFileSystemProvider(handle: number, scheme: string): void { this._fileProvider.set(handle, new RemoteFileSystemProvider(this._fileService, scheme, handle, this._proxy)); } - - $registerSearchProvider(handle: number, scheme: string): void { - this._searchProvider.set(handle, new RemoteSearchProvider(this._searchService, scheme, handle, this._proxy)); - } - $unregisterProvider(handle: number): void { dispose(this._fileProvider.get(handle)); this._fileProvider.delete(handle); - - dispose(this._searchProvider.get(handle)); - this._searchProvider.delete(handle); } $onFileSystemChange(handle: number, changes: IFileChangeDto[]): void { this._fileProvider.get(handle).$onFileSystemChange(changes); } - // --- search - - $handleFindMatch(handle: number, session, data: UriComponents | [UriComponents, ILineMatch]): void { - this._searchProvider.get(handle).handleFindMatch(session, data); - } } class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemProviderBase { @@ -121,105 +103,3 @@ class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemP return this._proxy.$readdir(this._handle, resource); } } - -class SearchOperation { - - private static _idPool = 0; - - constructor( - readonly progress: (match: IFileMatch) => any, - readonly id: number = ++SearchOperation._idPool, - readonly matches = new Map() - ) { - // - } - - addMatch(resource: URI, match: ILineMatch): void { - if (!this.matches.has(resource.toString())) { - this.matches.set(resource.toString(), { resource, lineMatches: [] }); - } - if (match) { - this.matches.get(resource.toString()).lineMatches.push(match); - } - this.progress(this.matches.get(resource.toString())); - } -} - -class RemoteSearchProvider implements ISearchResultProvider { - - private readonly _registrations: IDisposable[]; - private readonly _searches = new Map(); - - - constructor( - searchService: ISearchService, - private readonly _scheme: string, - private readonly _handle: number, - private readonly _proxy: ExtHostFileSystemShape - ) { - this._registrations = [searchService.registerSearchResultProvider(this)]; - } - - dispose(): void { - dispose(this._registrations); - } - - search(query: ISearchQuery): PPromise { - - if (isFalsyOrEmpty(query.folderQueries)) { - return PPromise.as(undefined); - } - - let includes = { ...query.includePattern }; - let excludes = { ...query.excludePattern }; - - for (const folderQuery of query.folderQueries) { - if (folderQuery.folder.scheme === this._scheme) { - includes = { ...includes, ...folderQuery.includePattern }; - excludes = { ...excludes, ...folderQuery.excludePattern }; - } - } - - let outer: TPromise; - - return new PPromise((resolve, reject, report) => { - - const search = new SearchOperation(report); - this._searches.set(search.id, search); - - outer = query.type === QueryType.File - ? this._proxy.$provideFileSearchResults(this._handle, search.id, query.filePattern) - : this._proxy.$provideTextSearchResults(this._handle, search.id, query.contentPattern, { excludes: Object.keys(excludes), includes: Object.keys(includes) }); - - outer.then(() => { - this._searches.delete(search.id); - resolve(({ results: values(search.matches), stats: undefined })); - }, err => { - this._searches.delete(search.id); - reject(err); - }); - }, () => { - if (outer) { - outer.cancel(); - } - }); - } - - handleFindMatch(session: number, dataOrUri: UriComponents | [UriComponents, ILineMatch]): void { - if (!this._searches.has(session)) { - // ignore... - return; - } - let resource: URI; - let match: ILineMatch; - - if (Array.isArray(dataOrUri)) { - resource = URI.revive(dataOrUri[0]); - match = dataOrUri[1]; - } else { - resource = URI.revive(dataOrUri); - } - - this._searches.get(session).addMatch(resource, match); - } -} diff --git a/src/vs/workbench/api/electron-browser/mainThreadSearch.ts b/src/vs/workbench/api/electron-browser/mainThreadSearch.ts new file mode 100644 index 00000000000..e83864d3a4a --- /dev/null +++ b/src/vs/workbench/api/electron-browser/mainThreadSearch.ts @@ -0,0 +1,148 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { values } from 'vs/base/common/map'; +import URI, { UriComponents } from 'vs/base/common/uri'; +import { PPromise, TPromise } from 'vs/base/common/winjs.base'; +import { IFileMatch, ILineMatch, ISearchComplete, ISearchProgressItem, ISearchQuery, ISearchResultProvider, ISearchService, QueryType } from 'vs/platform/search/common/search'; +import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { ExtHostContext, ExtHostSearchShape, IExtHostContext, MainContext, MainThreadSearchShape } from '../node/extHost.protocol'; + +@extHostNamedCustomer(MainContext.MainThreadSearch) +export class MainThreadSearch implements MainThreadSearchShape { + + private readonly _proxy: ExtHostSearchShape; + private readonly _searchProvider = new Map(); + + constructor( + extHostContext: IExtHostContext, + @ISearchService private readonly _searchService: ISearchService + ) { + this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostSearch); + } + + dispose(): void { + this._searchProvider.forEach(value => dispose()); + this._searchProvider.clear(); + } + + $registerSearchProvider(handle: number, scheme: string): void { + this._searchProvider.set(handle, new RemoteSearchProvider(this._searchService, scheme, handle, this._proxy)); + } + + $unregisterProvider(handle: number): void { + dispose(this._searchProvider.get(handle)); + this._searchProvider.delete(handle); + } + + $handleFindMatch(handle: number, session, data: UriComponents | [UriComponents, ILineMatch]): void { + this._searchProvider.get(handle).handleFindMatch(session, data); + } +} + +class SearchOperation { + + private static _idPool = 0; + + constructor( + readonly progress: (match: IFileMatch) => any, + readonly id: number = ++SearchOperation._idPool, + readonly matches = new Map() + ) { + // + } + + addMatch(resource: URI, match: ILineMatch): void { + if (!this.matches.has(resource.toString())) { + this.matches.set(resource.toString(), { resource, lineMatches: [] }); + } + if (match) { + this.matches.get(resource.toString()).lineMatches.push(match); + } + this.progress(this.matches.get(resource.toString())); + } +} + +class RemoteSearchProvider implements ISearchResultProvider { + + private readonly _registrations: IDisposable[]; + private readonly _searches = new Map(); + + + constructor( + searchService: ISearchService, + private readonly _scheme: string, + private readonly _handle: number, + private readonly _proxy: ExtHostSearchShape + ) { + this._registrations = [searchService.registerSearchResultProvider(this)]; + } + + dispose(): void { + dispose(this._registrations); + } + + search(query: ISearchQuery): PPromise { + + if (isFalsyOrEmpty(query.folderQueries)) { + return PPromise.as(undefined); + } + + let includes = { ...query.includePattern }; + let excludes = { ...query.excludePattern }; + + for (const folderQuery of query.folderQueries) { + if (folderQuery.folder.scheme === this._scheme) { + includes = { ...includes, ...folderQuery.includePattern }; + excludes = { ...excludes, ...folderQuery.excludePattern }; + } + } + + let outer: TPromise; + + return new PPromise((resolve, reject, report) => { + + const search = new SearchOperation(report); + this._searches.set(search.id, search); + + outer = query.type === QueryType.File + ? this._proxy.$provideFileSearchResults(this._handle, search.id, query.filePattern) + : this._proxy.$provideTextSearchResults(this._handle, search.id, query.contentPattern, { excludes: Object.keys(excludes), includes: Object.keys(includes) }); + + outer.then(() => { + this._searches.delete(search.id); + resolve(({ results: values(search.matches), stats: undefined })); + }, err => { + this._searches.delete(search.id); + reject(err); + }); + }, () => { + if (outer) { + outer.cancel(); + } + }); + } + + handleFindMatch(session: number, dataOrUri: UriComponents | [UriComponents, ILineMatch]): void { + if (!this._searches.has(session)) { + // ignore... + return; + } + let resource: URI; + let match: ILineMatch; + + if (Array.isArray(dataOrUri)) { + resource = URI.revive(dataOrUri[0]); + match = dataOrUri[1]; + } else { + resource = URI.revive(dataOrUri); + } + + this._searches.get(session).addMatch(resource, match); + } +} diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index ee9475f99b7..4e4583d1586 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -59,6 +59,7 @@ import { OverviewRulerLane } from 'vs/editor/common/model'; import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview'; import * as files from 'vs/platform/files/common/files'; +import { ExtHostSearch } from './extHostSearch'; export interface IExtensionApiFactory { (extension: IExtensionDescription): typeof vscode; @@ -116,6 +117,7 @@ export function createApiFactory( const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands)); const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(rpcProtocol)); const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService)); + const extHostSearch = rpcProtocol.set(ExtHostContext.ExtHostSearch, new ExtHostSearch(rpcProtocol)); const extHostTask = rpcProtocol.set(ExtHostContext.ExtHostTask, new ExtHostTask(rpcProtocol, extHostWorkspace)); const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol)); rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService); @@ -568,7 +570,7 @@ export function createApiFactory( return extHostFileSystem.registerFileSystemProvider(scheme, provider, newProvider); }), registerSearchProvider: proposedApiFunction(extension, (scheme, provider) => { - return extHostFileSystem.registerSearchProvider(scheme, provider); + return extHostSearch.registerSearchProvider(scheme, provider); }) }; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 2301dee43bc..49e3cdb0b56 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -383,11 +383,13 @@ export interface IFileChangeDto { export interface MainThreadFileSystemShape extends IDisposable { $registerFileSystemProvider(handle: number, scheme: string): void; + $unregisterProvider(handle: number): void; + $onFileSystemChange(handle: number, resource: IFileChangeDto[]): void; +} + +export interface MainThreadSearchShape extends IDisposable { $registerSearchProvider(handle: number, scheme: string): void; $unregisterProvider(handle: number): void; - - $onFileSystemChange(handle: number, resource: IFileChangeDto[]): void; - $handleFindMatch(handle: number, session, data: UriComponents | [UriComponents, ILineMatch]): void; } @@ -576,7 +578,9 @@ export interface ExtHostFileSystemShape { $readdir(handle: number, resource: UriComponents): TPromise<[string, IStat][]>; $delete(handle: number, resource: UriComponents): TPromise; +} +export interface ExtHostSearchShape { $provideFileSearchResults(handle: number, session: number, query: string): TPromise; $provideTextSearchResults(handle: number, session: number, pattern: IPatternInfo, options: { includes: string[], excludes: string[] }): TPromise; } @@ -857,6 +861,7 @@ export const MainContext = { MainThreadFileSystem: createMainId('MainThreadFileSystem'), MainThreadExtensionService: createMainId('MainThreadExtensionService'), MainThreadSCM: createMainId('MainThreadSCM'), + MainThreadSearch: createMainId('MainThreadSearch'), MainThreadTask: createMainId('MainThreadTask'), MainThreadWindow: createMainId('MainThreadWindow'), }; @@ -882,6 +887,7 @@ export const ExtHostContext = { ExtHostLogService: createExtId('ExtHostLogService'), ExtHostTerminalService: createExtId('ExtHostTerminalService'), ExtHostSCM: createExtId('ExtHostSCM'), + ExtHostSearch: createExtId('ExtHostSearch'), ExtHostTask: createExtId('ExtHostTask'), ExtHostWorkspace: createExtId('ExtHostWorkspace'), ExtHostWindow: createExtId('ExtHostWindow'), diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 965c01793e6..e6114f770a4 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -13,7 +13,6 @@ import * as files from 'vs/platform/files/common/files'; import * as path from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; import { asWinJsPromise } from 'vs/base/common/async'; -import { IPatternInfo } from 'vs/platform/search/common/search'; import { values } from 'vs/base/common/map'; import { Range, FileType, FileChangeType, FileChangeType2, FileType2 } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; @@ -157,7 +156,6 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _proxy: MainThreadFileSystemShape; private readonly _fsProvider = new Map(); - private readonly _searchProvider = new Map(); private readonly _linkProvider = new FsLinkProvider(); private _handlePool: number = 0; @@ -216,18 +214,6 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { }; } - registerSearchProvider(scheme: string, provider: vscode.SearchProvider) { - const handle = this._handlePool++; - this._searchProvider.set(handle, provider); - this._proxy.$registerSearchProvider(handle, scheme); - return { - dispose: () => { - this._searchProvider.delete(handle); - this._proxy.$unregisterProvider(handle); - } - }; - } - $stat(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), token)); } @@ -253,33 +239,4 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { $mkdir(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), token)); } - - $provideFileSearchResults(handle: number, session: number, query: string): TPromise { - const provider = this._searchProvider.get(handle); - if (!provider.provideFileSearchResults) { - return TPromise.as(undefined); - } - const progress = { - report: (uri) => { - this._proxy.$handleFindMatch(handle, session, uri); - } - }; - return asWinJsPromise(token => provider.provideFileSearchResults(query, progress, token)); - } - $provideTextSearchResults(handle: number, session: number, pattern: IPatternInfo, options: { includes: string[], excludes: string[] }): TPromise { - const provider = this._searchProvider.get(handle); - if (!provider.provideTextSearchResults) { - return TPromise.as(undefined); - } - const progress = { - report: (data: vscode.TextSearchResult) => { - this._proxy.$handleFindMatch(handle, session, [data.uri, { - lineNumber: data.range.start.line, - preview: data.preview.leading + data.preview.matching + data.preview.trailing, - offsetAndLengths: [[data.preview.leading.length, data.preview.matching.length]] - }]); - } - }; - return asWinJsPromise(token => provider.provideTextSearchResults(pattern, options, progress, token)); - } } diff --git a/src/vs/workbench/api/node/extHostSearch.ts b/src/vs/workbench/api/node/extHostSearch.ts new file mode 100644 index 00000000000..714e9bfe766 --- /dev/null +++ b/src/vs/workbench/api/node/extHostSearch.ts @@ -0,0 +1,64 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { asWinJsPromise } from 'vs/base/common/async'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IPatternInfo } from 'vs/platform/search/common/search'; +import * as vscode from 'vscode'; +import { ExtHostSearchShape, IMainContext, MainContext, MainThreadSearchShape } from './extHost.protocol'; + +export class ExtHostSearch implements ExtHostSearchShape { + + private readonly _proxy: MainThreadSearchShape; + private readonly _searchProvider = new Map(); + private _handlePool: number = 0; + + constructor(mainContext: IMainContext) { + this._proxy = mainContext.getProxy(MainContext.MainThreadSearch); + } + + registerSearchProvider(scheme: string, provider: vscode.SearchProvider) { + const handle = this._handlePool++; + this._searchProvider.set(handle, provider); + this._proxy.$registerSearchProvider(handle, scheme); + return { + dispose: () => { + this._searchProvider.delete(handle); + this._proxy.$unregisterProvider(handle); + } + }; + } + + $provideFileSearchResults(handle: number, session: number, query: string): TPromise { + const provider = this._searchProvider.get(handle); + if (!provider.provideFileSearchResults) { + return TPromise.as(undefined); + } + const progress = { + report: (uri) => { + this._proxy.$handleFindMatch(handle, session, uri); + } + }; + return asWinJsPromise(token => provider.provideFileSearchResults(query, progress, token)); + } + + $provideTextSearchResults(handle: number, session: number, pattern: IPatternInfo, options: { includes: string[], excludes: string[] }): TPromise { + const provider = this._searchProvider.get(handle); + if (!provider.provideTextSearchResults) { + return TPromise.as(undefined); + } + const progress = { + report: (data: vscode.TextSearchResult) => { + this._proxy.$handleFindMatch(handle, session, [data.uri, { + lineNumber: data.range.start.line, + preview: data.preview.leading + data.preview.matching + data.preview.trailing, + offsetAndLengths: [[data.preview.leading.length, data.preview.matching.length]] + }]); + } + }; + return asWinJsPromise(token => provider.provideTextSearchResults(pattern, options, progress, token)); + } +} From 40f2700e7ad8fa5c93b69a27da8c247c504c0f1b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 17 Apr 2018 18:50:05 +0200 Subject: [PATCH 395/710] - Store all current composites with pinned state - Retain the composites states - Compute pinned composites from loaded composite states and current composites - Store on shutdown - Parameter in add api to activate the added composite - Pin the added composite at currect location --- .../parts/activitybar/activitybarPart.ts | 5 ++ .../parts/compositebar/compositeBar.ts | 77 +++++++++++++------ .../browser/parts/panel/panelPart.ts | 5 ++ 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 0fc2fd42342..2382e8f9534 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -242,6 +242,11 @@ export class ActivitybarPart extends Part { return sizes; } + public shutdown(): void { + this.compositeBar.shutdown(); + super.shutdown(); + } + public dispose(): void { if (this.compositeBar) { this.compositeBar.dispose(); diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 682931b6b8f..19b667d8ceb 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -34,6 +34,11 @@ export interface ICompositeBarOptions { hidePart: () => TPromise; } +interface CompositeState { + id: string; + pinned: boolean; +} + export class CompositeBar implements ICompositeBar { private readonly _onDidContextMenu: Emitter; @@ -50,6 +55,7 @@ export class CompositeBar implements ICompositeBar { private compositeIdToActivityStack: { [compositeId: string]: ICompositeActivity[]; }; private compositeSizeInBar: Map; + private initialCompositesStates: CompositeState[]; private pinnedComposites: string[]; private activeCompositeId: string; private activeUnpinnedCompositeId: string; @@ -66,31 +72,35 @@ export class CompositeBar implements ICompositeBar { this.compositeSizeInBar = new Map(); this._onDidContextMenu = new Emitter(); - - const pinnedComposites = JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, null)) as string[]; - if (pinnedComposites) { - const compositeIds = this.options.composites.map(c => c.id); - this.pinnedComposites = pinnedComposites.filter(pcid => compositeIds.indexOf(pcid) >= 0); - } else { - this.pinnedComposites = this.options.composites.map(c => c.id); - } + this.initialCompositesStates = this.loadCompositesStates(); + this.pinnedComposites = this.initialCompositesStates + .filter(c => c.pinned) + .map(c => c.id) + .filter(id => this.options.composites.some(c => c.id === id)); } public get onDidContextMenu(): Event { return this._onDidContextMenu.event; } - public addComposite(compositeData: { id: string; name: string, order: number }, pin: boolean): void { + public addComposite(compositeData: { id: string; name: string, order: number }, activate: boolean): void { if (this.options.composites.filter(c => c.id === compositeData.id).length) { return; } - let i = 0; - while (i < this.options.composites.length && this.options.composites[i].order < compositeData.order) { - i++; - } this.options.composites.push(compositeData); - if (pin) { - this.pin(compositeData.id, true, i); + + const compositeState = this.initialCompositesStates.filter(c => c.id === compositeData.id)[0]; + if (!compositeState /* new composites are pinned by default */ || compositeState.pinned) { + let index; + if (compositeState) { + index = this.initialCompositesStates.indexOf(compositeState); + } else { + index = 0; + while (index < this.options.composites.length && this.options.composites[index].order < compositeData.order) { + index++; + } + } + this.pin(compositeData.id, true, index, activate); } } @@ -437,19 +447,20 @@ export class CompositeBar implements ICompositeBar { }); // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); } public isPinned(compositeId: string): boolean { return this.pinnedComposites.indexOf(compositeId) >= 0; } - public pin(compositeId: string, update = true, index = this.pinnedComposites.length): void { + public pin(compositeId: string, update = true, index = this.pinnedComposites.length, activate: boolean = true): void { if (this.isPinned(compositeId)) { return; } - this.options.openComposite(compositeId).then(() => { + const activatePromise = activate ? this.options.openComposite(compositeId) : TPromise.as(null); + activatePromise.then(() => { this.pinnedComposites.splice(index, 0, compositeId); this.pinnedComposites = arrays.distinct(this.pinnedComposites); @@ -458,7 +469,7 @@ export class CompositeBar implements ICompositeBar { } // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); }); } @@ -490,7 +501,7 @@ export class CompositeBar implements ICompositeBar { }, 0); // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); } public layout(dimension: Dimension): void { @@ -514,8 +525,30 @@ export class CompositeBar implements ICompositeBar { this.updateCompositeSwitcher(); } - private savePinnedComposites(): void { - this.storageService.store(this.options.storageId, JSON.stringify(this.pinnedComposites), StorageScope.GLOBAL); + private loadCompositesStates(): CompositeState[] { + const storedStates = >JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, '[]')); + const compositeStates = storedStates.map(c => + typeof c === 'string' /* migration from pinned states to composites states */ ? { id: c, pinned: true } : c); + + const newComposites = this.options.composites.filter(c => compositeStates.every(s => s.id !== c.id)); + newComposites.sort((c1, c2) => c1.order < c2.order ? -1 : 1); + newComposites.forEach(c => compositeStates.push({ id: c.id, pinned: true /* new composites are pinned by default */ })); + + return compositeStates; + } + + private saveCompositesStates(): void { + const toSave = this.pinnedComposites.map(id => ({ id, pinned: true })); + for (const composite of this.options.composites) { + if (this.pinnedComposites.indexOf(composite.id) === -1) { // Unpinned composites + toSave.push({ id: composite.id, pinned: false }); + } + } + this.storageService.store(this.options.storageId, JSON.stringify(toSave), StorageScope.GLOBAL); + } + + public shutdown(): void { + this.saveCompositesStates(); } public dispose(): void { diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 747f4c56d68..d339b0cfe04 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -243,6 +243,11 @@ export class PanelPart extends CompositePart implements IPanelService { return sizes; } + public shutdown(): void { + this.compositeBar.shutdown(); + super.shutdown(); + } + private layoutCompositeBar(): void { if (this.dimension) { let availableWidth = this.dimension.width - 40; // take padding into account From d518eae0a27dc752390bb37529a8192f1c903c97 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 17 Apr 2018 18:53:15 +0200 Subject: [PATCH 396/710] Fix the order of contributed groups --- src/vs/workbench/api/browser/activitybarExtensionPoint.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts index f39772adead..bcb3c89c92c 100644 --- a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts +++ b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts @@ -87,7 +87,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { if (!schema.isValidActivityGroup(value, collector)) { return; } - value.forEach(descriptor => { + value.forEach((descriptor, index) => { const id = `workbench.view.extension.${descriptor.id}`; const title = descriptor.title; const cssClass = `extensionViewlet-${descriptor.id}`; @@ -120,7 +120,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { id, title, cssClass, - -1 + 6 + index ); Registry.as(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor); From 4fca46dcc8d7bdf3168cc6d9f700fcfe1263378e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 17 Apr 2018 18:55:19 +0200 Subject: [PATCH 397/710] [json] adopt new folding APIs --- .../client/src/jsonMain.ts | 28 ++++++++++++++----- .../json-language-features/package.json | 8 +++--- .../server/package.json | 4 +-- .../server/src/jsonServerMain.ts | 26 ++++++++++------- .../json-language-features/server/yarn.lock | 12 ++++---- extensions/json-language-features/yarn.lock | 6 ++-- 6 files changed, 52 insertions(+), 32 deletions(-) diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index 78126d24e6d..ee895024bae 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -12,7 +12,7 @@ import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfig import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, CancellationToken } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; -import { FoldingRangesRequest, FoldingRangeRequestParam } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; import { hash } from './utils/hash'; @@ -97,6 +97,21 @@ export function activate(context: ExtensionContext) { // Create the language client and start the client. let client = new LanguageClient('json', localize('jsonserver.name', 'JSON Language Server'), serverOptions, clientOptions); client.registerProposedFeatures(); + client.registerFeature({ + fillClientCapabilities(capabilities: FoldingRangeClientCapabilities): void { + let textDocumentCap = capabilities.textDocument; + if (!textDocumentCap) { + textDocumentCap = capabilities.textDocument = {}; + } + textDocumentCap.foldingRange = { + dynamicRegistration: false, + rangeLimit: 5000, + lineFoldingOnly: true + }; + }, + initialize(capabilities, documentSelector): void { + } + }); let disposable = client.start(); toDispose.push(disposable); @@ -144,16 +159,15 @@ export function activate(context: ExtensionContext) { return languages.registerFoldingProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { const param: FoldingRangeRequestParam = { - textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), - maxRanges: context.maxRanges + textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) }; - return client.sendRequest(FoldingRangesRequest.type, param, token).then(res => { - if (res && Array.isArray(res.ranges)) { - return new FoldingRangeList(res.ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.type))); + return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { + if (Array.isArray(ranges)) { + return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind))); } return null; }, error => { - client.logFailedRequest(FoldingRangesRequest.type, error); + client.logFailedRequest(FoldingRangeRequest.type, error); return null; }); } diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 1632b67bccf..807a17db050 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -20,9 +20,9 @@ "postinstall": "cd server && yarn install", "install-client-next": "yarn add vscode-languageclient@next" }, - "categories": [ - "Programming Languages" - ], + "categories": [ + "Programming Languages" + ], "contributes": { "configuration": { "id": "json", @@ -102,7 +102,7 @@ "dependencies": { "vscode-extension-telemetry": "0.0.15", "vscode-languageclient": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1", + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2" }, "devDependencies": { diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 0fef4531f08..3f4cc7718cc 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -13,9 +13,9 @@ "dependencies": { "jsonc-parser": "^2.0.0-next.1", "request-light": "^0.2.2", - "vscode-json-languageservice": "^3.1.2-next.1", + "vscode-json-languageservice": "^3.1.2-next.2", "vscode-languageserver": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1", + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2", "vscode-uri": "^1.0.3" }, diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts index 0ecb72259cd..eb1587786b9 100644 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ b/extensions/json-language-features/server/src/jsonServerMain.ts @@ -19,7 +19,7 @@ import { formatError, runSafe, runSafeAsync } from './utils/runner'; import { JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration } from 'vscode-json-languageservice'; import { getLanguageModelCache } from './languageModelCache'; -import { FoldingRangesRequest, FoldingProviderServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; interface ISchemaAssociations { [pattern: string]: string[]; @@ -60,22 +60,28 @@ documents.listen(connection); let clientSnippetSupport = false; let clientDynamicRegisterSupport = false; +let foldingRangeLimit = Number.MAX_VALUE; // After the server has started the client sends an initialize request. The server receives // in the passed params the rootPath of the workspace plus the client capabilities. connection.onInitialize((params: InitializeParams): InitializeResult => { - function hasClientCapability(...keys: string[]) { - let c = params.capabilities as any; + function getClientCapability(name: string, def: T) { + let keys = name.split('.'); + let c: any = params.capabilities; for (let i = 0; c && i < keys.length; i++) { + if (!c.hasOwnProperty(keys[i])) { + return def; + } c = c[keys[i]]; } - return !!c; + return c; } - clientSnippetSupport = hasClientCapability('textDocument', 'completion', 'completionItem', 'snippetSupport'); - clientDynamicRegisterSupport = hasClientCapability('workspace', 'symbol', 'dynamicRegistration'); - let capabilities: ServerCapabilities & FoldingProviderServerCapabilities = { + clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); + clientDynamicRegisterSupport = getClientCapability('workspace.symbol.dynamicRegistration', false); + foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); + let capabilities: ServerCapabilities & FoldingRangeServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['"', ':'] } : void 0, @@ -83,7 +89,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { documentSymbolProvider: true, documentRangeFormattingProvider: false, colorProvider: true, - foldingProvider: true + foldingRangeProvider: true }; return { capabilities }; @@ -364,11 +370,11 @@ connection.onColorPresentation((params, token) => { }, [], `Error while computing color presentations for ${params.textDocument.uri}`, token); }); -connection.onRequest(FoldingRangesRequest.type, (params, token) => { +connection.onRequest(FoldingRangeRequest.type, (params, token) => { return runSafe(() => { let document = documents.get(params.textDocument.uri); if (document) { - return languageService.getFoldingRanges(document, { maxRanges: params.maxRanges }); + return languageService.getFoldingRanges(document, { rangeLimit: foldingRangeLimit }); } return null; }, null, `Error while computing folding ranges for ${params.textDocument.uri}`, token); diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock index 1ae1cc93da0..26fe2245dcd 100644 --- a/extensions/json-language-features/server/yarn.lock +++ b/extensions/json-language-features/server/yarn.lock @@ -72,9 +72,9 @@ request-light@^0.2.2: https-proxy-agent "2.1.1" vscode-nls "^2.0.2" -vscode-json-languageservice@^3.1.2-next.1: - version "3.1.2-next.1" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.1.2-next.1.tgz#8acee581c664e2af72ade2f08252aeae9b5918ca" +vscode-json-languageservice@^3.1.2-next.2: + version "3.1.2-next.2" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.1.2-next.2.tgz#da5346e5c22edbce739f29c110eb41732d41dc2d" dependencies: jsonc-parser "^2.0.0" vscode-languageserver-types "^3.6.1" @@ -85,9 +85,9 @@ vscode-jsonrpc@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0" diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 2db2da5dbe9..2a2706462ef 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -44,9 +44,9 @@ vscode-languageclient@^4.0.0: dependencies: vscode-languageserver-protocol "^3.6.0" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0" From a322ceb0f6af917aa8ed6a6e51736c6e481848e5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 17 Apr 2018 19:04:59 +0200 Subject: [PATCH 398/710] [html] adopt folding APIs --- .../client/src/htmlMain.ts | 28 ++++++++++++----- .../html-language-features/package.json | 6 ++-- .../server/package.json | 6 ++-- .../server/src/htmlServerMain.ts | 30 +++++++++++-------- .../server/src/modes/cssMode.ts | 2 +- .../server/src/modes/htmlFolding.ts | 6 ++-- .../server/src/modes/htmlMode.ts | 2 +- .../server/src/modes/javascriptMode.ts | 4 +-- .../server/src/test/folding.test.ts | 12 ++++---- .../html-language-features/server/yarn.lock | 18 +++++------ extensions/html-language-features/yarn.lock | 6 ++-- 11 files changed, 70 insertions(+), 50 deletions(-) diff --git a/extensions/html-language-features/client/src/htmlMain.ts b/extensions/html-language-features/client/src/htmlMain.ts index b90975f8b4a..1cde186c175 100644 --- a/extensions/html-language-features/client/src/htmlMain.ts +++ b/extensions/html-language-features/client/src/htmlMain.ts @@ -14,7 +14,7 @@ import { EMPTY_ELEMENTS } from './htmlEmptyTagsShared'; import { activateTagClosing } from './tagClosing'; import TelemetryReporter from 'vscode-extension-telemetry'; -import { FoldingRangesRequest, FoldingRangeRequestParam } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; namespace TagCloseRequest { export const type: RequestType = new RequestType('html/tag'); @@ -64,6 +64,21 @@ export function activate(context: ExtensionContext) { // Create the language client and start the client. let client = new LanguageClient('html', localize('htmlserver.name', 'HTML Language Server'), serverOptions, clientOptions); client.registerProposedFeatures(); + client.registerFeature({ + fillClientCapabilities(capabilities: FoldingRangeClientCapabilities): void { + let textDocumentCap = capabilities.textDocument; + if (!textDocumentCap) { + textDocumentCap = capabilities.textDocument = {}; + } + textDocumentCap.foldingRange = { + dynamicRegistration: false, + rangeLimit: 5000, + lineFoldingOnly: true + }; + }, + initialize(capabilities, documentSelector): void { + } + }); let disposable = client.start(); toDispose.push(disposable); @@ -162,16 +177,15 @@ export function activate(context: ExtensionContext) { return languages.registerFoldingProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { const param: FoldingRangeRequestParam = { - textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), - maxRanges: context.maxRanges + textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) }; - return client.sendRequest(FoldingRangesRequest.type, param, token).then(res => { - if (res && Array.isArray(res.ranges)) { - return new FoldingRangeList(res.ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.type))); + return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { + if (Array.isArray(ranges)) { + return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind))); } return null; }, error => { - client.logFailedRequest(FoldingRangesRequest.type, error); + client.logFailedRequest(FoldingRangeRequest.type, error); return null; }); } diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index f90024e779e..7de2bb112bc 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -22,8 +22,8 @@ "install-client-next": "yarn add vscode-languageclient@next" }, "categories": [ - "Programming Languages" - ], + "Programming Languages" + ], "contributes": { "configuration": { "id": "html", @@ -174,7 +174,7 @@ "dependencies": { "vscode-extension-telemetry": "0.0.15", "vscode-languageclient": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1", + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2" }, "devDependencies": { diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 839f00984fa..1ee90e635c3 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -8,11 +8,11 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.6", + "vscode-css-languageservice": "^3.0.9-next.7", "vscode-emmet-helper": "1.2.5", - "vscode-html-languageservice": "^2.1.3-next.1", + "vscode-html-languageservice": "^2.1.3-next.2", "vscode-languageserver": "^4.0.0", - "vscode-languageserver-protocol-foldingprovider": "^1.0.1", + "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-languageserver-types": "^3.6.1", "vscode-nls": "^3.2.2", "vscode-uri": "^1.0.3" diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts index 7d84f226c16..c054ca83845 100644 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ b/extensions/html-language-features/server/src/htmlServerMain.ts @@ -20,7 +20,7 @@ import uri from 'vscode-uri'; import { formatError, runSafe, runSafeAsync } from './utils/runner'; import { doComplete as emmetDoComplete, updateExtensionsPath as updateEmmetExtensionsPath, getEmmetCompletionParticipants } from 'vscode-emmet-helper'; -import { FoldingRangesRequest, FoldingProviderServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRangeRequest, FoldingRangeServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; import { getFoldingRanges } from './modes/htmlFolding'; namespace TagCloseRequest { @@ -55,6 +55,7 @@ let clientSnippetSupport = false; let clientDynamicRegisterSupport = false; let scopedSettingsSupport = false; let workspaceFoldersSupport = false; +let foldingRangeLimit = Number.MAX_VALUE; var globalSettings: Settings = {}; let documentSettings: { [key: string]: Thenable } = {}; @@ -106,19 +107,24 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { languageModes.dispose(); }); - function hasClientCapability(...keys: string[]) { - let c = params.capabilities; + function getClientCapability(name: string, def: T) { + let keys = name.split('.'); + let c: any = params.capabilities; for (let i = 0; c && i < keys.length; i++) { + if (!c.hasOwnProperty(keys[i])) { + return def; + } c = c[keys[i]]; } - return !!c; + return c; } - clientSnippetSupport = hasClientCapability('textDocument', 'completion', 'completionItem', 'snippetSupport'); - clientDynamicRegisterSupport = hasClientCapability('workspace', 'symbol', 'dynamicRegistration'); - scopedSettingsSupport = hasClientCapability('workspace', 'configuration'); - workspaceFoldersSupport = hasClientCapability('workspace', 'workspaceFolders'); - let capabilities: ServerCapabilities & FoldingProviderServerCapabilities = { + clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); + clientDynamicRegisterSupport = getClientCapability('workspace.symbol.dynamicRegistration', false); + scopedSettingsSupport = getClientCapability('workspace.configuration', false); + workspaceFoldersSupport = getClientCapability('workspace.workspaceFolders', false); + foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); + let capabilities: ServerCapabilities & FoldingRangeServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: [...emmetTriggerCharacters, '.', ':', '<', '"', '=', '/'] } : undefined, @@ -131,7 +137,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { signatureHelpProvider: { triggerCharacters: ['('] }, referencesProvider: true, colorProvider: true, - foldingProvider: true + foldingRangeProvider: true }; return { capabilities }; }); @@ -461,11 +467,11 @@ connection.onRequest(TagCloseRequest.type, (params, token) => { }, null, `Error while computing tag close actions for ${params.textDocument.uri}`, token); }); -connection.onRequest(FoldingRangesRequest.type, (params, token) => { +connection.onRequest(FoldingRangeRequest.type, (params, token) => { return runSafe(() => { let document = documents.get(params.textDocument.uri); if (document) { - return getFoldingRanges(languageModes, document, params.maxRanges, token); + return getFoldingRanges(languageModes, document, foldingRangeLimit, token); } return null; }, null, `Error while computing folding regions for ${params.textDocument.uri}`, token); diff --git a/extensions/html-language-features/server/src/modes/cssMode.ts b/extensions/html-language-features/server/src/modes/cssMode.ts index 4c240754610..1b40285ef0d 100644 --- a/extensions/html-language-features/server/src/modes/cssMode.ts +++ b/extensions/html-language-features/server/src/modes/cssMode.ts @@ -77,7 +77,7 @@ export function getCSSMode(documentRegions: LanguageModelCache r.startLine >= range.start.line && r.endLine < range.end.line); }, onDocumentRemoved(document: TextDocument) { diff --git a/extensions/html-language-features/server/src/modes/htmlFolding.ts b/extensions/html-language-features/server/src/modes/htmlFolding.ts index 0b8654f43aa..429dc3ac1a2 100644 --- a/extensions/html-language-features/server/src/modes/htmlFolding.ts +++ b/extensions/html-language-features/server/src/modes/htmlFolding.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; import { TextDocument, CancellationToken, Position, Range } from 'vscode-languageserver'; -import { FoldingRange, FoldingRangeList } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRange } from 'vscode-languageserver-protocol-foldingprovider'; import { LanguageModes } from './languageModes'; -export function getFoldingRanges(languageModes: LanguageModes, document: TextDocument, maxRanges: number | undefined, cancellationToken: CancellationToken | null): FoldingRangeList { +export function getFoldingRanges(languageModes: LanguageModes, document: TextDocument, maxRanges: number | undefined, cancellationToken: CancellationToken | null): FoldingRange[] { let htmlMode = languageModes.getMode('html'); let range = Range.create(Position.create(0, 0), Position.create(document.lineCount, 0)); let ranges: FoldingRange[] = []; @@ -24,7 +24,7 @@ export function getFoldingRanges(languageModes: LanguageModes, document: TextDoc if (maxRanges && ranges.length > maxRanges) { ranges = limitRanges(ranges, maxRanges); } - return { ranges }; + return ranges; } function limitRanges(ranges: FoldingRange[], maxRanges: number) { diff --git a/extensions/html-language-features/server/src/modes/htmlMode.ts b/extensions/html-language-features/server/src/modes/htmlMode.ts index 5176fb3eed2..d906ecde4ca 100644 --- a/extensions/html-language-features/server/src/modes/htmlMode.ts +++ b/extensions/html-language-features/server/src/modes/htmlMode.ts @@ -64,7 +64,7 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: return htmlLanguageService.format(document, range, formatSettings); }, getFoldingRanges(document: TextDocument, range: Range): FoldingRange[] { - let ranges = htmlLanguageService.getFoldingRanges(document).ranges; + let ranges = htmlLanguageService.getFoldingRanges(document); return ranges.filter(r => r.startLine >= range.start.line && r.endLine < range.end.line); }, doAutoClose(document: TextDocument, position: Position) { diff --git a/extensions/html-language-features/server/src/modes/javascriptMode.ts b/extensions/html-language-features/server/src/modes/javascriptMode.ts index 97a9c5877af..8cbbfce39c8 100644 --- a/extensions/html-language-features/server/src/modes/javascriptMode.ts +++ b/extensions/html-language-features/server/src/modes/javascriptMode.ts @@ -12,7 +12,7 @@ import { HTMLDocumentRegions } from './embeddedSupport'; import * as ts from 'typescript'; import { join } from 'path'; -import { FoldingRange, FoldingRangeType } from 'vscode-languageserver-protocol-foldingprovider'; +import { FoldingRange, FoldingRangeKind } from 'vscode-languageserver-protocol-foldingprovider'; const FILE_NAME = 'vscode://javascript/1'; // the same 'file' is used for all contents const JQUERY_D_TS = join(__dirname, '../../lib/jquery.d.ts'); @@ -291,7 +291,7 @@ export function getJavaScriptMode(documentRegions: LanguageModelCache r1.startLine - r2.startLine); assert.deepEqual(actualRanges, expected, message); } -function r(startLine: number, endLine: number, type?: string): ExpectedIndentRange { - return { startLine, endLine, type }; +function r(startLine: number, endLine: number, kind?: string): ExpectedIndentRange { + return { startLine, endLine, kind }; } suite('HTML Folding', () => { @@ -160,7 +160,7 @@ suite('HTML Folding', () => { /*10*/'', ]; assertRanges(input, [r(0, 9), r(1, 8), r(2, 7), r(3, 7, 'region'), r(4, 6, 'region')]); - }); + }); // test('Embedded JavaScript - multi line comment', () => { diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 1c58a8ba9ff..627e66f8462 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -18,9 +18,9 @@ jsonc-parser@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" -vscode-css-languageservice@^3.0.9-next.6: - version "3.0.9-next.6" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.6.tgz#4da4d25eabb101713f21e8eb60b6042e504fbd97" +vscode-css-languageservice@^3.0.9-next.7: + version "3.0.9-next.7" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.7.tgz#1eb8deadaa6bfaf55187656ea6fb6b7e8d71cd7f" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" @@ -33,9 +33,9 @@ vscode-emmet-helper@1.2.5: jsonc-parser "^1.0.0" vscode-languageserver-types "^3.6.0-next.1" -vscode-html-languageservice@^2.1.3-next.1: - version "2.1.3-next.1" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.3-next.1.tgz#bf8a36fc87d10b833211ff7adeb142a06fd18c61" +vscode-html-languageservice@^2.1.3-next.2: + version "2.1.3-next.2" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.3-next.2.tgz#911821cada8a237bd6773569851658c733409d65" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" @@ -45,9 +45,9 @@ vscode-jsonrpc@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0" diff --git a/extensions/html-language-features/yarn.lock b/extensions/html-language-features/yarn.lock index 8adc0154a74..4c8da33fb9b 100644 --- a/extensions/html-language-features/yarn.lock +++ b/extensions/html-language-features/yarn.lock @@ -44,9 +44,9 @@ vscode-languageclient@^4.0.0: dependencies: vscode-languageserver-protocol "^3.6.0" -vscode-languageserver-protocol-foldingprovider@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-1.0.1.tgz#85514aaf8fe905e91bf21e4106e0847f60d40f44" +vscode-languageserver-protocol-foldingprovider@^2.0.0-next.2: + version "2.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol-foldingprovider/-/vscode-languageserver-protocol-foldingprovider-2.0.0-next.2.tgz#fbb9cfdf5b8c4ac451826ba6312f1f88379f35b0" dependencies: vscode-languageserver-protocol "^3.6.0" vscode-languageserver-types "^3.6.0" From 6dd59dc7cdf7661b5fabc42cb053eb7e06877981 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 17 Apr 2018 10:43:33 +0200 Subject: [PATCH 399/710] - Add to composite bar when new composite is added - Sequential order for in-built viewlets --- src/vs/workbench/browser/composite.ts | 5 +++++ .../workbench/browser/parts/activitybar/activitybarPart.ts | 4 +++- src/vs/workbench/browser/parts/compositePart.ts | 2 +- src/vs/workbench/browser/parts/compositebar/compositeBar.ts | 6 ++++-- src/vs/workbench/browser/parts/panel/panelPart.ts | 4 +++- .../parts/debug/electron-browser/debug.contribution.ts | 2 +- .../extensions/electron-browser/extensions.contribution.ts | 2 +- .../parts/scm/electron-browser/scm.contribution.ts | 2 +- .../parts/search/electron-browser/search.contribution.ts | 2 +- src/vs/workbench/services/viewlet/browser/viewlet.ts | 1 + src/vs/workbench/services/viewlet/browser/viewletService.ts | 1 + 11 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index 04e72f4dfa8..545f12395cf 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -242,6 +242,10 @@ export abstract class CompositeDescriptor { } export abstract class CompositeRegistry { + + private readonly _onDidRegister: Emitter> = new Emitter>(); + readonly onDidRegister: Event> = this._onDidRegister.event; + private composites: CompositeDescriptor[]; constructor() { @@ -254,6 +258,7 @@ export abstract class CompositeRegistry { } this.composites.push(descriptor); + this._onDidRegister.fire(descriptor); } public getComposite(id: string): CompositeDescriptor { diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 298b44a0160..0fc2fd42342 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -87,6 +87,8 @@ export class ActivitybarPart extends Part { private registerListeners(): void { + this.toUnbind.push(this.viewletService.onDidViewletRegister(viewletDescriptor => this.compositeBar.addComposite(viewletDescriptor, false))); + // Activate viewlet action on opening of a viewlet this.toUnbind.push(this.viewletService.onDidViewletOpen(viewlet => this.compositeBar.activateComposite(viewlet.getId()))); @@ -95,7 +97,7 @@ export class ActivitybarPart extends Part { this.toUnbind.push(this.compositeBar.onDidContextMenu(e => this.showContextMenu(e))); this.toUnbind.push(this.viewletService.onDidViewletEnablementChange(({ id, enabled }) => { if (enabled) { - this.compositeBar.addComposite(this.viewletService.getViewlet(id)); + this.compositeBar.addComposite(this.viewletService.getViewlet(id), true); } else { this.compositeBar.removeComposite(id); } diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index e9b89555eea..5e919a5668c 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -77,7 +77,7 @@ export abstract class CompositePart extends Part { private keybindingService: IKeybindingService, protected instantiationService: IInstantiationService, themeService: IThemeService, - private registry: CompositeRegistry, + protected readonly registry: CompositeRegistry, private activeCompositeSettingsKey: string, private defaultCompositeId: string, private nameForTelemetry: string, diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 6b6e3cd458d..682931b6b8f 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -80,7 +80,7 @@ export class CompositeBar implements ICompositeBar { return this._onDidContextMenu.event; } - public addComposite(compositeData: { id: string; name: string, order: number }): void { + public addComposite(compositeData: { id: string; name: string, order: number }, pin: boolean): void { if (this.options.composites.filter(c => c.id === compositeData.id).length) { return; } @@ -89,7 +89,9 @@ export class CompositeBar implements ICompositeBar { i++; } this.options.composites.push(compositeData); - this.pin(compositeData.id, true, i); + if (pin) { + this.pin(compositeData.id, true, i); + } } public removeComposite(id: string): void { diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index d2972c69150..747f4c56d68 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -100,6 +100,8 @@ export class PanelPart extends CompositePart implements IPanelService { private registerListeners(): void { + this.toUnbind.push(this.registry.onDidRegister(panelDescriptor => this.compositeBar.addComposite(panelDescriptor, false))); + // Activate panel action on opening of a panel this.toUnbind.push(this.onDidPanelOpen(panel => { this.compositeBar.activateComposite(panel.getId()); @@ -180,7 +182,7 @@ export class PanelPart extends CompositePart implements IPanelService { if (descriptor && descriptor.enabled !== enabled) { descriptor.enabled = enabled; if (enabled) { - this.compositeBar.addComposite(descriptor); + this.compositeBar.addComposite(descriptor, true); } else { this.compositeBar.removeComposite(id); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 2b6f3550af8..c3f0e87d3df 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -86,7 +86,7 @@ Registry.as(ViewletExtensions.Viewlets).registerViewlet(new Vie VIEWLET_ID, nls.localize('debug', "Debug"), 'debug', - 40 + 3 )); const openViewletKb: IKeybindings = { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index 17911ae1a23..c884bb1d179 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -120,7 +120,7 @@ const viewletDescriptor = new ViewletDescriptor( VIEWLET_ID, localize('extensions', "Extensions"), 'extensions', - 100 + 4 ); Registry.as(ViewletExtensions.Viewlets) 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 9b3b978ffcf..95bc4991d0f 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -39,7 +39,7 @@ const viewletDescriptor = new ViewletDescriptor( VIEWLET_ID, localize('source control', "Source Control"), 'scm', - 36 + 2 ); Registry.as(ViewletExtensions.Viewlets) diff --git a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts index 5b65ba18480..90b31f579d5 100644 --- a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts @@ -420,7 +420,7 @@ Registry.as(ViewletExtensions.Viewlets).registerViewlet(new Vie VIEW_ID, nls.localize('name', "Search"), 'search', - 10 + 1 )); Registry.as(PanelExtensions.Panels).registerPanel(new PanelDescriptor( diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index ba1f9f17a5f..02006a2397a 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -16,6 +16,7 @@ export const IViewletService = createDecorator('viewletService' export interface IViewletService { _serviceBrand: ServiceIdentifier; + onDidViewletRegister: Event; onDidViewletOpen: Event; onDidViewletClose: Event; onDidViewletEnablementChange: Event<{ id: string, enabled: boolean }>; diff --git a/src/vs/workbench/services/viewlet/browser/viewletService.ts b/src/vs/workbench/services/viewlet/browser/viewletService.ts index a54cd61ec89..0a5271c8081 100644 --- a/src/vs/workbench/services/viewlet/browser/viewletService.ts +++ b/src/vs/workbench/services/viewlet/browser/viewletService.ts @@ -33,6 +33,7 @@ export class ViewletService implements IViewletService { private _onDidViewletEnable = new Emitter<{ id: string, enabled: boolean }>(); private disposables: IDisposable[] = []; + public get onDidViewletRegister(): Event { return >this.viewletRegistry.onDidRegister; } public get onDidViewletOpen(): Event { return this.sidebarPart.onDidViewletOpen; } public get onDidViewletClose(): Event { return this.sidebarPart.onDidViewletClose; } public get onDidViewletEnablementChange(): Event<{ id: string, enabled: boolean }> { return this._onDidViewletEnable.event; } From ddbd627a9a4d340d21ab2fed3152d522c5b02d74 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 17 Apr 2018 18:50:05 +0200 Subject: [PATCH 400/710] - Store all current composites with pinned state - Retain the composites states - Compute pinned composites from loaded composite states and current composites - Store on shutdown - Parameter in add api to activate the added composite - Pin the added composite at currect location --- .../parts/activitybar/activitybarPart.ts | 5 ++ .../parts/compositebar/compositeBar.ts | 77 +++++++++++++------ .../browser/parts/panel/panelPart.ts | 5 ++ 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 0fc2fd42342..2382e8f9534 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -242,6 +242,11 @@ export class ActivitybarPart extends Part { return sizes; } + public shutdown(): void { + this.compositeBar.shutdown(); + super.shutdown(); + } + public dispose(): void { if (this.compositeBar) { this.compositeBar.dispose(); diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 682931b6b8f..19b667d8ceb 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -34,6 +34,11 @@ export interface ICompositeBarOptions { hidePart: () => TPromise; } +interface CompositeState { + id: string; + pinned: boolean; +} + export class CompositeBar implements ICompositeBar { private readonly _onDidContextMenu: Emitter; @@ -50,6 +55,7 @@ export class CompositeBar implements ICompositeBar { private compositeIdToActivityStack: { [compositeId: string]: ICompositeActivity[]; }; private compositeSizeInBar: Map; + private initialCompositesStates: CompositeState[]; private pinnedComposites: string[]; private activeCompositeId: string; private activeUnpinnedCompositeId: string; @@ -66,31 +72,35 @@ export class CompositeBar implements ICompositeBar { this.compositeSizeInBar = new Map(); this._onDidContextMenu = new Emitter(); - - const pinnedComposites = JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, null)) as string[]; - if (pinnedComposites) { - const compositeIds = this.options.composites.map(c => c.id); - this.pinnedComposites = pinnedComposites.filter(pcid => compositeIds.indexOf(pcid) >= 0); - } else { - this.pinnedComposites = this.options.composites.map(c => c.id); - } + this.initialCompositesStates = this.loadCompositesStates(); + this.pinnedComposites = this.initialCompositesStates + .filter(c => c.pinned) + .map(c => c.id) + .filter(id => this.options.composites.some(c => c.id === id)); } public get onDidContextMenu(): Event { return this._onDidContextMenu.event; } - public addComposite(compositeData: { id: string; name: string, order: number }, pin: boolean): void { + public addComposite(compositeData: { id: string; name: string, order: number }, activate: boolean): void { if (this.options.composites.filter(c => c.id === compositeData.id).length) { return; } - let i = 0; - while (i < this.options.composites.length && this.options.composites[i].order < compositeData.order) { - i++; - } this.options.composites.push(compositeData); - if (pin) { - this.pin(compositeData.id, true, i); + + const compositeState = this.initialCompositesStates.filter(c => c.id === compositeData.id)[0]; + if (!compositeState /* new composites are pinned by default */ || compositeState.pinned) { + let index; + if (compositeState) { + index = this.initialCompositesStates.indexOf(compositeState); + } else { + index = 0; + while (index < this.options.composites.length && this.options.composites[index].order < compositeData.order) { + index++; + } + } + this.pin(compositeData.id, true, index, activate); } } @@ -437,19 +447,20 @@ export class CompositeBar implements ICompositeBar { }); // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); } public isPinned(compositeId: string): boolean { return this.pinnedComposites.indexOf(compositeId) >= 0; } - public pin(compositeId: string, update = true, index = this.pinnedComposites.length): void { + public pin(compositeId: string, update = true, index = this.pinnedComposites.length, activate: boolean = true): void { if (this.isPinned(compositeId)) { return; } - this.options.openComposite(compositeId).then(() => { + const activatePromise = activate ? this.options.openComposite(compositeId) : TPromise.as(null); + activatePromise.then(() => { this.pinnedComposites.splice(index, 0, compositeId); this.pinnedComposites = arrays.distinct(this.pinnedComposites); @@ -458,7 +469,7 @@ export class CompositeBar implements ICompositeBar { } // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); }); } @@ -490,7 +501,7 @@ export class CompositeBar implements ICompositeBar { }, 0); // Persist - this.savePinnedComposites(); + this.saveCompositesStates(); } public layout(dimension: Dimension): void { @@ -514,8 +525,30 @@ export class CompositeBar implements ICompositeBar { this.updateCompositeSwitcher(); } - private savePinnedComposites(): void { - this.storageService.store(this.options.storageId, JSON.stringify(this.pinnedComposites), StorageScope.GLOBAL); + private loadCompositesStates(): CompositeState[] { + const storedStates = >JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, '[]')); + const compositeStates = storedStates.map(c => + typeof c === 'string' /* migration from pinned states to composites states */ ? { id: c, pinned: true } : c); + + const newComposites = this.options.composites.filter(c => compositeStates.every(s => s.id !== c.id)); + newComposites.sort((c1, c2) => c1.order < c2.order ? -1 : 1); + newComposites.forEach(c => compositeStates.push({ id: c.id, pinned: true /* new composites are pinned by default */ })); + + return compositeStates; + } + + private saveCompositesStates(): void { + const toSave = this.pinnedComposites.map(id => ({ id, pinned: true })); + for (const composite of this.options.composites) { + if (this.pinnedComposites.indexOf(composite.id) === -1) { // Unpinned composites + toSave.push({ id: composite.id, pinned: false }); + } + } + this.storageService.store(this.options.storageId, JSON.stringify(toSave), StorageScope.GLOBAL); + } + + public shutdown(): void { + this.saveCompositesStates(); } public dispose(): void { diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 747f4c56d68..d339b0cfe04 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -243,6 +243,11 @@ export class PanelPart extends CompositePart implements IPanelService { return sizes; } + public shutdown(): void { + this.compositeBar.shutdown(); + super.shutdown(); + } + private layoutCompositeBar(): void { if (this.dimension) { let availableWidth = this.dimension.width - 40; // take padding into account From 43a71a9a58b76ce73869aa60aa98685a4b4275ba Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 17 Apr 2018 10:30:08 -0700 Subject: [PATCH 401/710] Merge electron-browser/terminal into node/terminal --- .../electron-browser/terminal.contribution.ts | 2 +- .../terminal/electron-browser/terminal.ts | 53 ------------------- .../electron-browser/terminalService.ts | 2 +- .../workbench/parts/terminal/node/terminal.ts | 49 +++++++++++++++++ 4 files changed, 51 insertions(+), 55 deletions(-) delete mode 100644 src/vs/workbench/parts/terminal/electron-browser/terminal.ts diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 11667f01d74..d148d55861b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -14,7 +14,7 @@ import * as platform from 'vs/base/common/platform'; import * as terminalCommands from 'vs/workbench/parts/terminal/common/terminalCommands'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TerminalCursorStyle, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE } from 'vs/workbench/parts/terminal/common/terminal'; -import { getTerminalDefaultShellUnixLike, getTerminalDefaultShellWindows } from 'vs/workbench/parts/terminal/electron-browser/terminal'; +import { getTerminalDefaultShellUnixLike, getTerminalDefaultShellWindows } from 'vs/workbench/parts/terminal/node/terminal'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts deleted file mode 100644 index e6d1478907d..00000000000 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ /dev/null @@ -1,53 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as os from 'os'; -import * as platform from 'vs/base/common/platform'; -import * as processes from 'vs/base/node/processes'; -import { readFile, fileExists } from 'vs/base/node/pfs'; - -let _TERMINAL_DEFAULT_SHELL_UNIX_LIKE: string = null; -export function getTerminalDefaultShellUnixLike(): string { - if (!_TERMINAL_DEFAULT_SHELL_UNIX_LIKE) { - let unixLikeTerminal = 'sh'; - if (!platform.isWindows && process.env.SHELL) { - unixLikeTerminal = process.env.SHELL; - // Some systems have $SHELL set to /bin/false which breaks the terminal - if (unixLikeTerminal === '/bin/false') { - unixLikeTerminal = '/bin/bash'; - } - } - _TERMINAL_DEFAULT_SHELL_UNIX_LIKE = unixLikeTerminal; - } - return _TERMINAL_DEFAULT_SHELL_UNIX_LIKE; -} - -let _TERMINAL_DEFAULT_SHELL_WINDOWS: string = null; -export function getTerminalDefaultShellWindows(): string { - if (!_TERMINAL_DEFAULT_SHELL_WINDOWS) { - const isAtLeastWindows10 = platform.isWindows && parseFloat(os.release()) >= 10; - const is32ProcessOn64Windows = process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); - const powerShellPath = `${process.env.windir}\\${is32ProcessOn64Windows ? 'Sysnative' : 'System32'}\\WindowsPowerShell\\v1.0\\powershell.exe`; - _TERMINAL_DEFAULT_SHELL_WINDOWS = isAtLeastWindows10 ? powerShellPath : processes.getWindowsShell(); - } - return _TERMINAL_DEFAULT_SHELL_WINDOWS; -} - -if (platform.isLinux) { - const file = '/etc/os-release'; - fileExists(file).then(exists => { - if (!exists) { - return; - } - readFile(file).then(b => { - const contents = b.toString(); - if (contents.indexOf('NAME=Fedora') >= 0) { - isFedora = true; - } - }); - }); -} - -export let isFedora = false; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index c99a2433259..bb679403d11 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -19,7 +19,7 @@ import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-brows import { TPromise } from 'vs/base/common/winjs.base'; import Severity from 'vs/base/common/severity'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { getTerminalDefaultShellWindows } from 'vs/workbench/parts/terminal/electron-browser/terminal'; +import { getTerminalDefaultShellWindows } from 'vs/workbench/parts/terminal/node/terminal'; import { TerminalPanel } from 'vs/workbench/parts/terminal/electron-browser/terminalPanel'; import { TerminalTab } from 'vs/workbench/parts/terminal/browser/terminalTab'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; diff --git a/src/vs/workbench/parts/terminal/node/terminal.ts b/src/vs/workbench/parts/terminal/node/terminal.ts index 2abad57488d..8cb9bc9dddd 100644 --- a/src/vs/workbench/parts/terminal/node/terminal.ts +++ b/src/vs/workbench/parts/terminal/node/terminal.ts @@ -3,6 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as os from 'os'; +import * as platform from 'vs/base/common/platform'; +import * as processes from 'vs/base/node/processes'; +import { readFile, fileExists } from 'vs/base/node/pfs'; + export interface IMessageFromTerminalProcess { type: 'pid' | 'data' | 'title'; content: number | string; @@ -27,3 +32,47 @@ export interface ITerminalChildProcess { on(event: 'exit', listener: (code: number) => void): this; on(event: 'message', listener: (message: IMessageFromTerminalProcess) => void): this; } + +let _TERMINAL_DEFAULT_SHELL_UNIX_LIKE: string = null; +export function getTerminalDefaultShellUnixLike(): string { + if (!_TERMINAL_DEFAULT_SHELL_UNIX_LIKE) { + let unixLikeTerminal = 'sh'; + if (!platform.isWindows && process.env.SHELL) { + unixLikeTerminal = process.env.SHELL; + // Some systems have $SHELL set to /bin/false which breaks the terminal + if (unixLikeTerminal === '/bin/false') { + unixLikeTerminal = '/bin/bash'; + } + } + _TERMINAL_DEFAULT_SHELL_UNIX_LIKE = unixLikeTerminal; + } + return _TERMINAL_DEFAULT_SHELL_UNIX_LIKE; +} + +let _TERMINAL_DEFAULT_SHELL_WINDOWS: string = null; +export function getTerminalDefaultShellWindows(): string { + if (!_TERMINAL_DEFAULT_SHELL_WINDOWS) { + const isAtLeastWindows10 = platform.isWindows && parseFloat(os.release()) >= 10; + const is32ProcessOn64Windows = process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432'); + const powerShellPath = `${process.env.windir}\\${is32ProcessOn64Windows ? 'Sysnative' : 'System32'}\\WindowsPowerShell\\v1.0\\powershell.exe`; + _TERMINAL_DEFAULT_SHELL_WINDOWS = isAtLeastWindows10 ? powerShellPath : processes.getWindowsShell(); + } + return _TERMINAL_DEFAULT_SHELL_WINDOWS; +} + +if (platform.isLinux) { + const file = '/etc/os-release'; + fileExists(file).then(exists => { + if (!exists) { + return; + } + readFile(file).then(b => { + const contents = b.toString(); + if (contents.indexOf('NAME=Fedora') >= 0) { + isFedora = true; + } + }); + }); +} + +export let isFedora = false; \ No newline at end of file From ea680fae1cdf0ef7cd710f387afe69d479ac54c5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 16 Apr 2018 16:48:15 -0700 Subject: [PATCH 402/710] Update to use more consistent WebviewPanel naming --- .../api/electron-browser/mainThreadWebview.ts | 40 +++++++++---------- src/vs/workbench/api/node/extHost.protocol.ts | 24 +++++------ src/vs/workbench/api/node/extHostWebview.ts | 30 +++++++------- .../api/extHostWebview.test.ts | 4 +- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 1b8051b42c0..f0ef3aef85c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -11,7 +11,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Position } from 'vs/platform/editor/common/editor'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { ExtHostContext, ExtHostWebviewsShape, IExtHostContext, MainContext, MainThreadWebviewsShape, WebviewHandle } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostContext, ExtHostWebviewsShape, IExtHostContext, MainContext, MainThreadWebviewsShape, WebviewPanelHandle } from 'vs/workbench/api/node/extHost.protocol'; import { WebviewEditor } from 'vs/workbench/parts/webview/electron-browser/webviewEditor'; import { WebviewEditorInput } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInput'; import { IWebviewEditorService, WebviewInputOptions, WebviewReviver } from 'vs/workbench/parts/webview/electron-browser/webviewEditorService'; @@ -34,10 +34,10 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv private _toDispose: IDisposable[] = []; private readonly _proxy: ExtHostWebviewsShape; - private readonly _webviews = new Map(); + private readonly _webviews = new Map(); private readonly _revivers = new Set(); - private _activeWebview: WebviewHandle | undefined = undefined; + private _activeWebview: WebviewPanelHandle | undefined = undefined; constructor( context: IExtHostContext, @@ -63,8 +63,8 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv this._toDispose = dispose(this._toDispose); } - $createWebview( - handle: WebviewHandle, + $createWebviewPanel( + handle: WebviewPanelHandle, viewType: string, title: string, column: Position, @@ -80,27 +80,27 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv this._webviews.set(handle, webview); } - $disposeWebview(handle: WebviewHandle): void { + $disposeWebview(handle: WebviewPanelHandle): void { const webview = this.getWebview(handle); webview.dispose(); } - $setTitle(handle: WebviewHandle, value: string): void { + $setTitle(handle: WebviewPanelHandle, value: string): void { const webview = this.getWebview(handle); webview.setName(value); } - $setHtml(handle: WebviewHandle, value: string): void { + $setHtml(handle: WebviewPanelHandle, value: string): void { const webview = this.getWebview(handle); webview.html = value; } - $reveal(handle: WebviewHandle, column: Position): void { + $reveal(handle: WebviewPanelHandle, column: Position): void { const webview = this.getWebview(handle); this._webviewService.revealWebview(webview, column); } - async $sendMessage(handle: WebviewHandle, message: any): TPromise { + async $sendMessage(handle: WebviewPanelHandle, message: any): TPromise { const webview = this.getWebview(handle); const editors = this._editorService.getVisibleEditors() .filter(e => e instanceof WebviewEditor) @@ -129,7 +129,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv this._webviews.set(handle, webview); webview._events = this.createWebviewEventDelegate(handle); - return this._proxy.$deserializeWebview(handle, webview.state.viewType, webview.getTitle(), webview.state.state, webview.position, webview.options) + return this._proxy.$deserializeWebviewPanel(handle, webview.state.viewType, webview.getTitle(), webview.state.state, webview.position, webview.options) .then(undefined, () => { webview.html = MainThreadWebviews.getDeserializationFailedContents(viewType); }); @@ -141,7 +141,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv } private _onWillShutdown(): TPromise { - const toRevive: WebviewHandle[] = []; + const toRevive: WebviewPanelHandle[] = []; this._webviews.forEach((view, key) => { if (this.canRevive(view)) { toRevive.push(key); @@ -150,7 +150,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv const reviveResponses = toRevive.map(handle => TPromise.any([ - this._proxy.$serializeWebview(handle).then( + this._proxy.$serializeWebviewPanel(handle).then( state => ({ handle, state }), () => ({ handle, state: null })), TPromise.timeout(MainThreadWebviews.serializeTimeout).then(() => ({ handle, state: null })) @@ -171,19 +171,19 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv }); } - private createWebviewEventDelegate(handle: WebviewHandle) { + private createWebviewEventDelegate(handle: WebviewPanelHandle) { return { onDidClickLink: uri => this.onDidClickLink(handle, uri), onMessage: message => this._proxy.$onMessage(handle, message), onDispose: () => { - this._proxy.$onDidDisposeWebview(handle).then(() => { + this._proxy.onDidDisposeWebviewPanel(handle).then(() => { this._webviews.delete(handle); }); } }; } - private getWebview(handle: WebviewHandle): WebviewEditorInput { + private getWebview(handle: WebviewPanelHandle): WebviewEditorInput { const webview = this._webviews.get(handle); if (!webview) { throw new Error('Unknown webview handle:' + handle); @@ -193,7 +193,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv private onEditorsChanged() { const activeEditor = this._editorService.getActiveEditor(); - let newActiveWebview: { input: WebviewEditorInput, handle: WebviewHandle } | undefined = undefined; + let newActiveWebview: { input: WebviewEditorInput, handle: WebviewPanelHandle } | undefined = undefined; if (activeEditor && activeEditor.input instanceof WebviewEditorInput) { for (const handle of map.keys(this._webviews)) { const input = this._webviews.get(handle); @@ -213,20 +213,20 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv if (typeof this._activeWebview !== 'undefined') { const oldActiveWebview = this._webviews.get(this._activeWebview); if (oldActiveWebview) { - this._proxy.$onDidChangeWebviewViewState(this._activeWebview, false, oldActiveWebview.position); + this._proxy.$onDidChangeWebviewPanelViewState(this._activeWebview, false, oldActiveWebview.position); } } // Then for newly active if (newActiveWebview) { - this._proxy.$onDidChangeWebviewViewState(newActiveWebview.handle, true, activeEditor.position); + this._proxy.$onDidChangeWebviewPanelViewState(newActiveWebview.handle, true, activeEditor.position); this._activeWebview = newActiveWebview.handle; } else { this._activeWebview = undefined; } } - private onDidClickLink(handle: WebviewHandle, link: URI): void { + private onDidClickLink(handle: WebviewPanelHandle, link: URI): void { if (!link) { return; } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 49e3cdb0b56..3f5c9595b49 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -347,26 +347,26 @@ export interface MainThreadTelemetryShape extends IDisposable { $publicLog(eventName: string, data?: any): void; } -export type WebviewHandle = string; +export type WebviewPanelHandle = string; export interface MainThreadWebviewsShape extends IDisposable { - $createWebview(handle: WebviewHandle, viewType: string, title: string, column: EditorPosition, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionFolderPath: string): void; - $disposeWebview(handle: WebviewHandle): void; - $reveal(handle: WebviewHandle, column: EditorPosition): void; - $setTitle(handle: WebviewHandle, value: string): void; - $setHtml(handle: WebviewHandle, value: string): void; - $sendMessage(handle: WebviewHandle, value: any): Thenable; + $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, column: EditorPosition, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionFolderPath: string): void; + $disposeWebview(handle: WebviewPanelHandle): void; + $reveal(handle: WebviewPanelHandle, column: EditorPosition): void; + $setTitle(handle: WebviewPanelHandle, value: string): void; + $setHtml(handle: WebviewPanelHandle, value: string): void; + $sendMessage(handle: WebviewPanelHandle, value: any): Thenable; $registerSerializer(viewType: string): void; $unregisterSerializer(viewType: string): void; } export interface ExtHostWebviewsShape { - $onMessage(handle: WebviewHandle, message: any): void; - $onDidChangeWebviewViewState(handle: WebviewHandle, active: boolean, position: EditorPosition): void; - $onDidDisposeWebview(handle: WebviewHandle): Thenable; - $deserializeWebview(newWebviewHandle: WebviewHandle, viewType: string, title: string, state: any, position: EditorPosition, options: vscode.WebviewOptions): Thenable; - $serializeWebview(webviewHandle: WebviewHandle): Thenable; + $onMessage(handle: WebviewPanelHandle, message: any): void; + $onDidChangeWebviewPanelViewState(handle: WebviewPanelHandle, active: boolean, position: EditorPosition): void; + onDidDisposeWebviewPanel(handle: WebviewPanelHandle): Thenable; + $deserializeWebviewPanel(newWebviewHandle: WebviewPanelHandle, viewType: string, title: string, state: any, position: EditorPosition, options: vscode.WebviewOptions): Thenable; + $serializeWebviewPanel(webviewHandle: WebviewPanelHandle): Thenable; } export interface MainThreadWorkspaceShape extends IDisposable { diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 44bb275e364..45afdf5d503 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainContext, MainThreadWebviewsShape, IMainContext, ExtHostWebviewsShape, WebviewHandle } from './extHost.protocol'; +import { MainContext, MainThreadWebviewsShape, IMainContext, ExtHostWebviewsShape, WebviewPanelHandle } from './extHost.protocol'; import * as vscode from 'vscode'; import { Event, Emitter } from 'vs/base/common/event'; import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; @@ -12,7 +12,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Disposable } from './extHostTypes'; export class ExtHostWebview implements vscode.Webview { - private readonly _handle: WebviewHandle; + private readonly _handle: WebviewPanelHandle; private readonly _proxy: MainThreadWebviewsShape; private _title: string; private _html: string; @@ -26,7 +26,7 @@ export class ExtHostWebview implements vscode.Webview { public readonly onDidChangeViewState: Event = this.onDidChangeViewStateEmitter.event; constructor( - handle: WebviewHandle, + handle: WebviewPanelHandle, proxy: MainThreadWebviewsShape, title: string, options: vscode.WebviewOptions @@ -91,7 +91,7 @@ export class ExtHostWebview implements vscode.Webview { export class ExtHostWebviewPanel implements vscode.WebviewPanel { - private readonly _handle: WebviewHandle; + private readonly _handle: WebviewPanelHandle; private readonly _viewType: string; private readonly _options: vscode.WebviewPanelOptions; private readonly _proxy: MainThreadWebviewsShape; @@ -108,7 +108,7 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { private _webview: ExtHostWebview; constructor( - handle: WebviewHandle, + handle: WebviewPanelHandle, proxy: MainThreadWebviewsShape, viewType: string, title: string, @@ -194,7 +194,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { private readonly _proxy: MainThreadWebviewsShape; - private readonly _webviewPanels = new Map(); + private readonly _webviewPanels = new Map(); private readonly _serializers = new Map(); constructor( @@ -211,7 +211,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { extensionFolderPath: string ): vscode.WebviewPanel { const handle = ExtHostWebviews.webviewHandlePool++ + ''; - this._proxy.$createWebview(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath); + this._proxy.$createWebviewPanel(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath); const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, title, viewColumn, options, options); this._webviewPanels.set(handle, panel); @@ -235,14 +235,14 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { }); } - $onMessage(handle: WebviewHandle, message: any): void { + $onMessage(handle: WebviewPanelHandle, message: any): void { const panel = this.getWebviewPanel(handle); if (panel) { panel.webview.onMessageEmitter.fire(message); } } - $onDidChangeWebviewViewState(handle: WebviewHandle, visible: boolean, position: Position): void { + $onDidChangeWebviewPanelViewState(handle: WebviewPanelHandle, visible: boolean, position: Position): void { const panel = this.getWebviewPanel(handle); if (panel) { const viewColumn = typeConverters.toViewColumn(position); @@ -254,7 +254,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { } } - $onDidDisposeWebview(handle: WebviewHandle): Thenable { + onDidDisposeWebviewPanel(handle: WebviewPanelHandle): Thenable { const panel = this.getWebviewPanel(handle); if (panel) { panel.dispose(); @@ -263,8 +263,8 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { return TPromise.as(void 0); } - $deserializeWebview( - webviewHandle: WebviewHandle, + $deserializeWebviewPanel( + webviewHandle: WebviewPanelHandle, viewType: string, title: string, state: any, @@ -281,8 +281,8 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { return serializer.deserializeWebviewPanel(revivedPanel, state); } - $serializeWebview( - webviewHandle: WebviewHandle + $serializeWebviewPanel( + webviewHandle: WebviewPanelHandle ): Thenable { const panel = this.getWebviewPanel(webviewHandle); if (!panel) { @@ -297,7 +297,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { return serialzer.serializeWebviewPanel(panel); } - private getWebviewPanel(handle: WebviewHandle): ExtHostWebviewPanel | undefined { + private getWebviewPanel(handle: WebviewPanelHandle): ExtHostWebviewPanel | undefined { return this._webviewPanels.get(handle); } } \ No newline at end of file diff --git a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts index f832179348d..0c600626db4 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts @@ -36,7 +36,7 @@ suite('ExtHostWebview', function () { const serializerARegistration = extHostWebviews.registerWebviewPanelSerializer(viewType, serializerA); - await extHostWebviews.$deserializeWebview('x', viewType, 'title', {}, EditorPosition.ONE, {}); + await extHostWebviews.$deserializeWebviewPanel('x', viewType, 'title', {}, EditorPosition.ONE, {}); assert.strictEqual(lastInvokedDeserializer, serializerA); assert.throws( @@ -47,7 +47,7 @@ suite('ExtHostWebview', function () { extHostWebviews.registerWebviewPanelSerializer(viewType, serializerB); - await extHostWebviews.$deserializeWebview('x', viewType, 'title', {}, EditorPosition.ONE, {}); + await extHostWebviews.$deserializeWebviewPanel('x', viewType, 'title', {}, EditorPosition.ONE, {}); assert.strictEqual(lastInvokedDeserializer, serializerB); }); }); From f2a2f394c73b4560a59e7fbe7e9f7760795fd3bc Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 17 Apr 2018 10:03:33 -0700 Subject: [PATCH 403/710] Unregister webview reviver on dispose Part of #48065 --- src/vs/workbench/api/electron-browser/mainThreadWebview.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index f0ef3aef85c..b3bff528318 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -53,10 +53,11 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv this._proxy = context.getProxy(ExtHostContext.ExtHostWebviews); editorGroupService.onEditorsChanged(this.onEditorsChanged, this, this._toDispose); - _webviewService.registerReviver(MainThreadWebviews.viewType, this); - this._toDispose.push(lifecycleService.onWillShutdown(e => { + this._toDispose.push(_webviewService.registerReviver(MainThreadWebviews.viewType, this)); + + lifecycleService.onWillShutdown(e => { e.veto(this._onWillShutdown()); - })); + }, this, this._toDispose); } dispose(): void { From 4323d933cae64168406033f9c29a2534b19be076 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 17 Apr 2018 10:53:28 -0700 Subject: [PATCH 404/710] Make service responsible for attaching the process proxy --- .../parts/terminal/common/terminal.ts | 9 ++++++ .../parts/terminal/common/terminalService.ts | 3 +- .../electron-browser/terminalConfigHelper.ts | 2 +- .../electron-browser/terminalInstance.ts | 1 - .../terminalProcessManager.ts | 6 ++-- .../electron-browser/terminalService.ts | 15 +++++++++- ...idge.ts => terminalProcessExtHostProxy.ts} | 28 ++++++++----------- .../terminalConfigHelper.test.ts | 2 +- 8 files changed, 43 insertions(+), 23 deletions(-) rename src/vs/workbench/parts/terminal/node/{terminalProcessExtHostBridge.ts => terminalProcessExtHostProxy.ts} (54%) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index ef1de21977d..d4934907a46 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -206,6 +206,8 @@ export interface ITerminalService { setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void; selectDefaultWindowsShell(): TPromise; setWorkspaceShellAllowed(isAllowed: boolean): void; + + requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): TPromise; } export const enum Direction { @@ -519,3 +521,10 @@ export enum ProcessState { // was run. KILLED_BY_PROCESS } + + +export interface ITerminalProcessExtHostProxy { + emitData(data: string): void; + emitTitle(title: string): void; + emitPid(pid: number): void; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index 08ff3e7ddea..2ec8be7c6bb 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -9,7 +9,7 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; import { TPromise } from 'vs/base/common/winjs.base'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -75,6 +75,7 @@ export abstract class TerminalService implements ITerminalService { public abstract getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance; public abstract selectDefaultWindowsShell(): TPromise; public abstract setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void; + public abstract requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): TPromise; private _restoreTabs(): void { if (!this.configHelper.config.experimentalRestore) { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index 243f7094819..a8e3f9ecbae 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -12,7 +12,7 @@ import { IWorkspaceConfigurationService } from 'vs/workbench/services/configurat import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITerminalConfiguration, ITerminalConfigHelper, ITerminalFont, IShellLaunchConfig, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, TERMINAL_CONFIG_SECTION } from 'vs/workbench/parts/terminal/common/terminal'; import Severity from 'vs/base/common/severity'; -import { isFedora } from 'vs/workbench/parts/terminal/electron-browser/terminal'; +import { isFedora } from 'vs/workbench/parts/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'vscode-xterm'; import { INotificationService } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 245ab95e82f..37f4a216882 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -110,7 +110,6 @@ export class TerminalInstance implements ITerminalInstance { @ILogService private _logService: ILogService ) { this._shellLaunchConfig.extensionHostOwned = true; - this._shellLaunchConfig.name = 'Test terminal renderer'; this._disposables = []; this._skipTerminalCommands = []; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts index 88defa05bbb..9d3c4ba3a4c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts @@ -17,7 +17,8 @@ import { IConfigurationResolverService } from 'vs/workbench/services/configurati import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { ITerminalChildProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; -import { TerminalProcessExtHostBridge } from 'vs/workbench/parts/terminal/node/terminalProcessExtHostBridge'; +import { TerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/node/terminalProcessExtHostProxy'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; @@ -54,6 +55,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, @IHistoryService private readonly _historyService: IHistoryService, @IConfigurationResolverService private readonly _configurationResolverService: IConfigurationResolverService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private _logService: ILogService ) { } @@ -115,7 +117,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { const options = { env, cwd }; this._logService.debug(`Terminal process launching`, options); if (shellLaunchConfig.extensionHostOwned) { - this._process = new TerminalProcessExtHostBridge(); + this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy); } else { this._process = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], options); } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index bb679403d11..470d17dcb0d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -13,7 +13,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IQuickOpenService, IPickOpenEntry, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; -import { ITerminalInstance, ITerminalService, IShellLaunchConfig, ITerminalConfigHelper, NEVER_SUGGEST_SELECT_WINDOWS_SHELL_STORAGE_KEY, TERMINAL_PANEL_ID } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalInstance, ITerminalService, IShellLaunchConfig, ITerminalConfigHelper, NEVER_SUGGEST_SELECT_WINDOWS_SHELL_STORAGE_KEY, TERMINAL_PANEL_ID, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; import { TerminalService as AbstractTerminalService } from 'vs/workbench/parts/terminal/common/terminalService'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -93,6 +93,19 @@ export class TerminalService extends AbstractTerminalService implements ITermina return this._instantiationService.createInstance(TerminalInstance, terminalFocusContextKey, configHelper, undefined, shellLaunchConfig, true); } + public requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): TPromise { + let i = 0; + setTimeout(() => { + proxy.emitPid(-1); + proxy.emitTitle('test title'); + proxy.emitData(`test ${i++}\r\n`); + }, 0); + setInterval(() => { + proxy.emitData(`test ${i++}\r\n`); + }, 1000); + return TPromise.as(void 0); + } + public focusFindWidget(): TPromise { return this.showPanel(false).then(() => { let panel = this._panelService.getActivePanel() as TerminalPanel; diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts similarity index 54% rename from src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts rename to src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index 9b3107576b4..271e8b0c543 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostBridge.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -5,32 +5,28 @@ import { ITerminalChildProcess, IMessageToTerminalProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; import { EventEmitter } from 'events'; +import { ITerminalService, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; -export class TerminalProcessExtHostBridge extends EventEmitter implements ITerminalChildProcess { +export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy { public connected: boolean; - constructor() { + constructor( + @ITerminalService private _terminalService: ITerminalService + ) { super(); - let i = 0; - setTimeout(() => { - this._emitPid(-1); - this._emitTitle('test title'); - this._emitData(`test ${i++}\r\n`); - }, 0); - setInterval(() => { - this._emitData(`test ${i++}\r\n`); - }, 1000); + this._terminalService.requestExtHostProcess(this).then(() => { + }); } - private _emitData(data: string): void { + public emitData(data: string): void { this.emit('message', { type: 'data', content: data } as IMessageFromTerminalProcess); } - private _emitTitle(title: string): void { - this.emit('message', { type: 'data', content: title } as IMessageFromTerminalProcess); + public emitTitle(title: string): void { + this.emit('message', { type: 'title', content: title } as IMessageFromTerminalProcess); } - private _emitPid(pid: number): void { - this.emit('message', { type: 'data', content: pid } as IMessageFromTerminalProcess); + public emitPid(pid: number): void { + this.emit('message', { type: 'pid', content: pid } as IMessageFromTerminalProcess); } public send(message: IMessageToTerminalProcess): boolean { diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts index 4a37a7ae84c..cc4cec690c4 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { isFedora } from 'vs/workbench/parts/terminal/electron-browser/terminal'; +import { isFedora } from 'vs/workbench/parts/terminal/node/terminal'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; suite('Workbench - TerminalConfigHelper', () => { From dc3e3e38f792d340d2e6276645321923d4c6196e Mon Sep 17 00:00:00 2001 From: kieferrm Date: Tue, 17 Apr 2018 10:59:58 -0700 Subject: [PATCH 405/710] account for substituations made by the pipeline --- src/vs/workbench/electron-browser/shell.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 509bd9406d4..5692c84329a 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -324,7 +324,7 @@ export class WorkbenchShell { perf.mark('didStatLocalStorage'); /* __GDPR__ - "localStorageTimers4" : { + "localStorageTimers" : { "statTime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "accessTime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "firstReadTime" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, From 2c1e126cfc891ba84e85951258cdd8c5586abdcc Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 17 Apr 2018 11:13:14 -0700 Subject: [PATCH 406/710] fix microsoft/monaco-editor#817. --- src/vs/editor/contrib/find/findController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/find/findController.ts b/src/vs/editor/contrib/find/findController.ts index 1b01a612ecf..1150a26fac9 100644 --- a/src/vs/editor/contrib/find/findController.ts +++ b/src/vs/editor/contrib/find/findController.ts @@ -446,8 +446,8 @@ export class StartFindWithSelectionAction extends EditorAction { constructor() { super({ id: FIND_IDS.StartFindWithSelection, - label: nls.localize('startFindAction', "Find"), - alias: 'Find', + label: nls.localize('startFindWithSelectionAction', "Find With Selection"), + alias: 'Find With Selection', precondition: null, kbOpts: { kbExpr: null, From e6ff6be9087236ad6cf7dd8e454b8f131f4ab370 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 17 Apr 2018 11:22:00 -0700 Subject: [PATCH 407/710] Fix focus tracker sometimes not being created properly for webview Editors Fixes #46974 --- .../webview/electron-browser/webviewEditor.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts index e7debe873e0..6ff804fc51d 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts @@ -185,17 +185,15 @@ export class WebviewEditor extends BaseWebviewEditor { } this.webviewContent = input.container; + + this.trackFocus(); + const existing = input.webview; if (existing) { this._webview = existing; return existing; } - this._webviewFocusTracker = DOM.trackFocus(this.webviewContent); - this._webviewFocusListenerDisposable = this._webviewFocusTracker.onDidFocus(() => { - this._onDidFocusWebview.fire(); - }); - if (input.options.enableFindWidget) { this._contextKeyService = this._contextKeyService.createScoped(this.webviewContent); this.contextKey = KEYBINDING_CONTEXT_WEBVIEWEDITOR_FOCUS.bindTo(this._contextKeyService); @@ -226,5 +224,19 @@ export class WebviewEditor extends BaseWebviewEditor { this.doUpdateContainer(); return this._webview; } + + private trackFocus() { + if (this._webviewFocusTracker) { + this._webviewFocusTracker.dispose(); + } + if (this._webviewFocusListenerDisposable) { + this._webviewFocusListenerDisposable.dispose(); + } + + this._webviewFocusTracker = DOM.trackFocus(this.webviewContent); + this._webviewFocusListenerDisposable = this._webviewFocusTracker.onDidFocus(() => { + this._onDidFocusWebview.fire(); + }); + } } From e40581af0d4cd2b19f0ec30aaf6a9e47505ab428 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 21:36:43 +0200 Subject: [PATCH 408/710] Fixes #37658 --- src/vs/editor/browser/controller/textAreaHandler.ts | 2 +- src/vs/editor/browser/viewParts/margin/margin.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index c8cfc5590e1..098af888c20 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -542,7 +542,7 @@ export class TextAreaHandler extends ViewPart { tac.setHeight(1); if (this._context.configuration.editor.viewInfo.glyphMargin) { - tac.setClassName('monaco-editor-background textAreaCover ' + Margin.CLASS_NAME); + tac.setClassName('monaco-editor-background textAreaCover ' + Margin.OUTER_CLASS_NAME); } else { if (this._context.configuration.editor.viewInfo.renderLineNumbers !== RenderLineNumbersType.Off) { tac.setClassName('monaco-editor-background textAreaCover ' + LineNumbersOverlay.CLASS_NAME); diff --git a/src/vs/editor/browser/viewParts/margin/margin.ts b/src/vs/editor/browser/viewParts/margin/margin.ts index 40efb4b4ef7..63a228dea04 100644 --- a/src/vs/editor/browser/viewParts/margin/margin.ts +++ b/src/vs/editor/browser/viewParts/margin/margin.ts @@ -14,6 +14,7 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents'; export class Margin extends ViewPart { public static readonly CLASS_NAME = 'glyph-margin'; + public static readonly OUTER_CLASS_NAME = 'margin'; private _domNode: FastDomNode; private _canUseLayerHinting: boolean; @@ -42,7 +43,7 @@ export class Margin extends ViewPart { private _createDomNode(): FastDomNode { let domNode = createFastDomNode(document.createElement('div')); - domNode.setClassName('margin'); + domNode.setClassName(Margin.OUTER_CLASS_NAME); domNode.setPosition('absolute'); domNode.setAttribute('role', 'presentation'); domNode.setAttribute('aria-hidden', 'true'); From 25462545569e74d8e8c2ba9b018263365facc344 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Tue, 17 Apr 2018 12:40:17 -0700 Subject: [PATCH 409/710] Anonymize paths only from error telemetry else data like mimetypes get anonymized --- .../telemetry/browser/errorTelemetry.ts | 2 +- src/vs/platform/telemetry/common/telemetry.ts | 2 +- .../telemetry/common/telemetryService.ts | 46 ++++++++++--------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/vs/platform/telemetry/browser/errorTelemetry.ts b/src/vs/platform/telemetry/browser/errorTelemetry.ts index 3bab84d8bf7..ec06e2c07ee 100644 --- a/src/vs/platform/telemetry/browser/errorTelemetry.ts +++ b/src/vs/platform/telemetry/browser/errorTelemetry.ts @@ -166,7 +166,7 @@ export default class ErrorTelemetry { "${include}": [ "${ErrorEvent}" ] } */ - this._telemetryService.publicLog('UnhandledError', error); + this._telemetryService.publicLog('UnhandledError', error, true); } this._buffer.length = 0; } diff --git a/src/vs/platform/telemetry/common/telemetry.ts b/src/vs/platform/telemetry/common/telemetry.ts index ebfc8144e6e..41a1987e9c9 100644 --- a/src/vs/platform/telemetry/common/telemetry.ts +++ b/src/vs/platform/telemetry/common/telemetry.ts @@ -29,7 +29,7 @@ export interface ITelemetryService { * Sends a telemetry event that has been privacy approved. * Do not call this unless you have been given approval. */ - publicLog(eventName: string, data?: ITelemetryData): TPromise; + publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): TPromise; getTelemetryInfo(): TPromise; diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index 992f3e36a96..dba27cde4b1 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -91,7 +91,7 @@ export class TelemetryService implements ITelemetryService { this._disposables = dispose(this._disposables); } - publicLog(eventName: string, data?: ITelemetryData): TPromise { + publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): TPromise { // don't send events when the user is optout if (!this._userOptIn) { return TPromise.as(undefined); @@ -105,7 +105,7 @@ export class TelemetryService implements ITelemetryService { // (last) remove all PII from data data = cloneAndChange(data, value => { if (typeof value === 'string') { - return this._cleanupInfo(value); + return this._cleanupInfo(value, anonymizeFilePaths); } return undefined; }); @@ -118,29 +118,33 @@ export class TelemetryService implements ITelemetryService { }); } - private _cleanupInfo(stack: string): string { - const cleanUpIndexes: [number, number][] = []; - for (let regexp of this._cleanupPatterns) { + private _cleanupInfo(stack: string, anonymizeFilePaths?: boolean): string { + let updatedStack = stack; + + if (anonymizeFilePaths) { + const cleanUpIndexes: [number, number][] = []; + for (let regexp of this._cleanupPatterns) { + while (true) { + const result = regexp.exec(stack); + if (!result) { + break; + } + cleanUpIndexes.push([result.index, regexp.lastIndex]); + } + } + + const nodeModulesRegex = /^[\\\/]?(node_modules|node_modules\.asar)[\\\/]/; + const fileRegex = /(file:\/\/)?([a-zA-Z]:(\\\\|\\|\/)|(\\\\|\\|\/))?([\w-\._]+(\\\\|\\|\/))+[\w-\._]*/g; + while (true) { - const result = regexp.exec(stack); + const result = fileRegex.exec(stack); if (!result) { break; } - cleanUpIndexes.push([result.index, regexp.lastIndex]); - } - } - - const nodeModulesRegex = /^[\\\/]?(node_modules|node_modules\.asar)[\\\/]/; - const fileRegex = /(file:\/\/)?([a-zA-Z]:(\\\\|\\|\/)|(\\\\|\\|\/))?([\w-\._]+(\\\\|\\|\/))+[\w-\._]*/g; - let updatedStack = stack; - while (true) { - const result = fileRegex.exec(stack); - if (!result) { - break; - } - // Anoynimize user file paths that do not need to be retained or cleaned up. - if (!nodeModulesRegex.test(result[0]) && cleanUpIndexes.every(([x, y]) => result.index < x || result.index >= y)) { - updatedStack = updatedStack.slice(0, result.index) + result[0].replace(/./g, 'a') + updatedStack.slice(fileRegex.lastIndex); + // Anoynimize user file paths that do not need to be retained or cleaned up. + if (!nodeModulesRegex.test(result[0]) && cleanUpIndexes.every(([x, y]) => result.index < x || result.index >= y)) { + updatedStack = updatedStack.slice(0, result.index) + result[0].replace(/./g, 'a') + updatedStack.slice(fileRegex.lastIndex); + } } } From a811707825e9a67e61ff1bd82bfdfa7e55d958db Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 22:16:26 +0200 Subject: [PATCH 410/710] Fixes #48046: Skip over a word made up of one single separator and followed by a regular character --- .../common/controller/cursorWordOperations.ts | 6 ++++++ .../wordOperations/test/wordOperations.test.ts | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/controller/cursorWordOperations.ts b/src/vs/editor/common/controller/cursorWordOperations.ts index e14d715fbbf..8bd73b791f0 100644 --- a/src/vs/editor/common/controller/cursorWordOperations.ts +++ b/src/vs/editor/common/controller/cursorWordOperations.ts @@ -171,6 +171,12 @@ export class WordOperations { let prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, column)); if (wordNavigationType === WordNavigationType.WordStart) { + if (prevWordOnLine && prevWordOnLine.wordType === WordType.Separator) { + if (prevWordOnLine.end - prevWordOnLine.start === 1 && prevWordOnLine.nextCharClass === WordCharacterClass.Regular) { + // Skip over a word made up of one single separator and followed by a regular character + prevWordOnLine = WordOperations._findPreviousWordOnLine(wordSeparators, model, new Position(lineNumber, prevWordOnLine.start + 1)); + } + } if (prevWordOnLine) { column = prevWordOnLine.start + 1; } else { diff --git a/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts index c643d6efda2..bd34ee01bda 100644 --- a/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/wordOperations.test.ts @@ -141,7 +141,6 @@ suite('WordOperations', () => { moveWordLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5-3 + '.length + 1, '002'); moveWordLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5-3 '.length + 1, '003'); moveWordLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5-'.length + 1, '004'); - moveWordLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5'.length + 1, '005'); moveWordLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +'.length + 1, '006'); moveWordLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 '.length + 1, '007'); moveWordLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= '.length + 1, '008'); @@ -165,7 +164,6 @@ suite('WordOperations', () => { moveWordStartLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5-3 + '.length + 1, '002'); moveWordStartLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5-3 '.length + 1, '003'); moveWordStartLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5-'.length + 1, '004'); - moveWordStartLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +5'.length + 1, '005'); moveWordStartLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 +'.length + 1, '006'); moveWordStartLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= 3 '.length + 1, '007'); moveWordStartLeft(editor); assert.equal(editor.getPosition().column, ' /* Just some more text a+= '.length + 1, '008'); @@ -290,6 +288,18 @@ suite('WordOperations', () => { }); }); + test('issue #48046: Word selection doesn\'t work as usual', () => { + withTestCodeEditor([ + 'deep.object.property' + ], {}, (editor, _) => { + editor.setPosition(new Position(1, 21)); + + moveWordLeft(editor); assert.equal(editor.getPosition().column, 'deep.object.'.length + 1, '001'); + moveWordLeft(editor); assert.equal(editor.getPosition().column, 'deep.'.length + 1, '002'); + moveWordLeft(editor); assert.equal(editor.getPosition().column, ''.length + 1, '003'); + }); + }); + test('moveWordEndRight', () => { withTestCodeEditor([ ' /* Just some more text a+= 3 +5-3 + 7 */ ' From 4bb888d71968e43e53480ee058ee4f783037159e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 22:44:56 +0200 Subject: [PATCH 411/710] Fixes #48065 --- .../electron-browser/extensionService.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 4d64bdc8415..ec7847ca19b 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -424,7 +424,10 @@ export class ExtensionService extends Disposable implements IExtensionService { } private _activateByEvent(activationEvent: string): TPromise { - return this._extensionHostProcessManager.activateByEvent(activationEvent); + if (this._extensionHostProcessManager) { + return this._extensionHostProcessManager.activateByEvent(activationEvent); + } + return NO_OP_VOID_PROMISE; } public whenInstalledExtensionsRegistered(): TPromise { @@ -455,8 +458,8 @@ export class ExtensionService extends Disposable implements IExtensionService { } public getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { - const activationTimes = this._extensionHostProcessManager.getActivationTimes(); - const runtimeErrors = this._extensionHostProcessManager.getRuntimeErrors(); + const activationTimes = this._extensionHostProcessManager ? this._extensionHostProcessManager.getActivationTimes() : {}; + const runtimeErrors = this._extensionHostProcessManager ? this._extensionHostProcessManager.getRuntimeErrors() : {}; let result: { [id: string]: IExtensionsStatus; } = Object.create(null); if (this._registry) { @@ -475,7 +478,10 @@ export class ExtensionService extends Disposable implements IExtensionService { } public canProfileExtensionHost(): boolean { - return this._extensionHostProcessManager.canProfileExtensionHost(); + if (this._extensionHostProcessManager) { + return this._extensionHostProcessManager.canProfileExtensionHost(); + } + return false; } public startExtensionHostProfile(): TPromise { From 3f81b43a8b0875e9bc53be02e45bacc10074811a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 23:07:22 +0200 Subject: [PATCH 412/710] Fixes #38591 --- .../browser/viewParts/selections/selections.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/browser/viewParts/selections/selections.ts b/src/vs/editor/browser/viewParts/selections/selections.ts index c844dfc3516..c25e5869f40 100644 --- a/src/vs/editor/browser/viewParts/selections/selections.ts +++ b/src/vs/editor/browser/viewParts/selections/selections.ts @@ -78,6 +78,7 @@ export class SelectionsOverlay extends DynamicViewOverlay { private _context: ViewContext; private _lineHeight: number; private _roundedSelection: boolean; + private _typicalHalfwidthCharacterWidth: number; private _selections: Range[]; private _renderResult: string[]; @@ -86,6 +87,7 @@ export class SelectionsOverlay extends DynamicViewOverlay { this._context = context; this._lineHeight = this._context.configuration.editor.lineHeight; this._roundedSelection = this._context.configuration.editor.viewInfo.roundedSelection; + this._typicalHalfwidthCharacterWidth = this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth; this._selections = []; this._renderResult = null; this._context.addEventHandler(this); @@ -108,6 +110,9 @@ export class SelectionsOverlay extends DynamicViewOverlay { if (e.viewInfo) { this._roundedSelection = this._context.configuration.editor.viewInfo.roundedSelection; } + if (e.fontInfo) { + this._typicalHalfwidthCharacterWidth = this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth; + } return true; } public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { @@ -154,6 +159,7 @@ export class SelectionsOverlay extends DynamicViewOverlay { } private _enrichVisibleRangesWithStyle(linesVisibleRanges: LineVisibleRangesWithStyle[], previousFrame: LineVisibleRangesWithStyle[]): void { + const epsilon = this._typicalHalfwidthCharacterWidth / 4; let previousFrameTop: HorizontalRangeWithStyle = null; let previousFrameBottom: HorizontalRangeWithStyle = null; @@ -202,13 +208,13 @@ export class SelectionsOverlay extends DynamicViewOverlay { let prevLeft = linesVisibleRanges[i - 1].ranges[0].left; let prevRight = linesVisibleRanges[i - 1].ranges[0].left + linesVisibleRanges[i - 1].ranges[0].width; - if (curLeft === prevLeft) { + if (abs(curLeft - prevLeft) < epsilon) { startStyle.top = CornerStyle.FLAT; } else if (curLeft > prevLeft) { startStyle.top = CornerStyle.INTERN; } - if (curRight === prevRight) { + if (abs(curRight - prevRight) < epsilon) { endStyle.top = CornerStyle.FLAT; } else if (prevLeft < curRight && curRight < prevRight) { endStyle.top = CornerStyle.INTERN; @@ -224,13 +230,13 @@ export class SelectionsOverlay extends DynamicViewOverlay { let nextLeft = linesVisibleRanges[i + 1].ranges[0].left; let nextRight = linesVisibleRanges[i + 1].ranges[0].left + linesVisibleRanges[i + 1].ranges[0].width; - if (curLeft === nextLeft) { + if (abs(curLeft - nextLeft) < epsilon) { startStyle.bottom = CornerStyle.FLAT; } else if (nextLeft < curLeft && curLeft < nextRight) { startStyle.bottom = CornerStyle.INTERN; } - if (curRight === nextRight) { + if (abs(curRight - nextRight) < epsilon) { endStyle.bottom = CornerStyle.FLAT; } else if (curRight < nextRight) { endStyle.bottom = CornerStyle.INTERN; @@ -407,3 +413,7 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${editorSelectionForegroundColor}; }`); } }); + +function abs(n: number): number { + return n < 0 ? -n : n; +} \ No newline at end of file From 63d9bf409bd3ff4f9bca6dbae6c94c1355401189 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 17 Apr 2018 23:23:39 +0200 Subject: [PATCH 413/710] Fixes #35770 --- .../viewParts/selections/selections.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/browser/viewParts/selections/selections.ts b/src/vs/editor/browser/viewParts/selections/selections.ts index c25e5869f40..a3e1d9e1dec 100644 --- a/src/vs/editor/browser/viewParts/selections/selections.ts +++ b/src/vs/editor/browser/viewParts/selections/selections.ts @@ -158,7 +158,7 @@ export class SelectionsOverlay extends DynamicViewOverlay { return false; } - private _enrichVisibleRangesWithStyle(linesVisibleRanges: LineVisibleRangesWithStyle[], previousFrame: LineVisibleRangesWithStyle[]): void { + private _enrichVisibleRangesWithStyle(viewport: Range, linesVisibleRanges: LineVisibleRangesWithStyle[], previousFrame: LineVisibleRangesWithStyle[]): void { const epsilon = this._typicalHalfwidthCharacterWidth / 4; let previousFrameTop: HorizontalRangeWithStyle = null; let previousFrameBottom: HorizontalRangeWithStyle = null; @@ -166,16 +166,20 @@ export class SelectionsOverlay extends DynamicViewOverlay { if (previousFrame && previousFrame.length > 0 && linesVisibleRanges.length > 0) { let topLineNumber = linesVisibleRanges[0].lineNumber; - for (let i = 0; !previousFrameTop && i < previousFrame.length; i++) { - if (previousFrame[i].lineNumber === topLineNumber) { - previousFrameTop = previousFrame[i].ranges[0]; + if (topLineNumber === viewport.startLineNumber) { + for (let i = 0; !previousFrameTop && i < previousFrame.length; i++) { + if (previousFrame[i].lineNumber === topLineNumber) { + previousFrameTop = previousFrame[i].ranges[0]; + } } } let bottomLineNumber = linesVisibleRanges[linesVisibleRanges.length - 1].lineNumber; - for (let i = previousFrame.length - 1; !previousFrameBottom && i >= 0; i--) { - if (previousFrame[i].lineNumber === bottomLineNumber) { - previousFrameBottom = previousFrame[i].ranges[0]; + if (bottomLineNumber === viewport.endLineNumber) { + for (let i = previousFrame.length - 1; !previousFrameBottom && i >= 0; i--) { + if (previousFrame[i].lineNumber === bottomLineNumber) { + previousFrameBottom = previousFrame[i].ranges[0]; + } } } @@ -258,7 +262,7 @@ export class SelectionsOverlay extends DynamicViewOverlay { let visibleRangesHaveGaps = this._visibleRangesHaveGaps(linesVisibleRanges); if (!isIEWithZoomingIssuesNearRoundedBorders && !visibleRangesHaveGaps && this._roundedSelection) { - this._enrichVisibleRangesWithStyle(linesVisibleRanges, previousFrame); + this._enrichVisibleRangesWithStyle(ctx.visibleRange, linesVisibleRanges, previousFrame); } // The visible ranges are sorted TOP-BOTTOM and LEFT-RIGHT From 5d37bdf57c938c215743c0881dfaae202982aa91 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 00:05:08 +0200 Subject: [PATCH 414/710] Fixes #28186: Do column selection when using middle mouse button --- .../editor/browser/controller/mouseHandler.ts | 21 +++++++++++++++++-- src/vs/editor/browser/view/viewController.ts | 11 +++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts index efe3c993f16..a6ac118cbdf 100644 --- a/src/vs/editor/browser/controller/mouseHandler.ts +++ b/src/vs/editor/browser/controller/mouseHandler.ts @@ -220,8 +220,8 @@ export class MouseHandler extends ViewEventHandler { let targetIsViewZone = (t.type === editorBrowser.MouseTargetType.CONTENT_VIEW_ZONE || t.type === editorBrowser.MouseTargetType.GUTTER_VIEW_ZONE); let targetIsWidget = (t.type === editorBrowser.MouseTargetType.CONTENT_WIDGET); - let shouldHandle = e.leftButton; - if (platform.isMacintosh && e.ctrlKey) { + let shouldHandle = e.leftButton || e.middleButton; + if (platform.isMacintosh && e.leftButton && e.ctrlKey) { shouldHandle = false; } @@ -334,6 +334,7 @@ class MouseDownOperation extends Disposable { this._lastMouseEvent = e; this._mouseState.setStartedOnLineNumbers(targetType === editorBrowser.MouseTargetType.GUTTER_LINE_NUMBERS); + this._mouseState.setStartButtons(e); this._mouseState.setModifiers(e); let position = this._findMousePosition(e, true); if (!position) { @@ -488,6 +489,9 @@ class MouseDownOperation extends Disposable { ctrlKey: this._mouseState.ctrlKey, metaKey: this._mouseState.metaKey, shiftKey: this._mouseState.shiftKey, + + leftButton: this._mouseState.leftButton, + middleButton: this._mouseState.middleButton, }); } } @@ -508,6 +512,12 @@ class MouseDownState { private _shiftKey: boolean; public get shiftKey(): boolean { return this._shiftKey; } + private _leftButton: boolean; + public get leftButton(): boolean { return this._leftButton; } + + private _middleButton: boolean; + public get middleButton(): boolean { return this._middleButton; } + private _startedOnLineNumbers: boolean; public get startedOnLineNumbers(): boolean { return this._startedOnLineNumbers; } @@ -522,6 +532,8 @@ class MouseDownState { this._ctrlKey = false; this._metaKey = false; this._shiftKey = false; + this._leftButton = false; + this._middleButton = false; this._startedOnLineNumbers = false; this._lastMouseDownPosition = null; this._lastMouseDownPositionEqualCount = 0; @@ -541,6 +553,11 @@ class MouseDownState { this._shiftKey = source.shiftKey; } + public setStartButtons(source: EditorMouseEvent) { + this._leftButton = source.leftButton; + this._middleButton = source.middleButton; + } + public setStartedOnLineNumbers(startedOnLineNumbers: boolean): void { this._startedOnLineNumbers = startedOnLineNumbers; } diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index 8dfebb34b87..31233148de5 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -31,6 +31,9 @@ export interface IMouseDispatchData { ctrlKey: boolean; metaKey: boolean; shiftKey: boolean; + + leftButton: boolean; + middleButton: boolean; } export interface ICommandDelegate { @@ -133,7 +136,13 @@ export class ViewController { } public dispatchMouse(data: IMouseDispatchData): void { - if (data.startedOnLineNumbers) { + if (data.middleButton) { + if (data.inSelectionMode) { + this.columnSelect(data.position, data.mouseColumn); + } else { + this.moveTo(data.position); + } + } else if (data.startedOnLineNumbers) { // If the dragging started on the gutter, then have operations work on the entire line if (this._hasMulticursorModifier(data)) { if (data.inSelectionMode) { From 70b22b8c05fc67717451246ec35860890ed73cae Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 17 Apr 2018 15:26:09 -0700 Subject: [PATCH 415/710] Get terminal process running on ext host --- .../mainThreadTerminalService.ts | 36 +++++++--- src/vs/workbench/api/node/extHost.protocol.ts | 7 +- .../api/node/extHostTerminalService.ts | 66 +++++++++++++++++-- .../parts/terminal/common/terminal.ts | 9 ++- .../parts/terminal/common/terminalService.ts | 6 +- .../electron-browser/terminalInstance.ts | 2 +- .../terminalProcessManager.ts | 3 +- .../electron-browser/terminalService.ts | 24 +++---- .../node/terminalProcessExtHostProxy.ts | 22 ++++++- 9 files changed, 139 insertions(+), 36 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 5f574cedd71..253fb655b65 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -5,7 +5,7 @@ 'use strict'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; import { TPromise } from 'vs/base/common/winjs.base'; import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; @@ -14,23 +14,24 @@ import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostC export class MainThreadTerminalService implements MainThreadTerminalServiceShape { private _proxy: ExtHostTerminalServiceShape; - private _toDispose: IDisposable[]; + private _toDispose: IDisposable[] = []; + private _terminalProcesses: { [id: number]: ITerminalProcessExtHostProxy } = {}; constructor( extHostContext: IExtHostContext, @ITerminalService private terminalService: ITerminalService ) { + console.log('MainThreadTerminalService#ctor'); this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalService); - this._toDispose = []; this._toDispose.push(terminalService.onInstanceCreated((terminalInstance) => { // Delay this message so the TerminalInstance constructor has a chance to finish and // return the ID normally to the extension host. The ID that is passed here will be used // to register non-extension API terminals in the extension host. setTimeout(() => this._onTerminalOpened(terminalInstance), 100); })); - this._toDispose.push(terminalService.onInstanceDisposed((terminalInstance) => this._onTerminalDisposed(terminalInstance))); - this._toDispose.push(terminalService.onInstanceProcessIdReady((terminalInstance) => this._onTerminalProcessIdReady(terminalInstance))); - this._toDispose.push(terminalService.onInstanceRequestExtHostProcess((terminalInstance) => this._onTerminalRequestExtHostProcess(terminalInstance))); + this._toDispose.push(terminalService.onInstanceDisposed(terminalInstance => this._onTerminalDisposed(terminalInstance))); + this._toDispose.push(terminalService.onInstanceProcessIdReady(terminalInstance => this._onTerminalProcessIdReady(terminalInstance))); + this._toDispose.push(terminalService.onInstanceRequestExtHostProcess(proxy => this._onTerminalRequestExtHostProcess(proxy))); // Set initial ext host state this.terminalService.terminalInstances.forEach(t => { @@ -99,8 +100,27 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy.$acceptTerminalProcessId(terminalInstance.id, terminalInstance.processId); } - private _onTerminalRequestExtHostProcess(terminalInstance: ITerminalInstance): void { + private _onTerminalRequestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void { console.log('mainThreadTerminalService#_onTerminalRequestExtHostProcess', arguments); - this._proxy.$createProcess(null, 0, 0); + this._terminalProcesses[proxy.terminalId] = proxy; + this._proxy.$createProcess(proxy.terminalId, null, 0, 0); + // TODO: Dispose of this properly when the terminal/process dies + this._toDispose.push(proxy.onInput(data => this._onTerminalProcessWrite(proxy.terminalId, data))); + } + + public $sendProcessTitle(terminalId: number, title: string): void { + this._terminalProcesses[terminalId].emitTitle(title); + } + + public $sendProcessData(terminalId: number, data: string): void { + this._terminalProcesses[terminalId].emitData(data); + } + + public $sendProcessPid(terminalId: number, pid: number): void { + this._terminalProcesses[terminalId].emitPid(pid); + } + + private _onTerminalProcessWrite(terminalId: number, data: string): void { + this._proxy.$acceptTerminalProcessWrite(terminalId, data); } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index ce3753c84e7..619181eff1f 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -321,6 +321,10 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $hide(terminalId: number): void; $sendText(terminalId: number, text: string, addNewLine: boolean): void; $show(terminalId: number, preserveFocus: boolean): void; + + $sendProcessTitle(terminalId: number, title: string): void; + $sendProcessData(terminalId: number, data: string): void; + $sendProcessPid(terminalId: number, pid: number): void; } export interface MyQuickPickItems extends IPickOpenEntry { @@ -743,7 +747,8 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalClosed(id: number): void; $acceptTerminalOpened(id: number, name: string): void; $acceptTerminalProcessId(id: number, processId: number): void; - $createProcess(shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; + $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; + $acceptTerminalProcessWrite(id: number, data: string): void; } export interface ExtHostSCMShape { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index c1632fc7629..9310283c71e 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -5,8 +5,12 @@ 'use strict'; import * as vscode from 'vscode'; +import * as cp from 'child_process'; +import * as path from 'path'; +import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto } from 'vs/workbench/api/node/extHost.protocol'; +import { IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; export class ExtHostTerminal implements vscode.Terminal { @@ -81,6 +85,7 @@ export class ExtHostTerminal implements vscode.Terminal { } public _setProcessId(processId: number): void { + console.log('extHostTerminalService#_setProcessId', processId); this._pidPromiseComplete(processId); this._pidPromiseComplete = null; } @@ -106,7 +111,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { private readonly _onDidCloseTerminal: Emitter; private readonly _onDidOpenTerminal: Emitter; private _proxy: MainThreadTerminalServiceShape; - private _terminals: ExtHostTerminal[]; + private _terminals: ExtHostTerminal[] = []; + private _terminalProcesses: { [id: number]: cp.ChildProcess } = {}; public get terminals(): ExtHostTerminal[] { return this._terminals; } @@ -114,7 +120,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { this._onDidCloseTerminal = new Emitter(); this._onDidOpenTerminal = new Emitter(); this._proxy = mainContext.getProxy(MainContext.MainThreadTerminalService); - this._terminals = []; } public createTerminal(name?: string, shellPath?: string, shellArgs?: string[]): vscode.Terminal { @@ -150,6 +155,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $acceptTerminalOpened(id: number, name: string): void { + console.log('terminal opened: ' + id); let index = this._getTerminalIndexById(id); if (index !== null) { // The terminal has already been created (via createTerminal*), only fire the event @@ -163,13 +169,64 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public $acceptTerminalProcessId(id: number, processId: number): void { let terminal = this._getTerminalById(id); + console.log('ExtHostTerminalService#$acceptTerminalProcessId ' + id + ' ' + processId); if (terminal) { terminal._setProcessId(processId); } } - public $createProcess(shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void { - console.log('$createProcess'); + public $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void { + shellLaunchConfig = { + env: {}, + executable: 'bash' + }; + + + // TODO: Launch process + // TODO: Associate the process with the terminal object/id + // TODO: terminal has incorrect name/options, fix up + const parentEnv = { ...process.env }; + const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, '/home/daniel', undefined, cols, rows); + // TODO: Use Uri? + let cwd = path.dirname(require.toUrl('../../parts/terminal/node/terminalProcess')).replace('file://', ''); + console.log(cwd); + const options = { env, cwd, execArgv: [] }; + + let bootstrapUri = require.toUrl('bootstrap').replace('file://', '') + '.js'; + console.log(bootstrapUri); + + // cwd = '/home/daniel/dev/Microsoft/vscode/out/vs/workbench/parts/terminal/node'; + // bootstrapUri = '/home/daniel/dev/Microsoft/vscode/out/bootstrap'; + // env['AMD_ENTRYPOINT'] = 'vs/workbench/parts/terminal/node/terminalProcess'; + this._terminalProcesses[id] = cp.fork(bootstrapUri, ['--type=terminal'], options); + + this._terminalProcesses[id].on('message', (message: IMessageFromTerminalProcess) => { + switch (message.type) { + case 'pid': + this._proxy.$sendProcessPid(id, message.content); + break; + case 'title': + this._proxy.$sendProcessTitle(id, message.content); + break; + case 'data': + this._proxy.$sendProcessData(id, message.content); + break; + } + // console.log('message type: ' + d.type + ', content: ' + d.content) + }); + + // const processPath = require.toUrl('../../parts/terminal/node/terminalProcess').replace('file://', ''); + // const process2 = cp.fork(processPath, [], options); + // process2.on('data', d => console.log('data ' + d)); + // process2.on('exit', d => console.log('exit ' + d)); + // process2.on('error', d => console.log('error ' + d)); + + const terminal = this._getTerminalById(id); + console.log('$createProcess terminal: ' + terminal.name); + } + + public $acceptTerminalProcessWrite(id: number, data: string): void { + this._terminalProcesses[id].send({ event: 'input', data }); } private _getTerminalById(id: number): ExtHostTerminal { @@ -180,6 +237,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { private _getTerminalIndexById(id: number): number { let index: number = null; this._terminals.some((terminal, i) => { + // TODO: This shouldn't be cas let thisId = (terminal)._id; if (thisId === id) { index = i; diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index d4934907a46..a435e65df32 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -165,7 +165,7 @@ export interface ITerminalService { onInstanceCreated: Event; onInstanceDisposed: Event; onInstanceProcessIdReady: Event; - onInstanceRequestExtHostProcess: Event; + onInstanceRequestExtHostProcess: Event; onInstancesChanged: Event; onInstanceTitleChanged: Event; terminalInstances: ITerminalInstance[]; @@ -207,7 +207,7 @@ export interface ITerminalService { selectDefaultWindowsShell(): TPromise; setWorkspaceShellAllowed(isAllowed: boolean): void; - requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): TPromise; + requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void; } export const enum Direction { @@ -524,7 +524,10 @@ export enum ProcessState { export interface ITerminalProcessExtHostProxy { + readonly terminalId: number; + emitData(data: string): void; emitTitle(title: string): void; emitPid(pid: number): void; -} \ No newline at end of file + onInput(listener: (data: string) => void): IDisposable; +} diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index 2ec8be7c6bb..92a91bcf5ac 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -39,8 +39,8 @@ export abstract class TerminalService implements ITerminalService { public get onInstanceDisposed(): Event { return this._onInstanceDisposed.event; } protected readonly _onInstanceProcessIdReady: Emitter = new Emitter(); public get onInstanceProcessIdReady(): Event { return this._onInstanceProcessIdReady.event; } - protected readonly _onInstanceRequestExtHostProcess: Emitter = new Emitter(); - public get onInstanceRequestExtHostProcess(): Event { return this._onInstanceRequestExtHostProcess.event; } + protected readonly _onInstanceRequestExtHostProcess: Emitter = new Emitter(); + public get onInstanceRequestExtHostProcess(): Event { return this._onInstanceRequestExtHostProcess.event; } protected readonly _onInstancesChanged: Emitter = new Emitter(); public get onInstancesChanged(): Event { return this._onInstancesChanged.event; } protected readonly _onInstanceTitleChanged: Emitter = new Emitter(); @@ -75,7 +75,7 @@ export abstract class TerminalService implements ITerminalService { public abstract getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance; public abstract selectDefaultWindowsShell(): TPromise; public abstract setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void; - public abstract requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): TPromise; + public abstract requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void; private _restoreTabs(): void { if (!this.configHelper.config.experimentalRestore) { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 37f4a216882..cfbbcd194b3 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -587,7 +587,7 @@ export class TerminalInstance implements ITerminalInstance { } protected _createProcess(): void { - this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._configHelper); + this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._id, this._configHelper); this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this)); this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts index 9d3c4ba3a4c..bfeef947e40 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts @@ -51,6 +51,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { public get onProcessExit(): Event { return this._onProcessExit.event; } constructor( + private _terminalId: number, private _configHelper: ITerminalConfigHelper, @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, @IHistoryService private readonly _historyService: IHistoryService, @@ -117,7 +118,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { const options = { env, cwd }; this._logService.debug(`Terminal process launching`, options); if (shellLaunchConfig.extensionHostOwned) { - this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy); + this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId); } else { this._process = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], options); } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 470d17dcb0d..0e37f567c63 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -27,6 +27,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { ipcRenderer as ipc } from 'electron'; import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; import { TerminalInstance } from 'vs/workbench/parts/terminal/electron-browser/terminalInstance'; +import { IExtensionService } from '../../../services/extensions/common/extensions'; export class TerminalService extends AbstractTerminalService implements ITerminalService { private _configHelper: TerminalConfigHelper; @@ -47,7 +48,8 @@ export class TerminalService extends AbstractTerminalService implements ITermina @IInstantiationService private readonly _instantiationService: IInstantiationService, @IQuickOpenService private readonly _quickOpenService: IQuickOpenService, @INotificationService private readonly _notificationService: INotificationService, - @IDialogService private readonly _dialogService: IDialogService + @IDialogService private readonly _dialogService: IDialogService, + @IExtensionService private readonly _extensionService: IExtensionService ) { super(contextKeyService, panelService, partService, lifecycleService, storageService); @@ -93,17 +95,15 @@ export class TerminalService extends AbstractTerminalService implements ITermina return this._instantiationService.createInstance(TerminalInstance, terminalFocusContextKey, configHelper, undefined, shellLaunchConfig, true); } - public requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): TPromise { - let i = 0; - setTimeout(() => { - proxy.emitPid(-1); - proxy.emitTitle('test title'); - proxy.emitData(`test ${i++}\r\n`); - }, 0); - setInterval(() => { - proxy.emitData(`test ${i++}\r\n`); - }, 1000); - return TPromise.as(void 0); + public requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void { + // Ensure extension host is ready before requesting a process + this._extensionService.whenInstalledExtensionsRegistered().then(() => { + // TODO: MainThreadTerminalService is not ready at this point, fix this + setTimeout(() => { + console.log('request'); + this._onInstanceRequestExtHostProcess.fire(proxy); + }, 100); + }); } public focusFindWidget(): TPromise { diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index 271e8b0c543..d59cb652534 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -6,17 +6,19 @@ import { ITerminalChildProcess, IMessageToTerminalProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; import { EventEmitter } from 'events'; import { ITerminalService, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; +import { IDisposable } from '../../../../base/common/lifecycle'; export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy { public connected: boolean; constructor( + public terminalId: number, @ITerminalService private _terminalService: ITerminalService ) { super(); - this._terminalService.requestExtHostProcess(this).then(() => { - }); + // TODO: Return TPromise indicating success? Teardown if failure? + this._terminalService.requestExtHostProcess(this); } public emitData(data: string): void { @@ -30,7 +32,21 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin } public send(message: IMessageToTerminalProcess): boolean { - console.log('TerminalProcessExtHostBridge#send', arguments); + console.log('TerminalProcessExtHostProxy#send'); + if (message.event === 'input') { + console.log('emit input', message.data); + this.emit('input', message.data); + } return true; } + + public onInput(listener: (data: string) => void): IDisposable { + console.log('TerminalProcessExtHostProxy#onInput', arguments); + // TODO: Dispose of me + this.on('input', data => { + console.log('TerminalProcessExtHostProxy#onInput - listener'); + listener(data); + }); + return null; + } } \ No newline at end of file From a0e99bcb4a1726100a71a66762dc4deafddc8c8b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 17 Apr 2018 15:30:31 -0700 Subject: [PATCH 416/710] Clean up --- .../api/node/extHostTerminalService.ts | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 9310283c71e..e6ad441affc 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -202,25 +202,12 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { this._terminalProcesses[id].on('message', (message: IMessageFromTerminalProcess) => { switch (message.type) { - case 'pid': - this._proxy.$sendProcessPid(id, message.content); - break; - case 'title': - this._proxy.$sendProcessTitle(id, message.content); - break; - case 'data': - this._proxy.$sendProcessData(id, message.content); - break; + case 'pid': this._proxy.$sendProcessPid(id, message.content); break; + case 'title': this._proxy.$sendProcessTitle(id, message.content); break; + case 'data': this._proxy.$sendProcessData(id, message.content); break; } - // console.log('message type: ' + d.type + ', content: ' + d.content) }); - // const processPath = require.toUrl('../../parts/terminal/node/terminalProcess').replace('file://', ''); - // const process2 = cp.fork(processPath, [], options); - // process2.on('data', d => console.log('data ' + d)); - // process2.on('exit', d => console.log('exit ' + d)); - // process2.on('error', d => console.log('error ' + d)); - const terminal = this._getTerminalById(id); console.log('$createProcess terminal: ' + terminal.name); } From c8d58f428e1d1b1fedee4524db39c9600a8c8371 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 17 Apr 2018 15:43:41 -0700 Subject: [PATCH 417/710] Pass through shutdown and resize --- .../mainThreadTerminalService.ts | 8 ++--- src/vs/workbench/api/node/extHost.protocol.ts | 4 ++- .../api/node/extHostTerminalService.ts | 11 ++++++- .../parts/terminal/common/terminal.ts | 2 ++ .../node/terminalProcessExtHostProxy.ts | 29 ++++++++++++------- 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 253fb655b65..4aea9d9d787 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -105,7 +105,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._terminalProcesses[proxy.terminalId] = proxy; this._proxy.$createProcess(proxy.terminalId, null, 0, 0); // TODO: Dispose of this properly when the terminal/process dies - this._toDispose.push(proxy.onInput(data => this._onTerminalProcessWrite(proxy.terminalId, data))); + this._toDispose.push(proxy.onInput(data => this._proxy.$acceptTerminalProcessInput(proxy.terminalId, data))); + this._toDispose.push(proxy.onResize((cols, rows) => this._proxy.$acceptTerminalProcessResize(proxy.terminalId, cols, rows))); + this._toDispose.push(proxy.onShutdown(() => this._proxy.$acceptTerminalProcessShutdown(proxy.terminalId))); } public $sendProcessTitle(terminalId: number, title: string): void { @@ -119,8 +121,4 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $sendProcessPid(terminalId: number, pid: number): void { this._terminalProcesses[terminalId].emitPid(pid); } - - private _onTerminalProcessWrite(terminalId: number, data: string): void { - this._proxy.$acceptTerminalProcessWrite(terminalId, data); - } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 619181eff1f..40ae2187b9d 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -748,7 +748,9 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalOpened(id: number, name: string): void; $acceptTerminalProcessId(id: number, processId: number): void; $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; - $acceptTerminalProcessWrite(id: number, data: string): void; + $acceptTerminalProcessInput(id: number, data: string): void; + $acceptTerminalProcessResize(id: number, cols: number, rows: number): void; + $acceptTerminalProcessShutdown(id: number): void; } export interface ExtHostSCMShape { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index e6ad441affc..16b62bd5e39 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -212,10 +212,19 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { console.log('$createProcess terminal: ' + terminal.name); } - public $acceptTerminalProcessWrite(id: number, data: string): void { + public $acceptTerminalProcessInput(id: number, data: string): void { this._terminalProcesses[id].send({ event: 'input', data }); } + public $acceptTerminalProcessResize(id: number, cols: number, rows: number): void { + console.log('resize' + cols + ',' + rows); + this._terminalProcesses[id].send({ event: 'resize', cols, rows }); + } + + public $acceptTerminalProcessShutdown(id: number): void { + this._terminalProcesses[id].send({ event: 'shutdown' }); + } + private _getTerminalById(id: number): ExtHostTerminal { let index = this._getTerminalIndexById(id); return index !== null ? this._terminals[index] : null; diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index a435e65df32..946bfb8ef2d 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -530,4 +530,6 @@ export interface ITerminalProcessExtHostProxy { emitTitle(title: string): void; emitPid(pid: number): void; onInput(listener: (data: string) => void): IDisposable; + onResize(listener: (cols: number, rows: number) => void): IDisposable; + onShutdown(listener: () => void): IDisposable; } diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index d59cb652534..f05ec5f6dc1 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -9,7 +9,8 @@ import { ITerminalService, ITerminalProcessExtHostProxy } from 'vs/workbench/par import { IDisposable } from '../../../../base/common/lifecycle'; export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy { - public connected: boolean; + // TODO: Set this properly + public connected: boolean = true; constructor( public terminalId: number, @@ -32,21 +33,29 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin } public send(message: IMessageToTerminalProcess): boolean { - console.log('TerminalProcessExtHostProxy#send'); - if (message.event === 'input') { - console.log('emit input', message.data); - this.emit('input', message.data); + switch (message.event) { + case 'input': this.emit('input', message.data); break; + case 'resize': this.emit('resize', message.cols, message.rows); break; + case 'shutdown': this.emit('shutdown'); break; } return true; } public onInput(listener: (data: string) => void): IDisposable { - console.log('TerminalProcessExtHostProxy#onInput', arguments); // TODO: Dispose of me - this.on('input', data => { - console.log('TerminalProcessExtHostProxy#onInput - listener'); - listener(data); - }); + this.on('input', data => listener(data)); + return null; + } + + public onResize(listener: (cols: number, rows: number) => void): IDisposable { + // TODO: Dispose of me + this.on('resize', (cols, rows) => listener(cols, rows)); + return null; + } + + public onShutdown(listener: () => void): IDisposable { + // TODO: Dispose of me + this.on('shutdown', () => listener()); return null; } } \ No newline at end of file From fbd3a083692e1327ba77f0645674a2df95c66c65 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 17 Apr 2018 16:20:27 -0700 Subject: [PATCH 418/710] Pass Webview into ExtHostWebviewPanel instead of creating it inside the ctor --- src/vs/workbench/api/node/extHostWebview.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 45afdf5d503..d82e1235db2 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -92,9 +92,10 @@ export class ExtHostWebview implements vscode.Webview { export class ExtHostWebviewPanel implements vscode.WebviewPanel { private readonly _handle: WebviewPanelHandle; + private readonly _proxy: MainThreadWebviewsShape; private readonly _viewType: string; private readonly _options: vscode.WebviewPanelOptions; - private readonly _proxy: MainThreadWebviewsShape; + private readonly _webview: ExtHostWebview; private _isDisposed: boolean = false; private _viewColumn: vscode.ViewColumn; private _visible: boolean = true; @@ -105,23 +106,21 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { public readonly onDidChangeViewStateEmitter = new Emitter(); public readonly onDidChangeViewState: Event = this.onDidChangeViewStateEmitter.event; - private _webview: ExtHostWebview; constructor( handle: WebviewPanelHandle, proxy: MainThreadWebviewsShape, viewType: string, - title: string, viewColumn: vscode.ViewColumn, editorOptions: vscode.WebviewPanelOptions, - webviewOptions: vscode.WebviewOptions + webview: ExtHostWebview ) { this._handle = handle; this._proxy = proxy; this._viewType = viewType; this._options = editorOptions; this._viewColumn = viewColumn; - this._webview = new ExtHostWebview(handle, proxy, title, webviewOptions); + this._webview = webview; } public dispose() { @@ -213,7 +212,8 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { const handle = ExtHostWebviews.webviewHandlePool++ + ''; this._proxy.$createWebviewPanel(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath); - const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, title, viewColumn, options, options); + const webview = new ExtHostWebview(handle, this._proxy, title, options); + const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, viewColumn, options, webview); this._webviewPanels.set(handle, panel); return panel; } @@ -269,14 +269,15 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { title: string, state: any, position: Position, - options: vscode.WebviewOptions + options: vscode.WebviewOptions & vscode.WebviewPanelOptions ): Thenable { const serializer = this._serializers.get(viewType); if (!serializer) { return TPromise.wrapError(new Error(`No serializer found for '${viewType}'`)); } - const revivedPanel = new ExtHostWebviewPanel(webviewHandle, this._proxy, viewType, title, typeConverters.toViewColumn(position), options as vscode.WebviewPanelOptions, options as vscode.WebviewOptions); + const webview = new ExtHostWebview(webviewHandle, this._proxy, title, options); + const revivedPanel = new ExtHostWebviewPanel(webviewHandle, this._proxy, viewType, typeConverters.toViewColumn(position), options, webview); this._webviewPanels.set(webviewHandle, revivedPanel); return serializer.deserializeWebviewPanel(revivedPanel, state); } From cdd9a731f9ea3c119621463c2d26f2725079172f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 17 Apr 2018 16:22:44 -0700 Subject: [PATCH 419/710] Use standard 'postMessage' name --- src/vs/workbench/api/electron-browser/mainThreadWebview.ts | 2 +- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostWebview.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index b3bff528318..4f007ab2439 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -101,7 +101,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv this._webviewService.revealWebview(webview, column); } - async $sendMessage(handle: WebviewPanelHandle, message: any): TPromise { + async $postMessage(handle: WebviewPanelHandle, message: any): TPromise { const webview = this.getWebview(handle); const editors = this._editorService.getVisibleEditors() .filter(e => e instanceof WebviewEditor) diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 3f5c9595b49..37f274df23a 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -355,7 +355,7 @@ export interface MainThreadWebviewsShape extends IDisposable { $reveal(handle: WebviewPanelHandle, column: EditorPosition): void; $setTitle(handle: WebviewPanelHandle, value: string): void; $setHtml(handle: WebviewPanelHandle, value: string): void; - $sendMessage(handle: WebviewPanelHandle, value: any): Thenable; + $postMessage(handle: WebviewPanelHandle, value: any): Thenable; $registerSerializer(viewType: string): void; $unregisterSerializer(viewType: string): void; diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index d82e1235db2..53eb8d31972 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -74,7 +74,7 @@ export class ExtHostWebview implements vscode.Webview { public postMessage(message: any): Thenable { this.assertNotDisposed(); - return this._proxy.$sendMessage(this._handle, message); + return this._proxy.$postMessage(this._handle, message); } public reveal(viewColumn: vscode.ViewColumn): void { @@ -173,7 +173,7 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { public postMessage(message: any): Thenable { this.assertNotDisposed(); - return this._proxy.$sendMessage(this._handle, message); + return this._proxy.$postMessage(this._handle, message); } public reveal(viewColumn: vscode.ViewColumn): void { From 94bd08ae126282bf0cac39cceede45471780cd9d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 17 Apr 2018 16:39:58 -0700 Subject: [PATCH 420/710] Clean up naming --- .../parts/webview/electron-browser/webview.contribution.ts | 2 +- .../parts/webview/electron-browser/webviewCommands.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts index aa05a047266..c455d333963 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts @@ -68,7 +68,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule(showPreviousFindTermCommand const hideCommand = new HideWebViewEditorFindCommand({ - id: HideWebViewEditorFindCommand.Id, + id: HideWebViewEditorFindCommand.ID, precondition: ContextKeyExpr.and( KEYBINDING_CONTEXT_WEBVIEWEDITOR_FOCUS, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE), diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts b/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts index ed5542fae12..aefe8892396 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts @@ -23,7 +23,7 @@ export class ShowWebViewEditorFindWidgetCommand extends Command { } export class HideWebViewEditorFindCommand extends Command { - public static readonly Id = 'editor.action.webvieweditor.hideFind'; + public static readonly ID = 'editor.action.webvieweditor.hideFind'; public runCommand(accessor: ServicesAccessor, args: any): void { const webViewEditor = getActiveWebviewEditor(accessor); @@ -97,8 +97,8 @@ export class ReloadWebviewAction extends Action { private getVisibleWebviews() { return this.workbenchEditorService.getVisibleEditors() - .filter(c => c && (c as any).isWebviewEditor) - .map(e => e as BaseWebviewEditor); + .filter(editor => editor && (editor as BaseWebviewEditor).isWebviewEditor) + .map(editor => editor as BaseWebviewEditor); } } From 7c68a78be7bff9cf45a40c4284caa369cd50c7b3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 17 Apr 2018 17:30:07 -0700 Subject: [PATCH 421/710] Remove the old referenceInfos editor config option This setting was removed two years back #17452 --- src/vs/editor/common/config/editorOptions.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 48d76961005..082b31e0aaa 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -491,11 +491,6 @@ export interface IEditorOptions { * Defaults to true. */ codeLens?: boolean; - /** - * @deprecated - use codeLens instead - * @internal - */ - referenceInfos?: boolean; /** * Control the behavior and rendering of the code action lightbulb. */ @@ -1745,7 +1740,7 @@ export class EditorOptionsValidator { suggestLineHeight: _clampedInt(opts.suggestLineHeight, defaults.suggestLineHeight, 0, 1000), selectionHighlight: _boolean(opts.selectionHighlight, defaults.selectionHighlight), occurrencesHighlight: _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight), - codeLens: _boolean(opts.codeLens, defaults.codeLens) && _boolean(opts.referenceInfos, true), + codeLens: _boolean(opts.codeLens, defaults.codeLens), folding: _boolean(opts.folding, defaults.folding), foldingStrategy: _stringSet<'auto' | 'indentation'>(opts.foldingStrategy, defaults.foldingStrategy, ['auto', 'indentation']), showFoldingControls: _stringSet<'always' | 'mouseover'>(opts.showFoldingControls, defaults.showFoldingControls, ['always', 'mouseover']), From 88f500e805ecc4efd064f7886c1a5ce8a2a2c087 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 17 Apr 2018 17:32:40 -0700 Subject: [PATCH 422/710] Use standard arrays.equals instead of custom function --- src/vs/editor/common/config/editorOptions.ts | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 082b31e0aaa..8045cc078ee 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -10,6 +10,7 @@ import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { Constants } from 'vs/editor/common/core/uint'; import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; +import * as arrays from 'vs/base/common/arrays'; /** * Configuration options for editor scrollbars @@ -1070,7 +1071,7 @@ export class InternalEditorOptions { return ( a.extraEditorClassName === b.extraEditorClassName && a.disableMonospaceOptimizations === b.disableMonospaceOptimizations - && this._equalsNumberArrays(a.rulers, b.rulers) + && arrays.equals(a.rulers, b.rulers) && a.ariaLabel === b.ariaLabel && a.renderLineNumbers === b.renderLineNumbers && a.renderCustomLineNumbers === b.renderCustomLineNumbers @@ -1132,18 +1133,6 @@ export class InternalEditorOptions { ); } - private static _equalsNumberArrays(a: number[], b: number[]): boolean { - if (a.length !== b.length) { - return false; - } - for (let i = 0; i < a.length; i++) { - if (a[i] !== b[i]) { - return false; - } - } - return true; - } - /** * @internal */ From dbe092542216081f7489b66bc8c05c9b52805a2e Mon Sep 17 00:00:00 2001 From: Christopher Leidigh Date: Wed, 18 Apr 2018 02:02:18 -0400 Subject: [PATCH 423/710] Selectbox: Remove workbench css ref, add min bottom margin. Fixes: #44915 (#48091) * Add selectBoxOptions * Add range checking * Selectbox: Remove workbench css ref, add minBottomMargin. Fixes: #45915 --- src/vs/base/browser/ui/selectBox/selectBox.ts | 8 ++++-- .../browser/ui/selectBox/selectBoxCustom.ts | 25 ++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/vs/base/browser/ui/selectBox/selectBox.ts b/src/vs/base/browser/ui/selectBox/selectBox.ts index d6f7ee5079c..28828be39de 100644 --- a/src/vs/base/browser/ui/selectBox/selectBox.ts +++ b/src/vs/base/browser/ui/selectBox/selectBox.ts @@ -34,6 +34,10 @@ export interface ISelectBoxDelegate { applyStyles(): void; } +export interface ISelectBoxOptions { + minBottomMargin?: number; +} + export interface ISelectBoxStyles extends IListStyles { selectBackground?: Color; selectListBackground?: Color; @@ -58,7 +62,7 @@ export class SelectBox extends Widget implements ISelectBoxDelegate { private styles: ISelectBoxStyles; private selectBoxDelegate: ISelectBoxDelegate; - constructor(options: string[], selected: number, contextViewProvider: IContextViewProvider, styles: ISelectBoxStyles = deepClone(defaultStyles)) { + constructor(options: string[], selected: number, contextViewProvider: IContextViewProvider, styles: ISelectBoxStyles = deepClone(defaultStyles), selectBoxOptions?: ISelectBoxOptions) { super(); this.toDispose = []; @@ -69,7 +73,7 @@ export class SelectBox extends Widget implements ISelectBoxDelegate { if (isMacintosh) { this.selectBoxDelegate = new SelectBoxNative(options, selected, styles); } else { - this.selectBoxDelegate = new SelectBoxList(options, selected, contextViewProvider, styles); + this.selectBoxDelegate = new SelectBoxList(options, selected, contextViewProvider, styles, selectBoxOptions); } this.toDispose.push(this.selectBoxDelegate); diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index 4155453489f..f075f3a06a6 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -17,7 +17,7 @@ import { List } from 'vs/base/browser/ui/list/listWidget'; import { IDelegate, IRenderer } from 'vs/base/browser/ui/list/list'; import { domEvent } from 'vs/base/browser/event'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; -import { ISelectBoxDelegate, ISelectBoxStyles, ISelectData } from 'vs/base/browser/ui/selectBox/selectBox'; +import { ISelectBoxDelegate, ISelectBoxOptions, ISelectBoxStyles, ISelectData } from 'vs/base/browser/ui/selectBox/selectBox'; import { isMacintosh } from 'vs/base/common/platform'; const $ = dom.$; @@ -74,9 +74,10 @@ class SelectListRenderer implements IRenderer { - private static SELECT_DROPDOWN_BOTTOM_MARGIN = 10; + private static readonly DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN = 32; private _isVisible: boolean; + private selectBoxOptions: ISelectBoxOptions; private selectElement: HTMLSelectElement; private options: string[]; private selected: number; @@ -93,10 +94,15 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate Date: Wed, 18 Apr 2018 08:03:47 +0200 Subject: [PATCH 424/710] :lipstick: --- src/vs/base/browser/ui/selectBox/selectBoxCustom.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index f075f3a06a6..d77c5cfd599 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -100,8 +100,10 @@ export class SelectBoxList implements ISelectBoxDelegate, IDelegate Date: Wed, 18 Apr 2018 08:14:38 +0200 Subject: [PATCH 425/710] screenshot support --- src/vs/platform/driver/common/driver.ts | 7 +++++ .../platform/driver/electron-main/driver.ts | 12 +++++++++ test/smoke/src/application.ts | 4 +++ test/smoke/src/main.ts | 27 +++++++++++++++++-- test/smoke/src/vscode/code.ts | 5 ++++ 5 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index e3084f34aa8..b33f4ff2295 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -27,6 +27,7 @@ export interface IDriver { _serviceBrand: any; getWindowIds(): TPromise; + capturePage(windowId: number): TPromise; reloadWindow(windowId: number): TPromise; dispatchKeybinding(windowId: number, keybinding: string): TPromise; click(windowId: number, selector: string, xoffset?: number | undefined, yoffset?: number | undefined): TPromise; @@ -43,6 +44,7 @@ export interface IDriver { export interface IDriverChannel extends IChannel { call(command: 'getWindowIds'): TPromise; + call(command: 'capturePage'): TPromise; call(command: 'reloadWindow', arg: number): TPromise; call(command: 'dispatchKeybinding', arg: [number, string]): TPromise; call(command: 'click', arg: [number, string, number | undefined, number | undefined]): TPromise; @@ -64,6 +66,7 @@ export class DriverChannel implements IDriverChannel { call(command: string, arg?: any): TPromise { switch (command) { case 'getWindowIds': return this.driver.getWindowIds(); + case 'capturePage': return this.driver.capturePage(arg); case 'reloadWindow': return this.driver.reloadWindow(arg); case 'dispatchKeybinding': return this.driver.dispatchKeybinding(arg[0], arg[1]); case 'click': return this.driver.click(arg[0], arg[1], arg[2], arg[3]); @@ -91,6 +94,10 @@ export class DriverChannelClient implements IDriver { return this.channel.call('getWindowIds'); } + capturePage(windowId: number): TPromise { + return this.channel.call('capturePage', windowId); + } + reloadWindow(windowId: number): TPromise { return this.channel.call('reloadWindow', windowId); } diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 858618480d1..d5502509ec5 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -20,6 +20,7 @@ import { Emitter, toPromise } from 'vs/base/common/event'; // TODO@joao: bad layering! import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; +import { NativeImage } from 'electron'; class WindowRouter implements IClientRouter { @@ -63,6 +64,17 @@ export class Driver implements IDriver, IWindowDriverRegistry { .filter(id => this.registeredWindowIds.has(id) && !this.reloadingWindowIds.has(id)); } + async capturePage(windowId: number): TPromise { + await this.whenUnfrozen(windowId); + + const window = this.windowsService.getWindowById(windowId); + const webContents = window.win.webContents; + const image = await new Promise(c => webContents.capturePage(c)); + const buffer = image.toPNG(); + + return buffer.toString('base64'); + } + async reloadWindow(windowId: number): TPromise { await this.whenUnfrozen(windowId); diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 76e7dd417f4..030c36e1d50 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -93,6 +93,10 @@ export class Application { } } + async capturePage(): Promise { + return this.code.capturePage(); + } + private async startApplication(workspaceOrFolder: string, extraArgs: string[] = []): Promise { this._code = await spawn({ codePath: this.options.codePath, diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index c73fd841400..55039581029 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -38,7 +38,8 @@ const opts = minimist(args, { 'stable-build', 'wait-time', 'test-repo', - 'keybindings' + 'keybindings', + 'screenshots' ], boolean: [ 'verbose' @@ -55,6 +56,12 @@ const keybindingsPath = path.join(testDataPath, 'keybindings.json'); const extensionsPath = path.join(testDataPath, 'extensions-dir'); mkdirp.sync(extensionsPath); +const screenshotsPath = opts.screenshots ? path.resolve(opts.screenshots) : null; + +if (screenshotsPath) { + mkdirp.sync(screenshotsPath); +} + function fail(errorMessage): void { console.error(errorMessage); process.exit(1); @@ -256,7 +263,7 @@ describe('Data Migration', () => { setupDataMigrationTests(userDataDir, createApp); }); -describe('Everything Else', () => { +describe('Test', () => { before(async function () { const app = createApp(quality); await app!.start(); @@ -267,6 +274,22 @@ describe('Everything Else', () => { await this.app.stop(); }); + if (screenshotsPath) { + afterEach(async function () { + if (this.currentTest.state !== 'failed') { + return; + } + + const app = this.app as Application; + const raw = await app.capturePage(); + const buffer = new Buffer(raw, 'base64'); + + const name = this.currentTest.fullTitle().replace(/[^a-z0-9\-]/ig, '_'); + const screenshotPath = path.join(screenshotsPath, `${name}.png`); + fs.writeFileSync(screenshotPath, buffer); + }); + } + setupDataLossTests(); setupDataExplorerTests(); setupDataPreferencesTests(); diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index 14ee5c4a51b..b4415b84384 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -202,6 +202,11 @@ export class Code { } } + async capturePage(): Promise { + const windowId = await this.getActiveWindowId(); + return await this.driver.capturePage(windowId); + } + async waitForWindowIds(fn: (windowIds: number[]) => boolean): Promise { await poll(() => this.driver.getWindowIds(), fn, `get window ids`); } From 315d6842eb79a191f5c75d94e596d151276eddfb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 08:18:49 +0200 Subject: [PATCH 426/710] publish screenshots in TFS --- build/tfs/continuous-build.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 7e75b568ede..ba2b15ea7f4 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -19,8 +19,13 @@ phases: - powershell: | .\scripts\test.bat --tfs .\scripts\test-integration.bat - yarn smoketest + yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\screenshots" name: test + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' + ArtifactName: Screenshots + publishLocation: Container - phase: Linux queue: Hosted Linux Preview @@ -75,5 +80,10 @@ phases: - script: | ./scripts/test.sh --tfs ./scripts/test-integration.sh - yarn smoketest + yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/screenshots" name: test + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' + ArtifactName: Screenshots + publishLocation: Container From 7dd11a0c955c3bfd79c0babc697b178f105ff399 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 08:59:47 +0200 Subject: [PATCH 427/710] publish screenshots --- build/tfs/continuous-build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index ba2b15ea7f4..0de0b63b073 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -26,6 +26,7 @@ phases: PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' ArtifactName: Screenshots publishLocation: Container + condition: succeededOrFailed() - phase: Linux queue: Hosted Linux Preview @@ -87,3 +88,4 @@ phases: PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' ArtifactName: Screenshots publishLocation: Container + condition: succeededOrFailed() From a502985ea44dcb731039939645fb5ce4a762ce61 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Wed, 18 Apr 2018 09:07:15 +0200 Subject: [PATCH 428/710] refactoring after PR review --- .../files/electron-browser/fileActions.ts | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 3927971926e..d7a91b53a7a 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1357,16 +1357,16 @@ export function validateFileName(parent: ExplorerItem, name: string, allowOverwr } const names: string[] = name.split(/[\\/]/).filter(part => !!part); - const pathMapping = mapPathsToExistingFolders(parent, names); + const analyzedPath = analyzePath(parent, names); // Do not allow to overwrite existing file - if (!allowOverwriting && pathMapping.fullPathAlreadyExists) { + if (!allowOverwriting && analyzedPath.fullPathAlreadyExists) { return nls.localize('fileNameExistsError', "A file or folder **{0}** already exists at this location. Please choose a different name.", name); } // A file must always be a leaf - if (pathMapping.lastExistingPathSegment.isFile) { - return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", pathMapping.lastExistingPathSegment.name); + if (analyzedPath.lastExistingPathSegment.isFile) { + return nls.localize('fileUsedAsFolderError', "**{0}** is a file and cannot have any descendants.", analyzedPath.lastExistingPathSegment.name); } // Invalid File name @@ -1385,16 +1385,7 @@ export function validateFileName(parent: ExplorerItem, name: string, allowOverwr return null; } - -interface IMappedPath { - fullPathAlreadyExists: boolean; - lastExistingPathSegment: { - isFile: boolean; - name: string; - }; -} - -function mapPathsToExistingFolders(parent: ExplorerItem, pathNames: string[]): IMappedPath { +function analyzePath(parent: ExplorerItem, pathNames: string[]): { fullPathAlreadyExists: boolean; lastExistingPathSegment: { isFile: boolean; name: string; } } { let lastExistingPathSegment = { isFile: false, name: '' }; for (const name of pathNames) { From d4b7153524b86de14d7e3883807d8ee81de7c177 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Wed, 18 Apr 2018 09:08:15 +0200 Subject: [PATCH 429/710] unit tests for multi-path validation --- .../electron-browser/explorerModel.test.ts | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts b/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts index 19cf2bf26c1..60e46754ec4 100644 --- a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts +++ b/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts @@ -194,11 +194,6 @@ suite('Files - View Model', () => { assert(validateFileName(s, '') !== null); assert(validateFileName(s, ' ') !== null); assert(validateFileName(s, 'Read Me') === null, 'name containing space'); - assert(validateFileName(s, 'foo/bar') === null); - assert(validateFileName(s, 'foo\\bar') === null); - assert(validateFileName(s, 'all/slashes/are/same') === null); - assert(validateFileName(s, 'theres/one/different\\slash') === null); - assert(validateFileName(s, '/slashAtBeginning') === null); if (isWindows) { assert(validateFileName(s, 'foo:bar') !== null); @@ -236,6 +231,38 @@ suite('Files - View Model', () => { assert(validateFileName(s, 'foo') === null); }); + test('Validate Multi-Path File Names', function () { + const d = new Date().getTime(); + const wsFolder = createStat('/', 'workspaceFolder', true, false, 8096, d); + + assert(validateFileName(wsFolder, 'foo/bar') === null); + assert(validateFileName(wsFolder, 'foo\\bar') === null); + assert(validateFileName(wsFolder, 'all/slashes/are/same') === null); + assert(validateFileName(wsFolder, 'theres/one/different\\slash') === null); + assert(validateFileName(wsFolder, '/slashAtBeginning') === null); + + // validation should detect if user tries to add a child to a file + const fileInRoot = createStat('/fileInRoot', 'fileInRoot', false, false, 8096, d); + wsFolder.addChild(fileInRoot); + assert(validateFileName(wsFolder, 'fileInRoot/aChild') !== null); + wsFolder.removeChild(fileInRoot); + + // attempting to add a child to a deeply nested file + const s1 = createStat('/path', 'path', true, false, 8096, d); + const s2 = createStat('/path/to', 'to', true, false, 8096, d); + const s3 = createStat('/path/to/stat', 'stat', true, false, 8096, d); + wsFolder.addChild(s1); + s1.addChild(s2); + s2.addChild(s3); + const fileDeeplyNested = createStat('/path/to/stat/fileNested', 'fileNested', false, false, 8096, d); + s3.addChild(fileDeeplyNested); + assert(validateFileName(wsFolder, '/path/to/stat/fileNested/aChild') !== null); + + // detect if path already exists + assert(validateFileName(wsFolder, '/path/to/stat/fileNested') !== null); + assert(validateFileName(wsFolder, '/path/to/stat/') !== null); + }); + test('Merge Local with Disk', function () { const d = new Date().toUTCString(); From 34c74d048e7d6b023f1668b3edd1d13aac2ff235 Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Wed, 18 Apr 2018 10:49:15 +0200 Subject: [PATCH 430/710] add validation check to allow only relative paths - prevents weird message in inputbox --- src/vs/workbench/parts/files/electron-browser/fileActions.ts | 5 +++++ .../parts/files/test/electron-browser/explorerModel.test.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index d70d714edc0..2deaec06f71 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -1355,6 +1355,11 @@ export function validateFileName(parent: ExplorerItem, name: string, allowOverwr return nls.localize('emptyFileNameError', "A file or folder name must be provided."); } + // Relative paths only + if (name[0] === '/' || name[0] === '\\') { + return nls.localize('fileNameStartsWithSlashError', "A file or folder name cannot start with a slash."); + } + const names: string[] = name.split(/[\\/]/).filter(part => !!part); // Do not allow to overwrite existing file diff --git a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts b/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts index 19cf2bf26c1..16c4930e66b 100644 --- a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts +++ b/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts @@ -198,7 +198,7 @@ suite('Files - View Model', () => { assert(validateFileName(s, 'foo\\bar') === null); assert(validateFileName(s, 'all/slashes/are/same') === null); assert(validateFileName(s, 'theres/one/different\\slash') === null); - assert(validateFileName(s, '/slashAtBeginning') === null); + assert(validateFileName(s, '/slashAtBeginning') !== null); if (isWindows) { assert(validateFileName(s, 'foo:bar') !== null); From 857fd206b4d959ccc4fa3b3088ee718fd274ef6a Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Wed, 18 Apr 2018 11:51:17 +0200 Subject: [PATCH 431/710] improves validation on rename --- .../workbench/parts/files/electron-browser/fileActions.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index d70d714edc0..bb8899f321f 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -161,6 +161,14 @@ class TriggerRenameFileAction extends BaseFileAction { } public validateFileName(parent: ExplorerItem, name: string): string { + const names: string[] = name.split(/[\\/]/).filter(part => !!part); + if (names.length > 1) { // error only occurs on multi-path + const comparer = isLinux ? strings.compare : strings.compareIgnoreCase; + if (comparer(names[0], this.element.name) === 0) { + return nls.localize('renameWhenSourcePathIsParentOfTargetError', "Cannot move/copy when source path is parent of target path."); + } + } + return this.renameAction.validateFileName(this.element.parent, name); } From 091b44540602eadca7dc724523bb0baf9a213b08 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 11:53:40 +0200 Subject: [PATCH 432/710] fixes #48109 --- src/vs/platform/driver/common/driver.ts | 14 +++++++++ .../driver/electron-browser/driver.ts | 25 +++++++++++++-- .../platform/driver/electron-main/driver.ts | 5 +++ .../smoke/src/areas/terminal/terminal.test.ts | 26 ++++++++++++++++ test/smoke/src/areas/terminal/terminal.ts | 31 +++++++++++++++++++ test/smoke/src/areas/workbench/workbench.ts | 3 ++ test/smoke/src/main.ts | 2 ++ test/smoke/src/vscode/code.ts | 10 ++++++ 8 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 test/smoke/src/areas/terminal/terminal.test.ts create mode 100644 test/smoke/src/areas/terminal/terminal.ts diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index b33f4ff2295..b40326a162b 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -34,6 +34,7 @@ export interface IDriver { doubleClick(windowId: number, selector: string): TPromise; move(windowId: number, selector: string): TPromise; setValue(windowId: number, selector: string, text: string): TPromise; + paste(windowId: number, selector: string, text: string): TPromise; getTitle(windowId: number): TPromise; isActiveElement(windowId: number, selector: string): TPromise; getElements(windowId: number, selector: string, recursive?: boolean): TPromise; @@ -51,6 +52,7 @@ export interface IDriverChannel extends IChannel { call(command: 'doubleClick', arg: [number, string]): TPromise; call(command: 'move', arg: [number, string]): TPromise; call(command: 'setValue', arg: [number, string, string]): TPromise; + call(command: 'paste', arg: [number, string, string]): TPromise; call(command: 'getTitle', arg: [number]): TPromise; call(command: 'isActiveElement', arg: [number, string]): TPromise; call(command: 'getElements', arg: [number, string, boolean]): TPromise; @@ -73,6 +75,7 @@ export class DriverChannel implements IDriverChannel { case 'doubleClick': return this.driver.doubleClick(arg[0], arg[1]); case 'move': return this.driver.move(arg[0], arg[1]); case 'setValue': return this.driver.setValue(arg[0], arg[1], arg[2]); + case 'paste': return this.driver.paste(arg[0], arg[1], arg[2]); case 'getTitle': return this.driver.getTitle(arg[0]); case 'isActiveElement': return this.driver.isActiveElement(arg[0], arg[1]); case 'getElements': return this.driver.getElements(arg[0], arg[1], arg[2]); @@ -122,6 +125,10 @@ export class DriverChannelClient implements IDriver { return this.channel.call('setValue', [windowId, selector, text]); } + paste(windowId: number, selector: string, text: string): TPromise { + return this.channel.call('paste', [windowId, selector, text]); + } + getTitle(windowId: number): TPromise { return this.channel.call('getTitle', [windowId]); } @@ -188,6 +195,7 @@ export interface IWindowDriver { doubleClick(selector: string): TPromise; move(selector: string): TPromise; setValue(selector: string, text: string): TPromise; + paste(selector: string, text: string): TPromise; getTitle(): TPromise; isActiveElement(selector: string): TPromise; getElements(selector: string, recursive: boolean): TPromise; @@ -200,6 +208,7 @@ export interface IWindowDriverChannel extends IChannel { call(command: 'doubleClick', arg: string): TPromise; call(command: 'move', arg: string): TPromise; call(command: 'setValue', arg: [string, string]): TPromise; + call(command: 'paste', arg: [string, string]): TPromise; call(command: 'getTitle'): TPromise; call(command: 'isActiveElement', arg: string): TPromise; call(command: 'getElements', arg: [string, boolean]): TPromise; @@ -218,6 +227,7 @@ export class WindowDriverChannel implements IWindowDriverChannel { case 'doubleClick': return this.driver.doubleClick(arg); case 'move': return this.driver.move(arg); case 'setValue': return this.driver.setValue(arg[0], arg[1]); + case 'paste': return this.driver.paste(arg[0], arg[1]); case 'getTitle': return this.driver.getTitle(); case 'isActiveElement': return this.driver.isActiveElement(arg); case 'getElements': return this.driver.getElements(arg[0], arg[1]); @@ -251,6 +261,10 @@ export class WindowDriverChannelClient implements IWindowDriver { return this.channel.call('setValue', [selector, text]); } + paste(selector: string, text: string): TPromise { + return this.channel.call('paste', [selector, text]); + } + getTitle(): TPromise { return this.channel.call('getTitle'); } diff --git a/src/vs/platform/driver/electron-browser/driver.ts b/src/vs/platform/driver/electron-browser/driver.ts index c762963dddc..60bce74b113 100644 --- a/src/vs/platform/driver/electron-browser/driver.ts +++ b/src/vs/platform/driver/electron-browser/driver.ts @@ -106,6 +106,21 @@ class WindowDriver implements IWindowDriver { inputElement.dispatchEvent(event); } + async paste(selector: string, text: string): TPromise { + const element = document.querySelector(selector); + + if (!element) { + throw new Error('Element not found'); + } + + const inputElement = element as HTMLInputElement; + const clipboardData = new DataTransfer(); + clipboardData.setData('text/plain', text); + const event = new ClipboardEvent('paste', { clipboardData } as any); + + inputElement.dispatchEvent(event); + } + async getTitle(): TPromise { return document.title; } @@ -154,12 +169,16 @@ class WindowDriver implements IWindowDriver { throw new Error('Terminal not found: ' + selector); } - const buffer = (element as any).xterm.buffer; + const xterm = (element as any).xterm; + + if (!xterm) { + throw new Error('Xterm not found: ' + selector); + } const lines: string[] = []; - for (let i = 0; i < buffer.lines.length; i++) { - lines.push(buffer.translateBufferLineToString(i, true)); + for (let i = 0; i < xterm.buffer.lines.length; i++) { + lines.push(xterm.buffer.translateBufferLineToString(i, true)); } return lines; diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index d5502509ec5..badeeab4a1f 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -155,6 +155,11 @@ export class Driver implements IDriver, IWindowDriverRegistry { return windowDriver.setValue(selector, text); } + async paste(windowId: number, selector: string, text: string): TPromise { + const windowDriver = await this.getWindowDriver(windowId); + return windowDriver.paste(selector, text); + } + async getTitle(windowId: number): TPromise { const windowDriver = await this.getWindowDriver(windowId); return windowDriver.getTitle(); diff --git a/test/smoke/src/areas/terminal/terminal.test.ts b/test/smoke/src/areas/terminal/terminal.test.ts new file mode 100644 index 00000000000..4c8c27e3794 --- /dev/null +++ b/test/smoke/src/areas/terminal/terminal.test.ts @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Application } from '../../application'; + +export function setup() { + describe('Terminal', () => { + it(`opens terminal, runs 'echo' and verifies the output`, async function () { + const app = this.app as Application; + + const expected = new Date().getTime().toString(); + await app.workbench.terminal.showTerminal(); + await app.workbench.terminal.runCommand(`echo ${expected}`); + await app.workbench.terminal.waitForTerminalText(terminalText => { + for (let index = terminalText.length - 2; index >= 0; index--) { + if (!!terminalText[index] && terminalText[index].trim() === expected) { + return true; + } + } + return false; + }); + }); + }); +} \ No newline at end of file diff --git a/test/smoke/src/areas/terminal/terminal.ts b/test/smoke/src/areas/terminal/terminal.ts new file mode 100644 index 00000000000..6e5e02735ca --- /dev/null +++ b/test/smoke/src/areas/terminal/terminal.ts @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Code } from '../../vscode/code'; +import { Commands } from '../workbench/workbench'; + +const PANEL_SELECTOR = 'div[id="workbench.panel.terminal"]'; +const XTERM_SELECTOR = `${PANEL_SELECTOR} .terminal-wrapper`; +const XTERM_TEXTAREA = `${XTERM_SELECTOR} textarea.xterm-helper-textarea`; + +export class Terminal { + + constructor(private code: Code, private commands: Commands) { } + + async showTerminal(): Promise { + await this.commands.runCommand('workbench.action.terminal.toggleTerminal'); + await this.code.waitForActiveElement(XTERM_TEXTAREA); + await this.code.waitForTerminalBuffer(XTERM_SELECTOR, lines => lines.some(line => line.length > 0)); + } + + async runCommand(commandText: string): Promise { + await this.code.waitForPaste(XTERM_TEXTAREA, commandText); + await this.code.dispatchKeybinding('enter'); + } + + async waitForTerminalText(accept: (buffer: string[]) => boolean): Promise { + await this.code.waitForTerminalBuffer(XTERM_SELECTOR, accept); + } +} \ No newline at end of file diff --git a/test/smoke/src/areas/workbench/workbench.ts b/test/smoke/src/areas/workbench/workbench.ts index 7d1e2fa0182..5ea8b5a7f9a 100644 --- a/test/smoke/src/areas/workbench/workbench.ts +++ b/test/smoke/src/areas/workbench/workbench.ts @@ -17,6 +17,7 @@ import { SettingsEditor } from '../preferences/settings'; import { KeybindingsEditor } from '../preferences/keybindings'; import { Editors } from '../editor/editors'; import { Code } from '../../vscode/code'; +import { Terminal } from '../terminal/terminal'; export interface Commands { runCommand(command: string): Promise; @@ -37,6 +38,7 @@ export class Workbench implements Commands { readonly problems: Problems; readonly settingsEditor: SettingsEditor; readonly keybindingsEditor: KeybindingsEditor; + readonly terminal: Terminal; constructor(private code: Code, private keybindings: any[], userDataPath: string) { this.editors = new Editors(code, this); @@ -52,6 +54,7 @@ export class Workbench implements Commands { this.problems = new Problems(code, this); this.settingsEditor = new SettingsEditor(code, userDataPath, this, this.editors, this.editor); this.keybindingsEditor = new KeybindingsEditor(code, this); + this.terminal = new Terminal(code, this); } /** diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 55039581029..ab2586f5c9e 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -24,6 +24,7 @@ import { setup as setupDataDebugTests } from './areas/debug/debug.test'; import { setup as setupDataGitTests } from './areas/git/git.test'; import { setup as setupDataStatusbarTests } from './areas/statusbar/statusbar.test'; import { setup as setupDataExtensionTests } from './areas/extensions/extensions.test'; +import { setup as setupTerminalTests } from './areas/terminal/terminal.test'; import { setup as setupDataMultirootTests } from './areas/multiroot/multiroot.test'; import { setup as setupDataLocalizationTests } from './areas/workbench/localization.test'; @@ -300,6 +301,7 @@ describe('Test', () => { setupDataGitTests(); setupDataStatusbarTests(); setupDataExtensionTests(); + setupTerminalTests(); setupDataMultirootTests(); setupDataLocalizationTests(); }); diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index b4415b84384..039bd05d4a2 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -247,6 +247,11 @@ export class Code { await poll(() => this.driver.setValue(windowId, selector, value), () => true, `set value '${selector}'`); } + async waitForPaste(selector: string, value: string): Promise { + const windowId = await this.getActiveWindowId(); + await poll(() => this.driver.paste(windowId, selector, value), () => true, `paste '${selector}'`); + } + async waitForElements(selector: string, recursive: boolean, accept: (result: IElement[]) => boolean = result => result.length > 0): Promise { const windowId = await this.getActiveWindowId(); return await poll(() => this.driver.getElements(windowId, selector, recursive), accept, `get elements '${selector}'`); @@ -272,6 +277,11 @@ export class Code { await poll(() => this.driver.typeInEditor(windowId, selector, text), () => true, `type in editor '${selector}'`); } + async waitForTerminalBuffer(selector: string, accept: (result: string[]) => boolean): Promise { + const windowId = await this.getActiveWindowId(); + await poll(() => this.driver.getTerminalBuffer(windowId, selector), accept, `get terminal buffer '${selector}'`); + } + private async getActiveWindowId(): Promise { if (typeof this._activeWindowId !== 'number') { const windows = await this.driver.getWindowIds(); From 6447b567c4c90f931c672a2d5cc421f0818fd0ac Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 12:01:17 +0200 Subject: [PATCH 433/710] improve smoketest docs --- test/smoke/README.md | 37 ++++++++++--------------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/test/smoke/README.md b/test/smoke/README.md index 8856e454400..0647f5b9bbd 100644 --- a/test/smoke/README.md +++ b/test/smoke/README.md @@ -4,43 +4,26 @@ ``` # Dev -npm run smoketest +yarn smoketest -# Specific build -npm run smoketest -- --build "path/to/code" - -# Data Migration tests -npm run smoketest -- --build "path/to/code-insiders" --stable-build "path/to/code" +# Build +yarn smoketest --build "path/to/code" ``` -The script calls mocha, so all mocha arguments should work fine. For example, use `-f Git` to only run the `Git` tests. +The script calls mocha, so all mocha arguments should work fine. For example, use `-f Git` to filter all tests except the `Git` tests. -By default, screenshots are not captured. To run tests with screenshots use the argument `--screenshots`. +A `--verbose` flag can be used to log to the console all the low level driver calls make to Code. + +Screenshots can be captured when tests fail. In order to get them,you need to use the argument `--screenshots SCREENSHOT_DIR`. ## Pitfalls -- Beware of **state**. The tests within a single suite will share the same state. +- Beware of workbench **state**. The tests within a single suite will share the same state. - Beware of **singletons**. This evil can, and will, manifest itself under the form of FS paths, TCP ports, IPC handles. Whenever writing a test, or setting up more smoke test architecture, make sure it can run simultaneously with any other tests and even itself. All test suites should be able to run many times in parallel. - Beware of **focus**. **Never** depend on DOM elements having focus using `.focused` classes or `:focus` pseudo-classes, since they will lose that state as soon as another window appears on top of the running VS Code window. A safe approach which avoids this problem is to use the `waitForActiveElement` API. Many tests use this whenever they need to wait for a specific element to _have focus_. -- Beware of **timing**. You need to read from or write to the DOM... yeah I know. But is it the right time to do that? Can you 100% promise that that `input` box will be visible and in the DOM at this point in time? Or are you just hoping that it will be so? Every time you want to interact with the DOM, be absolutely sure that you can. Eg. just because you triggered Quick Open, it doesn't mean that it's open; you must wait for the widget to be in the DOM and for its input field to be the active element. +- Beware of **timing**. You need to read from or write to the DOM... but is it the right time to do that? Can you 100% guarantee that that `input` box will be visible at that point in time? Or are you just hoping that it will be so? Hope is your worst enemy in UI tests. Example: just because you triggered Quick Open with `F1`, it doesn't mean that it's open and you can just start typing; you must first wait for the input element to be in the DOM as well as be the current active element. -- Beware of **waiting**. **Never** wait longer than a couple of seconds for anything, unless it's justified. Think of it as a human using Code. Would a human take 10 minutes to run through the Search viewlet smoke test? Then, the computer should even be faster. **Don't** use `setTimeout` just because. Think about what you should wait for in the DOM to be ready, then wait for that instead. - -## Common Issues - -### Certain keys don't appear in input boxes (eg: Space) - -This is a **waiting** issue. Everytime you send keys to Code, you must be aware that the keybinding service can handle them. Even if you're sure that input box is focused. - -Here's an example: when opening quick open, focus goes from its list to its input. We used to simply wait for the input to have focus and then send some text to be typed, like `Workbench: Show Editor`; yet, only `Workbench:ShowEditor` would be rendered in the input box. This happened due to the fact that the [`ListService` takes 50ms to unset the context key which indicates a list is focused](https://github.com/Microsoft/vscode/blob/c8dee4c016d3a3d475011106e04d8e394d9f138c/src/vs/platform/list/browser/listService.ts#L59). The fix was to [wait 50ms as well on the smoke test](https://github.com/Microsoft/vscode/blob/b82fa8dcb06bbf9c85c1502d0d43322e2e9d1a59/test/smoke/src/areas/quickopen/quickopen.ts#L65). - -### I type in a Monaco editor instance, but the text doesn't appear to be there - -This is a **waiting** issue. When you type in a Monaco editor instance, you're really typing in a `textarea`. The `textarea` is then polled for its contents, then the editor model gets updated and finally the editor view gets updated. It's a good idea to always wait for the text to appear rendered in the editor after you type in it. - -### I type in a Monaco editor instance, but the text appears scrambled - -This is an issue which is **not yet fixed**. Unfortunately this seems to happen whenever the CPU load of the system is high. Rerunning the test will often result in a successful outcome. \ No newline at end of file +- Beware of **waiting**. **Never** wait longer than a couple of seconds for anything, unless it's justified. Think of it as a human using Code. Would a human take 10 minutes to run through the Search viewlet smoke test? Then, the computer should even be faster. **Don't** use `setTimeout` just because. Think about what you should wait for in the DOM to be ready and wait for that instead. From c72b5532e2ccbad3df707e8c1a200584c6c609c7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 18 Apr 2018 09:37:37 +0200 Subject: [PATCH 434/710] add explicit function to register v1 file system provider, #47475 --- src/vs/vscode.proposed.d.ts | 1 + src/vs/workbench/api/node/extHost.api.impl.ts | 3 +++ src/vs/workbench/api/node/extHostFileSystem.ts | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 454722f40c5..3d49702be68 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -304,6 +304,7 @@ declare module 'vscode' { export namespace workspace { export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; + export function registerDeprecatedFileSystemProvider(scheme: string, provider: FileSystemProvider): Disposable; } //#endregion diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 4e4583d1586..dd52d40145b 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -569,6 +569,9 @@ export function createApiFactory( registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, newProvider?) => { return extHostFileSystem.registerFileSystemProvider(scheme, provider, newProvider); }), + registerDeprecatedFileSystemProvider: proposedApiFunction(extension, (scheme, provider) => { + return extHostFileSystem.registerDeprecatedFileSystemProvider(scheme, provider); + }), registerSearchProvider: proposedApiFunction(extension, (scheme, provider) => { return extHostSearch.registerSearchProvider(scheme, provider); }) diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index e6114f770a4..43612f7ab34 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -165,6 +165,10 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { extHostLanguageFeatures.registerDocumentLinkProvider('*', this._linkProvider); } + registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider) { + return this.registerFileSystemProvider(scheme, null, new FileSystemProviderShim(provider)); + } + registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { if (newProvider && newProvider._version === 6) { return this._doRegisterFileSystemProvider(scheme, newProvider); From 034b377306991a61ede5ed8aeb73b0ab3d055d8a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 18 Apr 2018 12:01:52 +0200 Subject: [PATCH 435/710] first cut of explict watch, #47475 --- src/vs/platform/files/common/files.ts | 8 +- src/vs/vscode.proposed.d.ts | 15 +- .../electron-browser/mainThreadFileSystem.ts | 14 +- src/vs/workbench/api/node/extHost.protocol.ts | 7 +- .../workbench/api/node/extHostFileSystem.ts | 36 +++-- .../files/electron-browser/fileService.ts | 2 +- .../electron-browser/remoteFileService.ts | 133 +++++++++++++++--- 7 files changed, 177 insertions(+), 38 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index d859f958b2e..cab1972b2e0 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -188,8 +188,14 @@ export interface IStat { type: FileType2; } +export interface IWatchOptions { + recursive?: boolean; + exclude?: string[]; +} + export interface IFileSystemProviderBase { - onDidChange: Event; + onDidChangeFile: Event; + watch(resource: URI, opts: IWatchOptions): IDisposable; stat(resource: URI): TPromise; rename(from: URI, to: URI, opts: { flags: FileOpenFlags }): TPromise; mkdir(resource: URI): TPromise; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 3d49702be68..6bf0f87445f 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -232,12 +232,21 @@ declare module 'vscode' { // todo@joh add open/close calls? export interface FileSystemProvider2 { - _version: 6; + _version: 7; /** - * An event to signal that a resource has been created, changed, or deleted. + * An event to signal that a resource has been created, changed, or deleted. This + * event should fire for resources that are being [watched](#FileSystemProvider2.watch) + * by clients of this provider. */ - readonly onDidChange: Event; + readonly onDidChangeFile: Event; + + /** + * Subscribe to events in the file or folder denoted by `uri`. + * @param uri + * @param options + */ + watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; /** * Retrieve metadata about a file. Must throw an [`ENOENT`](#FileError.ENOENT)-error diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index d48c4b7ba43..0a9f3485f76 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOpenFlags, IFileChange, IFileService, IFileSystemProviderBase, ISimpleReadWriteProvider, IStat } from 'vs/platform/files/common/files'; +import { FileOpenFlags, IFileChange, IFileService, IFileSystemProviderBase, ISimpleReadWriteProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -50,7 +50,7 @@ class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemP private readonly _onDidChange = new Emitter(); private readonly _registrations: IDisposable[]; - readonly onDidChange: Event = this._onDidChange.event; + readonly onDidChangeFile: Event = this._onDidChange.event; constructor( fileService: IFileService, @@ -66,6 +66,16 @@ class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemP this._onDidChange.dispose(); } + watch(resource: URI, opts: IWatchOptions) { + const session = Math.random(); + this._proxy.$watch(this._handle, session, resource, opts); + return { + dispose: () => { + this._proxy.$unwatch(this._handle, session); + } + }; + } + $onFileSystemChange(changes: IFileChangeDto[]): void { this._onDidChange.fire(changes.map(RemoteFileSystemProvider._createFileChange)); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 37f274df23a..bec0acdb06e 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -42,7 +42,7 @@ import { ITreeItem } from 'vs/workbench/common/views'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SerializedError } from 'vs/base/common/errors'; -import { IStat, FileChangeType, FileOpenFlags } from 'vs/platform/files/common/files'; +import { IStat, FileChangeType, FileOpenFlags, IWatchOptions } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration'; import { ISingleEditOperation } from 'vs/editor/common/model'; @@ -569,15 +569,14 @@ export interface ExtHostWorkspaceShape { export interface ExtHostFileSystemShape { $stat(handle: number, resource: UriComponents): TPromise; - $readFile(handle: number, resource: UriComponents, flags: FileOpenFlags): TPromise; $writeFile(handle: number, resource: UriComponents, base64Encoded: string, flags: FileOpenFlags): TPromise; - $rename(handle: number, resource: UriComponents, target: UriComponents, flags: FileOpenFlags): TPromise; $mkdir(handle: number, resource: UriComponents): TPromise; $readdir(handle: number, resource: UriComponents): TPromise<[string, IStat][]>; - $delete(handle: number, resource: UriComponents): TPromise; + $watch(handle: number, session: number, resource: UriComponents, opts: IWatchOptions): void; + $unwatch(handle: number, session: number): void; } export interface ExtHostSearchShape { diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 43612f7ab34..935c24b8365 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -58,18 +58,24 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { class FileSystemProviderShim implements vscode.FileSystemProvider2 { - _version: 6; + _version: 7 = 7; - onDidChange: vscode.Event; + onDidChangeFile: vscode.Event; constructor(private readonly _delegate: vscode.FileSystemProvider) { if (!this._delegate.onDidChange) { - this.onDidChange = Event.None; + this.onDidChangeFile = Event.None; } else { - this.onDidChange = mapEvent(this._delegate.onDidChange, old => old.map(FileSystemProviderShim._modernizeFileChange)); + this.onDidChangeFile = mapEvent(this._delegate.onDidChange, old => old.map(FileSystemProviderShim._modernizeFileChange)); } } + watch(uri: vscode.Uri, options: {}): vscode.Disposable { + // does nothing because in the old API there was no notion of + // watch and provider decide what file events to generate... + return { dispose() { } }; + } + stat(resource: vscode.Uri): Thenable { return this._delegate.stat(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } @@ -157,6 +163,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _proxy: MainThreadFileSystemShape; private readonly _fsProvider = new Map(); private readonly _linkProvider = new FsLinkProvider(); + private readonly _watches = new Map(); private _handlePool: number = 0; @@ -170,12 +177,12 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 6) { + if (newProvider && newProvider._version === 7) { return this._doRegisterFileSystemProvider(scheme, newProvider); } else if (provider) { return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); } else { - throw new Error('IGNORED both provider'); + throw new Error('FAILED to register file system provider, the new provider does not meet the version-constraint and there is no fallback, old provider'); } } @@ -185,8 +192,8 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._fsProvider.set(handle, provider); this._proxy.$registerFileSystemProvider(handle, scheme); let reg: IDisposable; - if (provider.onDidChange) { - reg = provider.onDidChange(event => { + if (provider.onDidChangeFile) { + reg = provider.onDidChangeFile(event => { let newEvent = event.map(e => { let { uri: resource, type } = e; let newType: files.FileChangeType; @@ -243,4 +250,17 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { $mkdir(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), token)); } + $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { + asWinJsPromise(token => { + let subscription = this._fsProvider.get(handle).watch(URI.revive(resource), opts); + this._watches.set(session, subscription); + }); + } + $unwatch(handle: number, session: number): void { + let subscription = this._watches.get(session); + if (subscription) { + subscription.dispose(); + this._watches.delete(session); + } + } } diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index df15aa6abad..b6619cd0664 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -93,7 +93,7 @@ export class FileService implements IFileService { protected readonly _onFileChanges: Emitter; protected readonly _onAfterOperation: Emitter; - private toDispose: IDisposable[]; + protected toDispose: IDisposable[]; private activeWorkspaceFileChangeWatcher: IDisposable; private activeFileChangesWatchers: ResourceMap; diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 7728937a544..418cade8906 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -4,25 +4,25 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import URI from 'vs/base/common/uri'; -import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; -import { IContent, IStreamContent, IFileStat, IResolveContentOptions, IUpdateContentOptions, IResolveFileOptions, IResolveFileResult, FileOperationEvent, FileOperation, IFileSystemProvider, IStat, FileType2, FileChangesEvent, ICreateFileOptions, FileOperationError, FileOperationResult, ITextSnapshot, StringSnapshot, FileOpenFlags, FileError } from 'vs/platform/files/common/files'; -import { TPromise } from 'vs/base/common/winjs.base'; import { posix } from 'path'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { isFalsyOrEmpty, distinct, flatten } from 'vs/base/common/arrays'; -import { Schemas } from 'vs/base/common/network'; -import { toDecodeStream, IDecodeStreamOptions, decodeStream } from 'vs/base/node/encoding'; +import { distinct, flatten, isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TernarySearchTree } from 'vs/base/common/map'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { IStorageService } from 'vs/platform/storage/common/storage'; +import { Schemas } from 'vs/base/common/network'; +import URI from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IDecodeStreamOptions, decodeStream, toDecodeStream } from 'vs/base/node/encoding'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { localize } from 'vs/nls'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { FileChangesEvent, FileError, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot } from 'vs/platform/files/common/files'; +import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { createReadableOfProvider, createReadableOfSnapshot, createWritableOfProvider } from 'vs/workbench/services/files/electron-browser/streams'; function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse?: (tuple: [URI, IStat]) => boolean): TPromise { @@ -72,6 +72,77 @@ export function toDeepIFileStat(provider: IFileSystemProvider, tuple: [URI, ISta }); } +class WorkspaceWatchLogic { + + private _disposables: IDisposable[] = []; + private _watches = new Map(); + + constructor( + private _fileService: RemoteFileService, + @IConfigurationService private _configurationService: IConfigurationService, + @IWorkspaceContextService private _contextService: IWorkspaceContextService, + ) { + this._refresh(); + + this._disposables.push(this._contextService.onDidChangeWorkspaceFolders(e => { + for (const removed of e.removed) { + this._unwatchWorkspace(removed.uri); + } + for (const added of e.added) { + this._watchWorkspace(added.uri); + } + })); + this._disposables.push(this._contextService.onDidChangeWorkbenchState(e => { + this._refresh(); + })); + this._disposables.push(this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('files.watcherExclude')) { + this._refresh(); + } + })); + } + + dispose(): void { + this._unwatchWorkspaces(); + this._disposables = dispose(this._disposables); + } + + private _refresh(): void { + this._unwatchWorkspaces(); + for (const folder of this._contextService.getWorkspace().folders) { + if (folder.uri.scheme !== Schemas.file) { + this._watchWorkspace(folder.uri); + } + } + } + + private _watchWorkspace(resource: URI) { + let exclude: string[] = []; + let config = this._configurationService.getValue({ resource }); + if (config.files && config.files.watcherExclude) { + for (const key in config.files.watcherExclude) { + if (config.files.watcherExclude[key] === true) { + exclude.push(key); + } + } + } + this._watches.set(resource.toString(), resource); + this._fileService.watchFileChanges(resource, { recursive: true, exclude }); + } + + private _unwatchWorkspace(resource: URI) { + if (this._watches.has(resource.toString())) { + this._fileService.unwatchFileChanges(resource); + this._watches.delete(resource.toString()); + } + } + + private _unwatchWorkspaces() { + this._watches.forEach(uri => this._fileService.unwatchFileChanges(uri)); + this._watches.clear(); + } +} + export class RemoteFileService extends FileService { private readonly _provider = new Map(); @@ -98,6 +169,7 @@ export class RemoteFileService extends FileService { ); this._supportedSchemes = JSON.parse(this._storageService.get('remote_schemes', undefined, '[]')); + this.toDispose.push(new WorkspaceWatchLogic(this, configurationService, contextService)); } registerProvider(authority: string, provider: IFileSystemProvider): IDisposable { @@ -109,7 +181,7 @@ export class RemoteFileService extends FileService { this._storageService.store('remote_schemes', JSON.stringify(distinct(this._supportedSchemes))); this._provider.set(authority, provider); - const reg = provider.onDidChange(changes => { + const reg = provider.onDidChangeFile(changes => { // forward change events this._onFileChanges.fire(new FileChangesEvent(changes)); }); @@ -480,15 +552,38 @@ export class RemoteFileService extends FileService { }); } - // TODO@Joh - file watching on demand! - public watchFileChanges(resource: URI): void { + private _activeWatches = new Map, count: number }>(); + + public watchFileChanges(resource: URI, opts: { recursive?: boolean, exclude?: string[] } = {}): void { if (resource.scheme === Schemas.file) { - super.watchFileChanges(resource); + return super.watchFileChanges(resource); } + + const key = resource.toString(); + const entry = this._activeWatches.get(key); + if (entry) { + entry.count += 1; + return; + } + + this._activeWatches.set(key, { + count: 1, + unwatch: this._withProvider(resource).then(provider => { + return provider.watch(resource, opts); + }, err => { + return { dispose() { } }; + }) + }); } + public unwatchFileChanges(resource: URI): void { if (resource.scheme === Schemas.file) { - super.unwatchFileChanges(resource); + return super.unwatchFileChanges(resource); + } + let entry = this._activeWatches.get(resource.toString()); + if (entry && --entry.count === 0) { + entry.unwatch.then(dispose); + this._activeWatches.delete(resource.toString()); } } } From 101c8ed9e337bc2d27ebad3e32ac71820220978d Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 12:13:27 +0200 Subject: [PATCH 436/710] Add scheme transformer --- src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- src/vs/workbench/api/node/extHostLanguageFeatures.ts | 10 ++++++++++ .../electron-browser/api/extHostApiCommands.test.ts | 2 +- .../api/extHostLanguageFeatures.test.ts | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index dd52d40145b..02fe0073cfe 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -111,7 +111,7 @@ export function createApiFactory( const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, new ExtHostDebugService(rpcProtocol, extHostWorkspace, extensionService)); rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration); const extHostDiagnostics = rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, new ExtHostDiagnostics(rpcProtocol)); - const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, extHostDocuments, extHostCommands, extHostHeapService, extHostDiagnostics)); + const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, null, extHostDocuments, extHostCommands, extHostHeapService, extHostDiagnostics)); const extHostFileSystem = rpcProtocol.set(ExtHostContext.ExtHostFileSystem, new ExtHostFileSystem(rpcProtocol, extHostLanguageFeatures)); const extHostFileSystemEvent = rpcProtocol.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService()); const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands)); diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 5e99422f862..8e0753d3df4 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -837,10 +837,15 @@ type Adapter = OutlineAdapter | CodeLensAdapter | DefinitionAdapter | HoverAdapt | SuggestAdapter | SignatureHelpAdapter | LinkProviderAdapter | ImplementationAdapter | TypeDefinitionAdapter | ColorProviderAdapter | FoldingProviderAdapter; +export interface ISchemeTransformer { + transformOutgoing(scheme: string): string; +} + export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { private static _handlePool: number = 0; + private readonly _schemeTransformer: ISchemeTransformer; private _proxy: MainThreadLanguageFeaturesShape; private _documents: ExtHostDocuments; private _commands: ExtHostCommands; @@ -850,11 +855,13 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { constructor( mainContext: IMainContext, + schemeTransformer: ISchemeTransformer, documents: ExtHostDocuments, commands: ExtHostCommands, heapMonitor: ExtHostHeapService, diagnostics: ExtHostDiagnostics ) { + this._schemeTransformer = schemeTransformer; this._proxy = mainContext.getProxy(MainContext.MainThreadLanguageFeatures); this._documents = documents; this._commands = commands; @@ -891,6 +898,9 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { } private _transformScheme(scheme: string): string { + if (this._schemeTransformer && typeof scheme === 'string') { + return this._schemeTransformer.transformOutgoing(scheme); + } return scheme; } diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index db8e34b495b..b024891dc84 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -129,7 +129,7 @@ suite('ExtHostLanguageFeatureCommands', function () { const diagnostics = new ExtHostDiagnostics(rpcProtocol); rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, diagnostics); - extHost = new ExtHostLanguageFeatures(rpcProtocol, extHostDocuments, commands, heapService, diagnostics); + extHost = new ExtHostLanguageFeatures(rpcProtocol, null, extHostDocuments, commands, heapService, diagnostics); rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, extHost); mainThread = rpcProtocol.set(MainContext.MainThreadLanguageFeatures, inst.createInstance(MainThreadLanguageFeatures, rpcProtocol)); diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index 511e5e963e5..f0748586c5d 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -111,7 +111,7 @@ suite('ExtHostLanguageFeatures', function () { const diagnostics = new ExtHostDiagnostics(rpcProtocol); rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, diagnostics); - extHost = new ExtHostLanguageFeatures(rpcProtocol, extHostDocuments, commands, heapService, diagnostics); + extHost = new ExtHostLanguageFeatures(rpcProtocol, null, extHostDocuments, commands, heapService, diagnostics); rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, extHost); mainThread = rpcProtocol.set(MainContext.MainThreadLanguageFeatures, inst.createInstance(MainThreadLanguageFeatures, rpcProtocol)); From 9e3f8976f4cf84b91c0fd0d87e24a74bbfb821de Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 12:19:46 +0200 Subject: [PATCH 437/710] scm: panel dnd --- src/vs/base/browser/ui/splitview/panelview.ts | 44 ++++++++++++++++--- .../browser/parts/views/viewsViewlet.ts | 4 +- .../parts/scm/electron-browser/scmViewlet.ts | 14 +++++- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/splitview/panelview.ts b/src/vs/base/browser/ui/splitview/panelview.ts index 82e35e5f814..d7079513a78 100644 --- a/src/vs/base/browser/ui/splitview/panelview.ts +++ b/src/vs/base/browser/ui/splitview/panelview.ts @@ -239,7 +239,7 @@ class PanelDraggable implements IDisposable { private _onDidDrop = new Emitter<{ from: Panel, to: Panel }>(); readonly onDidDrop = this._onDidDrop.event; - constructor(private panel: Panel, private context: IDndContext) { + constructor(private panel: Panel, private dnd: IPanelDndController, private context: IDndContext) { panel.draggableElement.draggable = true; domEvent(panel.draggableElement, 'dragstart')(this.onDragStart, this, this.disposables); domEvent(panel.dropTargetElement, 'dragenter')(this.onDragEnter, this, this.disposables); @@ -249,6 +249,12 @@ class PanelDraggable implements IDisposable { } private onDragStart(e: DragEvent): void { + if (!this.dnd.canDrag(this.panel)) { + e.preventDefault(); + e.stopPropagation(); + return; + } + e.dataTransfer.effectAllowed = 'move'; const dragImage = append(document.body, $('.monaco-panel-drag-image', {}, this.panel.draggableElement.textContent)); @@ -263,6 +269,10 @@ class PanelDraggable implements IDisposable { return; } + if (!this.dnd.canDrop(this.context.draggable.panel, this.panel)) { + return; + } + this.dragOverCounter++; this.render(); } @@ -272,6 +282,10 @@ class PanelDraggable implements IDisposable { return; } + if (!this.dnd.canDrop(this.context.draggable.panel, this.panel)) { + return; + } + this.dragOverCounter--; if (this.dragOverCounter === 0) { @@ -297,7 +311,7 @@ class PanelDraggable implements IDisposable { this.dragOverCounter = 0; this.render(); - if (this.context.draggable !== this) { + if (this.dnd.canDrop(this.context.draggable.panel, this.panel) && this.context.draggable !== this) { this._onDidDrop.fire({ from: this.context.draggable.panel, to: this.panel }); } @@ -319,8 +333,24 @@ class PanelDraggable implements IDisposable { } } -export class IPanelViewOptions { - dnd?: boolean; +export interface IPanelDndController { + canDrag(panel: Panel): boolean; + canDrop(panel: Panel, overPanel: Panel): boolean; +} + +export class DefaultPanelDndController implements IPanelDndController { + + canDrag(panel: Panel): boolean { + return true; + } + + canDrop(panel: Panel, overPanel: Panel): boolean { + return true; + } +} + +export interface IPanelViewOptions { + dnd?: IPanelDndController; } interface IPanelItem { @@ -330,7 +360,7 @@ interface IPanelItem { export class PanelView implements IDisposable { - private dnd: boolean; + private dnd: IPanelDndController | null; private dndContext: IDndContext = { draggable: null }; private el: HTMLElement; private panelItems: IPanelItem[] = []; @@ -343,7 +373,7 @@ export class PanelView implements IDisposable { readonly onDidSashChange: Event; constructor(container: HTMLElement, options: IPanelViewOptions = {}) { - this.dnd = !!options.dnd; + this.dnd = options.dnd; this.el = append(container, $('.monaco-panel-view')); this.splitview = new SplitView(this.el); this.onDidSashChange = this.splitview.onDidSashChange; @@ -358,7 +388,7 @@ export class PanelView implements IDisposable { this.splitview.addView(panel, size, index); if (this.dnd) { - const draggable = new PanelDraggable(panel, this.dndContext); + const draggable = new PanelDraggable(panel, this.dnd, this.dndContext); disposables.push(draggable); draggable.onDidDrop(this._onDidDrop.fire, this._onDidDrop, disposables); } diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index dbc78516337..d5d242b7f0f 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -23,7 +23,7 @@ import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/ import { IContextKeyService, IContextKeyChangeEvent } from 'vs/platform/contextkey/common/contextkey'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { PanelViewlet, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; -import { IPanelOptions } from 'vs/base/browser/ui/splitview/panelview'; +import { IPanelOptions, DefaultPanelDndController } from 'vs/base/browser/ui/splitview/panelview'; import { WorkbenchTree, IListService } from 'vs/platform/list/browser/listService'; import { IWorkbenchThemeService, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { ITreeConfiguration, ITreeOptions } from 'vs/base/parts/tree/browser/tree'; @@ -209,7 +209,7 @@ export class ViewsViewlet extends PanelViewlet implements IViewsViewlet { @IContextMenuService protected contextMenuService: IContextMenuService, @IExtensionService protected extensionService: IExtensionService ) { - super(id, { showHeaderInTitleWhenSingleView, dnd: true }, partService, contextMenuService, telemetryService, themeService); + super(id, { showHeaderInTitleWhenSingleView, dnd: new DefaultPanelDndController() }, partService, contextMenuService, telemetryService, themeService); this.viewletSettings = this.getMemento(storageService, Scope.WORKSPACE); } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 035623c0973..c6a27968135 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -60,6 +60,7 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IViewDescriptorRef, PersistentContributableViewsModel } from 'vs/workbench/browser/parts/views/contributableViews'; import { ViewLocation, IViewDescriptor } from 'vs/workbench/common/views'; import { ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { IPanelDndController, Panel } from '../../../../base/browser/ui/splitview/panelview'; export interface ISpliceEvent { index: number; @@ -1026,6 +1027,17 @@ class InstallAdditionalSCMProvidersAction extends Action { } } +class SCMPanelDndController implements IPanelDndController { + + canDrag(panel: Panel): boolean { + return !(panel instanceof MainPanel) && !(panel instanceof RepositoryPanel); + } + + canDrop(panel: Panel, overPanel: Panel): boolean { + return !(overPanel instanceof MainPanel) && !(overPanel instanceof RepositoryPanel); + } +} + export class SCMViewlet extends PanelViewlet implements IViewModel { private el: HTMLElement; @@ -1072,7 +1084,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { @IExtensionService extensionService: IExtensionService, @IConfigurationService private configurationService: IConfigurationService, ) { - super(VIEWLET_ID, { showHeaderInTitleWhenSingleView: true }, partService, contextMenuService, telemetryService, themeService); + super(VIEWLET_ID, { showHeaderInTitleWhenSingleView: true, dnd: new SCMPanelDndController() }, partService, contextMenuService, telemetryService, themeService); this.menus = instantiationService.createInstance(SCMMenus, undefined); this.menus.onDidChangeTitle(this.updateTitleArea, this, this.disposables); From 31307f2826679b13aceb3a3645b3fc3e90d1843b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 12:19:52 +0200 Subject: [PATCH 438/710] Add uri transformer --- .../extensions/node/extensionPoints.ts | 2 +- .../services/extensions/node/rpcProtocol.ts | 96 ++++++++++++++++++- 2 files changed, 96 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/extensions/node/extensionPoints.ts b/src/vs/workbench/services/extensions/node/extensionPoints.ts index cdcc36031bc..2707535072c 100644 --- a/src/vs/workbench/services/extensions/node/extensionPoints.ts +++ b/src/vs/workbench/services/extensions/node/extensionPoints.ts @@ -492,7 +492,7 @@ export class ExtensionScanner { /** * Read the extension defined in `absoluteFolderPath` */ - private static scanExtension(version: string, log: ILog, absoluteFolderPath: string, isBuiltin: boolean, nlsConfig: NlsConfiguration): TPromise { + public static scanExtension(version: string, log: ILog, absoluteFolderPath: string, isBuiltin: boolean, nlsConfig: NlsConfiguration): TPromise { absoluteFolderPath = normalize(absoluteFolderPath); let parser = new ExtensionManifestParser(version, log, absoluteFolderPath, isBuiltin); diff --git a/src/vs/workbench/services/extensions/node/rpcProtocol.ts b/src/vs/workbench/services/extensions/node/rpcProtocol.ts index 2e1ae6d2ee8..b40e5d2d19b 100644 --- a/src/vs/workbench/services/extensions/node/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/node/rpcProtocol.ts @@ -10,11 +10,88 @@ import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { LazyPromise } from 'vs/workbench/services/extensions/node/lazyPromise'; import { ProxyIdentifier, IRPCProtocol } from 'vs/workbench/services/extensions/node/proxyIdentifier'; import { CharCode } from 'vs/base/common/charCode'; +import URI, { UriComponents } from 'vs/base/common/uri'; +import { MarshalledObject } from 'vs/base/common/marshalling'; declare var Proxy: any; // TODO@TypeScript +export interface IURITransformer { + transformIncoming(uri: UriComponents): UriComponents; + transformOutgoing(uri: URI): URI; +} + +function _transformOutgoingURIs(obj: any, transformer: IURITransformer, depth: number): any { + + if (!obj || depth > 200) { + return null; + } + + if (typeof obj === 'object') { + if (obj instanceof URI) { + return transformer.transformOutgoing(obj); + } + + // walk object (or array) + for (let key in obj) { + if (Object.hasOwnProperty.call(obj, key)) { + const r = _transformOutgoingURIs(obj[key], transformer, depth + 1); + if (r !== null) { + obj[key] = r; + } + } + } + } + + return null; +} + +function transformOutgoingURIs(obj: any, transformer: IURITransformer): any { + const result = _transformOutgoingURIs(obj, transformer, 0); + if (result === null) { + // no change + return obj; + } + return result; +} + +function _transformIncomingURIs(obj: any, transformer: IURITransformer, depth: number): any { + + if (!obj || depth > 200) { + return null; + } + + if (typeof obj === 'object') { + + if ((obj).$mid === 1) { + return transformer.transformIncoming(obj); + } + + // walk object (or array) + for (let key in obj) { + if (Object.hasOwnProperty.call(obj, key)) { + const r = _transformIncomingURIs(obj[key], transformer, depth + 1); + if (r !== null) { + obj[key] = r; + } + } + } + } + + return null; +} + +function transformIncomingURIs(obj: any, transformer: IURITransformer): any { + const result = _transformIncomingURIs(obj, transformer, 0); + if (result === null) { + // no change + return obj; + } + return result; +} + export class RPCProtocol implements IRPCProtocol { + private readonly _uriTransformer: IURITransformer; private _isDisposed: boolean; private readonly _locals: { [id: string]: any; }; private readonly _proxies: { [id: string]: any; }; @@ -23,7 +100,8 @@ export class RPCProtocol implements IRPCProtocol { private readonly _pendingRPCReplies: { [msgId: string]: LazyPromise; }; private readonly _multiplexor: RPCMultiplexer; - constructor(protocol: IMessagePassingProtocol) { + constructor(protocol: IMessagePassingProtocol, transformer: IURITransformer = null) { + this._uriTransformer = transformer; this._isDisposed = false; this._locals = Object.create(null); this._proxies = Object.create(null); @@ -43,6 +121,13 @@ export class RPCProtocol implements IRPCProtocol { }); } + public transformIncomingURIs(obj: T): T { + if (!this._uriTransformer) { + return obj; + } + return transformIncomingURIs(obj, this._uriTransformer); + } + public getProxy(identifier: ProxyIdentifier): T { if (!this._proxies[identifier.id]) { this._proxies[identifier.id] = this._createProxy(identifier.id); @@ -84,6 +169,9 @@ export class RPCProtocol implements IRPCProtocol { } let msg = JSON.parse(rawmsg); + if (this._uriTransformer) { + msg = transformIncomingURIs(msg, this._uriTransformer); + } switch (msg.type) { case MessageType.Request: @@ -109,6 +197,9 @@ export class RPCProtocol implements IRPCProtocol { this._invokedHandlers[callId].then((r) => { delete this._invokedHandlers[callId]; + if (this._uriTransformer) { + r = transformOutgoingURIs(r, this._uriTransformer); + } this._multiplexor.send(MessageFactory.replyOK(callId, r)); }, (err) => { delete this._invokedHandlers[callId]; @@ -185,6 +276,9 @@ export class RPCProtocol implements IRPCProtocol { }); this._pendingRPCReplies[callId] = result; + if (this._uriTransformer) { + args = transformOutgoingURIs(args, this._uriTransformer); + } this._multiplexor.send(MessageFactory.request(callId, proxyId, methodName, args)); return result; } From 25e45cae771ff9a89f02be749257e08e6576b043 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 12:21:39 +0200 Subject: [PATCH 439/710] Add stop() --- .../node/watcher/unix/chokidarWatcherService.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index 191689d3615..175ef1a62ec 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -19,6 +19,7 @@ import { realcaseSync } from 'vs/base/node/extfs'; import { isMacintosh } from 'vs/base/common/platform'; import * as watcher from 'vs/workbench/services/files/node/watcher/common'; import { IWatcherRequest, IWatcherService } from 'vs/workbench/services/files/node/watcher/unix/watcher'; +import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; export class ChokidarWatcherService implements IWatcherService { @@ -28,6 +29,7 @@ export class ChokidarWatcherService implements IWatcherService { private spamCheckStartTime: number; private spamWarningLogged: boolean; private enospcErrorLogged: boolean; + private toDispose: IDisposable[] = []; public watch(request: IWatcherRequest): TPromise { const watcherOpts: chokidar.IOptions = { @@ -62,6 +64,11 @@ export class ChokidarWatcherService implements IWatcherService { let undeliveredFileEvents: watcher.IRawFileChange[] = []; const fileEventDelayer = new ThrottledDelayer(ChokidarWatcherService.FS_EVENT_DELAY); + this.toDispose.push(toDisposable(() => { + chokidarWatcher.close(); + fileEventDelayer.cancel(); + })); + return new TPromise((c, e, p) => { chokidarWatcher.on('all', (type: string, path: string) => { if (isMacintosh) { @@ -156,8 +163,12 @@ export class ChokidarWatcherService implements IWatcherService { } }); }, () => { - chokidarWatcher.close(); - fileEventDelayer.cancel(); + this.toDispose = dispose(this.toDispose); }); } + + public stop(): TPromise { + this.toDispose = dispose(this.toDispose); + return TPromise.as(void 0); + } } From 28d06555e81aee4b0ecec76491dab6ccb3a47dd2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 18 Apr 2018 12:21:58 +0200 Subject: [PATCH 440/710] be more strict when registering a provider, #47475 --- .../workbench/api/node/extHostFileSystem.ts | 70 ++++++++++++------- .../electron-browser/remoteFileService.ts | 12 ++-- 2 files changed, 49 insertions(+), 33 deletions(-) diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 935c24b8365..e82b05fca20 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -16,6 +16,7 @@ import { asWinJsPromise } from 'vs/base/common/async'; import { values } from 'vs/base/common/map'; import { Range, FileType, FileChangeType, FileChangeType2, FileType2 } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; +import { Schemas } from 'vs/base/common/network'; class FsLinkProvider implements vscode.DocumentLinkProvider { @@ -161,19 +162,30 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _proxy: MainThreadFileSystemShape; - private readonly _fsProvider = new Map(); private readonly _linkProvider = new FsLinkProvider(); + private readonly _fsProvider = new Map(); + private readonly _usedSchemes = new Set(); private readonly _watches = new Map(); private _handlePool: number = 0; constructor(mainContext: IMainContext, extHostLanguageFeatures: ExtHostLanguageFeatures) { this._proxy = mainContext.getProxy(MainContext.MainThreadFileSystem); + this._usedSchemes.add(Schemas.file); + this._usedSchemes.add(Schemas.untitled); + this._usedSchemes.add(Schemas.vscode); + this._usedSchemes.add(Schemas.inMemory); + this._usedSchemes.add(Schemas.internal); + this._usedSchemes.add(Schemas.http); + this._usedSchemes.add(Schemas.https); + this._usedSchemes.add(Schemas.mailto); + this._usedSchemes.add(Schemas.data); + extHostLanguageFeatures.registerDocumentLinkProvider('*', this._linkProvider); } registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider) { - return this.registerFileSystemProvider(scheme, null, new FileSystemProviderShim(provider)); + return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); } registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { @@ -182,43 +194,47 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } else if (provider) { return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); } else { - throw new Error('FAILED to register file system provider, the new provider does not meet the version-constraint and there is no fallback, old provider'); + throw new Error('FAILED to register file system provider, the new provider does not meet the version-constraint and there is no old provider'); } } private _doRegisterFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider2) { + + if (this._usedSchemes.has(scheme)) { + throw new Error(`a provider for the scheme '${scheme}' is already registered`); + } + const handle = this._handlePool++; this._linkProvider.add(scheme); + this._usedSchemes.add(scheme); this._fsProvider.set(handle, provider); this._proxy.$registerFileSystemProvider(handle, scheme); - let reg: IDisposable; - if (provider.onDidChangeFile) { - reg = provider.onDidChangeFile(event => { - let newEvent = event.map(e => { - let { uri: resource, type } = e; - let newType: files.FileChangeType; - switch (type) { - case FileChangeType2.Changed: - newType = files.FileChangeType.UPDATED; - break; - case FileChangeType2.Created: - newType = files.FileChangeType.ADDED; - break; - case FileChangeType2.Deleted: - newType = files.FileChangeType.DELETED; - break; - } - return { resource, type: newType }; - }); - this._proxy.$onFileSystemChange(handle, newEvent); + + const subscription = provider.onDidChangeFile(event => { + let newEvent = event.map(e => { + let { uri: resource, type } = e; + let newType: files.FileChangeType; + switch (type) { + case FileChangeType2.Changed: + newType = files.FileChangeType.UPDATED; + break; + case FileChangeType2.Created: + newType = files.FileChangeType.ADDED; + break; + case FileChangeType2.Deleted: + newType = files.FileChangeType.DELETED; + break; + } + return { resource, type: newType }; }); - } + this._proxy.$onFileSystemChange(handle, newEvent); + }); + return { dispose: () => { - if (reg) { - reg.dispose(); - } + subscription.dispose(); this._linkProvider.delete(scheme); + this._usedSchemes.delete(scheme); this._fsProvider.delete(handle); this._proxy.$unregisterProvider(handle); } diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 418cade8906..322e173fddc 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -172,22 +172,22 @@ export class RemoteFileService extends FileService { this.toDispose.push(new WorkspaceWatchLogic(this, configurationService, contextService)); } - registerProvider(authority: string, provider: IFileSystemProvider): IDisposable { - if (this._provider.has(authority)) { - throw new Error(); + registerProvider(scheme: string, provider: IFileSystemProvider): IDisposable { + if (this._provider.has(scheme)) { + throw new Error('a provider for that scheme is already registered'); } - this._supportedSchemes.push(authority); + this._supportedSchemes.push(scheme); this._storageService.store('remote_schemes', JSON.stringify(distinct(this._supportedSchemes))); - this._provider.set(authority, provider); + this._provider.set(scheme, provider); const reg = provider.onDidChangeFile(changes => { // forward change events this._onFileChanges.fire(new FileChangesEvent(changes)); }); return { dispose: () => { - this._provider.delete(authority); + this._provider.delete(scheme); reg.dispose(); } }; From 1e8cd162171bc6010d9344d5b6cf691931d292e4 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 18 Apr 2018 12:35:03 +0200 Subject: [PATCH 441/710] debug: only respect column breakpoints for column > 1 fixes #46784 --- src/vs/workbench/parts/debug/browser/debugCommands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugCommands.ts b/src/vs/workbench/parts/debug/browser/debugCommands.ts index 98653f91eec..0055357ca3e 100644 --- a/src/vs/workbench/parts/debug/browser/debugCommands.ts +++ b/src/vs/workbench/parts/debug/browser/debugCommands.ts @@ -188,13 +188,13 @@ export function registerCommands(): void { const position = control.getPosition(); const modelUri = control.getModel().uri; const bp = debugService.getModel().getBreakpoints() - .filter(bp => bp.lineNumber === position.lineNumber && bp.column === position.column && bp.uri.toString() === modelUri.toString()).pop(); + .filter(bp => bp.lineNumber === position.lineNumber && (bp.column === position.column || !bp.column && position.column <= 1) && bp.uri.toString() === modelUri.toString()).pop(); if (bp) { return TPromise.as(null); } if (debugService.getConfigurationManager().canSetBreakpointsIn(control.getModel())) { - return debugService.addBreakpoints(modelUri, [{ lineNumber: position.lineNumber, column: position.column }]); + return debugService.addBreakpoints(modelUri, [{ lineNumber: position.lineNumber, column: position.column > 1 ? position.column : undefined }]); } } From b41b482e41919976a706a065acbbdd87bb82e354 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 12:44:34 +0200 Subject: [PATCH 442/710] scm: move views --- .../browser/parts/views/contributableViews.ts | 41 +++++++++++-------- .../parts/scm/electron-browser/scmViewlet.ts | 23 ++++++----- .../parts/views/contributableViews.test.ts | 2 - 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/contributableViews.ts b/src/vs/workbench/browser/parts/views/contributableViews.ts index dfcb0227897..b835271fc11 100644 --- a/src/vs/workbench/browser/parts/views/contributableViews.ts +++ b/src/vs/workbench/browser/parts/views/contributableViews.ts @@ -186,8 +186,6 @@ export interface IViewDescriptorRef { export class ContributableViewsModel { - protected viewStates = new Map(); - readonly viewDescriptors: IViewDescriptor[] = []; get visibleViewDescriptors(): IViewDescriptor[] { return this.viewDescriptors.filter(v => this.viewStates.get(v.id).visible); @@ -206,7 +204,8 @@ export class ContributableViewsModel { constructor( location: ViewLocation, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + protected viewStates = new Map() ) { const viewDescriptorCollection = new ViewDescriptorCollection(location, contextKeyService); this.disposables.push(viewDescriptorCollection); @@ -366,15 +365,31 @@ interface ISerializedViewState { export class PersistentContributableViewsModel extends ContributableViewsModel { + private viewletStateStorageId: string; + private storageService: IStorageService; + private contextService: IWorkspaceContextService; + constructor( location: ViewLocation, - private readonly viewletStateStorageId: string, + viewletStateStorageId: string, @IContextKeyService contextKeyService: IContextKeyService, - @IStorageService private storageService: IStorageService, - @IWorkspaceContextService private contextService: IWorkspaceContextService + @IStorageService storageService: IStorageService, + @IWorkspaceContextService contextService: IWorkspaceContextService ) { - super(location, contextKeyService); - this.loadViewsStates(); + const scope = contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? StorageScope.WORKSPACE : StorageScope.GLOBAL; + const raw = storageService.get(viewletStateStorageId, scope, '[]'); + const serializedViewsStates = JSON.parse(raw) as ISerializedViewState[]; + const viewStates = new Map(); + + for (const { id, state } of serializedViewsStates) { + viewStates.set(id, state); + } + + super(location, contextKeyService, viewStates); + + this.viewletStateStorageId = viewletStateStorageId; + this.storageService = storageService; + this.contextService = contextService; } saveViewsStates(): void { @@ -386,16 +401,6 @@ export class PersistentContributableViewsModel extends ContributableViewsModel { this.storageService.store(this.viewletStateStorageId, raw, scope); } - private loadViewsStates(): void { - const scope = this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? StorageScope.WORKSPACE : StorageScope.GLOBAL; - const raw = this.storageService.get(this.viewletStateStorageId, scope, '[]'); - const serializedViewsStates = JSON.parse(raw) as ISerializedViewState[]; - - for (const { id, state } of serializedViewsStates) { - this.viewStates.set(id, state); - } - } - dispose(): void { this.saveViewsStates(); super.dispose(); diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index c6a27968135..8672f0abb17 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -51,7 +51,7 @@ import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import * as platform from 'vs/base/common/platform'; import { format } from 'vs/base/common/strings'; import { ISpliceable, ISequence, ISplice } from 'vs/base/common/sequence'; -import { firstIndex, move } from 'vs/base/common/arrays'; +import { firstIndex } from 'vs/base/common/arrays'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ThrottledDelayer } from 'vs/base/common/async'; @@ -1112,7 +1112,6 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { this.contributedViews.onDidAdd(this.onDidAddContributedView, this, this.disposables); this.contributedViews.onDidRemove(this.onDidRemoveContributedView, this, this.disposables); - this.contributedViews.onDidMove(this.onDidMoveContributedView, this, this.disposables); let index = this.getContributedViewsStartIndex(); for (const viewDescriptor of this.contributedViews.visibleViewDescriptors) { @@ -1250,6 +1249,17 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { this._height = dimension.height; } + movePanel(from: ViewletPanel, to: ViewletPanel): void { + const start = this.getContributedViewsStartIndex(); + const fromIndex = firstIndex(this.panels, panel => panel === from) - start; + const toIndex = firstIndex(this.panels, panel => panel === to) - start; + const fromViewDescriptor = this.contributedViews.viewDescriptors[fromIndex]; + const toViewDescriptor = this.contributedViews.viewDescriptors[toIndex]; + + super.movePanel(from, to); + this.contributedViews.move(fromViewDescriptor.id, toViewDescriptor.id); + } + private onSelectionChange(repositories: ISCMRepository[]): void { const wasSingleView = this.isSingleView(); const contributableViewsHeight = this.getContributableViewsSize(); @@ -1385,15 +1395,6 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { disposable.dispose(); } - onDidMoveContributedView({ from, to }: { from: IViewDescriptorRef, to: IViewDescriptorRef }): void { - const start = this.getContributedViewsStartIndex(); - const fromPanel = this.panels[start + from.index]; - const toPanel = this.panels[start + to.index]; - - this.movePanel(fromPanel, toPanel); - move(this.contextMenuDisposables, from.index, to.index); - } - protected isSingleView(): boolean { return super.isSingleView() && this.repositoryPanels.length + this.contributedViews.visibleViewDescriptors.length === 1; } diff --git a/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts b/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts index 9921a6a754b..f4fafe80f43 100644 --- a/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts +++ b/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts @@ -10,7 +10,6 @@ import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyServ import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { SimpleConfigurationService } from 'vs/editor/standalone/browser/simpleServices'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { move } from 'vs/base/common/arrays'; const location = new ViewLocation('test'); @@ -23,7 +22,6 @@ class ViewDescriptorSequence { this.elements = [...model.visibleViewDescriptors]; model.onDidAdd(({ viewDescriptor, index }) => this.elements.splice(index, 0, viewDescriptor), null, this.disposables); model.onDidRemove(({ viewDescriptor, index }) => this.elements.splice(index, 1), null, this.disposables); - model.onDidMove(({ from, to }) => move(this.elements, from.index, to.index), null, this.disposables); } dispose() { From b677f10beb9bb8caddac526a2943cfaeec444093 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 13:25:20 +0200 Subject: [PATCH 443/710] Fix #47478 --- src/vs/base/node/zip.ts | 29 ++++++++++++------- .../node/extensionManagementService.ts | 16 +++++----- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index a5e7abca5d8..7561e28471f 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -26,10 +26,7 @@ interface IOptions { sourcePathRegex: RegExp; } -export enum ExtractErrorType { - Undefined, - CorruptZip -} +export type ExtractErrorType = 'CorruptZip' | 'Incomplete'; export class ExtractError extends Error { @@ -40,7 +37,7 @@ export class ExtractError extends Error { let message = cause.message; switch (type) { - case ExtractErrorType.CorruptZip: message = `Corrupt ZIP: ${message}`; break; + case 'CorruptZip': message = `Corrupt ZIP: ${message}`; break; } super(message); @@ -58,10 +55,14 @@ function modeFromEntry(entry: Entry) { } function toExtractError(err: Error): ExtractError { - let type = ExtractErrorType.CorruptZip; + if (err instanceof ExtractError) { + return err; + } + + let type: ExtractErrorType = void 0; if (/end of central directory record signature not found/.test(err.message)) { - type = ExtractErrorType.CorruptZip; + type = 'CorruptZip'; } return new ExtractError(type, err); @@ -89,18 +90,26 @@ function extractEntry(stream: Readable, fileName: string, mode: number, targetPa function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions): TPromise { let isCanceled = false; let last = TPromise.wrap(null); + let extractedEntriesCount = 0; return new TPromise((c, e) => { const throttler = new SimpleThrottler(); zipfile.once('error', e); - zipfile.once('close', () => last.then(c, e)); + zipfile.once('close', () => last.then(() => { + if (isCanceled || zipfile.entryCount === extractedEntriesCount) { + c(null); + } else { + e(new ExtractError('Incomplete', new Error(nls.localize('incompleteExtract', "Incomplete. Extracted {0} of {1} entries", extractedEntriesCount, zipfile.entryCount)))); + } + }, e)); zipfile.on('entry', (entry: Entry) => { if (isCanceled) { return; } if (!options.sourcePathRegex.test(entry.fileName)) { + extractedEntriesCount++; return; } @@ -109,14 +118,14 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions): TP // directory file names end with '/' if (/\/$/.test(fileName)) { const targetFileName = path.join(targetPath, fileName); - last = mkdirp(targetFileName); + last = mkdirp(targetFileName).then(() => extractedEntriesCount++); return; } const stream = ninvoke(zipfile, zipfile.openReadStream, entry); const mode = modeFromEntry(entry); - last = throttler.queue(() => stream.then(stream => extractEntry(stream, fileName, mode, targetPath, options))); + last = throttler.queue(() => stream.then(stream => extractEntry(stream, fileName, mode, targetPath, options).then(() => extractedEntriesCount++))); }); }, () => { isCanceled = true; diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 29940b2d94e..321f8861d9e 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -12,7 +12,7 @@ import * as errors from 'vs/base/common/errors'; import { assign } from 'vs/base/common/objects'; import { toDisposable, Disposable } from 'vs/base/common/lifecycle'; import { flatten, distinct } from 'vs/base/common/arrays'; -import { extract, buffer } from 'vs/base/node/zip'; +import { extract, buffer, ExtractError } from 'vs/base/node/zip'; import { TPromise } from 'vs/base/common/winjs.base'; import { IExtensionManagementService, IExtensionGalleryService, ILocalExtension, @@ -444,17 +444,19 @@ export class ExtensionManagementService extends Disposable implements IExtension .then( () => this.logService.info(`Extracted extension to ${extractPath}:`, id), e => always(pfs.rimraf(extractPath), () => null) - .then(() => TPromise.wrapError(new ExtensionManagementError(e.message, INSTALL_ERROR_EXTRACTING)))), + .then(() => TPromise.wrapError(new ExtensionManagementError(e.message, e instanceof ExtractError ? e.type : INSTALL_ERROR_EXTRACTING)))), e => TPromise.wrapError(new ExtensionManagementError(this.joinErrors(e).message, INSTALL_ERROR_DELETING))); } private rename(id: string, extractPath: string, renamePath: string, retryUntil: number): TPromise { return pfs.rename(extractPath, renamePath) - .then(null, error => - isWindows && error && error.code === 'EPERM' && Date.now() < retryUntil - ? this.rename(id, extractPath, renamePath, retryUntil) - : TPromise.wrapError(new ExtensionManagementError(error.message || nls.localize('renameError', "Unknown error while"), error.code || INSTALL_ERROR_RENAMING)) - ); + .then(null, error => { + if (isWindows && error && error.code === 'EPERM' && Date.now() < retryUntil) { + this.logService.info(`Failed renaming ${extractPath} to ${renamePath} with 'EPERM' error. Trying again...`); + return this.rename(id, extractPath, renamePath, retryUntil); + } + return TPromise.wrapError(new ExtensionManagementError(error.message || nls.localize('renameError', "Unknown error while"), error.code || INSTALL_ERROR_RENAMING)); + }); } private rollback(extensions: IGalleryExtension[]): TPromise { From 8bd32b4fa88f8209b934f6b1ff32b8974be6eadc Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 13:28:01 +0200 Subject: [PATCH 444/710] Fix #47566 --- .../extensionManagement/node/extensionManagementService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 321f8861d9e..8ee83cc3a4c 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -455,7 +455,7 @@ export class ExtensionManagementService extends Disposable implements IExtension this.logService.info(`Failed renaming ${extractPath} to ${renamePath} with 'EPERM' error. Trying again...`); return this.rename(id, extractPath, renamePath, retryUntil); } - return TPromise.wrapError(new ExtensionManagementError(error.message || nls.localize('renameError', "Unknown error while"), error.code || INSTALL_ERROR_RENAMING)); + return TPromise.wrapError(new ExtensionManagementError(error.message || nls.localize('renameError', "Unknown error while renaming {0} to {1}", extractPath, renamePath), error.code || INSTALL_ERROR_RENAMING)); }); } From 50316e6b8f1266b5ba692bc55baf87a931f0328a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 14:34:02 +0200 Subject: [PATCH 445/710] Fix layout --- .../workbench/parts/markers/electron-browser/markersPanel.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index 34c5ce22c69..7c11d749c64 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -96,9 +96,8 @@ export class MarkersPanel extends Panel { } public layout(dimension: dom.Dimension): void { - const height = dimension.height - 38; - this.treeContainer.style.height = `${height}px`; - this.tree.layout(height, dimension.width); + this.treeContainer.style.height = `${dimension.height}px`; + this.tree.layout(dimension.height, dimension.width); this.filterInputActionItem.toggleLayout(dimension.width < 1200); } From 2353f6f30c93eb33820045f9cbaf45ce5396849d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 15:02:11 +0200 Subject: [PATCH 446/710] FIx #47828 --- .../node/extensionGalleryService.ts | 13 ++++--------- .../node/extensionManagementService.ts | 4 ++++ .../platform/extensions/node/extensionValidator.ts | 6 ++++++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 694f98da3e4..92c29975c2b 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -18,7 +18,7 @@ import { IPager } from 'vs/base/common/paging'; import { IRequestOptions, IRequestContext, download, asJson, asText } from 'vs/base/node/request'; import pkg from 'vs/platform/node/package'; import product from 'vs/platform/node/product'; -import { isVersionValid } from 'vs/platform/extensions/node/extensionValidator'; +import { isEngineValid } from 'vs/platform/extensions/node/extensionValidator'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { readFile } from 'vs/base/node/pfs'; import { writeFileAndFlushSync } from 'vs/base/node/extfs'; @@ -520,7 +520,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { } loadCompatibleVersion(extension: IGalleryExtension): TPromise { - if (extension.properties.engine && this.isEngineValid(extension.properties.engine)) { + if (extension.properties.engine && isEngineValid(extension.properties.engine)) { return TPromise.wrap(extension); } @@ -682,7 +682,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { if (!engine) { return null; } - if (this.isEngineValid(engine)) { + if (isEngineValid(engine)) { return TPromise.wrap(version); } } @@ -703,7 +703,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .then(manifest => { const engine = manifest.engines.vscode; - if (!this.isEngineValid(engine)) { + if (!isEngineValid(engine)) { return this.getLastValidExtensionVersionReccursively(extension, versions.slice(1)); } @@ -713,11 +713,6 @@ export class ExtensionGalleryService implements IExtensionGalleryService { }); } - private isEngineValid(engine: string): boolean { - // TODO@joao: discuss with alex '*' doesn't seem to be a valid engine version - return engine === '*' || isVersionValid(pkg.version, engine); - } - private static hasExtensionByName(extensions: IGalleryExtension[], name: string): boolean { for (const extension of extensions) { if (`${extension.publisher}.${extension.name}` === name) { diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 8ee83cc3a4c..96e5006095a 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -38,6 +38,7 @@ import Severity from 'vs/base/common/severity'; import { ExtensionsLifecycle } from 'vs/platform/extensionManagement/node/extensionLifecycle'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { isEngineValid } from 'vs/platform/extensions/node/extensionValidator'; const SystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', 'extensions')); const ERROR_SCANNING_SYS_EXTENSIONS = 'scanningSystem'; @@ -149,6 +150,9 @@ export class ExtensionManagementService extends Disposable implements IExtension return validateLocalExtension(zipPath) .then(manifest => { const identifier = { id: getLocalExtensionIdFromManifest(manifest) }; + if (manifest.engines && manifest.engines.vscode && !isEngineValid(manifest.engines.vscode)) { + return TPromise.wrapError(new Error(nls.localize('incompatible', "Unable to install Extension '{0}' as it is not compatible with Code '{1}'.", identifier.id, pkg.version))); + } return this.removeIfExists(identifier.id) .then( () => this.checkOutdated(manifest) diff --git a/src/vs/platform/extensions/node/extensionValidator.ts b/src/vs/platform/extensions/node/extensionValidator.ts index 0b98d38572d..a500010b134 100644 --- a/src/vs/platform/extensions/node/extensionValidator.ts +++ b/src/vs/platform/extensions/node/extensionValidator.ts @@ -5,6 +5,7 @@ 'use strict'; import * as nls from 'vs/nls'; +import pkg from 'vs/platform/node/package'; export interface IParsedVersion { hasCaret: boolean; @@ -219,6 +220,11 @@ export function isValidExtensionVersion(version: string, extensionDesc: IReduced return isVersionValid(version, extensionDesc.engines.vscode, notices); } +export function isEngineValid(engine: string): boolean { + // TODO@joao: discuss with alex '*' doesn't seem to be a valid engine version + return engine === '*' || isVersionValid(pkg.version, engine); +} + export function isVersionValid(currentVersion: string, requestedVersion: string, notices: string[] = []): boolean { let desiredVersion = normalizeVersion(parseVersion(requestedVersion)); From 89163a5f5911a943de52919d538fc9ad6fc4d377 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 18 Apr 2018 15:12:54 +0200 Subject: [PATCH 447/710] debug: terminate thread as a context menu and command palette action fixes #29549 --- .../parts/debug/browser/debugActions.ts | 21 +++++++++++++++++++ src/vs/workbench/parts/debug/common/debug.ts | 2 ++ .../parts/debug/common/debugModel.ts | 4 ++++ .../debug/electron-browser/callStackView.ts | 6 +++++- .../electron-browser/debug.contribution.ts | 3 ++- .../debug/electron-browser/rawDebugSession.ts | 4 ++++ .../parts/debug/test/common/mockDebug.ts | 5 +++++ 7 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index 5b4232955dc..51849684254 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -388,6 +388,27 @@ export class PauseAction extends AbstractDebugAction { } } +export class TerminateThreadAction extends AbstractDebugAction { + static readonly ID = 'workbench.action.debug.terminateThread'; + static LABEL = nls.localize('terminateThread', "Terminate Thread"); + + constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService) { + super(id, label, undefined, debugService, keybindingService); + } + + public run(thread: IThread): TPromise { + if (!(thread instanceof Thread)) { + thread = this.debugService.getViewModel().focusedThread; + } + + return thread ? thread.terminate() : TPromise.as(null); + } + + protected isEnabled(state: State): boolean { + return super.isEnabled(state) && (state === State.Running || state === State.Stopped); + } +} + export class RestartFrameAction extends AbstractDebugAction { static readonly ID = 'workbench.action.debug.restartFrame'; static LABEL = nls.localize('restartFrame', "Restart Frame"); diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 5b177840f30..6477133f88a 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -123,6 +123,7 @@ export interface ISession { stepOut(args: DebugProtocol.StepOutArguments): TPromise; continue(args: DebugProtocol.ContinueArguments): TPromise; pause(args: DebugProtocol.PauseArguments): TPromise; + terminateThreads(args: DebugProtocol.TerminateThreadsArguments): TPromise; stepBack(args: DebugProtocol.StepBackArguments): TPromise; reverseContinue(args: DebugProtocol.ReverseContinueArguments): TPromise; @@ -199,6 +200,7 @@ export interface IThread extends ITreeElement { stepBack(): TPromise; continue(): TPromise; pause(): TPromise; + terminate(): TPromise; reverseContinue(): TPromise; } diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 3007f9cafbf..f15a2b56c47 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -525,6 +525,10 @@ export class Thread implements IThread { return this.process.session.pause({ threadId: this.threadId }); } + public terminate(): TPromise { + return this.process.session.terminateThreads({ threadIds: [this.threadId] }); + } + public reverseContinue(): TPromise { return this.process.session.reverseContinue({ threadId: this.threadId }); } diff --git a/src/vs/workbench/parts/debug/electron-browser/callStackView.ts b/src/vs/workbench/parts/debug/electron-browser/callStackView.ts index 8e3b75e7f39..6703b2b0c70 100644 --- a/src/vs/workbench/parts/debug/electron-browser/callStackView.ts +++ b/src/vs/workbench/parts/debug/electron-browser/callStackView.ts @@ -18,7 +18,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { BaseDebugController, twistiePixels, renderViewTree } from 'vs/workbench/parts/debug/browser/baseDebugView'; import { ITree, IActionProvider, IDataSource, IRenderer, IAccessibilityProvider } from 'vs/base/parts/tree/browser/tree'; import { IAction, IActionItem } from 'vs/base/common/actions'; -import { RestartAction, StopAction, ContinueAction, StepOverAction, StepIntoAction, StepOutAction, PauseAction, RestartFrameAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { RestartAction, StopAction, ContinueAction, StepOverAction, StepIntoAction, StepOutAction, PauseAction, RestartFrameAction, TerminateThreadAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { CopyStackTraceAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -27,6 +27,7 @@ import { basenameOrAuthority } from 'vs/base/common/resources'; import { TreeResourceNavigator, WorkbenchTree } from 'vs/platform/list/browser/listService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; const $ = dom.$; @@ -268,6 +269,9 @@ class CallStackActionProvider implements IActionProvider { } else { actions.push(new PauseAction(PauseAction.ID, PauseAction.LABEL, this.debugService, this.keybindingService)); } + + actions.push(new Separator()); + actions.push(new TerminateThreadAction(TerminateThreadAction.ID, TerminateThreadAction.LABEL, this.debugService, this.keybindingService)); } else if (element instanceof StackFrame) { if (element.thread.process.session.capabilities.supportsRestartFrame) { actions.push(new RestartFrameAction(RestartFrameAction.ID, RestartFrameAction.LABEL, this.debugService, this.keybindingService)); diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 2b6f3550af8..89cdf27b9b4 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -30,7 +30,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { DebugEditorModelManager } from 'vs/workbench/parts/debug/browser/debugEditorModelManager'; import { StepOverAction, ClearReplAction, FocusReplAction, StepIntoAction, StepOutAction, StartAction, RestartAction, ContinueAction, StopAction, DisconnectAction, PauseAction, AddFunctionBreakpointAction, - ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction + ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction, TerminateThreadAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { DebugActionsWidget } from 'vs/workbench/parts/debug/browser/debugActionsWidget'; import * as service from 'vs/workbench/parts/debug/electron-browser/debugService'; @@ -134,6 +134,7 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(StopAction, StopAction registry.registerWorkbenchAction(new SyncActionDescriptor(DisconnectAction, DisconnectAction.ID, DisconnectAction.LABEL), 'Debug: Disconnect', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ContinueAction, ContinueAction.ID, ContinueAction.LABEL, { primary: KeyCode.F5 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Continue', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(PauseAction, PauseAction.ID, PauseAction.LABEL, { primary: KeyCode.F6 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Pause', debugCategory); +registry.registerWorkbenchAction(new SyncActionDescriptor(TerminateThreadAction, TerminateThreadAction.ID, TerminateThreadAction.LABEL, undefined, CONTEXT_IN_DEBUG_MODE), 'Debug: Terminate Thread', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL), 'Debug: Open launch.json', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(AddFunctionBreakpointAction, AddFunctionBreakpointAction.ID, AddFunctionBreakpointAction.LABEL), 'Debug: Add Function Breakpoint', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ReapplyBreakpointsAction, ReapplyBreakpointsAction.ID, ReapplyBreakpointsAction.LABEL), 'Debug: Reapply All Breakpoints', debugCategory); diff --git a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts index 80b235858b0..dd96720d946 100644 --- a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts @@ -350,6 +350,10 @@ export class RawDebugSession implements debug.ISession { return this.send('pause', args); } + public terminateThreads(args: DebugProtocol.TerminateThreadsArguments): TPromise { + return this.send('terminateThreads', args); + } + public setVariable(args: DebugProtocol.SetVariableArguments): TPromise { return this.send('setVariable', args); } diff --git a/src/vs/workbench/parts/debug/test/common/mockDebug.ts b/src/vs/workbench/parts/debug/test/common/mockDebug.ts index e626309a642..6db8bef34f6 100644 --- a/src/vs/workbench/parts/debug/test/common/mockDebug.ts +++ b/src/vs/workbench/parts/debug/test/common/mockDebug.ts @@ -111,6 +111,7 @@ export class MockDebugService implements IDebugService { } export class MockSession implements ISession { + public readyForBreakpoints = true; public emittedStopped = true; @@ -217,6 +218,10 @@ export class MockSession implements ISession { return TPromise.as(null); } + public terminateThreads(args: DebugProtocol.TerminateThreadsArguments): TPromise { + return TPromise.as(null); + } + public setVariable(args: DebugProtocol.SetVariableArguments): TPromise { return TPromise.as(null); } From 12dfca846f10ef2b575f7e615a5649ec285df7fa Mon Sep 17 00:00:00 2001 From: Till Salinger Date: Wed, 18 Apr 2018 15:17:24 +0200 Subject: [PATCH 448/710] fixes: single trailing slash results in a confusing message --- .../parts/files/electron-browser/views/explorerViewer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 65595830517..30c28198689 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -345,7 +345,7 @@ export class FileRenderer implements IRenderer { private displayCurrentPath(inputBox: InputBox, initialRelPath: string, projectFolderName: string = '', actionID: string) { if (inputBox.validate()) { const value = inputBox.value; - if (value && value.search(/[\\/]/) !== -1) { // only show if there's a slash + if (value && /.[\\/]./.test(value)) { // only show if there's at least one slash enclosed in the string let displayPath = path.normalize(path.join(projectFolderName, initialRelPath, value)); displayPath = rtrim(displayPath, paths.nativeSep); From 528efc5bbb82f9861900818fbf2c03f9a89d16f4 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 15:23:43 +0200 Subject: [PATCH 449/710] smoketest: log last poll message --- test/smoke/src/main.ts | 3 +++ test/smoke/src/vscode/code.ts | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index ab2586f5c9e..ea4f1365bf2 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -27,6 +27,7 @@ import { setup as setupDataExtensionTests } from './areas/extensions/extensions. import { setup as setupTerminalTests } from './areas/terminal/terminal.test'; import { setup as setupDataMultirootTests } from './areas/multiroot/multiroot.test'; import { setup as setupDataLocalizationTests } from './areas/workbench/localization.test'; +import { polling } from './vscode/code'; const tmpDir = tmp.dirSync({ prefix: 't' }) as { name: string; removeCallback: Function; }; const testDataPath = tmpDir.name; @@ -287,6 +288,8 @@ describe('Test', () => { const name = this.currentTest.fullTitle().replace(/[^a-z0-9\-]/ig, '_'); const screenshotPath = path.join(screenshotsPath, `${name}.png`); + + console.log('Last poll message: ', polling.lastTimeoutMessage); fs.writeFileSync(screenshotPath, buffer); }); } diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index 039bd05d4a2..5240380e776 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -139,6 +139,10 @@ export async function spawn(options: SpawnOptions): Promise { return connect(child, outPath, handle, options.verbose); } +export const polling = { + lastTimeoutMessage: '' +}; + async function poll( fn: () => Promise, acceptFn: (result: T) => boolean, @@ -155,6 +159,7 @@ async function poll( let result; try { + polling.lastTimeoutMessage = timeoutMessage; result = await fn(); if (acceptFn(result)) { From a1bb202eb66de3b3158d4fee9dd31318e0e9277e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 18 Apr 2018 15:26:43 +0200 Subject: [PATCH 450/710] incorperate folding api feedback --- .../client/src/cssMain.ts | 18 ++- .../client/src/htmlMain.ts | 18 ++- .../client/src/jsonMain.ts | 18 ++- .../src/extension.ts | 2 +- .../src/features/foldingProvider.ts | 14 ++- .../src/test/foldingProvider.test.ts | 36 +++--- .../src/features/foldingProvider.ts | 8 +- .../src/languageProvider.ts | 2 +- src/vs/editor/common/modes.ts | 55 ++++----- src/vs/editor/contrib/folding/folding.ts | 12 +- .../contrib/folding/syntaxRangeProvider.ts | 36 +++--- src/vs/vscode.proposed.d.ts | 108 ++++++++++-------- .../mainThreadLanguageFeatures.ts | 4 +- src/vs/workbench/api/node/extHost.api.impl.ts | 7 +- src/vs/workbench/api/node/extHost.protocol.ts | 4 +- .../api/node/extHostLanguageFeatures.ts | 16 +-- .../api/node/extHostTypeConverters.ts | 8 +- src/vs/workbench/api/node/extHostTypes.ts | 46 ++++---- 18 files changed, 232 insertions(+), 180 deletions(-) diff --git a/extensions/css-language-features/client/src/cssMain.ts b/extensions/css-language-features/client/src/cssMain.ts index ac1a1b7493e..c03c44b6cd6 100644 --- a/extensions/css-language-features/client/src/cssMain.ts +++ b/extensions/css-language-features/client/src/cssMain.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { languages, window, commands, ExtensionContext, Range, Position, TextDocument, CompletionItem, CompletionItemKind, TextEdit, SnippetString, FoldingRangeList, FoldingRange, FoldingContext, CancellationToken } from 'vscode'; +import { languages, window, commands, ExtensionContext, Range, Position, TextDocument, CompletionItem, CompletionItemKind, TextEdit, SnippetString, FoldingRangeKind, FoldingRange, FoldingContext, CancellationToken } from 'vscode'; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, Disposable } from 'vscode-languageclient'; import { FoldingRangeRequest, FoldingRangeRequestParam, FoldingRangeClientCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; @@ -117,14 +117,26 @@ export function activate(context: ExtensionContext) { } function initFoldingProvider(): Disposable { - return languages.registerFoldingProvider(documentSelector, { + const kinds: { [value: string]: FoldingRangeKind } = Object.create(null); + function getKind(value: string | undefined) { + if (!value) { + return void 0; + } + let kind = kinds[value]; + if (!kind) { + kind = new FoldingRangeKind(value); + kinds[value] = kind; + } + return kind; + } + return languages.registerFoldingRangeProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { const param: FoldingRangeRequestParam = { textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) }; return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { if (Array.isArray(ranges)) { - return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind))); + return ranges.map(r => new FoldingRange(r.startLine, r.endLine, getKind(r.kind))); } return null; }, error => { diff --git a/extensions/html-language-features/client/src/htmlMain.ts b/extensions/html-language-features/client/src/htmlMain.ts index 1cde186c175..6e25547a896 100644 --- a/extensions/html-language-features/client/src/htmlMain.ts +++ b/extensions/html-language-features/client/src/htmlMain.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { languages, ExtensionContext, IndentAction, Position, TextDocument, Range, CompletionItem, CompletionItemKind, SnippetString, FoldingRangeList, FoldingRange, FoldingContext } from 'vscode'; +import { languages, ExtensionContext, IndentAction, Position, TextDocument, Range, CompletionItem, CompletionItemKind, SnippetString, FoldingRangeKind, FoldingRange, FoldingContext } from 'vscode'; import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, RequestType, TextDocumentPositionParams, Disposable, CancellationToken } from 'vscode-languageclient'; import { EMPTY_ELEMENTS } from './htmlEmptyTagsShared'; import { activateTagClosing } from './tagClosing'; @@ -174,14 +174,26 @@ export function activate(context: ExtensionContext) { }); function initFoldingProvider(): Disposable { - return languages.registerFoldingProvider(documentSelector, { + const kinds: { [value: string]: FoldingRangeKind } = Object.create(null); + function getKind(value: string | undefined) { + if (!value) { + return void 0; + } + let kind = kinds[value]; + if (!kind) { + kind = new FoldingRangeKind(value); + kinds[value] = kind; + } + return kind; + } + return languages.registerFoldingRangeProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { const param: FoldingRangeRequestParam = { textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) }; return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { if (Array.isArray(ranges)) { - return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind))); + return ranges.map(r => new FoldingRange(r.startLine, r.endLine, getKind(r.kind))); } return null; }, error => { diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonMain.ts index ee895024bae..53c19c4c22f 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonMain.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, TextDocument, FoldingRangeList, FoldingRange, Disposable, FoldingContext } from 'vscode'; +import { workspace, languages, ExtensionContext, extensions, Uri, LanguageConfiguration, TextDocument, FoldingRangeKind, FoldingRange, Disposable, FoldingContext } from 'vscode'; import { LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, DidChangeConfigurationNotification, CancellationToken } from 'vscode-languageclient'; import TelemetryReporter from 'vscode-extension-telemetry'; @@ -156,14 +156,26 @@ export function activate(context: ExtensionContext) { languages.setLanguageConfiguration('jsonc', languageConfiguration); function initFoldingProvider(): Disposable { - return languages.registerFoldingProvider(documentSelector, { + const kinds: { [value: string]: FoldingRangeKind } = Object.create(null); + function getKind(value: string | undefined) { + if (!value) { + return void 0; + } + let kind = kinds[value]; + if (!kind) { + kind = new FoldingRangeKind(value); + kinds[value] = kind; + } + return kind; + } + return languages.registerFoldingRangeProvider(documentSelector, { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken) { const param: FoldingRangeRequestParam = { textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document) }; return client.sendRequest(FoldingRangeRequest.type, param, token).then(ranges => { if (Array.isArray(ranges)) { - return new FoldingRangeList(ranges.map(r => new FoldingRange(r.startLine, r.endLine, r.kind))); + return ranges.map(r => new FoldingRange(r.startLine, r.endLine, getKind(r.kind))); } return null; }, error => { diff --git a/extensions/markdown-language-features/src/extension.ts b/extensions/markdown-language-features/src/extension.ts index 6bac15639fb..e260737797b 100644 --- a/extensions/markdown-language-features/src/extension.ts +++ b/extensions/markdown-language-features/src/extension.ts @@ -39,7 +39,7 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(selector, symbolProvider)); context.subscriptions.push(vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider())); - context.subscriptions.push(vscode.languages.registerFoldingProvider(selector, new MarkdownFoldingProvider(engine))); + context.subscriptions.push(vscode.languages.registerFoldingRangeProvider(selector, new MarkdownFoldingProvider(engine))); context.subscriptions.push(vscode.languages.registerWorkspaceSymbolProvider(new MarkdownWorkspaceSymbolProvider(symbolProvider))); const previewSecuritySelector = new PreviewSecuritySelector(cspArbiter, previewManager); diff --git a/extensions/markdown-language-features/src/features/foldingProvider.ts b/extensions/markdown-language-features/src/features/foldingProvider.ts index 637cdb11d14..236908a1f1f 100644 --- a/extensions/markdown-language-features/src/features/foldingProvider.ts +++ b/extensions/markdown-language-features/src/features/foldingProvider.ts @@ -8,7 +8,9 @@ import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; import { TableOfContentsProvider } from '../tableOfContentsProvider'; -export default class MarkdownFoldingProvider implements vscode.FoldingProvider { +const rangeLimit = 5000; + +export default class MarkdownFoldingProvider implements vscode.FoldingRangeProvider { constructor( private readonly engine: MarkdownEngine @@ -16,13 +18,13 @@ export default class MarkdownFoldingProvider implements vscode.FoldingProvider { public async provideFoldingRanges( document: vscode.TextDocument, - context: vscode.FoldingContext, + _: vscode.FoldingContext, _token: vscode.CancellationToken - ): Promise { + ): Promise { const tocProvider = new TableOfContentsProvider(this.engine, document); let toc = await tocProvider.getToc(); - if (context.maxRanges && toc.length > context.maxRanges) { - toc = toc.slice(0, context.maxRanges); + if (toc.length > rangeLimit) { + toc = toc.slice(0, rangeLimit); } const foldingRanges = toc.map((entry, startIndex) => { @@ -43,6 +45,6 @@ export default class MarkdownFoldingProvider implements vscode.FoldingProvider { }); - return new vscode.FoldingRangeList(foldingRanges); + return foldingRanges; } } \ No newline at end of file diff --git a/extensions/markdown-language-features/src/test/foldingProvider.test.ts b/extensions/markdown-language-features/src/test/foldingProvider.test.ts index 5095bcbbed0..44c570d64d4 100644 --- a/extensions/markdown-language-features/src/test/foldingProvider.test.ts +++ b/extensions/markdown-language-features/src/test/foldingProvider.test.ts @@ -16,7 +16,7 @@ const testFileName = vscode.Uri.parse('test.md'); suite('markdown.FoldingProvider', () => { test('Should not return anything for empty document', async () => { const folds = await getFoldsForDocument(``); - assert.strictEqual(folds.ranges.length, 0); + assert.strictEqual(folds.length, 0); }); test('Should not return anything for document without headers', async () => { @@ -24,7 +24,7 @@ suite('markdown.FoldingProvider', () => { **b** afas a#b a`); - assert.strictEqual(folds.ranges.length, 0); + assert.strictEqual(folds.length, 0); }); test('Should fold from header to end of document', async () => { @@ -32,10 +32,10 @@ a`); # b c d`); - assert.strictEqual(folds.ranges.length, 1); - const firstFold = folds.ranges[0]; - assert.strictEqual(firstFold.startLine, 1); - assert.strictEqual(firstFold.endLine, 3); + assert.strictEqual(folds.length, 1); + const firstFold = folds[0]; + assert.strictEqual(firstFold.start, 1); + assert.strictEqual(firstFold.end, 3); }); test('Should leave single newline before next header', async () => { @@ -45,10 +45,10 @@ x # b y`); - assert.strictEqual(folds.ranges.length, 2); - const firstFold = folds.ranges[0]; - assert.strictEqual(firstFold.startLine, 1); - assert.strictEqual(firstFold.endLine, 3); + assert.strictEqual(folds.length, 2); + const firstFold = folds[0]; + assert.strictEqual(firstFold.start, 1); + assert.strictEqual(firstFold.end, 3); }); test('Should collapse multuple newlines to single newline before next header', async () => { @@ -60,10 +60,10 @@ x # b y`); - assert.strictEqual(folds.ranges.length, 2); - const firstFold = folds.ranges[0]; - assert.strictEqual(firstFold.startLine, 1); - assert.strictEqual(firstFold.endLine, 5); + assert.strictEqual(folds.length, 2); + const firstFold = folds[0]; + assert.strictEqual(firstFold.start, 1); + assert.strictEqual(firstFold.end, 5); }); test('Should not collapse if there is no newline before next header', async () => { @@ -72,10 +72,10 @@ y`); x # b y`); - assert.strictEqual(folds.ranges.length, 2); - const firstFold = folds.ranges[0]; - assert.strictEqual(firstFold.startLine, 1); - assert.strictEqual(firstFold.endLine, 2); + assert.strictEqual(folds.length, 2); + const firstFold = folds[0]; + assert.strictEqual(firstFold.start, 1); + assert.strictEqual(firstFold.end, 2); }); }); diff --git a/extensions/typescript-language-features/src/features/foldingProvider.ts b/extensions/typescript-language-features/src/features/foldingProvider.ts index b5ad3d23199..20c1ec40647 100644 --- a/extensions/typescript-language-features/src/features/foldingProvider.ts +++ b/extensions/typescript-language-features/src/features/foldingProvider.ts @@ -9,7 +9,7 @@ import * as Proto from '../protocol'; import * as typeConverters from '../utils/typeConverters'; import { ITypeScriptServiceClient } from '../typescriptService'; -export default class TypeScriptFoldingProvider implements vscode.FoldingProvider { +export default class TypeScriptFoldingProvider implements vscode.FoldingRangeProvider { public constructor( private readonly client: ITypeScriptServiceClient ) { } @@ -18,7 +18,7 @@ export default class TypeScriptFoldingProvider implements vscode.FoldingProvider document: vscode.TextDocument, _context: vscode.FoldingContext, token: vscode.CancellationToken - ): Promise { + ): Promise { if (!this.client.apiVersion.has280Features()) { return; } @@ -34,13 +34,13 @@ export default class TypeScriptFoldingProvider implements vscode.FoldingProvider return; } - return new vscode.FoldingRangeList(response.body.map(span => { + return response.body.map(span => { const range = typeConverters.Range.fromTextSpan(span.textSpan); // workaround for #47240 if (range.end.character > 0 && document.getText(new vscode.Range(range.end.translate(0, -1), range.end)) === '}') { return new vscode.FoldingRange(range.start.line, Math.max(range.end.line - 1, range.start.line)); } return new vscode.FoldingRange(range.start.line, range.end.line); - })); + }); } } diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index 5efb11d5a63..f23c7fab620 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -159,7 +159,7 @@ export default class LanguageProvider { let enable = workspace.getConfiguration().get(foldingSetting, false); if (enable && this.client.apiVersion.has280Features()) { if (!this.foldingProviderRegistration) { - this.foldingProviderRegistration = languages.registerFoldingProvider(this.documentSelector, new (await import('./features/foldingProvider')).default(this.client)); + this.foldingProviderRegistration = languages.registerFoldingRangeProvider(this.documentSelector, new (await import('./features/foldingProvider')).default(this.client)); } } else { if (this.foldingProviderRegistration) { diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 46e81803edc..76d62264ebc 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -835,7 +835,6 @@ export interface DocumentColorProvider { * @internal */ export interface FoldingContext { - maxRanges?: number; } /** @@ -844,59 +843,61 @@ export interface FoldingContext { /** * @internal */ -export interface FoldingProvider { +export interface FoldingRangeProvider { /** * Provides the color ranges for a specific model. */ - provideFoldingRanges(model: model.ITextModel, context: FoldingContext, token: CancellationToken): IFoldingRangeList | Thenable; + provideFoldingRanges(model: model.ITextModel, context: FoldingContext, token: CancellationToken): IFoldingRange[] | Thenable; } -/** - * @internal - */ -export interface IFoldingRangeList { - ranges: IFoldingRange[]; -} /** * @internal */ export interface IFoldingRange { /** - * The start line number + * The zero-based start line of the range to fold. The folded area starts after the line's last character. */ - startLineNumber: number; + start: number; /** - * The end line number + * The zero-based end line of the range to fold. The folded area ends with the line's last character. */ - endLineNumber: number; + end: number; /** - * The optional type of the folding range + * Describes the [Kind](#FoldingRangeKind) of the folding range such as [Comment](#FoldingRangeKind.Comment) or + * [Region](#FoldingRangeKind.Region). The kind is used to categorize folding ranges and used by commands + * like 'Fold all comments'. See + * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. */ - type?: FoldingRangeType | string; - - // auto-collapse - // header span - + kind?: FoldingRangeKind; } /** * @internal */ -export enum FoldingRangeType { +export class FoldingRangeKind { /** - * Folding range for a comment + * Kind for folding range representing a comment. The value of the kind is 'comment'. */ - Comment = 'comment', + static readonly Comment = new FoldingRangeKind('comment'); /** - * Folding range for a imports or includes + * Kind for folding range representing a import. The value of the kind is 'imports'. */ - Imports = 'imports', + static readonly Imports = new FoldingRangeKind('imports'); /** - * Folding range for a region (e.g. `#region`) + * Kind for folding range representing regions (for example marked by `#region`, `#endregion`). + * The value of the kind is 'region'. */ - Region = 'region' + static readonly Region = new FoldingRangeKind('region'); + + /** + * Creates a new [FoldingRangeKind](#FoldingRangeKind). + * + * @param value of the kind. + */ + public constructor(public value: string) { + } } /** @@ -1047,7 +1048,7 @@ export const ColorProviderRegistry = new LanguageFeatureRegistry(); +export const FoldingRangeProviderRegistry = new LanguageFeatureRegistry(); /** * @internal diff --git a/src/vs/editor/contrib/folding/folding.ts b/src/vs/editor/contrib/folding/folding.ts index e4237e2afd6..4d54fef449f 100644 --- a/src/vs/editor/contrib/folding/folding.ts +++ b/src/vs/editor/contrib/folding/folding.ts @@ -28,7 +28,7 @@ import { IRange } from 'vs/editor/common/core/range'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { IndentRangeProvider } from 'vs/editor/contrib/folding/indentRangeProvider'; import { IPosition } from 'vs/editor/common/core/position'; -import { FoldingProviderRegistry, FoldingRangeType } from 'vs/editor/common/modes'; +import { FoldingRangeProviderRegistry, FoldingRangeKind } from 'vs/editor/common/modes'; import { SyntaxRangeProvider } from './syntaxRangeProvider'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -82,7 +82,7 @@ export class FoldingController implements IEditorContribution { this.foldingDecorationProvider.autoHideFoldingControls = this._autoHideFoldingControls; this.globalToDispose.push(this.editor.onDidChangeModel(() => this.onModelChanged())); - this.globalToDispose.push(FoldingProviderRegistry.onDidChange(() => this.onFoldingStrategyChanged())); + this.globalToDispose.push(FoldingRangeProviderRegistry.onDidChange(() => this.onFoldingStrategyChanged())); this.globalToDispose.push(this.editor.onDidChangeConfiguration((e: IConfigurationChangedEvent) => { if (e.contribInfo) { @@ -205,7 +205,7 @@ export class FoldingController implements IEditorContribution { private getRangeProvider(): RangeProvider { if (!this.rangeProvider) { if (this._useFoldingProviders) { - let foldingProviders = FoldingProviderRegistry.ordered(this.foldingModel.textModel); + let foldingProviders = FoldingRangeProviderRegistry.ordered(this.foldingModel.textModel); this.rangeProvider = foldingProviders.length ? new SyntaxRangeProvider(foldingProviders) : new IndentRangeProvider(); } else { this.rangeProvider = new IndentRangeProvider(); @@ -584,7 +584,7 @@ class FoldAllBlockCommentsAction extends FoldingAction { invoke(foldingController: FoldingController, foldingModel: FoldingModel, editor: ICodeEditor): void { if (foldingModel.regions.hasTypes()) { - setCollapseStateForType(foldingModel, FoldingRangeType.Comment, true); + setCollapseStateForType(foldingModel, FoldingRangeKind.Comment.value, true); } else { let comments = LanguageConfigurationRegistry.getComments(editor.getModel().getLanguageIdentifier().id); if (comments && comments.blockCommentStartToken) { @@ -612,7 +612,7 @@ class FoldAllRegionsAction extends FoldingAction { invoke(foldingController: FoldingController, foldingModel: FoldingModel, editor: ICodeEditor): void { if (foldingModel.regions.hasTypes()) { - setCollapseStateForType(foldingModel, FoldingRangeType.Region, true); + setCollapseStateForType(foldingModel, FoldingRangeKind.Region.value, true); } else { let foldingRules = LanguageConfigurationRegistry.getFoldingRules(editor.getModel().getLanguageIdentifier().id); if (foldingRules && foldingRules.markers && foldingRules.markers.start) { @@ -640,7 +640,7 @@ class UnfoldAllRegionsAction extends FoldingAction { invoke(foldingController: FoldingController, foldingModel: FoldingModel, editor: ICodeEditor): void { if (foldingModel.regions.hasTypes()) { - setCollapseStateForType(foldingModel, FoldingRangeType.Region, false); + setCollapseStateForType(foldingModel, FoldingRangeKind.Region.value, false); } else { let foldingRules = LanguageConfigurationRegistry.getFoldingRules(editor.getModel().getLanguageIdentifier().id); if (foldingRules && foldingRules.markers && foldingRules.markers.start) { diff --git a/src/vs/editor/contrib/folding/syntaxRangeProvider.ts b/src/vs/editor/contrib/folding/syntaxRangeProvider.ts index 7d5d7447929..7131c02d583 100644 --- a/src/vs/editor/contrib/folding/syntaxRangeProvider.ts +++ b/src/vs/editor/contrib/folding/syntaxRangeProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { FoldingProvider, IFoldingRange, FoldingContext } from 'vs/editor/common/modes'; +import { FoldingRangeProvider, IFoldingRange, FoldingContext } from 'vs/editor/common/modes'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { toThenable } from 'vs/base/common/async'; import { ITextModel } from 'vs/editor/common/model'; @@ -26,7 +26,7 @@ const foldingContext: FoldingContext = { export class SyntaxRangeProvider implements RangeProvider { - constructor(private providers: FoldingProvider[]) { + constructor(private providers: FoldingRangeProvider[]) { } compute(model: ITextModel, cancellationToken: CancellationToken): Thenable { @@ -41,23 +41,23 @@ export class SyntaxRangeProvider implements RangeProvider { } -function collectSyntaxRanges(providers: FoldingProvider[], model: ITextModel, cancellationToken: CancellationToken): Thenable { +function collectSyntaxRanges(providers: FoldingRangeProvider[], model: ITextModel, cancellationToken: CancellationToken): Thenable { let promises = providers.map(provider => toThenable(provider.provideFoldingRanges(model, foldingContext, cancellationToken))); - return TPromise.join(promises).then(lists => { + return TPromise.join(promises).then(results => { let rangeData: IFoldingRangeData[] = null; if (cancellationToken.isCancellationRequested) { return null; } - for (let i = 0; i < lists.length; i++) { - let list = lists[i]; - if (list && Array.isArray(list.ranges)) { + for (let i = 0; i < results.length; i++) { + let ranges = results[i]; + if (Array.isArray(ranges)) { if (!Array.isArray(rangeData)) { rangeData = []; } let nLines = model.getLineCount(); - for (let r of list.ranges) { - if (r.startLineNumber > 0 && r.endLineNumber > r.startLineNumber && r.endLineNumber <= nLines) { - rangeData.push({ startLineNumber: r.startLineNumber, endLineNumber: r.endLineNumber, rank: i, type: r.type }); + for (let r of ranges) { + if (r.start > 0 && r.end > r.start && r.end <= nLines) { + rangeData.push({ start: r.start, end: r.end, rank: i, kind: r.kind }); } } } @@ -145,7 +145,7 @@ export class RangesCollector { export function sanitizeRanges(rangeData: IFoldingRangeData[]): FoldingRegions { let sorted = rangeData.sort((d1, d2) => { - let diff = d1.startLineNumber - d2.startLineNumber; + let diff = d1.start - d2.start; if (diff === 0) { diff = d1.rank - d2.rank; } @@ -158,20 +158,20 @@ export function sanitizeRanges(rangeData: IFoldingRangeData[]): FoldingRegions { for (let entry of sorted) { if (!top) { top = entry; - collector.add(entry.startLineNumber, entry.endLineNumber, entry.type, previous.length); + collector.add(entry.start, entry.end, entry.kind && entry.kind.value, previous.length); } else { - if (entry.startLineNumber > top.startLineNumber) { - if (entry.endLineNumber <= top.endLineNumber) { + if (entry.start > top.start) { + if (entry.end <= top.end) { previous.push(top); top = entry; - collector.add(entry.startLineNumber, entry.endLineNumber, entry.type, previous.length); - } else if (entry.startLineNumber > top.endLineNumber) { + collector.add(entry.start, entry.end, entry.kind && entry.kind.value, previous.length); + } else if (entry.start > top.end) { do { top = previous.pop(); - } while (top && entry.startLineNumber > top.endLineNumber); + } while (top && entry.start > top.end); previous.push(top); top = entry; - collector.add(entry.startLineNumber, entry.endLineNumber, entry.type, previous.length); + collector.add(entry.start, entry.end, entry.kind && entry.kind.value, previous.length); } } } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 6bf0f87445f..793919f0a11 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -13,88 +13,104 @@ declare module 'vscode' { //#region Aeschli: folding - export class FoldingRangeList { - - /** - * The folding ranges. - */ - ranges: FoldingRange[]; - - /** - * Creates new folding range list. - * - * @param ranges The folding ranges - */ - constructor(ranges: FoldingRange[]); - } - - export class FoldingRange { /** - * The start line number (zero-based) of the range to fold. The hidden area starts after the last character of that line. + * The zero-based start line of the range to fold. The folded area starts after the line's last character. */ - startLine: number; + start: number; /** - * The end line number (0-based) of the range to fold. The hidden area ends at the last character of that line. + * The zero-based end line of the range to fold. The folded area ends with the line's last character. */ - endLine: number; + end: number; /** - * The actual color value for this color range. + * Describes the [Kind](#FoldingRangeKind) of the folding range such as [Comment](#FoldingRangeKind.Comment) or + * [Region](#FoldingRangeKind.Region). The kind is used to categorize folding ranges and used by commands + * like 'Fold all comments'. See + * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. */ - type?: FoldingRangeType | string; + kind?: FoldingRangeKind; /** * Creates a new folding range. * - * @param startLineNumber The first line of the fold - * @param type The last line of the fold + * @param start The start line of the folded range. + * @param end The end line of the folded range. + * @param kind The kind of the folding range. */ - constructor(startLineNumber: number, endLineNumber: number, type?: FoldingRangeType | string); + constructor(start: number, end: number, kind?: FoldingRangeKind); } - export enum FoldingRangeType { + export class FoldingRangeKind { /** - * Folding range for a comment + * Kind for folding range representing a comment. The value of the kind is 'comment'. */ - Comment = 'comment', + static readonly Comment: FoldingRangeKind; /** - * Folding range for a imports or includes + * Kind for folding range representing a import. The value of the kind is 'imports'. */ - Imports = 'imports', + static readonly Imports: FoldingRangeKind; /** - * Folding range for a region (e.g. `#region`) + * Kind for folding range representing regions (for example a folding range marked by `#region` and `#endregion`). + * The value of the kind is 'region'. */ - Region = 'region' + static readonly Region: FoldingRangeKind; + /** + * String value of the kind, e.g. `comment`. + */ + readonly value: string; + /** + * Creates a new [FoldingRangeKind](#FoldingRangeKind). + * + * @param value of the kind. + */ + public constructor(value: string); } export namespace languages { /** - * Register a folding provider. + * Register a folding range provider. * * Multiple folding can be registered for a language. In that case providers are sorted * by their [score](#languages.match) and the best-matching provider is used. Failure * of the selected provider will cause a failure of the whole operation. * * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A folding provider. + * @param provider A folding range provider. + * @param metadata Metadata about the kind of code actions the provider providers. * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ - export function registerFoldingProvider(selector: DocumentSelector, provider: FoldingProvider): Disposable; + export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider, metadata?: FoldingRangeProviderMetadata): Disposable; } - export interface FoldingContext { - maxRanges?: number; - } - - export interface FoldingProvider { + /** + * Metadata about the kind of folding ranges that a [FoldingRangeProvider](#FoldingRangeProvider) providers uses. + */ + export interface FoldingRangeProviderMetadata { /** - * Returns a list of folding ranges or null if the provider does not want to participate or was cancelled. + * [FoldingRangeKind](#FoldingRangeKind) that this provider may return. */ - provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): ProviderResult; + readonly providedFoldingRangeKinds?: ReadonlyArray; + } + + /** + * Folding context (for future use) + */ + export interface FoldingContext { + } + + export interface FoldingRangeProvider { + /** + * Returns a list of folding ranges or null and undefined if the provider + * does not want to participate or was cancelled. + * @param document The document in which the command was invoked. + * @param context Additional context information (for future use) + * @param token A cancellation token. + */ + provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): ProviderResult; } //#endregion @@ -242,9 +258,9 @@ declare module 'vscode' { readonly onDidChangeFile: Event; /** - * Subscribe to events in the file or folder denoted by `uri`. - * @param uri - * @param options + * Subscribe to events in the file or folder denoted by `uri`. + * @param uri + * @param options */ watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; @@ -269,7 +285,7 @@ declare module 'vscode' { /** * Create a new directory. *Note* that new files are created via `write`-calls. - * + * * @param uri The uri of the *new* folder. * @param token A cancellation token. */ diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index edebb1a5bd2..34fb61eea6a 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -349,9 +349,9 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha // --- folding - $registerFoldingProvider(handle: number, selector: ISerializedDocumentFilter[]): void { + $registerFoldingRangeProvider(handle: number, selector: ISerializedDocumentFilter[]): void { const proxy = this._proxy; - this._registrations[handle] = modes.FoldingProviderRegistry.register(toLanguageSelector(selector), { + this._registrations[handle] = modes.FoldingRangeProviderRegistry.register(toLanguageSelector(selector), { provideFoldingRanges: (model, context, token) => { return wireCancellationToken(token, proxy.$provideFoldingRanges(handle, model.uri, context)); } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 02fe0073cfe..2790ad78549 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -328,8 +328,8 @@ export function createApiFactory( registerColorProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable { return extHostLanguageFeatures.registerColorProvider(checkSelector(selector), provider); }, - registerFoldingProvider: proposedApiFunction(extension, (selector: vscode.DocumentSelector, provider: vscode.FoldingProvider): vscode.Disposable => { - return extHostLanguageFeatures.registerFoldingProvider(checkSelector(selector), provider); + registerFoldingRangeProvider: proposedApiFunction(extension, (selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable => { + return extHostLanguageFeatures.registerFoldingRangeProvider(checkSelector(selector), provider); }), setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration): vscode.Disposable => { return extHostLanguageFeatures.setLanguageConfiguration(language, configuration); @@ -714,9 +714,8 @@ export function createApiFactory( FileType2: extHostTypes.FileType2, FileOpenFlags: files.FileOpenFlags, FileError: files.FileError, - FoldingRangeList: extHostTypes.FoldingRangeList, FoldingRange: extHostTypes.FoldingRange, - FoldingRangeType: extHostTypes.FoldingRangeType + FoldingRangeKind: extHostTypes.FoldingRangeKind }; }; } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index bec0acdb06e..fb05930446c 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -283,7 +283,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { $registerSignatureHelpProvider(handle: number, selector: ISerializedDocumentFilter[], triggerCharacter: string[]): void; $registerDocumentLinkProvider(handle: number, selector: ISerializedDocumentFilter[]): void; $registerDocumentColorProvider(handle: number, selector: ISerializedDocumentFilter[]): void; - $registerFoldingProvider(handle: number, selector: ISerializedDocumentFilter[]): void; + $registerFoldingRangeProvider(handle: number, selector: ISerializedDocumentFilter[]): void; $setLanguageConfiguration(handle: number, languageId: string, configuration: ISerializedLanguageConfiguration): void; } @@ -722,7 +722,7 @@ export interface ExtHostLanguageFeaturesShape { $resolveDocumentLink(handle: number, link: modes.ILink): TPromise; $provideDocumentColors(handle: number, resource: UriComponents): TPromise; $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: IRawColorInfo): TPromise; - $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext): TPromise; + $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext): TPromise; } export interface ExtHostQuickOpenShape { diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 8e0753d3df4..3d5e2fe57ad 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -817,16 +817,16 @@ class FoldingProviderAdapter { constructor( private _documents: ExtHostDocuments, - private _provider: vscode.FoldingProvider + private _provider: vscode.FoldingRangeProvider ) { } - provideFoldingRanges(resource: URI, context: modes.FoldingContext): TPromise { + provideFoldingRanges(resource: URI, context: modes.FoldingContext): TPromise { const doc = this._documents.getDocumentData(resource).document; - return asWinJsPromise(token => this._provider.provideFoldingRanges(doc, context, token)).then(list => { - if (!Array.isArray(list.ranges)) { + return asWinJsPromise(token => this._provider.provideFoldingRanges(doc, context, token)).then(ranges => { + if (!Array.isArray(ranges)) { return void 0; } - return TypeConverters.FoldingRangeList.from(list); + return ranges.map(TypeConverters.FoldingRange.from); }); } } @@ -1178,13 +1178,13 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, ColorProviderAdapter, adapter => adapter.provideColorPresentations(URI.revive(resource), colorInfo)); } - registerFoldingProvider(selector: vscode.DocumentSelector, provider: vscode.FoldingProvider): vscode.Disposable { + registerFoldingRangeProvider(selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable { const handle = this._addNewAdapter(new FoldingProviderAdapter(this._documents, provider)); - this._proxy.$registerFoldingProvider(handle, this._transformDocumentSelector(selector)); + this._proxy.$registerFoldingRangeProvider(handle, this._transformDocumentSelector(selector)); return this._createDisposable(handle); } - $provideFoldingRanges(handle: number, resource: UriComponents, context: vscode.FoldingContext): TPromise { + $provideFoldingRanges(handle: number, resource: UriComponents, context: vscode.FoldingContext): TPromise { return this._withAdapter(handle, FoldingProviderAdapter, adapter => adapter.provideFoldingRanges(URI.revive(resource), context)); } diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 0f412156674..b77f77279db 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -623,11 +623,9 @@ export namespace ProgressLocation { } } -export namespace FoldingRangeList { - export function from(rangeList: vscode.FoldingRangeList): modes.IFoldingRangeList { - return { - ranges: rangeList.ranges.map(r => ({ startLineNumber: r.startLine + 1, endLineNumber: r.endLine + 1, type: r.type })) - }; +export namespace FoldingRange { + export function from(r: vscode.FoldingRange): modes.IFoldingRange { + return { start: r.start + 1, end: r.end + 1, kind: r.kind }; } } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index d988a15447d..d4da587fb9e 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1841,43 +1841,43 @@ export enum FileType2 { //#region folding api -export class FoldingRangeList { - - ranges: FoldingRange[]; - - constructor(ranges: FoldingRange[]) { - this.ranges = ranges; - } -} - export class FoldingRange { - startLine: number; + start: number; - endLine: number; + end: number; - type?: FoldingRangeType | string; + kind?: FoldingRangeKind; - constructor(startLine: number, endLine: number, type?: FoldingRangeType | string) { - this.startLine = startLine; - this.endLine = endLine; - this.type = type; + constructor(start: number, end: number, kind?: FoldingRangeKind) { + this.start = start; + this.end = end; + this.kind = kind; } } -export enum FoldingRangeType { +export class FoldingRangeKind { /** - * Folding range for a comment + * Kind for folding range representing a comment. The value of the kind is 'comment'. */ - Comment = 'comment', + static readonly Comment = new FoldingRangeKind('comment'); /** - * Folding range for a imports or includes + * Kind for folding range representing a import. The value of the kind is 'imports'. */ - Imports = 'imports', + static readonly Imports = new FoldingRangeKind('imports'); /** - * Folding range for a region (e.g. `#region`) + * Kind for folding range representing regions (for example marked by `#region`, `#endregion`). + * The value of the kind is 'region'. */ - Region = 'region' + static readonly Region = new FoldingRangeKind('region'); + + /** + * Creates a new [FoldingRangeKind](#FoldingRangeKind). + * + * @param value of the kind. + */ + public constructor(public value: string) { + } } //#endregion From 7adef9d244e1b6c56091d9f9ec477824906b2825 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 15:45:27 +0200 Subject: [PATCH 451/710] log file --- test/smoke/src/application.ts | 8 ++++-- test/smoke/src/logger.ts | 42 ++++++++++++++++++++++++++++++++ test/smoke/src/main.ts | 31 ++++++++++++++++++++--- test/smoke/src/vscode/code.ts | 46 +++++++++++++---------------------- 4 files changed, 92 insertions(+), 35 deletions(-) create mode 100644 test/smoke/src/logger.ts diff --git a/test/smoke/src/application.ts b/test/smoke/src/application.ts index 030c36e1d50..cd63330d0ab 100644 --- a/test/smoke/src/application.ts +++ b/test/smoke/src/application.ts @@ -7,6 +7,7 @@ import { Workbench } from './areas/workbench/workbench'; import * as fs from 'fs'; import * as cp from 'child_process'; import { Code, spawn, SpawnOptions } from './vscode/code'; +import { Logger } from './logger'; export enum Quality { Dev, @@ -19,7 +20,6 @@ export interface ApplicationOptions extends SpawnOptions { workspacePath: string; workspaceFilePath: string; waitTime: number; - verbose: boolean; } export class Application { @@ -42,6 +42,10 @@ export class Application { return this._workbench; } + get logger(): Logger { + return this.options.logger; + } + get workspacePath(): string { return this.options.workspacePath; } @@ -103,7 +107,7 @@ export class Application { workspacePath: workspaceOrFolder, userDataDir: this.options.userDataDir, extensionsPath: this.options.extensionsPath, - verbose: this.options.verbose, + logger: this.options.logger, extraArgs }); diff --git a/test/smoke/src/logger.ts b/test/smoke/src/logger.ts new file mode 100644 index 00000000000..b36b502d6ae --- /dev/null +++ b/test/smoke/src/logger.ts @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { appendFileSync, writeFileSync } from 'fs'; +import { format } from 'util'; +import { EOL } from 'os'; + +export interface Logger { + log(message: string, ...args: any[]): void; +} + +export class ConsoleLogger implements Logger { + + log(message: string, ...args: any[]): void { + console.log('**', message, ...args); + } +} + +export class FileLogger implements Logger { + + constructor(private path: string) { + writeFileSync(path, ''); + } + + log(message: string, ...args: any[]): void { + const date = new Date().toISOString(); + appendFileSync(this.path, `[${date}] ${format(message, ...args)}${EOL}`); + } +} + +export class MultiLogger implements Logger { + + constructor(private loggers: Logger[]) { } + + log(message: string, ...args: any[]): void { + for (const logger of this.loggers) { + logger.log(message, ...args); + } + } +} \ No newline at end of file diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index ea4f1365bf2..8398e0d3944 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -27,7 +27,7 @@ import { setup as setupDataExtensionTests } from './areas/extensions/extensions. import { setup as setupTerminalTests } from './areas/terminal/terminal.test'; import { setup as setupDataMultirootTests } from './areas/multiroot/multiroot.test'; import { setup as setupDataLocalizationTests } from './areas/workbench/localization.test'; -import { polling } from './vscode/code'; +import { MultiLogger, Logger, ConsoleLogger, FileLogger } from './logger'; const tmpDir = tmp.dirSync({ prefix: 't' }) as { name: string; removeCallback: Function; }; const testDataPath = tmpDir.name; @@ -41,7 +41,8 @@ const opts = minimist(args, { 'wait-time', 'test-repo', 'keybindings', - 'screenshots' + 'screenshots', + 'log' ], boolean: [ 'verbose' @@ -238,6 +239,16 @@ async function setup(): Promise { } function createApp(quality: Quality): Application { + const loggers: Logger[] = []; + + if (opts.verbose) { + loggers.push(new ConsoleLogger()); + } + + if (opts.log) { + loggers.push(new FileLogger(opts.log)); + } + return new Application({ quality, codePath: opts.build, @@ -246,7 +257,7 @@ function createApp(quality: Quality): Application { extensionsPath, workspaceFilePath, waitTime: parseInt(opts['wait-time'] || '0') || 20, - verbose: opts.verbose + logger: new MultiLogger(loggers) }); } @@ -289,11 +300,23 @@ describe('Test', () => { const name = this.currentTest.fullTitle().replace(/[^a-z0-9\-]/ig, '_'); const screenshotPath = path.join(screenshotsPath, `${name}.png`); - console.log('Last poll message: ', polling.lastTimeoutMessage); + if (opts.log) { + app.logger.log('*** Scr eenshot recorded:', screenshotPath); + } + fs.writeFileSync(screenshotPath, buffer); }); } + if (opts.log) { + beforeEach(async function () { + const app = this.app as Application; + const title = this.currentTest.fullTitle(); + + app.logger.log('***', title.replace(/./g, '=')); + }); + } + setupDataLossTests(); setupDataExplorerTests(); setupDataPreferencesTests(); diff --git a/test/smoke/src/vscode/code.ts b/test/smoke/src/vscode/code.ts index 5240380e776..c60984c6441 100644 --- a/test/smoke/src/vscode/code.ts +++ b/test/smoke/src/vscode/code.ts @@ -8,6 +8,7 @@ import * as cp from 'child_process'; import * as os from 'os'; import { tmpName } from 'tmp'; import { IDriver, connect as connectDriver, IDisposable, IElement } from './driver'; +import { Logger } from '../logger'; const repoPath = path.join(__dirname, '../../../..'); @@ -57,13 +58,13 @@ function getBuildOutPath(root: string): string { } } -async function connect(child: cp.ChildProcess, outPath: string, handlePath: string, verbose: boolean): Promise { +async function connect(child: cp.ChildProcess, outPath: string, handlePath: string, logger: Logger): Promise { let errCount = 0; while (true) { try { const { client, driver } = await connectDriver(outPath, handlePath); - return new Code(child, client, driver, verbose); + return new Code(child, client, driver, logger); } catch (err) { if (++errCount > 50) { child.kill(); @@ -85,7 +86,7 @@ export interface SpawnOptions { workspacePath: string; userDataDir: string; extensionsPath: string; - verbose: boolean; + logger: Logger; extraArgs?: string[]; } @@ -127,22 +128,14 @@ export async function spawn(options: SpawnOptions): Promise { const spawnOptions: cp.SpawnOptions = {}; - if (options.verbose) { - spawnOptions.stdio = 'inherit'; - } - const child = cp.spawn(electronPath, args, spawnOptions); instances.add(child); child.once('exit', () => instances.delete(child)); - return connect(child, outPath, handle, options.verbose); + return connect(child, outPath, handle, options.logger); } -export const polling = { - lastTimeoutMessage: '' -}; - async function poll( fn: () => Promise, acceptFn: (result: T) => boolean, @@ -159,7 +152,6 @@ async function poll( let result; try { - polling.lastTimeoutMessage = timeoutMessage; result = await fn(); if (acceptFn(result)) { @@ -187,24 +179,20 @@ export class Code { private process: cp.ChildProcess, private client: IDisposable, driver: IDriver, - verbose: boolean + readonly logger: Logger ) { - if (verbose) { - this.driver = new Proxy(driver, { - get(target, prop, receiver) { - if (typeof target[prop] !== 'function') { - return target[prop]; - } - - return function (...args) { - console.log('** ', prop, ...args.filter(a => typeof a === 'string')); - return target[prop].apply(this, args); - }; + this.driver = new Proxy(driver, { + get(target, prop, receiver) { + if (typeof target[prop] !== 'function') { + return target[prop]; } - }); - } else { - this.driver = driver; - } + + return function (...args) { + logger.log(`${prop}`, ...args.filter(a => typeof a === 'string')); + return target[prop].apply(this, args); + }; + } + }); } async capturePage(): Promise { From f7b8b1ad2db28cc95254dd0f1fcd8487b28b7b52 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 15:47:12 +0200 Subject: [PATCH 452/710] publish log files --- build/tfs/continuous-build.yml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 0de0b63b073..20fe203c25a 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -19,12 +19,18 @@ phases: - powershell: | .\scripts\test.bat --tfs .\scripts\test-integration.bat - yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\screenshots" + yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\screenshots" --log "$(Build.ArtifactStagingDirectory)\smoketest.log" name: test - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' - ArtifactName: Screenshots + ArtifactName: screenshots-win32 + publishLocation: Container + condition: succeededOrFailed() + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/smoketest.log' + ArtifactName: logfile-win32 publishLocation: Container condition: succeededOrFailed() @@ -81,11 +87,17 @@ phases: - script: | ./scripts/test.sh --tfs ./scripts/test-integration.sh - yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/screenshots" + yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/screenshots" --log "$(Build.ArtifactStagingDirectory)/smoketest.log" name: test - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' - ArtifactName: Screenshots + ArtifactName: screenshots-darwin + publishLocation: Container + condition: succeededOrFailed() + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)/smoketest.log' + ArtifactName: logfile-darwin publishLocation: Container condition: succeededOrFailed() From 8623ddad7a7aa4744c7faee252afbea76a40f20f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 15:55:27 +0200 Subject: [PATCH 453/710] scm: save sizes --- .../browser/parts/views/contributableViews.ts | 33 +++++++++++-- .../parts/scm/electron-browser/scmViewlet.ts | 48 +++++++++++++++++-- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/contributableViews.ts b/src/vs/workbench/browser/parts/views/contributableViews.ts index b835271fc11..3a449130604 100644 --- a/src/vs/workbench/browser/parts/views/contributableViews.ts +++ b/src/vs/workbench/browser/parts/views/contributableViews.ts @@ -177,6 +177,7 @@ export interface IView { export interface IViewState { visible: boolean; order?: number; + size?: number; } export interface IViewDescriptorRef { @@ -184,6 +185,10 @@ export interface IViewDescriptorRef { index: number; } +export interface IAddedViewDescriptorRef extends IViewDescriptorRef { + size?: number; +} + export class ContributableViewsModel { readonly viewDescriptors: IViewDescriptor[] = []; @@ -191,8 +196,8 @@ export class ContributableViewsModel { return this.viewDescriptors.filter(v => this.viewStates.get(v.id).visible); } - private _onDidAdd = new Emitter(); - readonly onDidAdd: Event = this._onDidAdd.event; + private _onDidAdd = new Emitter(); + readonly onDidAdd: Event = this._onDidAdd.event; private _onDidRemove = new Emitter(); readonly onDidRemove: Event = this._onDidRemove.event; @@ -228,7 +233,7 @@ export class ContributableViewsModel { const { visibleIndex, viewDescriptor, state } = this.find(id); if (!viewDescriptor.canToggleVisibility) { - throw new Error('Can\'t toggle this view\'s visibility'); + throw new Error(`Can't toggle this view's visibility`); } if (state.visible === visible) { @@ -238,12 +243,32 @@ export class ContributableViewsModel { state.visible = visible; if (visible) { - this._onDidAdd.fire({ index: visibleIndex, viewDescriptor }); + this._onDidAdd.fire({ index: visibleIndex, viewDescriptor, size: state.size }); } else { this._onDidRemove.fire({ index: visibleIndex, viewDescriptor }); } } + getSize(id: string): number | undefined { + const state = this.viewStates.get(id); + + if (!state) { + throw new Error(`Unknown view ${id}`); + } + + return state.size; + } + + setSize(id: string, size: number): void { + const { viewDescriptor, state } = this.find(id); + + if (!viewDescriptor.canToggleVisibility) { + throw new Error(`Can't resize this view ${id}`); + } + + state.size = size; + } + move(from: string, to: string): void { const fromIndex = firstIndex(this.viewDescriptors, v => v.id === from); const toIndex = firstIndex(this.viewDescriptors, v => v.id === to); diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 8672f0abb17..037a0f29fab 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -57,7 +57,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ThrottledDelayer } from 'vs/base/common/async'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { IViewDescriptorRef, PersistentContributableViewsModel } from 'vs/workbench/browser/parts/views/contributableViews'; +import { IViewDescriptorRef, PersistentContributableViewsModel, IAddedViewDescriptorRef } from 'vs/workbench/browser/parts/views/contributableViews'; import { ViewLocation, IViewDescriptor } from 'vs/workbench/common/views'; import { ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IPanelDndController, Panel } from '../../../../base/browser/ui/splitview/panelview'; @@ -1117,6 +1117,8 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { for (const viewDescriptor of this.contributedViews.visibleViewDescriptors) { this.onDidAddContributedView({ viewDescriptor, index: index++ }); } + + this.onDidSashChange(this.saveContributedViewSizes, this, this.disposables); } private onDidAddRepository(repository: ISCMRepository): void { @@ -1244,9 +1246,17 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { return new ContextAwareMenuItemActionItem(action, this.keybindingService, this.notificationService, this.contextMenuService); } + private didLayout = false; layout(dimension: Dimension): void { super.layout(dimension); this._height = dimension.height; + + if (this.didLayout) { + // this.saveViewSizes(); + } else { + this.didLayout = true; + this.restoreContributedViewSizes(); + } } movePanel(from: ViewletPanel, to: ViewletPanel): void { @@ -1302,6 +1312,9 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { this.resizePanel(panel, size); } + // Resize contributed view sizes + this.restoreContributedViewSizes(); + // React to menu changes for single view mode if (wasSingleView !== this.isSingleView()) { this.singleRepositoryPanelTitleActionsDisposable.dispose(); @@ -1324,7 +1337,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { return value; } - onDidAddContributedView({ viewDescriptor, index }: IViewDescriptorRef): void { + onDidAddContributedView({ viewDescriptor, index, size }: IAddedViewDescriptorRef): void { const start = this.getContributedViewsStartIndex(); const panel = this.instantiationService.createInstance(viewDescriptor.ctor, { id: viewDescriptor.id, @@ -1334,7 +1347,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { viewletSettings: {}//this.viewletSettings }) as ViewsViewletPanel; - this.addPanel(panel, /* (viewState && viewState.size) ||*/ 200, start + index); + this.addPanel(panel, size || panel.minimumSize, start + index); const contextMenuDisposable = addDisposableListener(panel.draggableElement, 'contextmenu', e => { e.stopPropagation(); @@ -1395,6 +1408,35 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { disposable.dispose(); } + private saveContributedViewSizes(): void { + const start = this.getContributedViewsStartIndex(); + + for (let i = 0; i < this.contributedViews.viewDescriptors.length; i++) { + const viewDescriptor = this.contributedViews.viewDescriptors[i]; + const size = this.getPanelSize(this.panels[start + i]); + + this.contributedViews.setSize(viewDescriptor.id, size); + } + } + + private restoreContributedViewSizes(): void { + if (!this.didLayout) { + return; + } + + const start = this.getContributedViewsStartIndex(); + + for (let i = 0; i < this.contributedViews.viewDescriptors.length; i++) { + const panel = this.panels[start + i]; + const viewDescriptor = this.contributedViews.viewDescriptors[i]; + const size = this.contributedViews.getSize(viewDescriptor.id); + + if (typeof size === 'number') { + this.resizePanel(panel, size); + } + } + } + protected isSingleView(): boolean { return super.isSingleView() && this.repositoryPanels.length + this.contributedViews.visibleViewDescriptors.length === 1; } From 2d0626eadbf9f3f2dd7c326b42588ad55882e66d Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 18 Apr 2018 15:58:40 +0200 Subject: [PATCH 454/710] debug: prompt before removing breakpoint with condtion or message fixes #47643 --- .../debugEditorContribution.ts | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index b700d3e313d..4e33173f300 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -11,6 +11,7 @@ import * as lifecycle from 'vs/base/common/lifecycle'; import * as env from 'vs/base/common/platform'; import uri from 'vs/base/common/uri'; import { visit } from 'vs/base/common/json'; +import severity from 'vs/base/common/severity'; import { Constants } from 'vs/editor/common/core/uint'; import { IAction, Action } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -43,6 +44,7 @@ import { IMarginData } from 'vs/editor/browser/controller/mouseTarget'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ContextSubMenu } from 'vs/base/browser/contextmenu'; import { memoize } from 'vs/base/common/decorators'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; const HOVER_DELAY = 300; const LAUNCH_JSON_REGEX = /launch\.json$/; @@ -77,7 +79,8 @@ export class DebugEditorContribution implements IDebugEditorContribution { @ITelemetryService private telemetryService: ITelemetryService, @IConfigurationService private configurationService: IConfigurationService, @IThemeService themeService: IThemeService, - @IKeybindingService private keybindingService: IKeybindingService + @IKeybindingService private keybindingService: IKeybindingService, + @IDialogService private dialogService: IDialogService, ) { this.breakpointHintDecoration = []; this.hoverWidget = new DebugHoverWidget(this.editor, this.debugService, this.instantiationService, themeService); @@ -145,7 +148,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { )); actions.push(new Action( 'addConditionalBreakpoint', - nls.localize('conditionalBreakpoint', "Add Conditional Breakpoint..."), + nls.localize('addConditionalBreakpoint', "Add Conditional Breakpoint..."), null, true, () => TPromise.as(this.editor.getContribution(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(lineNumber, undefined)) @@ -190,7 +193,24 @@ export class DebugEditorContribution implements IDebugEditorContribution { .filter(bp => bp.uri.toString() === uri.toString() && bp.lineNumber === lineNumber); if (breakpoints.length) { - breakpoints.forEach(bp => this.debugService.removeBreakpoints(bp.getId())); + if (breakpoints.some(bp => !!bp.condition || !!bp.logMessage || !!bp.hitCondition)) { + const logPoint = breakpoints.every(bp => !!bp.logMessage); + this.dialogService.show(severity.Info, nls.localize('breakpointHasCondition', "This {0} has a valuable {1} that will get lost on remove. Consider disabling the {0} instead.", + logPoint ? nls.localize('logPoint', "log point") : nls.localize('breakpoint', "breakpoint"), logPoint ? nls.localize('message', "message") : nls.localize('condition', "condition")), [ + logPoint ? nls.localize('removeLogPoint', "Remove Log Point") : nls.localize('removeBreakpoint', "Remove Breakpoint"), + logPoint ? nls.localize('disableLogPoint', "Disable Log Point") : nls.localize('disableBreakpoint', "Disable Breakpoint"), + nls.localize('cancel', "Cancel") + ], { cancelId: 2 }).then(choice => { + if (choice === 0) { + breakpoints.forEach(bp => this.debugService.removeBreakpoints(bp.getId())); + } + if (choice === 1) { + breakpoints.forEach(bp => this.debugService.enableOrDisableBreakpoints(false, bp)); + } + }); + } else { + breakpoints.forEach(bp => this.debugService.removeBreakpoints(bp.getId())); + } } else if (canSetBreakpoints) { this.debugService.addBreakpoints(uri, [{ lineNumber }]); } From aa9f65089d9e28d92c52d0287355de067a0cf1cb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 16:11:54 +0200 Subject: [PATCH 455/710] save collapsed state --- .../browser/parts/views/contributableViews.ts | 31 +++++++++++++------ .../parts/scm/electron-browser/scmViewlet.ts | 25 +++++++++------ 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/contributableViews.ts b/src/vs/workbench/browser/parts/views/contributableViews.ts index 3a449130604..42c9ea86328 100644 --- a/src/vs/workbench/browser/parts/views/contributableViews.ts +++ b/src/vs/workbench/browser/parts/views/contributableViews.ts @@ -176,6 +176,7 @@ export interface IView { export interface IViewState { visible: boolean; + collapsed: boolean; order?: number; size?: number; } @@ -186,6 +187,7 @@ export interface IViewDescriptorRef { } export interface IAddedViewDescriptorRef extends IViewDescriptorRef { + collapsed: boolean; size?: number; } @@ -243,12 +245,27 @@ export class ContributableViewsModel { state.visible = visible; if (visible) { - this._onDidAdd.fire({ index: visibleIndex, viewDescriptor, size: state.size }); + this._onDidAdd.fire({ index: visibleIndex, viewDescriptor, size: state.size, collapsed: state.collapsed }); } else { this._onDidRemove.fire({ index: visibleIndex, viewDescriptor }); } } + isCollapsed(id: string): boolean { + const state = this.viewStates.get(id); + + if (!state) { + throw new Error(`Unknown view ${id}`); + } + + return state.collapsed; + } + + setCollapsed(id: string, collapsed: boolean): void { + const { state } = this.find(id); + state.collapsed = collapsed; + } + getSize(id: string): number | undefined { const state = this.viewStates.get(id); @@ -260,12 +277,7 @@ export class ContributableViewsModel { } setSize(id: string, size: number): void { - const { viewDescriptor, state } = this.find(id); - - if (!viewDescriptor.canToggleVisibility) { - throw new Error(`Can't resize this view ${id}`); - } - + const { state } = this.find(id); state.size = size; } @@ -341,7 +353,8 @@ export class ContributableViewsModel { for (const viewDescriptor of viewDescriptors) { if (!this.viewStates.has(viewDescriptor.id)) { this.viewStates.set(viewDescriptor.id, { - visible: true + visible: true, + collapsed: false }); } } @@ -370,7 +383,7 @@ export class ContributableViewsModel { const state = this.viewStates.get(viewDescriptor.id); if (state.visible) { - this._onDidAdd.fire({ index: startIndex++, viewDescriptor }); + this._onDidAdd.fire({ index: startIndex++, viewDescriptor, size: state.size, collapsed: state.collapsed }); } } } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 037a0f29fab..24668ee7847 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -8,7 +8,7 @@ import 'vs/css!./media/scmViewlet'; import { localize } from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; -import { Event, Emitter, chain, mapEvent, anyEvent, filterEvent } from 'vs/base/common/event'; +import { Event, Emitter, chain, mapEvent, anyEvent, filterEvent, latch } from 'vs/base/common/event'; import { domEvent, stop } from 'vs/base/browser/event'; import { basename } from 'vs/base/common/paths'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -1063,7 +1063,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { get selectedRepositories(): ISCMRepository[] { return this.repositoryPanels.map(p => p.repository); } private contributedViews: PersistentContributableViewsModel; - private contextMenuDisposables: IDisposable[] = []; + private contributedViewDisposables: IDisposable[] = []; constructor( @IPartService partService: IPartService, @@ -1115,7 +1115,10 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { let index = this.getContributedViewsStartIndex(); for (const viewDescriptor of this.contributedViews.visibleViewDescriptors) { - this.onDidAddContributedView({ viewDescriptor, index: index++ }); + const size = this.contributedViews.getSize(viewDescriptor.id); + const collapsed = this.contributedViews.isCollapsed(viewDescriptor.id); + + this.onDidAddContributedView({ viewDescriptor, index: index++, size, collapsed }); } this.onDidSashChange(this.saveContributedViewSizes, this, this.disposables); @@ -1337,14 +1340,14 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { return value; } - onDidAddContributedView({ viewDescriptor, index, size }: IAddedViewDescriptorRef): void { + onDidAddContributedView({ viewDescriptor, index, size, collapsed }: IAddedViewDescriptorRef): void { const start = this.getContributedViewsStartIndex(); const panel = this.instantiationService.createInstance(viewDescriptor.ctor, { id: viewDescriptor.id, name: viewDescriptor.name, actionRunner: this.getActionRunner(), - expanded: true, //!(viewState ? viewState.collapsed : viewDescriptor.collapsed), - viewletSettings: {}//this.viewletSettings + expanded: !collapsed, + viewletSettings: {} // what is this }) as ViewsViewletPanel; this.addPanel(panel, size || panel.minimumSize, start + index); @@ -1355,7 +1358,11 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { this.onViewHeaderContextMenu(new StandardMouseEvent(e), viewDescriptor); }); - this.contextMenuDisposables.splice(index, 0, contextMenuDisposable); + const collapseDisposable = latch(mapEvent(panel.onDidChange, () => !panel.isExpanded()))(collapsed => { + this.contributedViews.setCollapsed(viewDescriptor.id, collapsed); + }); + + this.contributedViewDisposables.splice(index, 0, combinedDisposable([contextMenuDisposable, collapseDisposable])); } private onViewHeaderContextMenu(event: StandardMouseEvent, viewDescriptor: IViewDescriptor): void { @@ -1404,7 +1411,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { this.removePanel(panel); - const [disposable] = this.contextMenuDisposables.splice(index, 1); + const [disposable] = this.contributedViewDisposables.splice(index, 1); disposable.dispose(); } @@ -1456,7 +1463,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { dispose(): void { this.disposables = dispose(this.disposables); - this.contextMenuDisposables = dispose(this.contextMenuDisposables); + this.contributedViewDisposables = dispose(this.contributedViewDisposables); this.mainPanelDisposable.dispose(); super.dispose(); } From 2be3fd376d26e9c9533548bfd590380059380c8e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 16:13:25 +0200 Subject: [PATCH 456/710] fix bad log --- test/smoke/src/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 8398e0d3944..eb74ad61c79 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -301,7 +301,7 @@ describe('Test', () => { const screenshotPath = path.join(screenshotsPath, `${name}.png`); if (opts.log) { - app.logger.log('*** Scr eenshot recorded:', screenshotPath); + app.logger.log('*** Screenshot recorded:', screenshotPath); } fs.writeFileSync(screenshotPath, buffer); @@ -313,7 +313,7 @@ describe('Test', () => { const app = this.app as Application; const title = this.currentTest.fullTitle(); - app.logger.log('***', title.replace(/./g, '=')); + app.logger.log('*** Test start:', title); }); } From fbdc0496a8c16ec9c910e7fb3bf1638d113e64c7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 16:15:39 +0200 Subject: [PATCH 457/710] single build artifacts folder --- build/tfs/continuous-build.yml | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index 20fe203c25a..cd59b418084 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -19,18 +19,12 @@ phases: - powershell: | .\scripts\test.bat --tfs .\scripts\test-integration.bat - yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\screenshots" --log "$(Build.ArtifactStagingDirectory)\smoketest.log" + yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\artifacts" --log "$(Build.ArtifactStagingDirectory)\artifacts\smoketest.log" name: test - task: PublishBuildArtifacts@1 inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' - ArtifactName: screenshots-win32 - publishLocation: Container - condition: succeededOrFailed() - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)/smoketest.log' - ArtifactName: logfile-win32 + PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' + ArtifactName: build-artifacts-win32 publishLocation: Container condition: succeededOrFailed() @@ -87,17 +81,11 @@ phases: - script: | ./scripts/test.sh --tfs ./scripts/test-integration.sh - yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/screenshots" --log "$(Build.ArtifactStagingDirectory)/smoketest.log" + yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/artifacts" --log "$(Build.ArtifactStagingDirectory)/artifacts/smoketest.log" name: test - task: PublishBuildArtifacts@1 inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)/screenshots' - ArtifactName: screenshots-darwin + PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts' + ArtifactName: build-artifacts-darwin publishLocation: Container - condition: succeededOrFailed() - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.ArtifactStagingDirectory)/smoketest.log' - ArtifactName: logfile-darwin - publishLocation: Container - condition: succeededOrFailed() + condition: succeededOrFailed() \ No newline at end of file From e524652273f6419c692fdebe172168e8ad0a1c75 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 18 Apr 2018 15:42:33 +0200 Subject: [PATCH 458/710] go a little slower on well-defined errors, #47475 --- src/vs/platform/files/common/files.ts | 13 ++--- src/vs/vscode.proposed.d.ts | 55 ++++++++++--------- .../electron-browser/mainThreadFileSystem.ts | 10 +++- .../electron-browser/remoteFileService.ts | 4 +- 4 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index cab1972b2e0..0c4dbfe44af 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -158,14 +158,13 @@ export enum FileType2 { export class FileError extends Error { + static readonly EntryExists = new FileError('EEXIST'); + static readonly EntryNotFound = new FileError('ENOENT'); + static readonly EntryNotADirectory = new FileError('ENOTDIR'); + static readonly EntryIsADirectory = new FileError('EISDIR'); - static readonly EEXIST = new FileError('EEXIST'); - static readonly ENOENT = new FileError('ENOENT'); - static readonly ENOTDIR = new FileError('ENOTDIR'); - static readonly EISDIR = new FileError('EISDIR'); - - constructor(readonly code: string) { - super(code); + constructor(readonly code: string, message?: string) { + super(message || code); } is(err: any): err is FileError { if (!err || typeof err !== 'object') { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 6bf0f87445f..ab7e16db4ce 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -172,32 +172,32 @@ declare module 'vscode' { // create(resource: Uri): Thenable; } - export class FileError extends Error { + // export class FileError extends Error { - /** - * Entry already exists. - */ - static readonly EEXIST: FileError; + // /** + // * Entry already exists, e.g. when creating a file or folder. + // */ + // static readonly EntryExists: FileError; - /** - * Entry does not exist. - */ - static readonly ENOENT: FileError; + // /** + // * Entry does not exist. + // */ + // static readonly EntryNotFound: FileError; - /** - * Entry is not a directory. - */ - static readonly ENOTDIR: FileError; + // /** + // * Entry is not a directory. + // */ + // static readonly EntryNotADirectory: FileError; - /** - * Entry is a directory. - */ - static readonly EISDIR: FileError; + // /** + // * Entry is a directory. + // */ + // static readonly EntryIsADirectory: FileError; - readonly code: string; + // readonly code: string; - constructor(code: string, message?: string); - } + // constructor(code: string, message?: string); + // } export enum FileChangeType2 { Changed = 1, @@ -229,7 +229,9 @@ declare module 'vscode' { Exclusive = 0b1000 } - // todo@joh add open/close calls? + /** + * + */ export interface FileSystemProvider2 { _version: 7; @@ -242,15 +244,14 @@ declare module 'vscode' { readonly onDidChangeFile: Event; /** - * Subscribe to events in the file or folder denoted by `uri`. - * @param uri - * @param options + * Subscribe to events in the file or folder denoted by `uri`. + * @param uri + * @param options */ watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; /** - * Retrieve metadata about a file. Must throw an [`ENOENT`](#FileError.ENOENT)-error - * when the file doesn't exist. + * Retrieve metadata about a file. * * @param uri The uri of the file to retrieve meta data about. * @param token A cancellation token. @@ -269,7 +270,7 @@ declare module 'vscode' { /** * Create a new directory. *Note* that new files are created via `write`-calls. - * + * * @param uri The uri of the *new* folder. * @param token A cancellation token. */ diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 0a9f3485f76..f62ded3f536 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOpenFlags, IFileChange, IFileService, IFileSystemProviderBase, ISimpleReadWriteProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files'; +import { FileOpenFlags, IFileChange, IFileService, IFileSystemProviderBase, ISimpleReadWriteProvider, IStat, IWatchOptions, FileError } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -86,8 +86,10 @@ class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemP // --- forwarding calls - stat(resource: URI): TPromise { - return this._proxy.$stat(this._handle, resource); + stat(resource: URI): TPromise { + return this._proxy.$stat(this._handle, resource).then(undefined, err => { + throw err; + }); } readFile(resource: URI, opts: { flags: FileOpenFlags }): TPromise { return this._proxy.$readFile(this._handle, resource, opts.flags).then(encoded => { @@ -112,4 +114,6 @@ class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemP readdir(resource: URI): TPromise<[string, IStat][], any> { return this._proxy.$readdir(this._handle, resource); } + + } diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 322e173fddc..b7143cff479 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -369,8 +369,8 @@ export class RemoteFileService extends FileService { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); return fileStat; }, err => { - if (FileError.EEXIST.is(err)) { - return TPromise.wrapError(new FileOperationError('EEXIST', FileOperationResult.FILE_MODIFIED_SINCE, options)); + if (FileError.EntryExists.is(err)) { + return TPromise.wrapError(new FileOperationError(err.code, FileOperationResult.FILE_MODIFIED_SINCE, options)); } throw err; }); From 5292f76fcd83c374376778b77d5968c323abece4 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 18 Apr 2018 16:23:28 +0200 Subject: [PATCH 459/710] add (optional) copy function #47475 --- src/vs/platform/files/common/files.ts | 36 ++++++------ src/vs/vscode.proposed.d.ts | 16 ++++-- .../electron-browser/mainThreadFileSystem.ts | 28 +++++++--- src/vs/workbench/api/node/extHost.protocol.ts | 5 +- .../workbench/api/node/extHostFileSystem.ts | 20 ++++++- .../electron-browser/remoteFileService.ts | 56 +++++++++++-------- .../files/electron-browser/streams.ts | 29 ++++++---- 7 files changed, 122 insertions(+), 68 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 0c4dbfe44af..25d4550d7fa 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -192,31 +192,35 @@ export interface IWatchOptions { exclude?: string[]; } -export interface IFileSystemProviderBase { +export enum FileSystemProviderCapabilities { + FileReadWrite = 0b1, + FileOpenReadWriteClose = 0b10, + FileFolderCopy = 0b100 +} + +export interface IFileSystemProvider { + + readonly capabilities: FileSystemProviderCapabilities; + onDidChangeFile: Event; watch(resource: URI, opts: IWatchOptions): IDisposable; + stat(resource: URI): TPromise; - rename(from: URI, to: URI, opts: { flags: FileOpenFlags }): TPromise; mkdir(resource: URI): TPromise; readdir(resource: URI): TPromise<[string, IStat][]>; delete(resource: URI): TPromise; -} -export interface ISimpleReadWriteProvider { - _type: 'simple'; - readFile(resource: URI, opts: { flags: FileOpenFlags }): TPromise; - writeFile(resource: URI, content: Uint8Array, opts: { flags: FileOpenFlags }): TPromise; -} + rename(from: URI, to: URI, opts: { flags: FileOpenFlags }): TPromise; + copy?(from: URI, to: URI, opts: { flags: FileOpenFlags }): TPromise; -export interface IReadWriteProvider { - _type: 'chunked'; - open(resource: URI, opts: { flags: FileOpenFlags }): TPromise; - close(fd: number): TPromise; - read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise; - write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise; -} + readFile?(resource: URI, opts: { flags: FileOpenFlags }): TPromise; + writeFile?(resource: URI, content: Uint8Array, opts: { flags: FileOpenFlags }): TPromise; -export type IFileSystemProvider = (IFileSystemProviderBase & ISimpleReadWriteProvider) | (IFileSystemProviderBase & IReadWriteProvider); + open?(resource: URI, opts: { flags: FileOpenFlags }): TPromise; + close?(fd: number): TPromise; + read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise; + write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise; +} export enum FileOperation { CREATE, diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index ab7e16db4ce..704e11b1a6b 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -297,15 +297,21 @@ declare module 'vscode' { /** * Rename a file or folder. * - * @param oldUri The exiting file or folder - * @param newUri The target location + * @param oldUri The existing file or folder. + * @param newUri The target location. * @param token A cancellation token. */ rename(oldUri: Uri, newUri: Uri, options: { flags: FileOpenFlags }, token: CancellationToken): FileStat2 | Thenable; - // todo@remote - // helps with performance bigly - // copy?(from: Uri, to: Uri): FileStat2 | Thenable; + /** + * Copy files or folders. Implementing this function is optional but it will speedup + * the copy operation. + * + * @param uri The existing file or folder. + * @param target The target location. + * @param token A cancellation token. + */ + copy?(uri: Uri, target: Uri, options: { flags: FileOpenFlags }, token: CancellationToken): FileStat2 | Thenable; // todo@remote // ? useTrash, expose trash diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index f62ded3f536..b3aedaab4a2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOpenFlags, IFileChange, IFileService, IFileSystemProviderBase, ISimpleReadWriteProvider, IStat, IWatchOptions, FileError } from 'vs/platform/files/common/files'; +import { FileOpenFlags, IFileChange, IFileService, IStat, IWatchOptions, FileError, FileSystemProviderCapabilities, IFileSystemProvider } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -30,9 +30,10 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { this._fileProvider.clear(); } - $registerFileSystemProvider(handle: number, scheme: string): void { - this._fileProvider.set(handle, new RemoteFileSystemProvider(this._fileService, scheme, handle, this._proxy)); + $registerFileSystemProvider(handle: number, scheme: string, capabilities: FileSystemProviderCapabilities): void { + this._fileProvider.set(handle, new RemoteFileSystemProvider(this._fileService, scheme, capabilities, handle, this._proxy)); } + $unregisterProvider(handle: number): void { dispose(this._fileProvider.get(handle)); this._fileProvider.delete(handle); @@ -43,21 +44,22 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } } -class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemProviderBase { - - _type: 'simple' = 'simple'; +class RemoteFileSystemProvider implements IFileSystemProvider { private readonly _onDidChange = new Emitter(); private readonly _registrations: IDisposable[]; readonly onDidChangeFile: Event = this._onDidChange.event; + readonly capabilities: FileSystemProviderCapabilities; constructor( fileService: IFileService, scheme: string, + capabilities: FileSystemProviderCapabilities, private readonly _handle: number, private readonly _proxy: ExtHostFileSystemShape ) { + this.capabilities = capabilities; this._registrations = [fileService.registerProvider(scheme, this)]; } @@ -91,29 +93,37 @@ class RemoteFileSystemProvider implements ISimpleReadWriteProvider, IFileSystemP throw err; }); } + readFile(resource: URI, opts: { flags: FileOpenFlags }): TPromise { return this._proxy.$readFile(this._handle, resource, opts.flags).then(encoded => { return Buffer.from(encoded, 'base64'); }); } + writeFile(resource: URI, content: Uint8Array, opts: { flags: FileOpenFlags }): TPromise { let encoded = Buffer.isBuffer(content) ? content.toString('base64') : Buffer.from(content.buffer, content.byteOffset, content.byteLength).toString('base64'); return this._proxy.$writeFile(this._handle, resource, encoded, opts.flags); } + delete(resource: URI): TPromise { return this._proxy.$delete(this._handle, resource); } - rename(resource: URI, target: URI, opts: { flags: FileOpenFlags }): TPromise { - return this._proxy.$rename(this._handle, resource, target, opts.flags); - } + mkdir(resource: URI): TPromise { return this._proxy.$mkdir(this._handle, resource); } + readdir(resource: URI): TPromise<[string, IStat][], any> { return this._proxy.$readdir(this._handle, resource); } + rename(resource: URI, target: URI, opts: { flags: FileOpenFlags }): TPromise { + return this._proxy.$rename(this._handle, resource, target, opts.flags); + } + copy(resource: URI, target: URI, opts: { flags: FileOpenFlags }): TPromise { + return this._proxy.$copy(this._handle, resource, target, opts.flags); + } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index bec0acdb06e..42ef9f86a07 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -42,7 +42,7 @@ import { ITreeItem } from 'vs/workbench/common/views'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SerializedError } from 'vs/base/common/errors'; -import { IStat, FileChangeType, FileOpenFlags, IWatchOptions } from 'vs/platform/files/common/files'; +import { IStat, FileChangeType, FileOpenFlags, IWatchOptions, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration'; import { ISingleEditOperation } from 'vs/editor/common/model'; @@ -382,7 +382,7 @@ export interface IFileChangeDto { } export interface MainThreadFileSystemShape extends IDisposable { - $registerFileSystemProvider(handle: number, scheme: string): void; + $registerFileSystemProvider(handle: number, scheme: string, capabilities: FileSystemProviderCapabilities): void; $unregisterProvider(handle: number): void; $onFileSystemChange(handle: number, resource: IFileChangeDto[]): void; } @@ -572,6 +572,7 @@ export interface ExtHostFileSystemShape { $readFile(handle: number, resource: UriComponents, flags: FileOpenFlags): TPromise; $writeFile(handle: number, resource: UriComponents, base64Encoded: string, flags: FileOpenFlags): TPromise; $rename(handle: number, resource: UriComponents, target: UriComponents, flags: FileOpenFlags): TPromise; + $copy(handle: number, resource: UriComponents, target: UriComponents, flags: FileOpenFlags): TPromise; $mkdir(handle: number, resource: UriComponents): TPromise; $readdir(handle: number, resource: UriComponents): TPromise<[string, IStat][]>; $delete(handle: number, resource: UriComponents): TPromise; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index e82b05fca20..78d27342c02 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -208,7 +208,13 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._linkProvider.add(scheme); this._usedSchemes.add(scheme); this._fsProvider.set(handle, provider); - this._proxy.$registerFileSystemProvider(handle, scheme); + + let capabilites = files.FileSystemProviderCapabilities.FileReadWrite; + if (typeof provider.copy === 'function') { + capabilites += files.FileSystemProviderCapabilities.FileFolderCopy; + } + + this._proxy.$registerFileSystemProvider(handle, scheme, capabilites); const subscription = provider.onDidChangeFile(event => { let newEvent = event.map(e => { @@ -244,9 +250,11 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { $stat(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), token)); } + $readdir(handle: number, resource: UriComponents): TPromise<[string, files.IStat][], any> { return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), token)); } + $readFile(handle: number, resource: UriComponents, flags: files.FileOpenFlags): TPromise { return asWinJsPromise(token => { return this._fsProvider.get(handle).readFile(URI.revive(resource), { flags }, token); @@ -254,24 +262,34 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return Buffer.isBuffer(data) ? data.toString('base64') : Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString('base64'); }); } + $writeFile(handle: number, resource: UriComponents, base64Content: string, flags: files.FileOpenFlags): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).writeFile(URI.revive(resource), Buffer.from(base64Content, 'base64'), { flags }, token)); } + $delete(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), token)); } + $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, flags: files.FileOpenFlags): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), { flags }, token)); } + + $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, flags: files.FileOpenFlags): TPromise { + return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), { flags }, token)); + } + $mkdir(handle: number, resource: UriComponents): TPromise { return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), token)); } + $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { asWinJsPromise(token => { let subscription = this._fsProvider.get(handle).watch(URI.revive(resource), opts); this._watches.set(session, subscription); }); } + $unwatch(handle: number, session: number): void { let subscription = this._watches.get(session); if (subscription) { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index b7143cff479..3d6d056a71b 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileError, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileError, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -522,31 +522,39 @@ export class RemoteFileService extends FileService { return super.copyFile(source, target, overwrite); } - const prepare = overwrite - ? this.del(target).then(undefined, err => { /*ignore*/ }) - : TPromise.as(null); + return this._withProvider(target).then(provider => { - return prepare.then(() => { - // todo@ben, can only copy text files - // https://github.com/Microsoft/vscode/issues/41543 - return this.resolveContent(source, { acceptTextOnly: true }).then(content => { - return this._withProvider(target).then(provider => { - return this._writeFile( - provider, target, - new StringSnapshot(content.value), - { encoding: content.encoding }, - FileOpenFlags.Create | FileOpenFlags.Write - ).then(fileStat => { - this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat)); - return fileStat; + if (source.scheme === target.scheme && (provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy)) { + // good: provider supports copy withing scheme + return provider.copy(source, target, { flags: 0 }).then(stat => toIFileStat(provider, [target, stat])); + } + + const prepare = overwrite + ? this.del(target).then(undefined, err => { /*ignore*/ }) + : TPromise.as(null); + + return prepare.then(() => { + // todo@ben, can only copy text files + // https://github.com/Microsoft/vscode/issues/41543 + return this.resolveContent(source, { acceptTextOnly: true }).then(content => { + return this._withProvider(target).then(provider => { + return this._writeFile( + provider, target, + new StringSnapshot(content.value), + { encoding: content.encoding }, + FileOpenFlags.Create | FileOpenFlags.Write + ).then(fileStat => { + this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat)); + return fileStat; + }); + }, err => { + if (err instanceof Error && err.name === 'ENOPRO') { + // file scheme + return super.updateContent(target, content.value, { encoding: content.encoding }); + } else { + return TPromise.wrapError(err); + } }); - }, err => { - if (err instanceof Error && err.name === 'ENOPRO') { - // file scheme - return super.updateContent(target, content.value, { encoding: content.encoding }); - } else { - return TPromise.wrapError(err); - } }); }); }); diff --git a/src/vs/workbench/services/files/electron-browser/streams.ts b/src/vs/workbench/services/files/electron-browser/streams.ts index 4af45b17119..ce1f4e50d54 100644 --- a/src/vs/workbench/services/files/electron-browser/streams.ts +++ b/src/vs/workbench/services/files/electron-browser/streams.ts @@ -7,16 +7,20 @@ import { Readable, Writable } from 'stream'; import { UTF8 } from 'vs/base/node/encoding'; import URI from 'vs/base/common/uri'; -import { IFileSystemProvider, ITextSnapshot, ISimpleReadWriteProvider, IReadWriteProvider, FileOpenFlags } from 'vs/platform/files/common/files'; +import { IFileSystemProvider, ITextSnapshot, FileSystemProviderCapabilities, FileOpenFlags } from 'vs/platform/files/common/files'; +import { illegalArgument } from 'vs/base/common/errors'; export function createWritableOfProvider(provider: IFileSystemProvider, resource: URI, flags: FileOpenFlags): Writable { - switch (provider._type) { - case 'simple': return createSimpleWritable(provider, resource, flags); - case 'chunked': return createWritable(provider, resource, flags); + if (provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose) { + return createWritable(provider, resource, flags); + } else if (provider.capabilities & FileSystemProviderCapabilities.FileReadWrite) { + return createSimpleWritable(provider, resource, flags); + } else { + throw illegalArgument(); } } -function createSimpleWritable(provider: ISimpleReadWriteProvider, resource: URI, flags: FileOpenFlags): Writable { +function createSimpleWritable(provider: IFileSystemProvider, resource: URI, flags: FileOpenFlags): Writable { return new class extends Writable { _chunks: Buffer[] = []; constructor(opts?) { @@ -37,7 +41,7 @@ function createSimpleWritable(provider: ISimpleReadWriteProvider, resource: URI, }; } -function createWritable(provider: IReadWriteProvider, resource: URI, flags: FileOpenFlags): Writable { +function createWritable(provider: IFileSystemProvider, resource: URI, flags: FileOpenFlags): Writable { return new class extends Writable { _fd: number; _pos: number; @@ -67,13 +71,16 @@ function createWritable(provider: IReadWriteProvider, resource: URI, flags: File } export function createReadableOfProvider(provider: IFileSystemProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { - switch (provider._type) { - case 'simple': return createSimpleReadable(provider, resource, position, flags); - case 'chunked': return createReadable(provider, resource, position, flags); + if (provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose) { + return createReadable(provider, resource, position, flags); + } else if (provider.capabilities & FileSystemProviderCapabilities.FileReadWrite) { + return createSimpleReadable(provider, resource, position, flags); + } else { + throw illegalArgument(); } } -function createReadable(provider: IReadWriteProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { +function createReadable(provider: IFileSystemProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { return new class extends Readable { _fd: number; _pos: number = position; @@ -117,7 +124,7 @@ function createReadable(provider: IReadWriteProvider, resource: URI, position: n }; } -function createSimpleReadable(provider: ISimpleReadWriteProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { +function createSimpleReadable(provider: IFileSystemProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { return new class extends Readable { _readOperation: Thenable; _read(size?: number): void { From 28f57593c75edb6c344dac358bbc83fd4a535d85 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 16:35:21 +0200 Subject: [PATCH 460/710] smoketest: improve preferences smoketest reliability --- test/smoke/src/areas/editor/editor.test.ts | 6 +- test/smoke/src/areas/editor/editor.ts | 62 ++++++++++--------- test/smoke/src/areas/preferences/settings.ts | 4 +- .../src/areas/statusbar/statusbar.test.ts | 2 +- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/test/smoke/src/areas/editor/editor.test.ts b/test/smoke/src/areas/editor/editor.test.ts index b892c49d5da..af9f49cf4c6 100644 --- a/test/smoke/src/areas/editor/editor.test.ts +++ b/test/smoke/src/areas/editor/editor.test.ts @@ -19,7 +19,7 @@ export function setup() { const app = this.app as Application; await app.workbench.quickopen.openFile('www'); - const references = await app.workbench.editor.findReferences('app', 7); + const references = await app.workbench.editor.findReferences('www', 'app', 7); await references.waitForReferencesCountInTitle(3); await references.waitForReferencesCount(3); @@ -53,7 +53,7 @@ export function setup() { const app = this.app as Application; await app.workbench.quickopen.openFile('app.js'); - await app.workbench.editor.gotoDefinition('express', 11); + await app.workbench.editor.gotoDefinition('app.js', 'express', 11); await app.workbench.editors.waitForActiveTab('index.d.ts'); }); @@ -62,7 +62,7 @@ export function setup() { const app = this.app as Application; await app.workbench.quickopen.openFile('app.js'); - const peek = await app.workbench.editor.peekDefinition('express', 11); + const peek = await app.workbench.editor.peekDefinition('app.js', 'express', 11); await peek.waitForFile('index.d.ts'); }); diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 41a04d85412..0482c94bfd6 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -10,18 +10,18 @@ import { Code } from '../../vscode/code'; const RENAME_BOX = '.monaco-editor .monaco-editor.rename-box'; const RENAME_INPUT = `${RENAME_BOX} .rename-input`; const EDITOR = filename => `.monaco-editor[data-uri$="${filename}"]`; +const VIEW_LINES = filename => `${EDITOR(filename)} .view-lines`; +const LINE_NUMBERS = filename => `${EDITOR(filename)} .margin .margin-view-overlays .line-numbers`; export class Editor { - private static readonly VIEW_LINES = '.monaco-editor .view-lines'; - private static readonly LINE_NUMBERS = '.monaco-editor .margin .margin-view-overlays .line-numbers'; private static readonly FOLDING_EXPANDED = '.monaco-editor .margin .margin-view-overlays>:nth-child(${INDEX}) .folding'; private static readonly FOLDING_COLLAPSED = `${Editor.FOLDING_EXPANDED}.collapsed`; constructor(private code: Code, private commands: Commands) { } - async findReferences(term: string, line: number): Promise { - await this.clickOnTerm(term, line); + async findReferences(filename: string, term: string, line: number): Promise { + await this.clickOnTerm(filename, term, line); await this.commands.runCommand('Find All References'); const references = new References(this.code); await references.waitUntilOpen(); @@ -29,7 +29,7 @@ export class Editor { } async rename(filename: string, line: number, from: string, to: string): Promise { - await this.clickOnTerm(from, line); + await this.clickOnTerm(filename, from, line); await this.commands.runCommand('Rename Symbol'); await this.code.waitForActiveElement(RENAME_INPUT); @@ -38,21 +38,21 @@ export class Editor { await this.code.dispatchKeybinding('enter'); } - async gotoDefinition(term: string, line: number): Promise { - await this.clickOnTerm(term, line); + async gotoDefinition(filename: string, term: string, line: number): Promise { + await this.clickOnTerm(filename, term, line); await this.commands.runCommand('Go to Definition'); } - async peekDefinition(term: string, line: number): Promise { - await this.clickOnTerm(term, line); + async peekDefinition(filename: string, term: string, line: number): Promise { + await this.clickOnTerm(filename, term, line); await this.commands.runCommand('Peek Definition'); const peek = new References(this.code); await peek.waitUntilOpen(); return peek; } - async waitForHighlightingLine(line: number): Promise { - const currentLineIndex = await this.getViewLineIndex(line); + async waitForHighlightingLine(filename: string, line: number): Promise { + const currentLineIndex = await this.getViewLineIndex(filename, line); if (currentLineIndex) { await this.code.waitForElement(`.monaco-editor .view-overlays>:nth-child(${currentLineIndex}) .current-line`); return; @@ -60,31 +60,37 @@ export class Editor { throw new Error('Cannot find line ' + line); } - async getSelector(term: string, line: number): Promise { - const lineIndex = await this.getViewLineIndex(line); - const classNames = await this.getClassSelectors(term, lineIndex); - return `${Editor.VIEW_LINES}>:nth-child(${lineIndex}) span span.${classNames[0]}`; + private async getSelector(filename: string, term: string, line: number): Promise { + const lineIndex = await this.getViewLineIndex(filename, line); + const classNames = await this.getClassSelectors(filename, term, lineIndex); + + return `${VIEW_LINES(filename)}>:nth-child(${lineIndex}) span span.${classNames[0]}`; } - async foldAtLine(line: number): Promise { - const lineIndex = await this.getViewLineIndex(line); + async foldAtLine(filename: string, line: number): Promise { + const lineIndex = await this.getViewLineIndex(filename, line); await this.code.waitAndClick(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); await this.code.waitForElement(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); } - async unfoldAtLine(line: number): Promise { - const lineIndex = await this.getViewLineIndex(line); + async unfoldAtLine(filename: string, line: number): Promise { + const lineIndex = await this.getViewLineIndex(filename, line); await this.code.waitAndClick(Editor.FOLDING_COLLAPSED.replace('${INDEX}', '' + lineIndex)); await this.code.waitForElement(Editor.FOLDING_EXPANDED.replace('${INDEX}', '' + lineIndex)); } - async waitUntilShown(line: number): Promise { - await this.getViewLineIndex(line); + private async clickOnTerm(filename: string, term: string, line: number): Promise { + const selector = await this.getSelector(filename, term, line); + await this.code.waitAndClick(selector); } - async clickOnTerm(term: string, line: number): Promise { - const selector = await this.getSelector(term, line); - await this.code.waitAndClick(selector); + async waitForEditorFocus(filename: string, lineNumber: number, selectorPrefix = ''): Promise { + const editor = [selectorPrefix || '', EDITOR(filename)].join(' '); + const line = `${editor} .view-lines > .view-line:nth-child(${lineNumber})`; + const textarea = `${editor} textarea`; + + await this.code.waitAndClick(line); + await this.code.waitForActiveElement(textarea); } async waitForTypeInEditor(filename: string, text: string, selectorPrefix = ''): Promise { @@ -105,14 +111,14 @@ export class Editor { return this.code.waitForTextContent(selector, undefined, c => accept(c.replace(/\u00a0/g, ' '))); } - private async getClassSelectors(term: string, viewline: number): Promise { - const elements = await this.code.waitForElements(`${Editor.VIEW_LINES}>:nth-child(${viewline}) span span`, false, els => els.some(el => el.textContent === term)); + private async getClassSelectors(filename: string, term: string, viewline: number): Promise { + const elements = await this.code.waitForElements(`${VIEW_LINES(filename)}>:nth-child(${viewline}) span span`, false, els => els.some(el => el.textContent === term)); const { className } = elements.filter(r => r.textContent === term)[0]; return className.split(/\s/g); } - private async getViewLineIndex(line: number): Promise { - const elements = await this.code.waitForElements(Editor.LINE_NUMBERS, false, els => { + private async getViewLineIndex(filename: string, line: number): Promise { + const elements = await this.code.waitForElements(LINE_NUMBERS(filename), false, els => { return els.some(el => el.textContent === `${line}`); }); diff --git a/test/smoke/src/areas/preferences/settings.ts b/test/smoke/src/areas/preferences/settings.ts index 3ac98059629..7d398598f30 100644 --- a/test/smoke/src/areas/preferences/settings.ts +++ b/test/smoke/src/areas/preferences/settings.ts @@ -16,7 +16,6 @@ export enum ActivityBarPosition { } const SEARCH_INPUT = '.settings-search-input input'; -const EDITOR = '.editable-preferences-editor-container .monaco-editor textarea'; export class SettingsEditor { @@ -27,8 +26,7 @@ export class SettingsEditor { await this.code.waitAndClick(SEARCH_INPUT); await this.code.waitForActiveElement(SEARCH_INPUT); - await this.code.dispatchKeybinding('down'); - await this.code.waitForActiveElement(EDITOR); + await this.editor.waitForEditorFocus('settings.json', 1, '.editable-preferences-editor-container'); await this.code.dispatchKeybinding('right'); await this.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value}`, '.editable-preferences-editor-container'); diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index b5c119c0539..9fcd47bf9b5 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -75,7 +75,7 @@ export function setup() { await app.workbench.quickopen.waitForQuickOpenOpened(); await app.workbench.quickopen.submit(':15'); - await app.workbench.editor.waitForHighlightingLine(15); + await app.workbench.editor.waitForHighlightingLine('app.js', 15); }); it(`verifies if changing EOL is reflected in the status bar`, async function () { From 7f043c268e8cfb70246d9e446e8d6c2e5ce18bf4 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 07:48:02 -0700 Subject: [PATCH 461/710] Pass terminal shell launch config through --- .../mainThreadTerminalService.ts | 25 ++++--- src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- .../api/node/extHostTerminalService.ts | 65 ++++++++++++++---- .../parts/terminal/common/terminal.ts | 11 ++- .../parts/terminal/common/terminalService.ts | 8 +-- .../electron-browser/terminalInstance.ts | 1 + .../terminalProcessManager.ts | 68 +++++++++---------- .../electron-browser/terminalService.ts | 5 +- .../terminal/node/terminalEnvironment.ts | 1 - .../node/terminalProcessExtHostProxy.ts | 7 +- 10 files changed, 123 insertions(+), 70 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 4aea9d9d787..4ea4d4eeeaf 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -5,9 +5,9 @@ 'use strict'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest } from 'vs/workbench/parts/terminal/common/terminal'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; +import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from '../node/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; @extHostNamedCustomer(MainContext.MainThreadTerminalService) @@ -31,7 +31,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape })); this._toDispose.push(terminalService.onInstanceDisposed(terminalInstance => this._onTerminalDisposed(terminalInstance))); this._toDispose.push(terminalService.onInstanceProcessIdReady(terminalInstance => this._onTerminalProcessIdReady(terminalInstance))); - this._toDispose.push(terminalService.onInstanceRequestExtHostProcess(proxy => this._onTerminalRequestExtHostProcess(proxy))); + this._toDispose.push(terminalService.onInstanceRequestExtHostProcess(request => this._onTerminalRequestExtHostProcess(request))); // Set initial ext host state this.terminalService.terminalInstances.forEach(t => { @@ -100,14 +100,21 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy.$acceptTerminalProcessId(terminalInstance.id, terminalInstance.processId); } - private _onTerminalRequestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void { + private _onTerminalRequestExtHostProcess(request: ITerminalProcessExtHostRequest): void { console.log('mainThreadTerminalService#_onTerminalRequestExtHostProcess', arguments); - this._terminalProcesses[proxy.terminalId] = proxy; - this._proxy.$createProcess(proxy.terminalId, null, 0, 0); + this._terminalProcesses[request.proxy.terminalId] = request.proxy; + const shellLaunchConfigDto: ShellLaunchConfigDto = { + name: request.shellLaunchConfig.name, + executable: request.shellLaunchConfig.executable, + args: request.shellLaunchConfig.args, + cwd: request.shellLaunchConfig.cwd, + env: request.shellLaunchConfig.env + }; + this._proxy.$createProcess(request.proxy.terminalId, shellLaunchConfigDto, request.cols, request.rows); // TODO: Dispose of this properly when the terminal/process dies - this._toDispose.push(proxy.onInput(data => this._proxy.$acceptTerminalProcessInput(proxy.terminalId, data))); - this._toDispose.push(proxy.onResize((cols, rows) => this._proxy.$acceptTerminalProcessResize(proxy.terminalId, cols, rows))); - this._toDispose.push(proxy.onShutdown(() => this._proxy.$acceptTerminalProcessShutdown(proxy.terminalId))); + this._toDispose.push(request.proxy.onInput(data => this._proxy.$acceptTerminalProcessInput(request.proxy.terminalId, data))); + this._toDispose.push(request.proxy.onResize((cols, rows) => this._proxy.$acceptTerminalProcessResize(request.proxy.terminalId, cols, rows))); + this._toDispose.push(request.proxy.onShutdown(() => this._proxy.$acceptTerminalProcessShutdown(request.proxy.terminalId))); } public $sendProcessTitle(terminalId: number, title: string): void { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 4e4583d1586..13822da3edb 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -115,7 +115,7 @@ export function createApiFactory( const extHostFileSystem = rpcProtocol.set(ExtHostContext.ExtHostFileSystem, new ExtHostFileSystem(rpcProtocol, extHostLanguageFeatures)); const extHostFileSystemEvent = rpcProtocol.set(ExtHostContext.ExtHostFileSystemEventService, new ExtHostFileSystemEventService()); const extHostQuickOpen = rpcProtocol.set(ExtHostContext.ExtHostQuickOpen, new ExtHostQuickOpen(rpcProtocol, extHostWorkspace, extHostCommands)); - const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(rpcProtocol)); + const extHostTerminalService = rpcProtocol.set(ExtHostContext.ExtHostTerminalService, new ExtHostTerminalService(rpcProtocol, extHostConfiguration, extHostLogService)); const extHostSCM = rpcProtocol.set(ExtHostContext.ExtHostSCM, new ExtHostSCM(rpcProtocol, extHostCommands, extHostLogService)); const extHostSearch = rpcProtocol.set(ExtHostContext.ExtHostSearch, new ExtHostSearch(rpcProtocol)); const extHostTask = rpcProtocol.set(ExtHostContext.ExtHostTask, new ExtHostTask(rpcProtocol, extHostWorkspace)); diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 16b62bd5e39..db3f40dd119 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -7,10 +7,13 @@ import * as vscode from 'vscode'; import * as cp from 'child_process'; import * as path from 'path'; +import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto } from 'vs/workbench/api/node/extHost.protocol'; import { IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; +import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; +import { ILogService } from 'vs/platform/log/common/log'; export class ExtHostTerminal implements vscode.Terminal { @@ -116,7 +119,11 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public get terminals(): ExtHostTerminal[] { return this._terminals; } - constructor(mainContext: IMainContext) { + constructor( + mainContext: IMainContext, + private _extHostConfiguration: ExtHostConfiguration, + private _logService: ILogService + ) { this._onDidCloseTerminal = new Emitter(); this._onDidOpenTerminal = new Emitter(); this._proxy = mainContext.getProxy(MainContext.MainThreadTerminalService); @@ -176,28 +183,61 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void { - shellLaunchConfig = { - env: {}, - executable: 'bash' - }; + // TODO: This function duplicates a lot of TerminalProcessManager.createProcess, ideally + // they would be merged into a single implementation. + + const terminalConfig = this._extHostConfiguration.getConfiguration('terminal.integrated'); + + const locale = terminalConfig.get('setLocaleVariables') ? platform.locale : undefined; + if (!shellLaunchConfig.executable) { + // TODO: This duplicates some of TerminalConfigHelper.mergeDefaultShellPathAndArgs and should be merged + // this._configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig); + + const platformKey = platform.isWindows ? 'windows' : platform.isMacintosh ? 'osx' : 'linux'; + const shellConfigValue: string = terminalConfig.get(`shell.${platformKey}`); + const shellArgsConfigValue: string = terminalConfig.get(`shellArgs.${platformKey}`); + + shellLaunchConfig.executable = shellConfigValue; + shellLaunchConfig.args = shellArgsConfigValue; + } + this._logService.info('$createProcess', id, shellLaunchConfig, cols, rows); + + // const lastActiveWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot('file'); + // this.initialCwd = terminalEnvironment.getCwd(shellLaunchConfig, lastActiveWorkspaceRootUri, this._configHelper); + + // // Resolve env vars from config and shell + // const lastActiveWorkspaceRoot = this._workspaceContextService.getWorkspaceFolder(lastActiveWorkspaceRootUri); + // const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); + // const envFromConfig = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...this._configHelper.config.env[platformKey] }, lastActiveWorkspaceRoot); + // const envFromShell = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...shellLaunchConfig.env }, lastActiveWorkspaceRoot); + // shellLaunchConfig.env = envFromShell; + + // // Merge process env with the env from config + // const parentEnv = { ...process.env }; + // terminalEnvironment.mergeEnvironments(parentEnv, envFromConfig); + + // // Continue env initialization, merging in the env from the launch + // // config and adding keys that are needed to create the process + // const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, this.initialCwd, locale, cols, rows); + // const cwd = Uri.parse(paths.dirname(require.toUrl('../node/terminalProcess'))).fsPath; + // const options = { env, cwd }; + + + // TODO: Launch process // TODO: Associate the process with the terminal object/id // TODO: terminal has incorrect name/options, fix up const parentEnv = { ...process.env }; - const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, '/home/daniel', undefined, cols, rows); + const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, '/home/daniel', locale, cols, rows); // TODO: Use Uri? let cwd = path.dirname(require.toUrl('../../parts/terminal/node/terminalProcess')).replace('file://', ''); - console.log(cwd); const options = { env, cwd, execArgv: [] }; let bootstrapUri = require.toUrl('bootstrap').replace('file://', '') + '.js'; - console.log(bootstrapUri); - // cwd = '/home/daniel/dev/Microsoft/vscode/out/vs/workbench/parts/terminal/node'; - // bootstrapUri = '/home/daniel/dev/Microsoft/vscode/out/bootstrap'; - // env['AMD_ENTRYPOINT'] = 'vs/workbench/parts/terminal/node/terminalProcess'; + this._logService.debug(`Terminal process launching on ext host`, options); this._terminalProcesses[id] = cp.fork(bootstrapUri, ['--type=terminal'], options); this._terminalProcesses[id].on('message', (message: IMessageFromTerminalProcess) => { @@ -207,9 +247,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { case 'data': this._proxy.$sendProcessData(id, message.content); break; } }); - - const terminal = this._getTerminalById(id); - console.log('$createProcess terminal: ' + terminal.name); } public $acceptTerminalProcessInput(id: number, data: string): void { diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 946bfb8ef2d..8ec70a197d4 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -165,7 +165,7 @@ export interface ITerminalService { onInstanceCreated: Event; onInstanceDisposed: Event; onInstanceProcessIdReady: Event; - onInstanceRequestExtHostProcess: Event; + onInstanceRequestExtHostProcess: Event; onInstancesChanged: Event; onInstanceTitleChanged: Event; terminalInstances: ITerminalInstance[]; @@ -207,7 +207,7 @@ export interface ITerminalService { selectDefaultWindowsShell(): TPromise; setWorkspaceShellAllowed(isAllowed: boolean): void; - requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void; + requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void; } export const enum Direction { @@ -533,3 +533,10 @@ export interface ITerminalProcessExtHostProxy { onResize(listener: (cols: number, rows: number) => void): IDisposable; onShutdown(listener: () => void): IDisposable; } + +export interface ITerminalProcessExtHostRequest { + proxy: ITerminalProcessExtHostProxy; + shellLaunchConfig: IShellLaunchConfig; + cols: number; + rows: number; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index 92a91bcf5ac..e294388516b 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -9,7 +9,7 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest } from 'vs/workbench/parts/terminal/common/terminal'; import { TPromise } from 'vs/base/common/winjs.base'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -39,8 +39,8 @@ export abstract class TerminalService implements ITerminalService { public get onInstanceDisposed(): Event { return this._onInstanceDisposed.event; } protected readonly _onInstanceProcessIdReady: Emitter = new Emitter(); public get onInstanceProcessIdReady(): Event { return this._onInstanceProcessIdReady.event; } - protected readonly _onInstanceRequestExtHostProcess: Emitter = new Emitter(); - public get onInstanceRequestExtHostProcess(): Event { return this._onInstanceRequestExtHostProcess.event; } + protected readonly _onInstanceRequestExtHostProcess: Emitter = new Emitter(); + public get onInstanceRequestExtHostProcess(): Event { return this._onInstanceRequestExtHostProcess.event; } protected readonly _onInstancesChanged: Emitter = new Emitter(); public get onInstancesChanged(): Event { return this._onInstancesChanged.event; } protected readonly _onInstanceTitleChanged: Emitter = new Emitter(); @@ -75,7 +75,7 @@ export abstract class TerminalService implements ITerminalService { public abstract getActiveOrCreateInstance(wasNewTerminalAction?: boolean): ITerminalInstance; public abstract selectDefaultWindowsShell(): TPromise; public abstract setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void; - public abstract requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void; + public abstract requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void; private _restoreTabs(): void { if (!this.configHelper.config.experimentalRestore) { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index cfbbcd194b3..cdc1f00c8a8 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -109,6 +109,7 @@ export class TerminalInstance implements ITerminalInstance { @IConfigurationService private readonly _configurationService: IConfigurationService, @ILogService private _logService: ILogService ) { + // TODO: Delete me this._shellLaunchConfig.extensionHostOwned = true; this._disposables = []; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts index bfeef947e40..b50fa001bac 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import * as path from 'path'; +import * as paths from 'vs/base/common/paths'; import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; import Uri from 'vs/base/common/uri'; @@ -59,6 +59,12 @@ export class TerminalProcessManager implements ITerminalProcessManager { @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private _logService: ILogService ) { + this.ptyProcessReady = new TPromise(c => { + this.onProcessReady(() => { + this._logService.debug(`Terminal process ready (shellProcessId: ${this.shellProcessId})`); + c(void 0); + }); + }); } public dispose(): void { @@ -85,41 +91,35 @@ export class TerminalProcessManager implements ITerminalProcessManager { cols: number, rows: number ): void { - this.ptyProcessReady = new TPromise(c => { - this.onProcessReady(() => { - this._logService.debug(`Terminal process ready (shellProcessId: ${this.shellProcessId})`); - c(void 0); - }); - }); - - const locale = this._configHelper.config.setLocaleVariables ? platform.locale : undefined; - if (!shellLaunchConfig.executable) { - this._configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig); - } - - const lastActiveWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot('file'); - this.initialCwd = terminalEnvironment.getCwd(shellLaunchConfig, lastActiveWorkspaceRootUri, this._configHelper); - - // Resolve env vars from config and shell - const lastActiveWorkspaceRoot = this._workspaceContextService.getWorkspaceFolder(lastActiveWorkspaceRootUri); - const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); - const envFromConfig = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...this._configHelper.config.env[platformKey] }, lastActiveWorkspaceRoot); - const envFromShell = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...shellLaunchConfig.env }, lastActiveWorkspaceRoot); - shellLaunchConfig.env = envFromShell; - - // Merge process env with the env from config - const parentEnv = { ...process.env }; - terminalEnvironment.mergeEnvironments(parentEnv, envFromConfig); - - // Continue env initialization, merging in the env from the launch - // config and adding keys that are needed to create the process - const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, this.initialCwd, locale, cols, rows); - const cwd = Uri.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath; - const options = { env, cwd }; - this._logService.debug(`Terminal process launching`, options); if (shellLaunchConfig.extensionHostOwned) { - this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId); + this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, cols, rows); } else { + const locale = this._configHelper.config.setLocaleVariables ? platform.locale : undefined; + if (!shellLaunchConfig.executable) { + this._configHelper.mergeDefaultShellPathAndArgs(shellLaunchConfig); + } + + const lastActiveWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot('file'); + this.initialCwd = terminalEnvironment.getCwd(shellLaunchConfig, lastActiveWorkspaceRootUri, this._configHelper); + + // Resolve env vars from config and shell + const lastActiveWorkspaceRoot = this._workspaceContextService.getWorkspaceFolder(lastActiveWorkspaceRootUri); + const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); + const envFromConfig = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...this._configHelper.config.env[platformKey] }, lastActiveWorkspaceRoot); + const envFromShell = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...shellLaunchConfig.env }, lastActiveWorkspaceRoot); + shellLaunchConfig.env = envFromShell; + + // Merge process env with the env from config + const parentEnv = { ...process.env }; + terminalEnvironment.mergeEnvironments(parentEnv, envFromConfig); + + // Continue env initialization, merging in the env from the launch + // config and adding keys that are needed to create the process + const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, this.initialCwd, locale, cols, rows); + const cwd = Uri.parse(paths.dirname(require.toUrl('../node/terminalProcess'))).fsPath; + const options = { env, cwd }; + this._logService.debug(`Terminal process launching`, options); + this._process = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], options); } this.processState = ProcessState.LAUNCHING; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 0e37f567c63..e7080740ebd 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -95,13 +95,12 @@ export class TerminalService extends AbstractTerminalService implements ITermina return this._instantiationService.createInstance(TerminalInstance, terminalFocusContextKey, configHelper, undefined, shellLaunchConfig, true); } - public requestExtHostProcess(proxy: ITerminalProcessExtHostProxy): void { + public requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void { // Ensure extension host is ready before requesting a process this._extensionService.whenInstalledExtensionsRegistered().then(() => { // TODO: MainThreadTerminalService is not ready at this point, fix this setTimeout(() => { - console.log('request'); - this._onInstanceRequestExtHostProcess.fire(proxy); + this._onInstanceRequestExtHostProcess.fire({ proxy, shellLaunchConfig, cols, rows }); }, 100); }); } diff --git a/src/vs/workbench/parts/terminal/node/terminalEnvironment.ts b/src/vs/workbench/parts/terminal/node/terminalEnvironment.ts index e52554048e2..2c60754603d 100644 --- a/src/vs/workbench/parts/terminal/node/terminalEnvironment.ts +++ b/src/vs/workbench/parts/terminal/node/terminalEnvironment.ts @@ -79,7 +79,6 @@ export function createTerminalEnv(parentEnv: IStringDictionary, shell: I return env; } -// TODO:should be protected/non-static export function resolveConfigurationVariables(configurationResolverService: IConfigurationResolverService, env: IStringDictionary, lastActiveWorkspaceRoot: IWorkspaceFolder): IStringDictionary { Object.keys(env).forEach((key) => { if (typeof env[key] === 'string') { diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index f05ec5f6dc1..2efdd72fa4b 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -5,7 +5,7 @@ import { ITerminalChildProcess, IMessageToTerminalProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; import { EventEmitter } from 'events'; -import { ITerminalService, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; import { IDisposable } from '../../../../base/common/lifecycle'; export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy { @@ -14,12 +14,15 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin constructor( public terminalId: number, + shellLaunchConfig: IShellLaunchConfig, + cols: number, + rows: number @ITerminalService private _terminalService: ITerminalService ) { super(); // TODO: Return TPromise indicating success? Teardown if failure? - this._terminalService.requestExtHostProcess(this); + this._terminalService.requestExtHostProcess(this, shellLaunchConfig, cols, rows); } public emitData(data: string): void { From 35ef4f3664004ef798db7a00823758374f002a79 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 18 Apr 2018 16:53:01 +0200 Subject: [PATCH 462/710] fixes #47738 --- src/vs/base/common/resources.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index bbc5c6ca223..8a1e1853bfa 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -9,12 +9,12 @@ import uri from 'vs/base/common/uri'; import { equalsIgnoreCase } from 'vs/base/common/strings'; export function basenameOrAuthority(resource: uri): string { - return paths.basename(resource.fsPath) || resource.authority; + return paths.basename(resource.path) || resource.authority; } export function isEqualOrParent(resource: uri, candidate: uri, ignoreCase?: boolean): boolean { if (resource.scheme === candidate.scheme && resource.authority === candidate.authority) { - return paths.isEqualOrParent(resource.fsPath, candidate.fsPath, ignoreCase); + return paths.isEqualOrParent(resource.path, candidate.path, ignoreCase); } return false; @@ -66,4 +66,4 @@ export function distinctParents(items: T[], resourceAccessor: (item: T) => ur } return distinctParents; -} \ No newline at end of file +} From 4dc7a828c559bed8f7d36ac2aa6ad48df8b10a86 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 18 Apr 2018 16:55:39 +0200 Subject: [PATCH 463/710] fixes #47740 --- .../parts/files/electron-browser/views/explorerViewer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 30c28198689..c32ade7e82c 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -327,10 +327,10 @@ export class FileRenderer implements IRenderer { } }), DOM.addStandardDisposableListener(inputBox.inputElement, DOM.EventType.KEY_UP, (e: IKeyboardEvent) => { - const initialRelPath: string = path.relative(stat.root.resource.fsPath, stat.parent.resource.fsPath); + const initialRelPath: string = path.relative(stat.root.resource.path, stat.parent.resource.path); let projectFolderName: string = ''; if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { - projectFolderName = paths.basename(stat.root.resource.fsPath); // show root folder name in multi-folder project + projectFolderName = paths.basename(stat.root.resource.path); // show root folder name in multi-folder project } this.displayCurrentPath(inputBox, initialRelPath, projectFolderName, editableData.action.id); }), @@ -726,7 +726,7 @@ export class FileFilter implements IFilter { // Hide those that match Hidden Patterns const expression = this.hiddenExpressionPerRoot.get(stat.root.resource.toString()) || Object.create(null); - if (glob.match(expression, paths.normalize(path.relative(stat.root.resource.fsPath, stat.resource.fsPath), true), siblingsFn)) { + if (glob.match(expression, paths.normalize(path.relative(stat.root.resource.path, stat.resource.path), true), siblingsFn)) { return false; // hidden through pattern } From 414e19a550ee77525d36374b7be6c0acd2333616 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 08:01:21 -0700 Subject: [PATCH 464/710] Simplify terminal process paths --- src/vs/workbench/api/node/extHostTerminalService.ts | 6 +++--- .../parts/terminal/electron-browser/terminalInstance.ts | 1 + .../terminal/electron-browser/terminalProcessManager.ts | 3 +-- .../parts/terminal/electron-browser/terminalService.ts | 3 ++- .../parts/terminal/node/terminalProcessExtHostProxy.ts | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index db3f40dd119..ee3fe228b8d 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -6,9 +6,9 @@ import * as vscode from 'vscode'; import * as cp from 'child_process'; -import * as path from 'path'; import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; +import Uri from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto } from 'vs/workbench/api/node/extHost.protocol'; import { IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; @@ -232,10 +232,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { const parentEnv = { ...process.env }; const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, '/home/daniel', locale, cols, rows); // TODO: Use Uri? - let cwd = path.dirname(require.toUrl('../../parts/terminal/node/terminalProcess')).replace('file://', ''); + let cwd = Uri.parse(require.toUrl('../../parts/terminal/node')).fsPath; const options = { env, cwd, execArgv: [] }; - let bootstrapUri = require.toUrl('bootstrap').replace('file://', '') + '.js'; + let bootstrapUri = Uri.parse(require.toUrl('bootstrap')).fsPath; this._logService.debug(`Terminal process launching on ext host`, options); this._terminalProcesses[id] = cp.fork(bootstrapUri, ['--type=terminal'], options); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index cdc1f00c8a8..592a65af4dd 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -591,6 +591,7 @@ export class TerminalInstance implements ITerminalInstance { this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._id, this._configHelper); this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this)); this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); + console.log('_createProcess', this._cols, this._rows); this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows); if (this._shellLaunchConfig.name) { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts index b50fa001bac..c416d5ff60b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import * as paths from 'vs/base/common/paths'; import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; import Uri from 'vs/base/common/uri'; @@ -116,7 +115,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { // Continue env initialization, merging in the env from the launch // config and adding keys that are needed to create the process const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, this.initialCwd, locale, cols, rows); - const cwd = Uri.parse(paths.dirname(require.toUrl('../node/terminalProcess'))).fsPath; + const cwd = Uri.parse(require.toUrl('../node')).fsPath; const options = { env, cwd }; this._logService.debug(`Terminal process launching`, options); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index e7080740ebd..eb2e2cbb021 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -92,7 +92,7 @@ export class TerminalService extends AbstractTerminalService implements ITermina } public createInstance(terminalFocusContextKey: IContextKey, configHelper: ITerminalConfigHelper, container: HTMLElement, shellLaunchConfig: IShellLaunchConfig, doCreateProcess: boolean): ITerminalInstance { - return this._instantiationService.createInstance(TerminalInstance, terminalFocusContextKey, configHelper, undefined, shellLaunchConfig, true); + return this._instantiationService.createInstance(TerminalInstance, terminalFocusContextKey, configHelper, container, shellLaunchConfig, true); } public requestExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number): void { @@ -100,6 +100,7 @@ export class TerminalService extends AbstractTerminalService implements ITermina this._extensionService.whenInstalledExtensionsRegistered().then(() => { // TODO: MainThreadTerminalService is not ready at this point, fix this setTimeout(() => { + console.log('cols, rows', cols, rows); this._onInstanceRequestExtHostProcess.fire({ proxy, shellLaunchConfig, cols, rows }); }, 100); }); diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index 2efdd72fa4b..464f7de71ef 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -16,7 +16,7 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin public terminalId: number, shellLaunchConfig: IShellLaunchConfig, cols: number, - rows: number + rows: number, @ITerminalService private _terminalService: ITerminalService ) { super(); From 53dd6b096b5a50b0783044150a98090c15280508 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 18 Apr 2018 17:30:24 +0200 Subject: [PATCH 465/710] make folding api public (for #47808) --- src/vs/vscode.d.ts | 100 ++++++++++++++++- src/vs/vscode.proposed.d.ts | 104 ------------------ src/vs/workbench/api/node/extHost.api.impl.ts | 4 +- 3 files changed, 101 insertions(+), 107 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 9ce91242cb1..73c2a2ee364 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2749,7 +2749,7 @@ declare module 'vscode' { /** * Optional function for resolving and validating a position *before* running rename. The result can - * be a range or a range and a placeholder text. The placeholder text should be the identifier of the symbol + * be a range or a range and a placeholder text. The placeholder text should be the identifier of the symbol * which is being renamed - when omitted the text in the returned range is used. * * @param document The document in which rename will be invoked. @@ -3384,6 +3384,90 @@ declare module 'vscode' { provideColorPresentations(color: Color, context: { document: TextDocument, range: Range }, token: CancellationToken): ProviderResult; } + export class FoldingRange { + + /** + * The zero-based start line of the range to fold. The folded area starts after the line's last character. + */ + start: number; + + /** + * The zero-based end line of the range to fold. The folded area ends with the line's last character. + */ + end: number; + + /** + * Describes the [Kind](#FoldingRangeKind) of the folding range such as [Comment](#FoldingRangeKind.Comment) or + * [Region](#FoldingRangeKind.Region). The kind is used to categorize folding ranges and used by commands + * like 'Fold all comments'. See + * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. + */ + kind?: FoldingRangeKind; + + /** + * Creates a new folding range. + * + * @param start The start line of the folded range. + * @param end The end line of the folded range. + * @param kind The kind of the folding range. + */ + constructor(start: number, end: number, kind?: FoldingRangeKind); + } + + export class FoldingRangeKind { + /** + * Kind for folding range representing a comment. The value of the kind is 'comment'. + */ + static readonly Comment: FoldingRangeKind; + /** + * Kind for folding range representing a import. The value of the kind is 'imports'. + */ + static readonly Imports: FoldingRangeKind; + /** + * Kind for folding range representing regions (for example a folding range marked by `#region` and `#endregion`). + * The value of the kind is 'region'. + */ + static readonly Region: FoldingRangeKind; + /** + * String value of the kind, e.g. `comment`. + */ + readonly value: string; + /** + * Creates a new [FoldingRangeKind](#FoldingRangeKind). + * + * @param value of the kind. + */ + public constructor(value: string); + } + + + /** + * Metadata about the kind of folding ranges that a [FoldingRangeProvider](#FoldingRangeProvider) providers uses. + */ + export interface FoldingRangeProviderMetadata { + /** + * [FoldingRangeKind](#FoldingRangeKind) that this provider may return. + */ + readonly providedFoldingRangeKinds?: ReadonlyArray; + } + + /** + * Folding context (for future use) + */ + export interface FoldingContext { + } + + export interface FoldingRangeProvider { + /** + * Returns a list of folding ranges or null and undefined if the provider + * does not want to participate or was cancelled. + * @param document The document in which the command was invoked. + * @param context Additional context information (for future use) + * @param token A cancellation token. + */ + provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): ProviderResult; + } + /** * A tuple of two characters, like a pair of * opening and closing brackets. @@ -6370,6 +6454,20 @@ declare module 'vscode' { */ export function registerColorProvider(selector: DocumentSelector, provider: DocumentColorProvider): Disposable; + /** + * Register a folding range provider. + * + * Multiple folding can be registered for a language. In that case providers are sorted + * by their [score](#languages.match) and the best-matching provider is used. Failure + * of the selected provider will cause a failure of the whole operation. + * + * @param selector A selector that defines the documents this provider is applicable to. + * @param provider A folding range provider. + * @param metadata Metadata about the kind of code actions the provider providers. + * @return A [disposable](#Disposable) that unregisters this provider when being disposed. + */ + export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider, metadata?: FoldingRangeProviderMetadata): Disposable; + /** * Set a [language configuration](#LanguageConfiguration) for a language. * diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 24c7142a6d9..7a55ba9b0e2 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -11,110 +11,6 @@ declare module 'vscode' { export function sampleFunction(): Thenable; } - //#region Aeschli: folding - - export class FoldingRange { - - /** - * The zero-based start line of the range to fold. The folded area starts after the line's last character. - */ - start: number; - - /** - * The zero-based end line of the range to fold. The folded area ends with the line's last character. - */ - end: number; - - /** - * Describes the [Kind](#FoldingRangeKind) of the folding range such as [Comment](#FoldingRangeKind.Comment) or - * [Region](#FoldingRangeKind.Region). The kind is used to categorize folding ranges and used by commands - * like 'Fold all comments'. See - * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. - */ - kind?: FoldingRangeKind; - - /** - * Creates a new folding range. - * - * @param start The start line of the folded range. - * @param end The end line of the folded range. - * @param kind The kind of the folding range. - */ - constructor(start: number, end: number, kind?: FoldingRangeKind); - } - - export class FoldingRangeKind { - /** - * Kind for folding range representing a comment. The value of the kind is 'comment'. - */ - static readonly Comment: FoldingRangeKind; - /** - * Kind for folding range representing a import. The value of the kind is 'imports'. - */ - static readonly Imports: FoldingRangeKind; - /** - * Kind for folding range representing regions (for example a folding range marked by `#region` and `#endregion`). - * The value of the kind is 'region'. - */ - static readonly Region: FoldingRangeKind; - /** - * String value of the kind, e.g. `comment`. - */ - readonly value: string; - /** - * Creates a new [FoldingRangeKind](#FoldingRangeKind). - * - * @param value of the kind. - */ - public constructor(value: string); - } - - export namespace languages { - - /** - * Register a folding range provider. - * - * Multiple folding can be registered for a language. In that case providers are sorted - * by their [score](#languages.match) and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A folding range provider. - * @param metadata Metadata about the kind of code actions the provider providers. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider, metadata?: FoldingRangeProviderMetadata): Disposable; - } - - /** - * Metadata about the kind of folding ranges that a [FoldingRangeProvider](#FoldingRangeProvider) providers uses. - */ - export interface FoldingRangeProviderMetadata { - /** - * [FoldingRangeKind](#FoldingRangeKind) that this provider may return. - */ - readonly providedFoldingRangeKinds?: ReadonlyArray; - } - - /** - * Folding context (for future use) - */ - export interface FoldingContext { - } - - export interface FoldingRangeProvider { - /** - * Returns a list of folding ranges or null and undefined if the provider - * does not want to participate or was cancelled. - * @param document The document in which the command was invoked. - * @param context Additional context information (for future use) - * @param token A cancellation token. - */ - provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): ProviderResult; - } - - //#endregion - //#region Joh: file system provider export enum FileChangeType { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 2790ad78549..ca47b4f247d 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -328,9 +328,9 @@ export function createApiFactory( registerColorProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentColorProvider): vscode.Disposable { return extHostLanguageFeatures.registerColorProvider(checkSelector(selector), provider); }, - registerFoldingRangeProvider: proposedApiFunction(extension, (selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable => { + registerFoldingRangeProvider(selector: vscode.DocumentSelector, provider: vscode.FoldingRangeProvider): vscode.Disposable { return extHostLanguageFeatures.registerFoldingRangeProvider(checkSelector(selector), provider); - }), + }, setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration): vscode.Disposable => { return extHostLanguageFeatures.setLanguageConfiguration(language, configuration); } From 7b871c125ec89e151522dc4f5873fc3825c005f2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 17:40:47 +0200 Subject: [PATCH 466/710] Fix compilation --- src/vs/workbench/services/progress/test/progressService.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/services/progress/test/progressService.test.ts b/src/vs/workbench/services/progress/test/progressService.test.ts index 83b2b91d522..577d37ad5b3 100644 --- a/src/vs/workbench/services/progress/test/progressService.test.ts +++ b/src/vs/workbench/services/progress/test/progressService.test.ts @@ -22,10 +22,12 @@ let activeViewlet: Viewlet = {} as any; class TestViewletService implements IViewletService { public _serviceBrand: any; + onDidViewletRegisterEmitter = new Emitter(); onDidViewletOpenEmitter = new Emitter(); onDidViewletCloseEmitter = new Emitter(); onDidViewletEnableEmitter = new Emitter<{ id: string, enabled: boolean }>(); + onDidViewletRegister = this.onDidViewletRegisterEmitter.event; onDidViewletOpen = this.onDidViewletOpenEmitter.event; onDidViewletClose = this.onDidViewletCloseEmitter.event; onDidViewletEnablementChange = this.onDidViewletEnableEmitter.event; From f0e5ee0418c71295ed6da3ac4ea4ea289a9a3eb9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 17:42:19 +0200 Subject: [PATCH 467/710] fix unit tests --- .../test/browser/parts/views/contributableViews.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts b/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts index 99a80610c25..4153fce6fc1 100644 --- a/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts +++ b/src/vs/workbench/test/browser/parts/views/contributableViews.test.ts @@ -10,6 +10,7 @@ import { ContextKeyService } from 'vs/platform/contextkey/browser/contextKeyServ import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { SimpleConfigurationService } from 'vs/editor/standalone/browser/simpleServices'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { move } from 'vs/base/common/arrays'; const location = ViewLocation.register('test'); @@ -22,6 +23,7 @@ class ViewDescriptorSequence { this.elements = [...model.visibleViewDescriptors]; model.onDidAdd(({ viewDescriptor, index }) => this.elements.splice(index, 0, viewDescriptor), null, this.disposables); model.onDidRemove(({ viewDescriptor, index }) => this.elements.splice(index, 1), null, this.disposables); + model.onDidMove(({ from, to }) => move(this.elements, from.index, to.index), null, this.disposables); } dispose() { @@ -218,8 +220,8 @@ suite('ContributableViewsModel', () => { const view3: IViewDescriptor = { id: 'view3', ctor: null, location, name: 'Test View 3' }; ViewsRegistry.registerViews([view1, view2, view3]); - assert.deepEqual(model.visibleViewDescriptors, [view1, view2, view3]); - assert.deepEqual(seq.elements, [view1, view2, view3]); + assert.deepEqual(model.visibleViewDescriptors, [view1, view2, view3], 'model views should be OK'); + assert.deepEqual(seq.elements, [view1, view2, view3], 'sql views should be OK'); model.move('view3', 'view1'); assert.deepEqual(model.visibleViewDescriptors, [view3, view1, view2], 'view3 should go to the front'); From 6fb36419f112f01d4d7805a480241e3f9aac19bc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 17:42:29 +0200 Subject: [PATCH 468/710] make build stop when a script errs --- build/tfs/continuous-build.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build/tfs/continuous-build.yml b/build/tfs/continuous-build.yml index cd59b418084..107c7ff9cdd 100644 --- a/build/tfs/continuous-build.yml +++ b/build/tfs/continuous-build.yml @@ -9,6 +9,7 @@ phases: inputs: versionSpec: "1.3.2" - powershell: | + $ErrorActionPreference = "Stop" yarn .\node_modules\.bin\gulp electron npm run gulp -- hygiene @@ -17,6 +18,7 @@ phases: node build/lib/builtInExtensions.js name: build - powershell: | + $ErrorActionPreference = "Stop" .\scripts\test.bat --tfs .\scripts\test-integration.bat yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)\artifacts" --log "$(Build.ArtifactStagingDirectory)\artifacts\smoketest.log" @@ -32,6 +34,7 @@ phases: queue: Hosted Linux Preview steps: - script: | + set -e apt-get update apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 libgconf-2-4 dbus xvfb libgtk-3-0 cp build/tfs/linux/x64/xvfb.init /etc/init.d/xvfb @@ -47,15 +50,18 @@ phases: inputs: versionSpec: "1.3.2" - script: | + set -e yarn npm run gulp -- electron-x64 - script: | + set -e npm run gulp -- hygiene ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit npm run compile node build/lib/builtInExtensions.js name: build - script: | + set -e DISPLAY=:10 ./scripts/test.sh --tfs # DISPLAY=:10 ./scripts/test-integration.sh name: test @@ -70,15 +76,18 @@ phases: inputs: versionSpec: "1.3.2" - script: | + set -e yarn npm run gulp -- electron-x64 - script: | + set -e npm run gulp -- hygiene ./node_modules/.bin/tsc -p ./src/tsconfig.monaco.json --noEmit npm run compile node build/lib/builtInExtensions.js name: build - script: | + set -e ./scripts/test.sh --tfs ./scripts/test-integration.sh yarn smoketest --screenshots "$(Build.ArtifactStagingDirectory)/artifacts" --log "$(Build.ArtifactStagingDirectory)/artifacts/smoketest.log" From 7bc218f9249824e0163ee2ecfebd13446fa35d69 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 18 Apr 2018 17:46:28 +0200 Subject: [PATCH 469/710] fixes #46899 --- .../workbench/parts/debug/electron-browser/breakpointWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts index dca48387864..037df6816e5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts +++ b/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts @@ -172,13 +172,13 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakopintWi condition, hitCondition, verified: this.breakpoint.verified, + column: this.breakpoint.column, logMessage } }, false); } else { this.debugService.addBreakpoints(this.editor.getModel().uri, [{ lineNumber: this.lineNumber, - column: this.breakpoint ? this.breakpoint.column : undefined, enabled: true, condition, hitCondition, From 45e859bfdc720da4668a2e9742039860efccfa84 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 18 Apr 2018 17:48:13 +0200 Subject: [PATCH 470/710] monaco folding api (for #47808) --- src/vs/editor/common/modes.ts | 18 +----- .../contrib/folding/syntaxRangeProvider.ts | 4 +- .../standalone/browser/standaloneLanguages.ts | 13 +++-- src/vs/monaco.d.ts | 58 ++++++++++++++++++- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- .../api/node/extHostLanguageFeatures.ts | 4 +- .../api/node/extHostTypeConverters.ts | 2 +- 7 files changed, 72 insertions(+), 29 deletions(-) diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 76d62264ebc..e9caa888ae2 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -830,30 +830,19 @@ export interface DocumentColorProvider { */ provideColorPresentations(model: model.ITextModel, colorInfo: IColorInformation, token: CancellationToken): IColorPresentation[] | Thenable; } - -/** - * @internal - */ export interface FoldingContext { } - /** * A provider of colors for editor models. */ -/** - * @internal - */ export interface FoldingRangeProvider { /** * Provides the color ranges for a specific model. */ - provideFoldingRanges(model: model.ITextModel, context: FoldingContext, token: CancellationToken): IFoldingRange[] | Thenable; + provideFoldingRanges(model: model.ITextModel, context: FoldingContext, token: CancellationToken): FoldingRange[] | Thenable; } -/** - * @internal - */ -export interface IFoldingRange { +export interface FoldingRange { /** * The zero-based start line of the range to fold. The folded area starts after the line's last character. @@ -873,9 +862,6 @@ export interface IFoldingRange { */ kind?: FoldingRangeKind; } -/** - * @internal - */ export class FoldingRangeKind { /** * Kind for folding range representing a comment. The value of the kind is 'comment'. diff --git a/src/vs/editor/contrib/folding/syntaxRangeProvider.ts b/src/vs/editor/contrib/folding/syntaxRangeProvider.ts index 7131c02d583..eec4d8406c9 100644 --- a/src/vs/editor/contrib/folding/syntaxRangeProvider.ts +++ b/src/vs/editor/contrib/folding/syntaxRangeProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { FoldingRangeProvider, IFoldingRange, FoldingContext } from 'vs/editor/common/modes'; +import { FoldingRangeProvider, FoldingRange, FoldingContext } from 'vs/editor/common/modes'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; import { toThenable } from 'vs/base/common/async'; import { ITextModel } from 'vs/editor/common/model'; @@ -16,7 +16,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; const MAX_FOLDING_REGIONS_FOR_INDENT_LIMIT = 5000; -export interface IFoldingRangeData extends IFoldingRange { +export interface IFoldingRangeData extends FoldingRange { rank: number; } diff --git a/src/vs/editor/standalone/browser/standaloneLanguages.ts b/src/vs/editor/standalone/browser/standaloneLanguages.ts index c0eec9275ac..eaa070aeda8 100644 --- a/src/vs/editor/standalone/browser/standaloneLanguages.ts +++ b/src/vs/editor/standalone/browser/standaloneLanguages.ts @@ -391,12 +391,11 @@ export function registerColorProvider(languageId: string, provider: modes.Docume } /** - * Register a folding provider + * Register a folding range provider */ -/*export function registerFoldingProvider(languageId: string, provider: modes.FoldingProvider): IDisposable { - return modes.FoldingProviderRegistry.register(languageId, provider); -}*/ - +export function registerFoldingRangeProvider(languageId: string, provider: modes.FoldingRangeProvider): IDisposable { + return modes.FoldingRangeProviderRegistry.register(languageId, provider); +} /** * Contains additional diagnostic information about the context in which @@ -787,12 +786,14 @@ export function createMonacoLanguagesAPI(): typeof monaco.languages { registerOnTypeFormattingEditProvider: registerOnTypeFormattingEditProvider, registerLinkProvider: registerLinkProvider, registerColorProvider: registerColorProvider, + registerFoldingRangeProvider: registerFoldingRangeProvider, // enums DocumentHighlightKind: modes.DocumentHighlightKind, CompletionItemKind: CompletionItemKind, SymbolKind: modes.SymbolKind, IndentAction: IndentAction, - SuggestTriggerKind: modes.SuggestTriggerKind + SuggestTriggerKind: modes.SuggestTriggerKind, + FoldingRangeKind: modes.FoldingRangeKind }; } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 28b6ac3ffaf..268571ebc7d 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -4105,8 +4105,10 @@ declare namespace monaco.languages { export function registerColorProvider(languageId: string, provider: DocumentColorProvider): IDisposable; /** - * Register a folding provider + * Register a folding range provider */ + export function registerFoldingRangeProvider(languageId: string, provider: FoldingRangeProvider): IDisposable; + /** * Contains additional diagnostic information about the context in which * a [code action](#CodeActionProvider.provideCodeActions) is run. @@ -5000,6 +5002,60 @@ declare namespace monaco.languages { provideColorPresentations(model: editor.ITextModel, colorInfo: IColorInformation, token: CancellationToken): IColorPresentation[] | Thenable; } + export interface FoldingContext { + } + + /** + * A provider of colors for editor models. + */ + export interface FoldingRangeProvider { + /** + * Provides the color ranges for a specific model. + */ + provideFoldingRanges(model: editor.ITextModel, context: FoldingContext, token: CancellationToken): FoldingRange[] | Thenable; + } + + export interface FoldingRange { + /** + * The zero-based start line of the range to fold. The folded area starts after the line's last character. + */ + start: number; + /** + * The zero-based end line of the range to fold. The folded area ends with the line's last character. + */ + end: number; + /** + * Describes the [Kind](#FoldingRangeKind) of the folding range such as [Comment](#FoldingRangeKind.Comment) or + * [Region](#FoldingRangeKind.Region). The kind is used to categorize folding ranges and used by commands + * like 'Fold all comments'. See + * [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds. + */ + kind?: FoldingRangeKind; + } + + export class FoldingRangeKind { + value: string; + /** + * Kind for folding range representing a comment. The value of the kind is 'comment'. + */ + static readonly Comment: FoldingRangeKind; + /** + * Kind for folding range representing a import. The value of the kind is 'imports'. + */ + static readonly Imports: FoldingRangeKind; + /** + * Kind for folding range representing regions (for example marked by `#region`, `#endregion`). + * The value of the kind is 'region'. + */ + static readonly Region: FoldingRangeKind; + /** + * Creates a new [FoldingRangeKind](#FoldingRangeKind). + * + * @param value of the kind. + */ + constructor(value: string); + } + export interface ResourceFileEdit { oldUri: Uri; newUri: Uri; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index c21323c8c04..38d81ee9141 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -723,7 +723,7 @@ export interface ExtHostLanguageFeaturesShape { $resolveDocumentLink(handle: number, link: modes.ILink): TPromise; $provideDocumentColors(handle: number, resource: UriComponents): TPromise; $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: IRawColorInfo): TPromise; - $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext): TPromise; + $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext): TPromise; } export interface ExtHostQuickOpenShape { diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 3d5e2fe57ad..2d14359a8b1 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -820,7 +820,7 @@ class FoldingProviderAdapter { private _provider: vscode.FoldingRangeProvider ) { } - provideFoldingRanges(resource: URI, context: modes.FoldingContext): TPromise { + provideFoldingRanges(resource: URI, context: modes.FoldingContext): TPromise { const doc = this._documents.getDocumentData(resource).document; return asWinJsPromise(token => this._provider.provideFoldingRanges(doc, context, token)).then(ranges => { if (!Array.isArray(ranges)) { @@ -1184,7 +1184,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._createDisposable(handle); } - $provideFoldingRanges(handle: number, resource: UriComponents, context: vscode.FoldingContext): TPromise { + $provideFoldingRanges(handle: number, resource: UriComponents, context: vscode.FoldingContext): TPromise { return this._withAdapter(handle, FoldingProviderAdapter, adapter => adapter.provideFoldingRanges(URI.revive(resource), context)); } diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index b77f77279db..5c98f71fd82 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -624,7 +624,7 @@ export namespace ProgressLocation { } export namespace FoldingRange { - export function from(r: vscode.FoldingRange): modes.IFoldingRange { + export function from(r: vscode.FoldingRange): modes.FoldingRange { return { start: r.start + 1, end: r.end + 1, kind: r.kind }; } } From dbbf8d5fc02cf51562d9b70aa2a1abe33a227c18 Mon Sep 17 00:00:00 2001 From: Ivor Huang Date: Wed, 18 Apr 2018 11:59:05 -0400 Subject: [PATCH 471/710] remove code duplication by using StartAction member in RestartAction --- .../parts/debug/browser/debugActions.ts | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index a840efe8e97..72b07267869 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -215,15 +215,21 @@ export class RestartAction extends AbstractDebugAction { static LABEL = nls.localize('restartDebug', "Restart"); static RECONNECT_LABEL = nls.localize('reconnectDebug', "Reconnect"); + private startAction: StartAction; + constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService, @IWorkspaceContextService private contextService?: IWorkspaceContextService, - @IHistoryService private historyService?: IHistoryService + @IHistoryService historyService?: IHistoryService ) { super(id, label, 'debug-action restart', debugService, keybindingService, 70); this.setLabel(this.debugService.getViewModel().focusedProcess); this.toDispose.push(this.debugService.getViewModel().onDidFocusStackFrame(() => this.setLabel(this.debugService.getViewModel().focusedProcess))); + + if (contextService !== undefined && historyService !== undefined) { + this.startAction = new StartAction(id, label, debugService, keybindingService, contextService, historyService); + } } private setLabel(process: IProcess): void { @@ -234,21 +240,9 @@ export class RestartAction extends AbstractDebugAction { if (!(process instanceof Process)) { process = this.debugService.getViewModel().focusedProcess; } + if (!process) { - const configurationManager = this.debugService.getConfigurationManager(); - let launch = configurationManager.selectedConfiguration.launch; - if (!launch) { - const rootUri = this.historyService.getLastActiveWorkspaceRoot(); - launch = configurationManager.getLaunch(rootUri); - if (!launch || launch.getConfigurationNames().length === 0) { - const launches = configurationManager.getLaunches(); - launch = first(launches, l => !!l.getConfigurationNames().length, launches.length ? launches[0] : launch); - } - - configurationManager.selectConfiguration(launch); - } - - return this.debugService.startDebugging(launch, undefined, false); + return this.startAction.run(); } if (this.debugService.getModel().getProcesses().length <= 1) { From 07acfd7e794024103f1d956a96b3ff84d76d41c4 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 09:18:17 -0700 Subject: [PATCH 472/710] Improve terminal clear command to work with multi-line prompts Fixes #48146 --- .../parts/terminal/electron-browser/terminalInstance.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 9db5b91c7d3..b81c277f4c3 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -567,7 +567,13 @@ export class TerminalInstance implements ITerminalInstance { } public clear(): void { - this._xterm.clear(); + if (paths.basename(this._shellLaunchConfig.executable).match(/zsh|bash/)) { + // If a supported shell is being used, clear xterm scrollback then clear shell (^L) + this._xterm.write('\x1b[3J'); + this._processManager.write('\x0c'); + } else { + this._xterm.clear(); + } } private _refreshSelectionContextKey() { From 33108e1b308ffdba994cb172ad6bacbe76b86455 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 18:18:47 +0200 Subject: [PATCH 473/710] set icon mask size to 22px --- src/vs/workbench/api/browser/activitybarExtensionPoint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts index bcb3c89c92c..15aed855355 100644 --- a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts +++ b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts @@ -96,7 +96,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; const iconPath = join(extension.description.extensionFolderPath, descriptor.icon); - createCSSRule(iconClass, `-webkit-mask: url('${iconPath}') no-repeat 50% 50%; -webkit-mask-size: contain;`); + createCSSRule(iconClass, `-webkit-mask: url('${iconPath}') no-repeat 50% 50%; -webkit-mask-size: 22px;`); // Register as viewlet class CustomViewlet extends PersistentViewsViewlet { From 194adb4949d2b47ce8006d8f07fdf0fd3eeb7633 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 18 Apr 2018 18:23:44 +0200 Subject: [PATCH 474/710] debug: fix action labels for log points fixes #46821 --- .../parts/debug/browser/breakpointsView.ts | 5 +++-- .../electron-browser/debugEditorContribution.ts | 14 ++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/breakpointsView.ts b/src/vs/workbench/parts/debug/browser/breakpointsView.ts index a4d5380cde6..3c7afd4f1f6 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/parts/debug/browser/breakpointsView.ts @@ -124,8 +124,9 @@ export class BreakpointsView extends ViewsViewletPanel { const actions: IAction[] = []; const element = e.element; + const breakpointType = element instanceof Breakpoint && element.logMessage ? nls.localize('logPoint', "Log Point") : nls.localize('breakpoint', "Breakpoint"); if (element instanceof Breakpoint || element instanceof FunctionBreakpoint) { - actions.push(new Action('workbench.action.debug.openEditorAndEditBreakpoint', nls.localize('editConditionalBreakpoint', "Edit Breakpoint..."), undefined, true, () => { + actions.push(new Action('workbench.action.debug.openEditorAndEditBreakpoint', nls.localize('editBreakpoint', "Edit {0}...", breakpointType), undefined, true, () => { if (element instanceof Breakpoint) { return openBreakpointSource(element, false, false, this.debugService, this.editorService).then(editor => { const codeEditor = editor.getControl(); @@ -142,7 +143,7 @@ export class BreakpointsView extends ViewsViewletPanel { actions.push(new Separator()); } - actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, nls.localize('removeBreakpoint', "Remove {0}", breakpointType), this.debugService, this.keybindingService)); if (this.debugService.getModel().getBreakpoints().length + this.debugService.getModel().getFunctionBreakpoints().length > 1) { actions.push(new RemoveAllBreakpointsAction(RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL, this.debugService, this.keybindingService)); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index 4e33173f300..0b5f26ba2ed 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -95,10 +95,11 @@ export class DebugEditorContribution implements IDebugEditorContribution { private getContextMenuActions(breakpoints: IBreakpoint[], uri: uri, lineNumber: number): TPromise<(IAction | ContextSubMenu)[]> { const actions: (IAction | ContextSubMenu)[] = []; if (breakpoints.length === 1) { - actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, RemoveBreakpointAction.LABEL, this.debugService, this.keybindingService)); + const breakpointType = breakpoints[0].logMessage ? nls.localize('logPoint', "Log Point") : nls.localize('breakpoint', "Breakpoint"); + actions.push(new RemoveBreakpointAction(RemoveBreakpointAction.ID, nls.localize('removeBreakpoint', "Remove {0}", breakpointType), this.debugService, this.keybindingService)); actions.push(new Action( 'workbench.debug.action.editBreakpointAction', - nls.localize('editBreakpoint', "Edit Breakpoint..."), + nls.localize('editBreakpoint', "Edit {0}...", breakpointType), undefined, true, () => TPromise.as(this.editor.getContribution(EDITOR_CONTRIBUTION_ID).showBreakpointWidget(breakpoints[0].lineNumber, breakpoints[0].column)) @@ -106,7 +107,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { actions.push(new Action( `workbench.debug.viewlet.action.toggleBreakpoint`, - breakpoints[0].enabled ? nls.localize('disableBreakpoint', "Disable Breakpoint") : nls.localize('enableBreakpoint', "Enable Breakpoint"), + breakpoints[0].enabled ? nls.localize('disableBreakpoint', "Disable {0}", breakpointType) : nls.localize('enableBreakpoint', "Enable {0}", breakpointType), undefined, true, () => this.debugService.enableOrDisableBreakpoints(!breakpoints[0].enabled, breakpoints[0]) @@ -195,10 +196,11 @@ export class DebugEditorContribution implements IDebugEditorContribution { if (breakpoints.length) { if (breakpoints.some(bp => !!bp.condition || !!bp.logMessage || !!bp.hitCondition)) { const logPoint = breakpoints.every(bp => !!bp.logMessage); + const breakpointType = logPoint ? nls.localize('logPoint', "Log Point") : nls.localize('breakpoint', "Breakpoint"); this.dialogService.show(severity.Info, nls.localize('breakpointHasCondition', "This {0} has a valuable {1} that will get lost on remove. Consider disabling the {0} instead.", - logPoint ? nls.localize('logPoint', "log point") : nls.localize('breakpoint', "breakpoint"), logPoint ? nls.localize('message', "message") : nls.localize('condition', "condition")), [ - logPoint ? nls.localize('removeLogPoint', "Remove Log Point") : nls.localize('removeBreakpoint', "Remove Breakpoint"), - logPoint ? nls.localize('disableLogPoint', "Disable Log Point") : nls.localize('disableBreakpoint', "Disable Breakpoint"), + breakpointType.toLowerCase(), logPoint ? nls.localize('message', "message") : nls.localize('condition', "condition")), [ + nls.localize('removeLogPoint', "Remove {0}", breakpointType), + nls.localize('disableLogPoint', "Disable {0}", breakpointType), nls.localize('cancel', "Cancel") ], { cancelId: 2 }).then(choice => { if (choice === 0) { From c53db4b02e8eec2624b60c0caa0656910f1f1061 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 09:28:34 -0700 Subject: [PATCH 475/710] Remove empty imports --- src/vs/editor/contrib/gotoError/gotoError.ts | 1 - src/vs/workbench/browser/parts/editor/resourceViewer.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/vs/editor/contrib/gotoError/gotoError.ts b/src/vs/editor/contrib/gotoError/gotoError.ts index d1d82b9a00b..e9aa3c4667d 100644 --- a/src/vs/editor/contrib/gotoError/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/gotoError.ts @@ -17,7 +17,6 @@ import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { registerEditorAction, registerEditorContribution, ServicesAccessor, IActionOptions, EditorAction, EditorCommand, registerEditorCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; -import { } from 'vs/platform/theme/common/colorRegistry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; diff --git a/src/vs/workbench/browser/parts/editor/resourceViewer.ts b/src/vs/workbench/browser/parts/editor/resourceViewer.ts index 02e222d2456..f89c87eea31 100644 --- a/src/vs/workbench/browser/parts/editor/resourceViewer.ts +++ b/src/vs/workbench/browser/parts/editor/resourceViewer.ts @@ -19,7 +19,6 @@ import { clamp } from 'vs/base/common/numbers'; import { Themable } from 'vs/workbench/common/theme'; import { IStatusbarItem, StatusbarItemDescriptor, IStatusbarRegistry, Extensions, StatusbarAlignment } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { } from 'vs/platform/workspace/common/workspace'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Registry } from 'vs/platform/registry/common/platform'; From 4686ca2e6e759f769c6fad10827dc4ce53fc7aae Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 16:59:26 +0200 Subject: [PATCH 476/710] Add TextModel.getActiveIndentGuide --- src/vs/editor/common/model.ts | 14 ++ src/vs/editor/common/model/textModel.ts | 212 ++++++++++++++++-- .../common/model/textModelWithTokens.test.ts | 33 ++- 3 files changed, 235 insertions(+), 24 deletions(-) diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 607b70ac557..3f628c4136a 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -446,6 +446,15 @@ export enum TrackedRangeStickiness { GrowsOnlyWhenTypingAfter = 3, } +/** + * @internal + */ +export interface IActiveIndentGuideInfo { + startLineNumber: number; + endLineNumber: number; + indent: number; +} + /** * A model. */ @@ -857,6 +866,11 @@ export interface ITextModel { */ matchBracket(position: IPosition): [Range, Range]; + /** + * @internal + */ + getActiveIndentGuide(lineNumber: number): IActiveIndentGuideInfo; + /** * @internal */ diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index b22db35807d..48ff90c6d0c 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -2390,6 +2390,168 @@ export class TextModel extends Disposable implements model.ITextModel { return TextModel.computeIndentLevel(this._buffer.getLineContent(lineIndex + 1), this._options.tabSize); } + public getActiveIndentGuide(lineNumber: number): model.IActiveIndentGuideInfo { + this._assertNotDisposed(); + const lineCount = this.getLineCount(); + + if (lineNumber < 1 || lineNumber > lineCount) { + throw new Error('Illegal value for lineNumber'); + } + + const foldingRules = LanguageConfigurationRegistry.getFoldingRules(this._languageIdentifier.id); + const offSide = foldingRules && foldingRules.offSide; + + let up_aboveContentLineIndex = -2; /* -2 is a marker for not having computed it */ + let up_aboveContentLineIndent = -1; + let up_belowContentLineIndex = -2; /* -2 is a marker for not having computed it */ + let up_belowContentLineIndent = -1; + const up_resolveIndents = (lineNumber: number) => { + if (up_aboveContentLineIndex !== -1 && (up_aboveContentLineIndex === -2 || up_aboveContentLineIndex > lineNumber - 1)) { + up_aboveContentLineIndex = -1; + up_aboveContentLineIndent = -1; + + // must find previous line with content + for (let lineIndex = lineNumber - 2; lineIndex >= 0; lineIndex--) { + let indent = this._computeIndentLevel(lineIndex); + if (indent >= 0) { + up_aboveContentLineIndex = lineIndex; + up_aboveContentLineIndent = indent; + break; + } + } + } + + if (up_belowContentLineIndex === -2) { + up_belowContentLineIndex = -1; + up_belowContentLineIndent = -1; + + // must find next line with content + for (let lineIndex = lineNumber; lineIndex < lineCount; lineIndex++) { + let indent = this._computeIndentLevel(lineIndex); + if (indent >= 0) { + up_belowContentLineIndex = lineIndex; + up_belowContentLineIndent = indent; + break; + } + } + } + }; + + let down_aboveContentLineIndex = -2; /* -2 is a marker for not having computed it */ + let down_aboveContentLineIndent = -1; + let down_belowContentLineIndex = -2; /* -2 is a marker for not having computed it */ + let down_belowContentLineIndent = -1; + const down_resolveIndents = (lineNumber: number) => { + if (down_aboveContentLineIndex === -2) { + down_aboveContentLineIndex = -1; + down_aboveContentLineIndent = -1; + + // must find previous line with content + for (let lineIndex = lineNumber - 2; lineIndex >= 0; lineIndex--) { + let indent = this._computeIndentLevel(lineIndex); + if (indent >= 0) { + down_aboveContentLineIndex = lineIndex; + down_aboveContentLineIndent = indent; + break; + } + } + } + + if (down_belowContentLineIndex !== -1 && (down_belowContentLineIndex === -2 || down_belowContentLineIndex < lineNumber - 1)) { + down_belowContentLineIndex = -1; + down_belowContentLineIndent = -1; + + // must find next line with content + for (let lineIndex = lineNumber; lineIndex < lineCount; lineIndex++) { + let indent = this._computeIndentLevel(lineIndex); + if (indent >= 0) { + down_belowContentLineIndex = lineIndex; + down_belowContentLineIndent = indent; + break; + } + } + } + }; + + let startLineNumber = 0; + let goUp = true; + let endLineNumber = 0; + let goDown = true; + let indent = 0; + + for (let distance = 0; goUp || goDown; distance++) { + const upLineNumber = lineNumber - distance; + const downLineNumber = lineNumber + distance; + + if (upLineNumber < 1) { + goUp = false; + } + if (downLineNumber > lineCount) { + goDown = false; + } + + if (goUp) { + // compute indent level going up + let upLineIndentLevel: number; + + const currentIndent = this._computeIndentLevel(upLineNumber - 1); + if (currentIndent >= 0) { + // This line has content (besides whitespace) + // Use the line's indent + up_belowContentLineIndex = upLineNumber - 1; + up_belowContentLineIndent = currentIndent; + upLineIndentLevel = Math.ceil(currentIndent / this._options.tabSize); + } else { + up_resolveIndents(upLineNumber); + upLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, up_aboveContentLineIndent, up_belowContentLineIndent); + } + + if (distance === 0) { + // This is the initial line number + startLineNumber = upLineNumber; + endLineNumber = downLineNumber; + indent = upLineIndentLevel; + if (indent === 0) { + // No need to continue + return { startLineNumber, endLineNumber, indent }; + } + continue; + } + + if (upLineIndentLevel >= indent) { + startLineNumber = upLineNumber; + } else { + goUp = false; + } + } + + if (goDown) { + // compute indent level going down + let downLineIndentLevel: number; + + const currentIndent = this._computeIndentLevel(downLineNumber - 1); + if (currentIndent >= 0) { + // This line has content (besides whitespace) + // Use the line's indent + down_aboveContentLineIndex = downLineNumber - 1; + down_aboveContentLineIndent = currentIndent; + downLineIndentLevel = Math.ceil(currentIndent / this._options.tabSize); + } else { + down_resolveIndents(downLineNumber); + downLineIndentLevel = this._getIndentLevelForWhitespaceLine(offSide, down_aboveContentLineIndent, down_belowContentLineIndent); + } + + if (downLineIndentLevel >= indent) { + endLineNumber = downLineNumber; + } else { + goDown = false; + } + } + } + + return { startLineNumber, endLineNumber, indent }; + } + public getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] { this._assertNotDisposed(); const lineCount = this.getLineCount(); @@ -2455,32 +2617,38 @@ export class TextModel extends Disposable implements model.ITextModel { } } - if (aboveContentLineIndent === -1 || belowContentLineIndent === -1) { - // At the top or bottom of the file - result[resultIndex] = 0; + result[resultIndex] = this._getIndentLevelForWhitespaceLine(offSide, aboveContentLineIndent, belowContentLineIndent); - } else if (aboveContentLineIndent < belowContentLineIndent) { - // we are inside the region above - result[resultIndex] = (1 + Math.floor(aboveContentLineIndent / this._options.tabSize)); - - } else if (aboveContentLineIndent === belowContentLineIndent) { - // we are in between two regions - result[resultIndex] = Math.ceil(belowContentLineIndent / this._options.tabSize); - - } else { - - if (offSide) { - // same level as region below - result[resultIndex] = Math.ceil(belowContentLineIndent / this._options.tabSize); - } else { - // we are inside the region that ends below - result[resultIndex] = (1 + Math.floor(belowContentLineIndent / this._options.tabSize)); - } - - } } return result; } + + private _getIndentLevelForWhitespaceLine(offSide: boolean, aboveContentLineIndent: number, belowContentLineIndent: number): number { + if (aboveContentLineIndent === -1 || belowContentLineIndent === -1) { + // At the top or bottom of the file + return 0; + + } else if (aboveContentLineIndent < belowContentLineIndent) { + // we are inside the region above + return (1 + Math.floor(aboveContentLineIndent / this._options.tabSize)); + + } else if (aboveContentLineIndent === belowContentLineIndent) { + // we are in between two regions + return Math.ceil(belowContentLineIndent / this._options.tabSize); + + } else { + + if (offSide) { + // same level as region below + return Math.ceil(belowContentLineIndent / this._options.tabSize); + } else { + // we are inside the region that ends below + return (1 + Math.floor(belowContentLineIndent / this._options.tabSize)); + } + + } + } + //#endregion } diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index a9fae3df41a..be4d9452721 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -380,10 +380,39 @@ suite('TextModel.getLineIndentGuide', () => { actual[line - 1] = [actualIndents[line - 1], model.getLineContent(line)]; } - // let expected = lines.map(l => l[0]); - assert.deepEqual(actual, lines); + // Also test getActiveIndentGuide + for (let lineNumber = 1; lineNumber <= model.getLineCount(); lineNumber++) { + let startLineNumber = lineNumber; + let endLineNumber = lineNumber; + let indent = actualIndents[lineNumber - 1]; + + if (indent !== 0) { + for (let i = lineNumber - 1; i >= 1; i--) { + const currIndent = actualIndents[i - 1]; + if (currIndent >= indent) { + startLineNumber = i; + } else { + break; + } + } + for (let i = lineNumber + 1; i <= model.getLineCount(); i++) { + const currIndent = actualIndents[i - 1]; + if (currIndent >= indent) { + endLineNumber = i; + } else { + break; + } + } + } + + const expected = { startLineNumber, endLineNumber, indent }; + const actual = model.getActiveIndentGuide(lineNumber); + + assert.deepEqual(actual, expected, `line number ${lineNumber}`); + } + model.dispose(); } From 0100518547990f6f8584f2d4cda8c9970e973ec9 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 18:31:05 +0200 Subject: [PATCH 477/710] Highlight active indent guide (closes #14017) --- .../theme-abyss/themes/abyss-color-theme.json | 1 + .../theme-defaults/themes/dark_defaults.json | 1 + .../themes/hc_black_defaults.json | 1 + .../theme-defaults/themes/light_defaults.json | 1 + .../themes/dimmed-monokai-color-theme.json | 1 + .../themes/monokai-color-theme.json | 1 + .../themes/solarized-dark-color-theme.json | 3 +- .../themes/solarized-light-color-theme.json | 3 +- .../viewParts/indentGuides/indentGuides.css | 3 ++ .../viewParts/indentGuides/indentGuides.ts | 41 ++++++++++++++++--- .../editor/common/view/editorColorRegistry.ts | 1 + .../common/viewModel/splitLinesCollection.ts | 27 +++++++++++- src/vs/editor/common/viewModel/viewModel.ts | 3 +- .../editor/common/viewModel/viewModelImpl.ts | 6 ++- src/vs/editor/standalone/common/themes.ts | 5 ++- .../electron-browser/themeCompatibility.ts | 1 + 16 files changed, 87 insertions(+), 12 deletions(-) diff --git a/extensions/theme-abyss/themes/abyss-color-theme.json b/extensions/theme-abyss/themes/abyss-color-theme.json index 3c29932bdee..85f5f9a4a9e 100644 --- a/extensions/theme-abyss/themes/abyss-color-theme.json +++ b/extensions/theme-abyss/themes/abyss-color-theme.json @@ -309,6 +309,7 @@ "editor.lineHighlightBackground": "#082050", "editor.selectionBackground": "#770811", "editorIndentGuide.background": "#002952", + "editorIndentGuide.activeBackground": "#204972", "editorHoverWidget.background": "#000c38", "editorHoverWidget.border": "#004c18", "editorLineNumber.foreground": "#406385", diff --git a/extensions/theme-defaults/themes/dark_defaults.json b/extensions/theme-defaults/themes/dark_defaults.json index e15677c62c8..cb9e20066b5 100644 --- a/extensions/theme-defaults/themes/dark_defaults.json +++ b/extensions/theme-defaults/themes/dark_defaults.json @@ -6,6 +6,7 @@ "editor.foreground": "#D4D4D4", "editor.inactiveSelectionBackground": "#3A3D41", "editorIndentGuide.background": "#404040", + "editorIndentGuide.activeBackground": "#707070", "editor.selectionHighlightBackground": "#ADD6FF26", "list.dropBackground": "#383B3D", "activityBarBadge.background": "#007ACC", diff --git a/extensions/theme-defaults/themes/hc_black_defaults.json b/extensions/theme-defaults/themes/hc_black_defaults.json index 8833ff32c1f..4acf07cd7ab 100644 --- a/extensions/theme-defaults/themes/hc_black_defaults.json +++ b/extensions/theme-defaults/themes/hc_black_defaults.json @@ -5,6 +5,7 @@ "editor.background": "#000000", "editor.foreground": "#FFFFFF", "editorIndentGuide.background": "#FFFFFF", + "editorIndentGuide.activeBackground": "#FFFFFF", "sideBarTitle.foreground": "#FFFFFF" }, "settings": [ diff --git a/extensions/theme-defaults/themes/light_defaults.json b/extensions/theme-defaults/themes/light_defaults.json index 4e50029e23c..2ee46debb3a 100644 --- a/extensions/theme-defaults/themes/light_defaults.json +++ b/extensions/theme-defaults/themes/light_defaults.json @@ -6,6 +6,7 @@ "editor.foreground": "#000000", "editor.inactiveSelectionBackground": "#E5EBF1", "editorIndentGuide.background": "#D3D3D3", + "editorIndentGuide.activeBackground": "#939393", "editor.selectionHighlightBackground": "#ADD6FF4D", "editorSuggestWidget.background": "#F3F3F3", "activityBarBadge.background": "#007ACC", diff --git a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json index 0a45c9ffe88..20f12faee09 100644 --- a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json +++ b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json @@ -19,6 +19,7 @@ "editorCursor.foreground": "#c07020", "editorWhitespace.foreground": "#505037", "editorIndentGuide.background": "#505037", + "editorIndentGuide.activeBackground": "#707057", "editorGroupHeader.tabsBackground": "#282828", "editorGroup.background": "#1e1e1e", "tab.inactiveBackground": "#404040", diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index 610bf0dc5a2..439ed05190e 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -28,6 +28,7 @@ "editorCursor.foreground": "#f8f8f0", "editorWhitespace.foreground": "#464741", "editorIndentGuide.background": "#464741", + "editorIndentGuide.activeBackground": "#767771", "editorGroupHeader.tabsBackground": "#1e1f1c", "editorGroup.dropBackground": "#41433980", "tab.inactiveBackground": "#414339", diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index 2f5db67fbad..7d77408d2e7 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -357,7 +357,8 @@ "editor.lineHighlightBackground": "#073642", "editorLineNumber.activeForeground": "#949494", "editor.selectionBackground": "#073642", - // "editorIndentGuide.background": "", + "editorIndentGuide.background": "#93A1A180", + "editorIndentGuide.activeBackground": "#C3E1E180", "editorHoverWidget.background": "#004052", // "editorHoverWidget.border": "", // "editorLineNumber.foreground": "", diff --git a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json index d752a613c38..588e21e8933 100644 --- a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json +++ b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json @@ -352,7 +352,8 @@ "editorWhitespace.foreground": "#586E7580", "editor.lineHighlightBackground": "#EEE8D5", "editor.selectionBackground": "#EEE8D5", - // "editorIndentGuide.background": "", + "editorIndentGuide.background": "#586E7580", + "editorIndentGuide.activeBackground": "#081E2580", "editorHoverWidget.background": "#CCC4B0", "editorLineNumber.activeForeground": "#567983", // "editorHoverWidget.border": "", diff --git a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.css b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.css index 45992137d18..3055ad67e4e 100644 --- a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.css +++ b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.css @@ -10,3 +10,6 @@ .monaco-editor .lines-content .cigr { position: absolute; } +.monaco-editor .lines-content .cigra { + position: absolute; +} diff --git a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts index b8ad9dadd68..8834b5fed88 100644 --- a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts +++ b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts @@ -11,12 +11,13 @@ import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; +import { editorIndentGuides, editorActiveIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; import { Position } from 'vs/editor/common/core/position'; export class IndentGuidesOverlay extends DynamicViewOverlay { private _context: ViewContext; + private _primaryLineNumber: number; private _lineHeight: number; private _spaceWidth: number; private _renderResult: string[]; @@ -25,6 +26,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { constructor(context: ViewContext) { super(); this._context = context; + this._primaryLineNumber = 0; this._lineHeight = this._context.configuration.editor.lineHeight; this._spaceWidth = this._context.configuration.editor.fontInfo.spaceWidth; this._enabled = this._context.configuration.editor.viewInfo.renderIndentGuides; @@ -54,6 +56,17 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { } return true; } + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { + const selection = e.selections[0]; + const newPrimaryLineNumber = selection.isEmpty() ? selection.positionLineNumber : 0; + + if (this._primaryLineNumber !== newPrimaryLineNumber) { + this._primaryLineNumber = newPrimaryLineNumber; + return true; + } + + return false; + } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { // true for inline decorations return true; @@ -97,16 +110,28 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { const indents = this._context.model.getLinesIndentGuides(visibleStartLineNumber, visibleEndLineNumber); + let activeIndentStartLineNumber = 0; + let activeIndentEndLineNumber = 0; + let activeIndentLevel = 0; + if (this._primaryLineNumber) { + const activeIndentInfo = this._context.model.getActiveIndentGuide(this._primaryLineNumber); + activeIndentStartLineNumber = activeIndentInfo.startLineNumber; + activeIndentEndLineNumber = activeIndentInfo.endLineNumber; + activeIndentLevel = activeIndentInfo.indent; + } + let output: string[] = []; for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { + const containsActiveIndentGuide = (activeIndentStartLineNumber <= lineNumber && lineNumber <= activeIndentEndLineNumber); const lineIndex = lineNumber - visibleStartLineNumber; const indent = indents[lineIndex]; let result = ''; let leftMostVisiblePosition = ctx.visibleRangeForPosition(new Position(lineNumber, 1)); let left = leftMostVisiblePosition ? leftMostVisiblePosition.left : 0; - for (let i = 0; i < indent; i++) { - result += `
`; + for (let i = 1; i <= indent; i++) { + let className = (containsActiveIndentGuide && i === activeIndentLevel ? 'cigra' : 'cigr'); + result += `
`; left += tabWidth; } @@ -128,8 +153,12 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { } registerThemingParticipant((theme, collector) => { - let editorGuideColor = theme.getColor(editorIndentGuides); - if (editorGuideColor) { - collector.addRule(`.monaco-editor .lines-content .cigr { box-shadow: 1px 0 0 0 ${editorGuideColor} inset; }`); + let editorIndentGuidesColor = theme.getColor(editorIndentGuides); + if (editorIndentGuidesColor) { + collector.addRule(`.monaco-editor .lines-content .cigr { box-shadow: 1px 0 0 0 ${editorIndentGuidesColor} inset; }`); + } + let editorActiveIndentGuidesColor = theme.getColor(editorActiveIndentGuides) || editorIndentGuidesColor; + if (editorActiveIndentGuidesColor) { + collector.addRule(`.monaco-editor .lines-content .cigra { box-shadow: 1px 0 0 0 ${editorActiveIndentGuidesColor} inset; }`); } }); diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 9bafc0f45c2..92f67358ba7 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -20,6 +20,7 @@ export const editorCursorForeground = registerColor('editorCursor.foreground', { export const editorCursorBackground = registerColor('editorCursor.background', null, nls.localize('editorCursorBackground', 'The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.')); export const editorWhitespaces = registerColor('editorWhitespace.foreground', { dark: '#e3e4e229', light: '#33333333', hc: '#e3e4e229' }, nls.localize('editorWhitespaces', 'Color of whitespace characters in the editor.')); export const editorIndentGuides = registerColor('editorIndentGuide.background', { dark: editorWhitespaces, light: editorWhitespaces, hc: editorWhitespaces }, nls.localize('editorIndentGuides', 'Color of the editor indentation guides.')); +export const editorActiveIndentGuides = registerColor('editorIndentGuide.activeBackground', { dark: editorWhitespaces, light: editorWhitespaces, hc: editorWhitespaces }, nls.localize('editorActiveIndentGuide', 'Color of the active editor indentation guides.')); export const editorLineNumbers = registerColor('editorLineNumber.foreground', { dark: '#5A5A5A', light: '#2B91AF', hc: Color.white }, nls.localize('editorLineNumbers', 'Color of editor line numbers.')); const deprecatedEditorActiveLineNumber = registerColor('editorActiveLineNumber.foreground', { dark: null, light: null, hc: null }, nls.localize('editorActiveLineNumber', 'Color of editor active line number'), false, nls.localize('deprecatedEditorActiveLineNumber', 'Id is deprecated. Use \'editorLineNumber.activeForeground\' instead.')); diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index b80a077c786..73f02436877 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -14,7 +14,7 @@ import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; import { ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from 'vs/editor/common/model/textModel'; import { ThemeColor, ITheme } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; -import { IModelDecoration, ITextModel, IModelDeltaDecoration, EndOfLinePreference } from 'vs/editor/common/model'; +import { IModelDecoration, ITextModel, IModelDeltaDecoration, EndOfLinePreference, IActiveIndentGuideInfo } from 'vs/editor/common/model'; export class OutputPosition { _outputPositionBrand: void; @@ -82,6 +82,7 @@ export interface IViewModelLinesCollection { getViewLineCount(): number; warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void; + getActiveIndentGuide(viewLineNumber: number): IActiveIndentGuideInfo; getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[]; getViewLineContent(viewLineNumber: number): string; getViewLineLength(viewLineNumber: number): number; @@ -504,6 +505,22 @@ export class SplitLinesCollection implements IViewModelLinesCollection { this.prefixSumComputer.warmUpCache(viewStartLineNumber - 1, viewEndLineNumber - 1); } + public getActiveIndentGuide(viewLineNumber: number): IActiveIndentGuideInfo { + this._ensureValidState(); + viewLineNumber = this._toValidViewLineNumber(viewLineNumber); + + const modelPosition = this.convertViewPositionToModelPosition(viewLineNumber, this.getViewLineMinColumn(viewLineNumber)); + const result = this.model.getActiveIndentGuide(modelPosition.lineNumber); + + const viewStartPosition = this.convertModelPositionToViewPosition(result.startLineNumber, 1); + const viewEndPosition = this.convertModelPositionToViewPosition(result.endLineNumber, 1); + return { + startLineNumber: viewStartPosition.lineNumber, + endLineNumber: viewEndPosition.lineNumber, + indent: result.indent + }; + } + public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] { this._ensureValidState(); viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber); @@ -1241,6 +1258,14 @@ export class IdentityLinesCollection implements IViewModelLinesCollection { public warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void { } + public getActiveIndentGuide(viewLineNumber: number): IActiveIndentGuideInfo { + return { + startLineNumber: viewLineNumber, + endLineNumber: viewLineNumber, + indent: 0 + }; + } + public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] { const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1; let result = new Array(viewLineCount); diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index b9ce5b257ce..c97d919393a 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -5,7 +5,7 @@ 'use strict'; import { INewScrollPosition } from 'vs/editor/common/editorCommon'; -import { EndOfLinePreference, IModelDecorationOptions } from 'vs/editor/common/model'; +import { EndOfLinePreference, IModelDecorationOptions, IActiveIndentGuideInfo } from 'vs/editor/common/model'; import { IViewLineTokens } from 'vs/editor/common/core/lineTokens'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -132,6 +132,7 @@ export interface IViewModel { getLineCount(): number; getLineContent(lineNumber: number): string; getLineLength(lineNumber: number): number; + getActiveIndentGuide(lineNumber: number): IActiveIndentGuideInfo; getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[]; getLineMinColumn(lineNumber: number): number; getLineMaxColumn(lineNumber: number): number; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 3f9ff85de8c..8fbfa9939e7 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -23,7 +23,7 @@ import { Color } from 'vs/base/common/color'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ITheme } from 'vs/platform/theme/common/themeService'; import { ModelDecorationOverviewRulerOptions } from 'vs/editor/common/model/textModel'; -import { ITextModel, EndOfLinePreference, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { ITextModel, EndOfLinePreference, TrackedRangeStickiness, IActiveIndentGuideInfo } from 'vs/editor/common/model'; const USE_IDENTITY_LINES_COLLECTION = true; @@ -451,6 +451,10 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel this.viewportStartLineTop = this.viewLayout.getVerticalOffsetForLineNumber(startLineNumber); } + public getActiveIndentGuide(lineNumber: number): IActiveIndentGuideInfo { + return this.lines.getActiveIndentGuide(lineNumber); + } + public getLinesIndentGuides(startLineNumber: number, endLineNumber: number): number[] { return this.lines.getViewLinesIndentGuides(startLineNumber, endLineNumber); } diff --git a/src/vs/editor/standalone/common/themes.ts b/src/vs/editor/standalone/common/themes.ts index 0a51ad13ed8..5ac8ffea7e7 100644 --- a/src/vs/editor/standalone/common/themes.ts +++ b/src/vs/editor/standalone/common/themes.ts @@ -7,7 +7,7 @@ import { IStandaloneThemeData } from 'vs/editor/standalone/common/standaloneThemeService'; import { editorBackground, editorForeground, editorSelectionHighlight, editorInactiveSelection } from 'vs/platform/theme/common/colorRegistry'; -import { editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; +import { editorIndentGuides, editorActiveIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; /* -------------------------------- Begin vs theme -------------------------------- */ export const vs: IStandaloneThemeData = { @@ -74,6 +74,7 @@ export const vs: IStandaloneThemeData = { [editorForeground]: '#000000', [editorInactiveSelection]: '#E5EBF1', [editorIndentGuides]: '#D3D3D3', + [editorActiveIndentGuides]: '#939393', [editorSelectionHighlight]: '#ADD6FF4D' } }; @@ -144,6 +145,7 @@ export const vs_dark: IStandaloneThemeData = { [editorForeground]: '#D4D4D4', [editorInactiveSelection]: '#3A3D41', [editorIndentGuides]: '#404040', + [editorActiveIndentGuides]: '#707070', [editorSelectionHighlight]: '#ADD6FF26' } }; @@ -205,6 +207,7 @@ export const hc_black: IStandaloneThemeData = { [editorBackground]: '#000000', [editorForeground]: '#FFFFFF', [editorIndentGuides]: '#FFFFFF', + [editorActiveIndentGuides]: '#FFFFFF', } }; /* -------------------------------- End hc-black theme -------------------------------- */ diff --git a/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts b/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts index a05bfc5cf4f..7ce9567369d 100644 --- a/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts +++ b/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts @@ -66,6 +66,7 @@ addSettingMapping('rangeHighlight', editorColorRegistry.editorRangeHighlight); addSettingMapping('caret', editorColorRegistry.editorCursorForeground); addSettingMapping('invisibles', editorColorRegistry.editorWhitespaces); addSettingMapping('guide', editorColorRegistry.editorIndentGuides); +addSettingMapping('activeGuide', editorColorRegistry.editorActiveIndentGuides); const ansiColorMap = ['ansiBlack', 'ansiRed', 'ansiGreen', 'ansiYellow', 'ansiBlue', 'ansiMagenta', 'ansiCyan', 'ansiWhite', 'ansiBrightBlack', 'ansiBrightRed', 'ansiBrightGreen', 'ansiBrightYellow', 'ansiBrightBlue', 'ansiBrightMagenta', 'ansiBrightCyan', 'ansiBrightWhite' From a443a44f40a6ab6595101f418e5fac91b5c93d10 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 09:57:09 -0700 Subject: [PATCH 478/710] Support WSL for multi-line prompt clearing --- .../parts/terminal/electron-browser/terminalInstance.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index b81c277f4c3..654333e1b3a 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -567,7 +567,7 @@ export class TerminalInstance implements ITerminalInstance { } public clear(): void { - if (paths.basename(this._shellLaunchConfig.executable).match(/zsh|bash/)) { + if (this._shellLaunchConfig.executable && paths.basename(this._shellLaunchConfig.executable).match(/^(zsh|bash|bash\.exe)$/)) { // If a supported shell is being used, clear xterm scrollback then clear shell (^L) this._xterm.write('\x1b[3J'); this._processManager.write('\x0c'); From 0dc8e7f5bc82f5911d0b30f2bab8ad21eb2e4285 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 19:23:10 +0200 Subject: [PATCH 479/710] Fixes #32568: A ResolvedKeybinding must have a first part --- .../platform/keybinding/common/usLayoutResolvedKeybinding.ts | 3 +-- .../services/keybinding/common/macLinuxKeyboardMapper.ts | 3 +++ .../services/keybinding/common/windowsKeyboardMapper.ts | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts index 78861625e1a..a0c923e8078 100644 --- a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts +++ b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts @@ -21,8 +21,7 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding { super(); this._os = OS; if (actual === null) { - this._firstPart = null; - this._chordPart = null; + throw new Error(`Invalid USLayoutResolvedKeybinding`); } else if (actual.type === KeybindingType.Chord) { this._firstPart = actual.firstPart; this._chordPart = actual.chordPart; diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index 2bb8da1d890..1c56f4f0dde 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -74,6 +74,9 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { constructor(mapper: MacLinuxKeyboardMapper, OS: OperatingSystem, firstPart: ScanCodeBinding, chordPart: ScanCodeBinding) { super(); + if (!firstPart) { + throw new Error(`Invalid USLayoutResolvedKeybinding`); + } this._mapper = mapper; this._OS = OS; this._firstPart = firstPart; diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 02c1dac816c..869932b1b18 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -86,6 +86,9 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { constructor(mapper: WindowsKeyboardMapper, firstPart: SimpleKeybinding, chordPart: SimpleKeybinding) { super(); + if (!firstPart) { + throw new Error(`Invalid WindowsNativeResolvedKeybinding firstPart`); + } this._mapper = mapper; this._firstPart = firstPart; this._chordPart = chordPart; From 6c760803623b5143299a1c22504f5ad4269dc446 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 19:27:43 +0200 Subject: [PATCH 480/710] Fixes #32565 --- src/vs/editor/common/model/textModel.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 48ff90c6d0c..3f50b4cf63e 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -2111,6 +2111,10 @@ export class TextModel extends Disposable implements model.ITextModel { } private _matchFoundBracket(foundBracket: Range, data: RichEditBracket, isOpen: boolean): [Range, Range] { + if (!data) { + return null; + } + if (isOpen) { let matched = this._findMatchingBracketDown(data, foundBracket.getEndPosition()); if (matched) { From 2fadb901982adf9f52e743a95a4f290d3752c920 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 18 Apr 2018 10:51:33 -0700 Subject: [PATCH 481/710] Move TS/JS to use organize imports codeAction instead of command (#47850) * Move TS/JS to use organize imports code action Fixes #47845 Fixes #46647 - Defines a new standard `SourceOrganizeImports` `CodeActionKind` to be used to implement organize imports in a consistent way. - Add a new `Organize imports` command and keybinding that executes these actions. - Move over the existing js/ts organize imports command to use the new code action kind * Use supportedCodeActions context key * Document code action kind values * Fix regular expression Make sure we only match whole scopes and not `unicorn.source.organizeImports` --- .../typescript-language-features/package.json | 34 -------- .../package.nls.json | 1 - .../src/extension.ts | 7 -- .../src/features/organizeImports.ts | 81 ++++++------------- .../src/languageProvider.ts | 10 ++- .../contrib/codeAction/codeActionCommands.ts | 45 ++++++++++- .../codeAction/codeActionContributions.ts | 3 +- .../contrib/codeAction/codeActionModel.ts | 32 +++----- .../contrib/codeAction/codeActionTrigger.ts | 1 + src/vs/vscode.d.ts | 17 ++-- src/vs/workbench/api/node/extHostTypes.ts | 1 + 11 files changed, 95 insertions(+), 137 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 649154ef5fe..836a370e785 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -39,7 +39,6 @@ "onCommand:javascript.goToProjectConfig", "onCommand:typescript.goToProjectConfig", "onCommand:typescript.openTsServerLog", - "onCommand:typescript.organizeImports", "onCommand:workbench.action.tasks.runTask" ], "main": "./out/extension", @@ -464,23 +463,6 @@ "command": "typescript.restartTsServer", "title": "%typescript.restartTsServer%", "category": "TypeScript" - }, - { - "command": "typescript.organizeImports", - "title": "%typescript.organizeImports%", - "category": "TypeScript" - }, - { - "command": "javascript.organizeImports", - "title": "%typescript.organizeImports%", - "category": "JavaScript" - } - ], - "keybindings": [ - { - "command": "typescript.organizeImports", - "key": "shift+alt+o", - "when": "typescript.isManagedFile && typescript.canOrganizeImports" } ], "menus": { @@ -528,22 +510,6 @@ { "command": "typescript.restartTsServer", "when": "typescript.isManagedFile" - }, - { - "command": "typescript.organizeImports", - "when": "editorLangId == typescriptreact && typescript.isManagedFile && typescript.canOrganizeImports" - }, - { - "command": "typescript.organizeImports", - "when": "editorLangId == typescript && typescript.isManagedFile && typescript.canOrganizeImports" - }, - { - "command": "javascript.organizeImports", - "when": "editorLangId == javascriptreact && typescript.isManagedFile && typescript.canOrganizeImports" - }, - { - "command": "javascript.organizeImports", - "when": "editorLangId == javascript && typescript.isManagedFile && typescript.canOrganizeImports" } ] }, diff --git a/extensions/typescript-language-features/package.nls.json b/extensions/typescript-language-features/package.nls.json index d3d8458eef0..18ab9fadd9a 100644 --- a/extensions/typescript-language-features/package.nls.json +++ b/extensions/typescript-language-features/package.nls.json @@ -53,7 +53,6 @@ "typescript.autoImportSuggestions.enabled": "Enable/disable auto import suggestions. Requires TypeScript >=2.6.1", "typescript.experimental.syntaxFolding": "Enables/disables syntax aware folding markers.", "taskDefinition.tsconfig.description": "The tsconfig file that defines the TS build.", - "typescript.organizeImports": "Organize Imports", "javascript.suggestionActions.enabled": "Enable/disable suggestion diagnostics for JavaScript files in the editor. Requires TypeScript >= 2.8", "typescript.suggestionActions.enabled": "Enable/disable suggestion diagnostics for TypeScript files in the editor. Requires TypeScript >= 2.8." } \ No newline at end of file diff --git a/extensions/typescript-language-features/src/extension.ts b/extensions/typescript-language-features/src/extension.ts index ac33918d1c2..960296b0491 100644 --- a/extensions/typescript-language-features/src/extension.ts +++ b/extensions/typescript-language-features/src/extension.ts @@ -19,7 +19,6 @@ import ManagedFileContextManager from './utils/managedFileContext'; import { lazy, Lazy } from './utils/lazy'; import * as fileSchemes from './utils/fileSchemes'; import LogDirectoryProvider from './utils/logDirectoryProvider'; -import { OrganizeImportsCommand, OrganizeImportsContextManager } from './features/organizeImports'; export function activate( context: vscode.ExtensionContext @@ -74,11 +73,6 @@ function createLazyClientHost( context.subscriptions.push(clientHost); - const organizeImportsContext = new OrganizeImportsContextManager(); - clientHost.serviceClient.onTsServerStarted(api => { - organizeImportsContext.onDidChangeApiVersion(api); - }, null, context.subscriptions); - clientHost.serviceClient.onReady(() => { context.subscriptions.push( ProjectStatus.create( @@ -103,7 +97,6 @@ function registerCommands( commandManager.register(new commands.RestartTsServerCommand(lazyClientHost)); commandManager.register(new commands.TypeScriptGoToProjectConfigCommand(lazyClientHost)); commandManager.register(new commands.JavaScriptGoToProjectConfigCommand(lazyClientHost)); - commandManager.register(new OrganizeImportsCommand(lazyClientHost)); } function isSupportedDocument( diff --git a/extensions/typescript-language-features/src/features/organizeImports.ts b/extensions/typescript-language-features/src/features/organizeImports.ts index 96bf276d3cb..2fe5f9e71d2 100644 --- a/extensions/typescript-language-features/src/features/organizeImports.ts +++ b/extensions/typescript-language-features/src/features/organizeImports.ts @@ -4,37 +4,27 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; - +import * as nls from 'vscode-nls'; import * as Proto from '../protocol'; -import { Command } from '../utils/commandManager'; +import { ITypeScriptServiceClient } from '../typescriptService'; +import { Command, CommandManager } from '../utils/commandManager'; +import { isSupportedLanguageMode } from '../utils/languageModeIds'; import * as typeconverts from '../utils/typeConverters'; -import { isSupportedLanguageMode } from '../utils/languageModeIds'; -import API from '../utils/api'; -import { Lazy } from '../utils/lazy'; -import TypeScriptServiceClientHost from '../typeScriptServiceClientHost'; -import { ITypeScriptServiceClient } from '../typescriptService'; -import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -export class OrganizeImportsCommand implements Command { - public static readonly Ids = ['javascript.organizeImports', 'typescript.organizeImports']; +class OrganizeImportsCommand implements Command { + public static readonly Id = '_typescript.organizeImports'; - public readonly id = OrganizeImportsCommand.Ids; + public readonly id = OrganizeImportsCommand.Id; constructor( - private readonly lazyClientHost: Lazy + private readonly client: ITypeScriptServiceClient ) { } public async execute(): Promise { - // Don't force activation - if (!this.lazyClientHost.hasValue) { - return false; - } - - const client = this.lazyClientHost.value.serviceClient; - if (!client.apiVersion.has280Features()) { + if (!this.client.apiVersion.has280Features()) { return false; } @@ -43,7 +33,7 @@ export class OrganizeImportsCommand implements Command { return false; } - const file = client.normalizePath(editor.document.uri); + const file = this.client.normalizePath(editor.document.uri); if (!file) { return false; } @@ -56,67 +46,42 @@ export class OrganizeImportsCommand implements Command { } } }; - const response = await client.execute('organizeImports', args); + const response = await this.client.execute('organizeImports', args); if (!response || !response.success) { return false; } - const edits = typeconverts.WorkspaceEdit.fromFromFileCodeEdits(client, response.body); + const edits = typeconverts.WorkspaceEdit.fromFromFileCodeEdits(this.client, response.body); return await vscode.workspace.applyEdit(edits); } } -/** - * When clause context set when the ts version supports organize imports. - */ -const contextName = 'typescript.canOrganizeImports'; - -export class OrganizeImportsContextManager { - - private currentValue: boolean = false; - - public onDidChangeApiVersion(apiVersion: API): any { - this.updateContext(apiVersion.has280Features()); - } - - private updateContext(newValue: boolean) { - if (newValue === this.currentValue) { - return; - } - - vscode.commands.executeCommand('setContext', contextName, newValue); - this.currentValue = newValue; - } -} - - export class OrganizeImportsCodeActionProvider implements vscode.CodeActionProvider { - private static readonly organizeImportsKind = vscode.CodeActionKind.Source.append('organizeImports'); - public constructor( - private readonly client: ITypeScriptServiceClient - ) { } + private readonly client: ITypeScriptServiceClient, + commandManager: CommandManager + ) { + commandManager.register(new OrganizeImportsCommand(client)); + } public readonly metadata: vscode.CodeActionProviderMetadata = { - providedCodeActionKinds: [OrganizeImportsCodeActionProvider.organizeImportsKind] + providedCodeActionKinds: [vscode.CodeActionKind.SourceOrganizeImports] }; public provideCodeActions( - document: vscode.TextDocument, + _document: vscode.TextDocument, _range: vscode.Range, _context: vscode.CodeActionContext, _token: vscode.CancellationToken ): vscode.CodeAction[] { - if (!isSupportedLanguageMode(document)) { - return []; - } - if (!this.client.apiVersion.has280Features()) { return []; } - const action = new vscode.CodeAction(localize('oraganizeImportsAction.title', "Organize Imports"), OrganizeImportsCodeActionProvider.organizeImportsKind); - action.command = { title: '', command: OrganizeImportsCommand.Ids[0] }; + const action = new vscode.CodeAction( + localize('oraganizeImportsAction.title', "Organize Imports"), + vscode.CodeActionKind.SourceOrganizeImports); + action.command = { title: '', command: OrganizeImportsCommand.Id }; return [action]; } } \ No newline at end of file diff --git a/extensions/typescript-language-features/src/languageProvider.ts b/extensions/typescript-language-features/src/languageProvider.ts index f23c7fab620..b2cdbf56456 100644 --- a/extensions/typescript-language-features/src/languageProvider.ts +++ b/extensions/typescript-language-features/src/languageProvider.ts @@ -43,7 +43,7 @@ export default class LanguageProvider { constructor( private readonly client: TypeScriptServiceClient, private readonly description: LanguageDescription, - commandManager: CommandManager, + private readonly commandManager: CommandManager, typingsStatus: TypingsStatus ) { this.formattingOptionsManager = new FormattingConfigurationManager(client); @@ -123,9 +123,6 @@ export default class LanguageProvider { const refactorProvider = new (await import('./features/refactorProvider')).default(client, this.formattingOptionsManager, commandManager); this.disposables.push(languages.registerCodeActionsProvider(selector, refactorProvider, refactorProvider.metadata)); - const organizeImportsProvider = new (await import('./features/organizeImports')).OrganizeImportsCodeActionProvider(client); - this.disposables.push(languages.registerCodeActionsProvider(selector, organizeImportsProvider, organizeImportsProvider.metadata)); - await this.initFoldingProvider(); this.disposables.push(workspace.onDidChangeConfiguration(c => { if (c.affectsConfiguration(foldingSetting)) { @@ -247,6 +244,11 @@ export default class LanguageProvider { if (this.client.apiVersion.has213Features()) { this.versionDependentDisposables.push(languages.registerTypeDefinitionProvider(selector, new (await import('./features/typeDefinitionProvider')).default(this.client))); } + + if (this.client.apiVersion.has280Features()) { + const organizeImportsProvider = new (await import('./features/organizeImports')).OrganizeImportsCodeActionProvider(this.client, this.commandManager); + this.versionDependentDisposables.push(languages.registerCodeActionsProvider(selector, organizeImportsProvider, organizeImportsProvider.metadata)); + } } public triggerAllDiagnostics(): void { diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index 9f9464324a3..3083b047c8d 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -22,10 +22,17 @@ import { IFileService } from 'vs/platform/files/common/files'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IMarkerService } from 'vs/platform/markers/common/markers'; -import { CodeActionModel, CodeActionsComputeEvent, HAS_REFACTOR_PROVIDER, HAS_SOURCE_ACTION_PROVIDER } from './codeActionModel'; +import { CodeActionModel, CodeActionsComputeEvent, SUPPORTED_CODE_ACTIONS } from './codeActionModel'; import { CodeActionAutoApply, CodeActionFilter, CodeActionKind } from './codeActionTrigger'; import { CodeActionContextMenu } from './codeActionWidget'; import { LightBulbWidget } from './lightBulbWidget'; +import { escapeRegExpCharacters } from 'vs/base/common/strings'; + +function contextKeyForSupportedActions(kind: CodeActionKind) { + return ContextKeyExpr.regex( + SUPPORTED_CODE_ACTIONS.keys()[0], + new RegExp('(\\s|^)' + escapeRegExpCharacters(kind.value) + '\\b')); +} export class QuickFixController implements IEditorContribution { @@ -247,7 +254,9 @@ export class RefactorAction extends EditorAction { menuOpts: { group: '1_modification', order: 2, - when: ContextKeyExpr.and(EditorContextKeys.writable, HAS_REFACTOR_PROVIDER), + when: ContextKeyExpr.and( + EditorContextKeys.writable, + contextKeyForSupportedActions(CodeActionKind.Refactor)), } }); } @@ -274,8 +283,9 @@ export class SourceAction extends EditorAction { menuOpts: { group: '1_modification', order: 2.1, - when: ContextKeyExpr.and(EditorContextKeys.writable, HAS_SOURCE_ACTION_PROVIDER), - + when: ContextKeyExpr.and( + EditorContextKeys.writable, + contextKeyForSupportedActions(CodeActionKind.Source)), } }); } @@ -286,4 +296,31 @@ export class SourceAction extends EditorAction { { kind: CodeActionKind.Source, includeSourceActions: true }, CodeActionAutoApply.Never); } +} + +export class OrganizeImportsAction extends EditorAction { + + static readonly Id = 'editor.action.organizeImports'; + + constructor() { + super({ + id: OrganizeImportsAction.Id, + label: nls.localize('organizeImports.label', "Organize Imports"), + alias: 'Organize Imports', + precondition: ContextKeyExpr.and( + EditorContextKeys.writable, + contextKeyForSupportedActions(CodeActionKind.SourceOrganizeImports)), + kbOpts: { + kbExpr: EditorContextKeys.editorTextFocus, + primary: KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_O + } + }); + } + + public run(accessor: ServicesAccessor, editor: ICodeEditor): void { + return showCodeActionsForEditorSelection(editor, + nls.localize('editor.action.organize.noneMessage', "No organize imports action available"), + { kind: CodeActionKind.SourceOrganizeImports, includeSourceActions: true }, + CodeActionAutoApply.IfSingle); + } } \ No newline at end of file diff --git a/src/vs/editor/contrib/codeAction/codeActionContributions.ts b/src/vs/editor/contrib/codeAction/codeActionContributions.ts index 52df471057f..8653b935470 100644 --- a/src/vs/editor/contrib/codeAction/codeActionContributions.ts +++ b/src/vs/editor/contrib/codeAction/codeActionContributions.ts @@ -4,11 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { registerEditorAction, registerEditorCommand, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; -import { SourceAction, QuickFixController, QuickFixAction, CodeActionCommand, RefactorAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; +import { SourceAction, QuickFixController, QuickFixAction, CodeActionCommand, RefactorAction, OrganizeImportsAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; registerEditorContribution(QuickFixController); registerEditorAction(QuickFixAction); registerEditorAction(RefactorAction); registerEditorAction(SourceAction); +registerEditorAction(OrganizeImportsAction); registerEditorCommand(new CodeActionCommand()); diff --git a/src/vs/editor/contrib/codeAction/codeActionModel.ts b/src/vs/editor/contrib/codeAction/codeActionModel.ts index 7e7fe02e1f2..a369f31e28e 100644 --- a/src/vs/editor/contrib/codeAction/codeActionModel.ts +++ b/src/vs/editor/contrib/codeAction/codeActionModel.ts @@ -15,10 +15,9 @@ import { CodeAction, CodeActionProviderRegistry } from 'vs/editor/common/modes'; import { IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { getCodeActions } from './codeAction'; -import { CodeActionKind, CodeActionTrigger } from './codeActionTrigger'; +import { CodeActionTrigger } from './codeActionTrigger'; -export const HAS_REFACTOR_PROVIDER = new RawContextKey('hasRefactorProvider', false); -export const HAS_SOURCE_ACTION_PROVIDER = new RawContextKey('hasSourceActionProvider', false); +export const SUPPORTED_CODE_ACTIONS = new RawContextKey('supportedCodeAction', ''); export class CodeActionOracle { @@ -144,15 +143,13 @@ export class CodeActionModel { private _codeActionOracle: CodeActionOracle; private _onDidChangeFixes = new Emitter(); private _disposables: IDisposable[] = []; - private readonly _hasRefactorProvider: IContextKey; - private readonly _hasSourceProvider: IContextKey; + private readonly _supportedCodeActions: IContextKey; constructor(editor: ICodeEditor, markerService: IMarkerService, contextKeyService: IContextKeyService) { this._editor = editor; this._markerService = markerService; - this._hasRefactorProvider = HAS_REFACTOR_PROVIDER.bindTo(contextKeyService); - this._hasSourceProvider = HAS_SOURCE_ACTION_PROVIDER.bindTo(contextKeyService); + this._supportedCodeActions = SUPPORTED_CODE_ACTIONS.bindTo(contextKeyService); this._disposables.push(this._editor.onDidChangeModel(() => this._update())); this._disposables.push(this._editor.onDidChangeModelLanguage(() => this._update())); @@ -182,28 +179,19 @@ export class CodeActionModel { && CodeActionProviderRegistry.has(this._editor.getModel()) && !this._editor.getConfiguration().readOnly) { - let hasRefactorProvider = false; - let hasSourceProvider = false; - outer: for (const provider of CodeActionProviderRegistry.all(this._editor.getModel())) { - if (!provider.providedCodeActionKinds) { - continue; - } - for (const providedKind of provider.providedCodeActionKinds) { - hasRefactorProvider = hasRefactorProvider || CodeActionKind.Refactor.contains(providedKind); - hasSourceProvider = hasSourceProvider || CodeActionKind.Source.contains(providedKind); - if (hasRefactorProvider && hasSourceProvider) { - break outer; - } + const supportedActions: string[] = []; + for (const provider of CodeActionProviderRegistry.all(this._editor.getModel())) { + if (Array.isArray(provider.providedCodeActionKinds)) { + supportedActions.push(...provider.providedCodeActionKinds); } } - this._hasRefactorProvider.set(hasRefactorProvider); - this._hasSourceProvider.set(hasSourceProvider); + this._supportedCodeActions.set(supportedActions.join(' ')); this._codeActionOracle = new CodeActionOracle(this._editor, this._markerService, p => this._onDidChangeFixes.fire(p)); this._codeActionOracle.trigger({ type: 'auto' }); } else { - this._hasRefactorProvider.reset(); + this._supportedCodeActions.reset(); } } diff --git a/src/vs/editor/contrib/codeAction/codeActionTrigger.ts b/src/vs/editor/contrib/codeAction/codeActionTrigger.ts index 382c8ebda68..4f3c53b5dc9 100644 --- a/src/vs/editor/contrib/codeAction/codeActionTrigger.ts +++ b/src/vs/editor/contrib/codeAction/codeActionTrigger.ts @@ -11,6 +11,7 @@ export class CodeActionKind { public static readonly Empty = new CodeActionKind(''); public static readonly Refactor = new CodeActionKind('refactor'); public static readonly Source = new CodeActionKind('source'); + public static readonly SourceOrganizeImports = new CodeActionKind('source.organizeImports'); constructor( public readonly value: string diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 73c2a2ee364..85bb26a4ed0 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1887,17 +1887,17 @@ declare module 'vscode' { static readonly Empty: CodeActionKind; /** - * Base kind for quickfix actions. + * Base kind for quickfix actions: `quickfix` */ static readonly QuickFix: CodeActionKind; /** - * Base kind for refactoring actions. + * Base kind for refactoring actions: `refactor` */ static readonly Refactor: CodeActionKind; /** - * Base kind for refactoring extraction actions. + * Base kind for refactoring extraction actions: `refactor.extract` * * Example extract actions: * @@ -1910,7 +1910,7 @@ declare module 'vscode' { static readonly RefactorExtract: CodeActionKind; /** - * Base kind for refactoring inline actions. + * Base kind for refactoring inline actions: `refactor.inline` * * Example inline actions: * @@ -1922,7 +1922,7 @@ declare module 'vscode' { static readonly RefactorInline: CodeActionKind; /** - * Base kind for refactoring rewrite actions. + * Base kind for refactoring rewrite actions: `refactor.rewrite` * * Example rewrite actions: * @@ -1936,12 +1936,17 @@ declare module 'vscode' { static readonly RefactorRewrite: CodeActionKind; /** - * Base kind for source actions. + * Base kind for source actions: `source` * * Source code actions apply to the entire file. */ static readonly Source: CodeActionKind; + /** + * Base kind for an organize imports source action: `source.organizeImports` + */ + static readonly SourceOrganizeImports: CodeActionKind; + private constructor(value: string); /** diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index d4da587fb9e..f877921b5d5 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -904,6 +904,7 @@ export class CodeActionKind { 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: string From 811b7441b350e929715f41eb6437f1608517f491 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 10:52:31 -0700 Subject: [PATCH 482/710] Clean up process creation and check connected before sending --- .../api/node/extHostTerminalService.ts | 47 ++++++++----------- .../node/terminalProcessExtHostProxy.ts | 2 +- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index ee3fe228b8d..21493ea0fe3 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -6,6 +6,7 @@ import * as vscode from 'vscode'; import * as cp from 'child_process'; +import * as os from 'os'; import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; import Uri from 'vs/base/common/uri'; @@ -202,9 +203,12 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } this._logService.info('$createProcess', id, shellLaunchConfig, cols, rows); + // TODO: Base the cwd on the last active workspace root // const lastActiveWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot('file'); // this.initialCwd = terminalEnvironment.getCwd(shellLaunchConfig, lastActiveWorkspaceRootUri, this._configHelper); + const initialCwd = os.homedir(); + // TODO: Pull in and resolve config settings // // Resolve env vars from config and shell // const lastActiveWorkspaceRoot = this._workspaceContextService.getWorkspaceFolder(lastActiveWorkspaceRootUri); // const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); @@ -212,34 +216,19 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // const envFromShell = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...shellLaunchConfig.env }, lastActiveWorkspaceRoot); // shellLaunchConfig.env = envFromShell; - // // Merge process env with the env from config - // const parentEnv = { ...process.env }; + // Merge process env with the env from config + const parentEnv = { ...process.env }; // terminalEnvironment.mergeEnvironments(parentEnv, envFromConfig); - // // Continue env initialization, merging in the env from the launch - // // config and adding keys that are needed to create the process - // const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, this.initialCwd, locale, cols, rows); - // const cwd = Uri.parse(paths.dirname(require.toUrl('../node/terminalProcess'))).fsPath; - // const options = { env, cwd }; - - - - - - // TODO: Launch process - // TODO: Associate the process with the terminal object/id - // TODO: terminal has incorrect name/options, fix up - const parentEnv = { ...process.env }; - const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, '/home/daniel', locale, cols, rows); - // TODO: Use Uri? + // Continue env initialization, merging in the env from the launch + // config and adding keys that are needed to create the process + const env = terminalEnvironment.createTerminalEnv(parentEnv, shellLaunchConfig, initialCwd, locale, cols, rows); let cwd = Uri.parse(require.toUrl('../../parts/terminal/node')).fsPath; const options = { env, cwd, execArgv: [] }; - let bootstrapUri = Uri.parse(require.toUrl('bootstrap')).fsPath; - + // Fork the process and listen for messages this._logService.debug(`Terminal process launching on ext host`, options); - this._terminalProcesses[id] = cp.fork(bootstrapUri, ['--type=terminal'], options); - + this._terminalProcesses[id] = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], options); this._terminalProcesses[id].on('message', (message: IMessageFromTerminalProcess) => { switch (message.type) { case 'pid': this._proxy.$sendProcessPid(id, message.content); break; @@ -250,16 +239,21 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $acceptTerminalProcessInput(id: number, data: string): void { - this._terminalProcesses[id].send({ event: 'input', data }); + if (this._terminalProcesses[id].connected) { + this._terminalProcesses[id].send({ event: 'input', data }); + } } public $acceptTerminalProcessResize(id: number, cols: number, rows: number): void { - console.log('resize' + cols + ',' + rows); - this._terminalProcesses[id].send({ event: 'resize', cols, rows }); + if (this._terminalProcesses[id].connected) { + this._terminalProcesses[id].send({ event: 'resize', cols, rows }); + } } public $acceptTerminalProcessShutdown(id: number): void { - this._terminalProcesses[id].send({ event: 'shutdown' }); + if (this._terminalProcesses[id].connected) { + this._terminalProcesses[id].send({ event: 'shutdown' }); + } } private _getTerminalById(id: number): ExtHostTerminal { @@ -283,7 +277,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } class ApiRequest { - private _callback: (...args: any[]) => void; private _args: any[]; diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index 464f7de71ef..b815ed27d96 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -9,7 +9,7 @@ import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig } fr import { IDisposable } from '../../../../base/common/lifecycle'; export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy { - // TODO: Set this properly + // For ext host processes connected checks happen on the ext host public connected: boolean = true; constructor( From 634eb8ae1af0705885ebaa8a1709499263d6db50 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 10:58:37 -0700 Subject: [PATCH 483/710] Remove debug logging --- .../api/electron-browser/mainThreadTerminalService.ts | 2 -- src/vs/workbench/api/node/extHostTerminalService.ts | 4 ---- .../parts/terminal/electron-browser/terminalInstance.ts | 1 - 3 files changed, 7 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 4ea4d4eeeaf..6d5ce98516a 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -21,7 +21,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape extHostContext: IExtHostContext, @ITerminalService private terminalService: ITerminalService ) { - console.log('MainThreadTerminalService#ctor'); this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTerminalService); this._toDispose.push(terminalService.onInstanceCreated((terminalInstance) => { // Delay this message so the TerminalInstance constructor has a chance to finish and @@ -101,7 +100,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } private _onTerminalRequestExtHostProcess(request: ITerminalProcessExtHostRequest): void { - console.log('mainThreadTerminalService#_onTerminalRequestExtHostProcess', arguments); this._terminalProcesses[request.proxy.terminalId] = request.proxy; const shellLaunchConfigDto: ShellLaunchConfigDto = { name: request.shellLaunchConfig.name, diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 21493ea0fe3..06da1425d4d 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -89,7 +89,6 @@ export class ExtHostTerminal implements vscode.Terminal { } public _setProcessId(processId: number): void { - console.log('extHostTerminalService#_setProcessId', processId); this._pidPromiseComplete(processId); this._pidPromiseComplete = null; } @@ -163,7 +162,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $acceptTerminalOpened(id: number, name: string): void { - console.log('terminal opened: ' + id); let index = this._getTerminalIndexById(id); if (index !== null) { // The terminal has already been created (via createTerminal*), only fire the event @@ -177,7 +175,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public $acceptTerminalProcessId(id: number, processId: number): void { let terminal = this._getTerminalById(id); - console.log('ExtHostTerminalService#$acceptTerminalProcessId ' + id + ' ' + processId); if (terminal) { terminal._setProcessId(processId); } @@ -201,7 +198,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { shellLaunchConfig.executable = shellConfigValue; shellLaunchConfig.args = shellArgsConfigValue; } - this._logService.info('$createProcess', id, shellLaunchConfig, cols, rows); // TODO: Base the cwd on the last active workspace root // const lastActiveWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot('file'); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 592a65af4dd..cdc1f00c8a8 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -591,7 +591,6 @@ export class TerminalInstance implements ITerminalInstance { this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._id, this._configHelper); this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this)); this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); - console.log('_createProcess', this._cols, this._rows); this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows); if (this._shellLaunchConfig.name) { From 1ffe882f1ddfade884f76b812b7d8e884cea24ab Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 11:29:15 -0700 Subject: [PATCH 484/710] Add proposed API checks for new terminal APIs --- src/vs/workbench/api/node/extHost.api.impl.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index ca47b4f247d..3de53551971 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -345,7 +345,7 @@ export function createApiFactory( return extHostEditors.getVisibleTextEditors(); }, get terminals() { - return extHostTerminalService.terminals; + return proposedApiFunction(extension, extHostTerminalService.terminals); }, showTextDocument(documentOrUri: vscode.TextDocument | vscode.Uri, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, preserveFocus?: boolean): TPromise { let documentPromise: TPromise; @@ -382,9 +382,9 @@ export function createApiFactory( onDidCloseTerminal(listener, thisArg?, disposables?) { return extHostTerminalService.onDidCloseTerminal(listener, thisArg, disposables); }, - onDidOpenTerminal(listener, thisArg?, disposables?) { + onDidOpenTerminal: proposedApiFunction(extension, (listener, thisArg?, disposables?) => { return extHostTerminalService.onDidOpenTerminal(listener, thisArg, disposables); - }, + }), get state() { return extHostWindow.state; }, From 52a75ecf23338b3a73aaef4714837ffb6e142ec6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 18 Apr 2018 11:32:20 -0700 Subject: [PATCH 485/710] Use correct $name for onDidDisposeWebviewPanel event Fixes #48127 --- src/vs/workbench/api/electron-browser/mainThreadWebview.ts | 2 +- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostWebview.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 4f007ab2439..c6411afa704 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -177,7 +177,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv onDidClickLink: uri => this.onDidClickLink(handle, uri), onMessage: message => this._proxy.$onMessage(handle, message), onDispose: () => { - this._proxy.onDidDisposeWebviewPanel(handle).then(() => { + this._proxy.$onDidDisposeWebviewPanel(handle).then(() => { this._webviews.delete(handle); }); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 38d81ee9141..f18f37f7e78 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -364,7 +364,7 @@ export interface MainThreadWebviewsShape extends IDisposable { export interface ExtHostWebviewsShape { $onMessage(handle: WebviewPanelHandle, message: any): void; $onDidChangeWebviewPanelViewState(handle: WebviewPanelHandle, active: boolean, position: EditorPosition): void; - onDidDisposeWebviewPanel(handle: WebviewPanelHandle): Thenable; + $onDidDisposeWebviewPanel(handle: WebviewPanelHandle): Thenable; $deserializeWebviewPanel(newWebviewHandle: WebviewPanelHandle, viewType: string, title: string, state: any, position: EditorPosition, options: vscode.WebviewOptions): Thenable; $serializeWebviewPanel(webviewHandle: WebviewPanelHandle): Thenable; } diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 53eb8d31972..a841e091574 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -254,7 +254,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { } } - onDidDisposeWebviewPanel(handle: WebviewPanelHandle): Thenable { + $onDidDisposeWebviewPanel(handle: WebviewPanelHandle): Thenable { const panel = this.getWebviewPanel(handle); if (panel) { panel.dispose(); From 6b06e54bba97ab76b85b5229be9d75653323306f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 11:34:35 -0700 Subject: [PATCH 486/710] Improve naming --- .../api/electron-browser/mainThreadTerminalService.ts | 6 +++--- src/vs/workbench/api/node/extHost.protocol.ts | 6 +++--- src/vs/workbench/api/node/extHostTerminalService.ts | 8 +++----- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 6d5ce98516a..564b663d54b 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -110,9 +110,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape }; this._proxy.$createProcess(request.proxy.terminalId, shellLaunchConfigDto, request.cols, request.rows); // TODO: Dispose of this properly when the terminal/process dies - this._toDispose.push(request.proxy.onInput(data => this._proxy.$acceptTerminalProcessInput(request.proxy.terminalId, data))); - this._toDispose.push(request.proxy.onResize((cols, rows) => this._proxy.$acceptTerminalProcessResize(request.proxy.terminalId, cols, rows))); - this._toDispose.push(request.proxy.onShutdown(() => this._proxy.$acceptTerminalProcessShutdown(request.proxy.terminalId))); + this._toDispose.push(request.proxy.onInput(data => this._proxy.$acceptProcessInput(request.proxy.terminalId, data))); + this._toDispose.push(request.proxy.onResize((cols, rows) => this._proxy.$acceptProcessResize(request.proxy.terminalId, cols, rows))); + this._toDispose.push(request.proxy.onShutdown(() => this._proxy.$acceptProcessShutdown(request.proxy.terminalId))); } public $sendProcessTitle(terminalId: number, title: string): void { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 40ae2187b9d..5805a7dc8d1 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -748,9 +748,9 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalOpened(id: number, name: string): void; $acceptTerminalProcessId(id: number, processId: number): void; $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; - $acceptTerminalProcessInput(id: number, data: string): void; - $acceptTerminalProcessResize(id: number, cols: number, rows: number): void; - $acceptTerminalProcessShutdown(id: number): void; + $acceptProcessInput(id: number, data: string): void; + $acceptProcessResize(id: number, cols: number, rows: number): void; + $acceptProcessShutdown(id: number): void; } export interface ExtHostSCMShape { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 06da1425d4d..b46656a860c 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -17,7 +17,6 @@ import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration import { ILogService } from 'vs/platform/log/common/log'; export class ExtHostTerminal implements vscode.Terminal { - private _name: string; private _id: number; private _proxy: MainThreadTerminalServiceShape; @@ -110,7 +109,6 @@ export class ExtHostTerminal implements vscode.Terminal { } export class ExtHostTerminalService implements ExtHostTerminalServiceShape { - private readonly _onDidCloseTerminal: Emitter; private readonly _onDidOpenTerminal: Emitter; private _proxy: MainThreadTerminalServiceShape; @@ -234,19 +232,19 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { }); } - public $acceptTerminalProcessInput(id: number, data: string): void { + public $acceptProcessInput(id: number, data: string): void { if (this._terminalProcesses[id].connected) { this._terminalProcesses[id].send({ event: 'input', data }); } } - public $acceptTerminalProcessResize(id: number, cols: number, rows: number): void { + public $acceptProcessResize(id: number, cols: number, rows: number): void { if (this._terminalProcesses[id].connected) { this._terminalProcesses[id].send({ event: 'resize', cols, rows }); } } - public $acceptTerminalProcessShutdown(id: number): void { + public $acceptProcessShutdown(id: number): void { if (this._terminalProcesses[id].connected) { this._terminalProcesses[id].send({ event: 'shutdown' }); } From 181bddba566208afb32e4a11d0a95f7694b1cb92 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 11:37:43 -0700 Subject: [PATCH 487/710] Move from shell launch config option to setting --- src/vs/workbench/parts/terminal/common/terminal.ts | 5 ----- .../parts/terminal/electron-browser/terminalInstance.ts | 3 --- .../terminal/electron-browser/terminalProcessManager.ts | 3 ++- .../parts/terminal/electron-browser/terminalService.ts | 1 - 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 8ec70a197d4..a6ea40af349 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -148,11 +148,6 @@ export interface IShellLaunchConfig { * of the terminal. Use \x1b over \033 or \e for the escape control character. */ initialText?: string; - - /** - * Whether the process should live on the extension host, not the renderer process. - */ - extensionHostOwned?: boolean; } export interface ITerminalService { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index cdc1f00c8a8..f24199efb6a 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -109,9 +109,6 @@ export class TerminalInstance implements ITerminalInstance { @IConfigurationService private readonly _configurationService: IConfigurationService, @ILogService private _logService: ILogService ) { - // TODO: Delete me - this._shellLaunchConfig.extensionHostOwned = true; - this._disposables = []; this._skipTerminalCommands = []; this._onLineDataListeners = []; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts index c416d5ff60b..1670b248a0b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts @@ -90,7 +90,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { cols: number, rows: number ): void { - if (shellLaunchConfig.extensionHostOwned) { + const extensionHostOwned = (this._configHelper.config).extHostProcess; + if (extensionHostOwned) { this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, cols, rows); } else { const locale = this._configHelper.config.setLocaleVariables ? platform.locale : undefined; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index eb2e2cbb021..744961567f8 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -100,7 +100,6 @@ export class TerminalService extends AbstractTerminalService implements ITermina this._extensionService.whenInstalledExtensionsRegistered().then(() => { // TODO: MainThreadTerminalService is not ready at this point, fix this setTimeout(() => { - console.log('cols, rows', cols, rows); this._onInstanceRequestExtHostProcess.fire({ proxy, shellLaunchConfig, cols, rows }); }, 100); }); From 0911fb867d146ae701ca709e3c33b3984718ee6e Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Wed, 18 Apr 2018 11:44:34 -0700 Subject: [PATCH 488/710] Change document selector to include the schema explicitly --- extensions/npm/src/features/bowerJSONContribution.ts | 2 +- extensions/npm/src/features/packageJSONContribution.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/npm/src/features/bowerJSONContribution.ts b/extensions/npm/src/features/bowerJSONContribution.ts index 13d6ccd29ee..a00f347078c 100644 --- a/extensions/npm/src/features/bowerJSONContribution.ts +++ b/extensions/npm/src/features/bowerJSONContribution.ts @@ -29,7 +29,7 @@ export class BowerJSONContribution implements IJSONContribution { } public getDocumentSelector(): DocumentSelector { - return [{ language: 'json', pattern: '**/bower.json' }, { language: 'json', pattern: '**/.bower.json' }]; + return [{ language: 'json', scheme: '*', pattern: '**/bower.json' }, { language: 'json', scheme: '*', pattern: '**/.bower.json' }]; } public collectDefaultSuggestions(_resource: string, collector: ISuggestionsCollector): Thenable { diff --git a/extensions/npm/src/features/packageJSONContribution.ts b/extensions/npm/src/features/packageJSONContribution.ts index e4b35802ecd..8b967a6ace8 100644 --- a/extensions/npm/src/features/packageJSONContribution.ts +++ b/extensions/npm/src/features/packageJSONContribution.ts @@ -30,7 +30,7 @@ export class PackageJSONContribution implements IJSONContribution { private knownScopes = ['@types', '@angular']; public getDocumentSelector(): DocumentSelector { - return [{ language: 'json', pattern: '**/package.json' }]; + return [{ language: 'json', scheme: '*', pattern: '**/package.json' }]; } public constructor(private xhr: XHRRequest) { From 35ae86231af1afd17bedc69ae89daf6fc3bd0d92 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 11:47:01 -0700 Subject: [PATCH 489/710] Fix NPE --- src/vs/workbench/api/node/extHostTerminalService.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index b46656a860c..ed4483d3c88 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -88,8 +88,11 @@ export class ExtHostTerminal implements vscode.Terminal { } public _setProcessId(processId: number): void { - this._pidPromiseComplete(processId); - this._pidPromiseComplete = null; + // The event may fire 2 times when the panel is restored + if (this._pidPromiseComplete) { + this._pidPromiseComplete(processId); + this._pidPromiseComplete = null; + } } private _queueApiRequest(callback: (...args: any[]) => void, args: any[]) { From c5adbe4401eda6275c0c0b85348b7fc816915a9f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 11:53:22 -0700 Subject: [PATCH 490/710] Return disposables for proxy listeners --- .../node/terminalProcessExtHostProxy.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index b815ed27d96..6a21b1669eb 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -6,7 +6,7 @@ import { ITerminalChildProcess, IMessageToTerminalProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; import { EventEmitter } from 'events'; import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; -import { IDisposable } from '../../../../base/common/lifecycle'; +import { IDisposable, toDisposable } from '../../../../base/common/lifecycle'; export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy { // For ext host processes connected checks happen on the ext host @@ -45,20 +45,20 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin } public onInput(listener: (data: string) => void): IDisposable { - // TODO: Dispose of me - this.on('input', data => listener(data)); - return null; + const outerListener = (data) => listener(data); + this.on('input', data => outerListener); + return toDisposable(() => this.removeListener('input', outerListener)); } public onResize(listener: (cols: number, rows: number) => void): IDisposable { - // TODO: Dispose of me - this.on('resize', (cols, rows) => listener(cols, rows)); - return null; + const outerListener = (cols, rows) => listener(cols, rows); + this.on('resize', outerListener); + return toDisposable(() => this.removeListener('resize', outerListener)); } public onShutdown(listener: () => void): IDisposable { - // TODO: Dispose of me - this.on('shutdown', () => listener()); - return null; + const outerListener = () => listener(); + this.on('shutdown', outerListener); + return toDisposable(() => this.removeListener('shutdown', outerListener)); } } \ No newline at end of file From a03dbe8654658c5e51e217ab652ef548904aab3e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 21:15:03 +0200 Subject: [PATCH 491/710] Fixes #30347: Wrap fontFamily in double quotes when spaces or + signs are used --- src/vs/editor/browser/config/configuration.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index 2a890239887..74cb598bddf 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -276,8 +276,21 @@ class CSSBasedConfiguration extends Disposable { export class Configuration extends CommonEditorConfiguration { + private static _massageFontFamily(fontFamily: string): string { + if (/[,"']/.test(fontFamily)) { + // Looks like the font family might be already escaped + return fontFamily; + } + if (/[+ ]/.test(fontFamily)) { + // Wrap a font family using + or with quotes + return `"${fontFamily}"`; + } + + return fontFamily; + } + public static applyFontInfoSlow(domNode: HTMLElement, fontInfo: BareFontInfo): void { - domNode.style.fontFamily = fontInfo.fontFamily; + domNode.style.fontFamily = Configuration._massageFontFamily(fontInfo.fontFamily); domNode.style.fontWeight = fontInfo.fontWeight; domNode.style.fontSize = fontInfo.fontSize + 'px'; domNode.style.lineHeight = fontInfo.lineHeight + 'px'; @@ -285,7 +298,7 @@ export class Configuration extends CommonEditorConfiguration { } public static applyFontInfo(domNode: FastDomNode, fontInfo: BareFontInfo): void { - domNode.setFontFamily(fontInfo.fontFamily); + domNode.setFontFamily(Configuration._massageFontFamily(fontInfo.fontFamily)); domNode.setFontWeight(fontInfo.fontWeight); domNode.setFontSize(fontInfo.fontSize); domNode.setLineHeight(fontInfo.lineHeight); From e02f59a111ea6586faaab08fcdb6f628ff90a0f2 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 21:50:44 +0200 Subject: [PATCH 492/710] Fixes #31312: Leave a 2px gap at the end of wrapped lines for the cursor --- src/vs/editor/common/config/editorOptions.ts | 18 ++-- .../viewLayout/editorLayoutProvider.test.ts | 93 +++++++++++++++---- 2 files changed, 86 insertions(+), 25 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 8045cc078ee..e4aa5cf65af 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -2090,18 +2090,19 @@ export class EditorLayoutProvider { } // Given: - // viewportColumn = (contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth + // (leaving 2px for the cursor to have space after the last character) + // viewportColumn = (contentWidth - verticalScrollbarWidth - 2) / typicalHalfwidthCharacterWidth // minimapWidth = viewportColumn * minimapCharWidth // contentWidth = remainingWidth - minimapWidth // What are good values for contentWidth and minimapWidth ? - // minimapWidth = ((contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth) * minimapCharWidth - // typicalHalfwidthCharacterWidth * minimapWidth = (contentWidth - verticalScrollbarWidth) * minimapCharWidth - // typicalHalfwidthCharacterWidth * minimapWidth = (remainingWidth - minimapWidth - verticalScrollbarWidth) * minimapCharWidth - // (typicalHalfwidthCharacterWidth + minimapCharWidth) * minimapWidth = (remainingWidth - verticalScrollbarWidth) * minimapCharWidth - // minimapWidth = ((remainingWidth - verticalScrollbarWidth) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth) + // minimapWidth = ((contentWidth - verticalScrollbarWidth - 2) / typicalHalfwidthCharacterWidth) * minimapCharWidth + // typicalHalfwidthCharacterWidth * minimapWidth = (contentWidth - verticalScrollbarWidth - 2) * minimapCharWidth + // typicalHalfwidthCharacterWidth * minimapWidth = (remainingWidth - minimapWidth - verticalScrollbarWidth - 2) * minimapCharWidth + // (typicalHalfwidthCharacterWidth + minimapCharWidth) * minimapWidth = (remainingWidth - verticalScrollbarWidth - 2) * minimapCharWidth + // minimapWidth = ((remainingWidth - verticalScrollbarWidth - 2) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth) - minimapWidth = Math.max(0, Math.floor(((remainingWidth - verticalScrollbarWidth) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth))); + minimapWidth = Math.max(0, Math.floor(((remainingWidth - verticalScrollbarWidth - 2) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth))); let minimapColumns = minimapWidth / minimapCharWidth; if (minimapColumns > minimapMaxColumn) { minimapWidth = Math.floor(minimapMaxColumn * minimapCharWidth); @@ -2119,7 +2120,8 @@ export class EditorLayoutProvider { } } - const viewportColumn = Math.max(1, Math.floor((contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth)); + // (leaving 2px for the cursor to have space after the last character) + const viewportColumn = Math.max(1, Math.floor((contentWidth - verticalScrollbarWidth - 2) / typicalHalfwidthCharacterWidth)); const verticalArrowSize = (verticalScrollbarHasArrows ? scrollbarArrowSize : 0); diff --git a/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts b/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts index eddae34ccc2..8009ce8a0dd 100644 --- a/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts +++ b/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts @@ -58,7 +58,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 99, + viewportColumn: 98, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -174,7 +174,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 89, + viewportColumn: 88, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -232,7 +232,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 89, + viewportColumn: 88, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -290,7 +290,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 89, + viewportColumn: 88, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -348,7 +348,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 84, + viewportColumn: 83, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -406,7 +406,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 84, + viewportColumn: 83, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -464,7 +464,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 83, + viewportColumn: 82, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -522,7 +522,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 172, + viewportColumn: 171, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -580,7 +580,7 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { renderMinimap: RenderMinimap.None, minimapLeft: 0, minimapWidth: 0, - viewportColumn: 170, + viewportColumn: 169, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -632,13 +632,13 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { decorationsHeight: 800, contentLeft: 10, - contentWidth: 900, + contentWidth: 901, contentHeight: 800, renderMinimap: RenderMinimap.Small, - minimapLeft: 910, - minimapWidth: 90, - viewportColumn: 90, + minimapLeft: 911, + minimapWidth: 89, + viewportColumn: 89, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -690,13 +690,13 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { decorationsHeight: 800, contentLeft: 10, - contentWidth: 900, + contentWidth: 901, contentHeight: 800, renderMinimap: RenderMinimap.Large, - minimapLeft: 910, - minimapWidth: 90, - viewportColumn: 90, + minimapLeft: 911, + minimapWidth: 89, + viewportColumn: 89, verticalScrollbarWidth: 0, horizontalScrollbarHeight: 0, @@ -825,4 +825,63 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { } }); }); + + test('issue #31312: When wrapping, leave 2px for the cursor', () => { + doTest({ + outerWidth: 1201, + outerHeight: 422, + showGlyphMargin: true, + lineHeight: 30, + showLineNumbers: true, + lineNumbersMinChars: 3, + lineNumbersDigitCount: 1, + lineDecorationsWidth: 26, + typicalHalfwidthCharacterWidth: 12.04296875, + maxDigitWidth: 12.04296875, + verticalScrollbarWidth: 14, + horizontalScrollbarHeight: 10, + scrollbarArrowSize: 11, + verticalScrollbarHasArrows: false, + minimap: true, + minimapSide: 'right', + minimapRenderCharacters: true, + minimapMaxColumn: 120, + pixelRatio: 2 + }, { + width: 1201, + height: 422, + + glyphMarginLeft: 0, + glyphMarginWidth: 30, + glyphMarginHeight: 422, + + lineNumbersLeft: 30, + lineNumbersWidth: 36, + lineNumbersHeight: 422, + + decorationsLeft: 66, + decorationsWidth: 26, + decorationsHeight: 422, + + contentLeft: 92, + contentWidth: 1026, + contentHeight: 422, + + renderMinimap: RenderMinimap.Large, + minimapLeft: 1104, + minimapWidth: 83, + viewportColumn: 83, + + verticalScrollbarWidth: 14, + horizontalScrollbarHeight: 10, + + overviewRuler: { + top: 0, + width: 14, + height: 422, + right: 0 + } + }); + + }); }); From 2a822c7c1d32c79af42aca5d50b5db0a801bb298 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 12:56:39 -0700 Subject: [PATCH 493/710] Improve handling of process exit --- .../mainThreadTerminalService.ts | 4 ++++ src/vs/workbench/api/node/extHost.protocol.ts | 1 + .../workbench/api/node/extHostTerminalService.ts | 16 ++++++++++++++++ .../workbench/parts/terminal/common/terminal.ts | 1 + .../electron-browser/terminalInstance.ts | 6 +++++- .../terminal/node/terminalProcessExtHostProxy.ts | 6 ++++++ 6 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 564b663d54b..482ab29cf44 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -126,4 +126,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $sendProcessPid(terminalId: number, pid: number): void { this._terminalProcesses[terminalId].emitPid(pid); } + + public $sendProcessExit(terminalId: number, exitCode: number): void { + this._terminalProcesses[terminalId].emitExit(exitCode); + } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 5805a7dc8d1..25de9e60714 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -325,6 +325,7 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $sendProcessTitle(terminalId: number, title: string): void; $sendProcessData(terminalId: number, data: string): void; $sendProcessPid(terminalId: number, pid: number): void; + $sendProcessExit(terminalId: number, exitCode: number): void; } export interface MyQuickPickItems extends IPickOpenEntry { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index ed4483d3c88..035f4c42664 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -233,6 +233,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { case 'data': this._proxy.$sendProcessData(id, message.content); break; } }); + this._terminalProcesses[id].on('exit', (exitCode) => this._onProcessExit(id, exitCode)); } public $acceptProcessInput(id: number, data: string): void { @@ -242,6 +243,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $acceptProcessResize(id: number, cols: number, rows: number): void { + console.log('send resize'); if (this._terminalProcesses[id].connected) { this._terminalProcesses[id].send({ event: 'resize', cols, rows }); } @@ -253,6 +255,20 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } } + private _onProcessExit(id: number, exitCode: number): void { + console.log('exit'); + // Remove listeners + const process = this._terminalProcesses[id]; + process.removeAllListeners('message'); + process.removeAllListeners('exit'); + + // Remove process reference + delete this._terminalProcesses[id]; + + // Send exit event to main side + this._proxy.$sendProcessExit(id, exitCode); + } + private _getTerminalById(id: number): ExtHostTerminal { let index = this._getTerminalIndexById(id); return index !== null ? this._terminals[index] : null; diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index a6ea40af349..c1fa9345179 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -524,6 +524,7 @@ export interface ITerminalProcessExtHostProxy { emitData(data: string): void; emitTitle(title: string): void; emitPid(pid: number): void; + emitExit(exitCode: number): void; onInput(listener: (data: string) => void): IDisposable; onResize(listener: (cols: number, rows: number) => void): IDisposable; onShutdown(listener: () => void): IDisposable; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index f24199efb6a..6345a63a7a5 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -667,7 +667,11 @@ export class TerminalInstance implements ITerminalInstance { return a; }).join(' '); } - this._notificationService.error(nls.localize('terminal.integrated.launchFailed', 'The terminal process command \'{0}{1}\' failed to launch (exit code: {2})', this._shellLaunchConfig.executable, args, exitCode)); + if (this._shellLaunchConfig.executable) { + this._notificationService.error(nls.localize('terminal.integrated.launchFailed', 'The terminal process command \'{0}{1}\' failed to launch (exit code: {2})', this._shellLaunchConfig.executable, args, exitCode)); + } else { + this._notificationService.error(nls.localize('terminal.integrated.launchFailedExtHost', 'The terminal process failed to launch (exit code: {0})', exitCode)); + } } else { if (this._configHelper.config.showExitAlert) { this._notificationService.error(exitCodeMessage); diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index 6a21b1669eb..a302b7df10b 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -28,13 +28,19 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin public emitData(data: string): void { this.emit('message', { type: 'data', content: data } as IMessageFromTerminalProcess); } + public emitTitle(title: string): void { this.emit('message', { type: 'title', content: title } as IMessageFromTerminalProcess); } + public emitPid(pid: number): void { this.emit('message', { type: 'pid', content: pid } as IMessageFromTerminalProcess); } + public emitExit(exitCode: number): void { + this.emit('exit', exitCode); + } + public send(message: IMessageToTerminalProcess): boolean { switch (message.event) { case 'input': this.emit('input', message.data); break; From 9d2814a9a160bae07990df4d6c455638c85a9c8f Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 18 Apr 2018 22:13:50 +0200 Subject: [PATCH 494/710] update grammars --- .../bat/syntaxes/batchfile.tmLanguage.json | 102 +++++++++++------- .../bat/test/colorize-results/test_bat.json | 13 ++- .../syntaxes/JavaScript.tmLanguage.json | 4 +- .../syntaxes/JavaScriptReact.tmLanguage.json | 4 +- extensions/log/syntaxes/log.tmLanguage.json | 8 +- extensions/r/syntaxes/r.tmLanguage.json | 8 +- .../syntaxes/TypeScript.tmLanguage.json | 4 +- .../syntaxes/TypeScriptReact.tmLanguage.json | 4 +- 8 files changed, 91 insertions(+), 56 deletions(-) diff --git a/extensions/bat/syntaxes/batchfile.tmLanguage.json b/extensions/bat/syntaxes/batchfile.tmLanguage.json index 996d5aed4da..e5f00ed3827 100644 --- a/extensions/bat/syntaxes/batchfile.tmLanguage.json +++ b/extensions/bat/syntaxes/batchfile.tmLanguage.json @@ -4,7 +4,7 @@ "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/9b2d868a43d6a04a4dc27cb31f907b960a4fdab1", + "version": "https://github.com/mmims/language-batchfile/commit/6235c491be4dff49cd3966b50142874d7f79580a", "name": "Batch File", "scopeName": "source.batchfile", "patterns": [ @@ -46,14 +46,17 @@ "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)", + "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|cls|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|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|\\.)", + "begin": "(?i)(?<=^|[\\s@])(echo)(?:(?=$|\\.|:)|\\s+(?:(on|off)(?=\\s*$))?)", "beginCaptures": { - "0": { + "1": { "name": "keyword.command.batchfile" + }, + "2": { + "name": "keyword.other.special-method.batchfile" } }, "end": "(?=$\\n|[&|><)])", @@ -72,6 +75,17 @@ } ] }, + { + "match": "(?i)(?<=^|[\\s@])(setlocal)(?:\\s*$|\\s+(EnableExtensions|DisableExtensions|EnableDelayedExpansion|DisableDelayedExpansion)(?=\\s*$))", + "captures": { + "1": { + "name": "keyword.command.batchfile" + }, + "2": { + "name": "keyword.other.special-method.batchfile" + } + } + }, { "include": "#command_set" } @@ -110,36 +124,7 @@ "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": "punctuation.definition.string.end.batchfile" - } - }, - "name": "string.quoted.double.batchfile", - "patterns": [ - { - "include": "#variables" - }, - { - "include": "#numbers" - }, - { - "include": "#parens" - } - ] + "include": "#command_set_strings" }, { "include": "#strings" @@ -216,6 +201,9 @@ "begin": "\\s+/[pP]\\s+", "end": "(?=$\\n|[&|><)])", "patterns": [ + { + "include": "#command_set_strings" + }, { "begin": "([^ ][^=]*)(=)", "beginCaptures": { @@ -295,6 +283,42 @@ } ] }, + "command_set_strings": { + "patterns": [ + { + "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": "punctuation.definition.string.end.batchfile" + } + }, + "name": "string.quoted.double.batchfile", + "patterns": [ + { + "include": "#variables" + }, + { + "include": "#numbers" + }, + { + "include": "#escaped_characters" + } + ] + } + ] + }, "comments": { "patterns": [ { @@ -360,7 +384,7 @@ "controls": { "patterns": [ { - "match": "(?<=^|\\s)(?i)(?:goto|call|exit)(?=$|\\s)", + "match": "(?i)(?<=^|\\s)(?:call|exit(?=$|\\s)|goto(?=$|\\s|:))", "name": "keyword.control.statement.batchfile" }, { @@ -390,7 +414,7 @@ "escaped_characters": { "patterns": [ { - "match": "%%|\\^\\^!|\\^.|\\^\\n", + "match": "%%|\\^\\^!|\\^(?=.)|\\^\\n", "name": "constant.character.escape.batchfile" } ] @@ -398,7 +422,7 @@ "labels": { "patterns": [ { - "match": "^\\s*(:)([^+=,;:\\s].*)$", + "match": "(?i)(?:^\\s*|(?<=goto)\\s*)(:)([^+=,;:\\s].*)$", "captures": { "1": { "name": "punctuation.separator.batchfile" @@ -433,11 +457,11 @@ "name": "keyword.operator.logical.batchfile" }, { - "match": "&&?|\\|\\|", + "match": "(?=", + "name": "keyword.operator.comparison.r" + }, { "match": "==", "name": "keyword.operator.comarison.r" @@ -177,7 +181,7 @@ "name": "keyword.operator.assignment.r" }, { - "match": "(!=|<>|<|>|<=|>=|%in%)", + "match": "(!=|<>|<|>|%in%)", "name": "keyword.operator.comparison.r" }, { diff --git a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json index 2856d4ed0e9..33f6319b5c3 100644 --- a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/929ee616cc9c299c5ed09d6051277a9c34e2d6e9", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/3f27a794a2dbebf18714d7eaa799162fbadf7a11", "name": "TypeScript", "scopeName": "source.ts", "patterns": [ @@ -2293,7 +2293,7 @@ "name": "keyword.operator.expression.instanceof.ts" } }, - "end": "(?<=\\))|(?=[;),}\\]:]|\\|\\||\\&\\&|$|((? Date: Wed, 18 Apr 2018 22:20:32 +0200 Subject: [PATCH 495/710] Implement automatic wrapping with < > for C++. Fixes #47864 --- extensions/cpp/language-configuration.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/cpp/language-configuration.json b/extensions/cpp/language-configuration.json index 23d99a485e1..e50df32dd11 100644 --- a/extensions/cpp/language-configuration.json +++ b/extensions/cpp/language-configuration.json @@ -20,7 +20,8 @@ ["[", "]"], ["(", ")"], ["\"", "\""], - ["'", "'"] + ["'", "'"], + ["<", ">"] ], "folding": { "markers": { From 4cc09e1ca72c1193071e0ab638d3947b303cd699 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 18 Apr 2018 22:44:08 +0200 Subject: [PATCH 496/710] [themes] add peekViewEditor.matchHighlightBorder. Fixes #47233 --- src/vs/editor/contrib/referenceSearch/referencesWidget.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/referenceSearch/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/referencesWidget.ts index 8ea2b9b4a74..3e98e35c67e 100644 --- a/src/vs/editor/contrib/referenceSearch/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/referencesWidget.ts @@ -836,6 +836,7 @@ export const peekViewEditorGutterBackground = registerColor('peekViewEditorGutte export const peekViewResultsMatchHighlight = registerColor('peekViewResult.matchHighlightBackground', { dark: '#ea5c004d', light: '#ea5c004d', hc: null }, nls.localize('peekViewResultsMatchHighlight', 'Match highlight color in the peek view result list.')); export const peekViewEditorMatchHighlight = registerColor('peekViewEditor.matchHighlightBackground', { dark: '#ff8f0099', light: '#f5d802de', hc: null }, nls.localize('peekViewEditorMatchHighlight', 'Match highlight color in the peek view editor.')); +export const peekViewEditorMatchHighlightBorder = registerColor('peekViewEditor.matchHighlightBorder', { dark: null, light: null, hc: activeContrastBorder }, nls.localize('peekViewEditorMatchHighlightBorder', 'Match highlight border in the peek view editor.')); registerThemingParticipant((theme, collector) => { @@ -847,10 +848,13 @@ registerThemingParticipant((theme, collector) => { if (referenceHighlightColor) { collector.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { background-color: ${referenceHighlightColor}; }`); } + let referenceHighlightBorder = theme.getColor(peekViewEditorMatchHighlightBorder); + if (referenceHighlightBorder) { + collector.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { border: 2px solid ${referenceHighlightBorder}; box-sizing: border-box; }`); + } let hcOutline = theme.getColor(activeContrastBorder); if (hcOutline) { collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .referenceMatch { border: 1px dotted ${hcOutline}; box-sizing: border-box; }`); - collector.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { border: 2px solid ${hcOutline}; box-sizing: border-box; }`); } let resultsBackground = theme.getColor(peekViewResultsBackground); if (resultsBackground) { From 7ce50b70e7cc3cd206bf112963bba8fac3070e66 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 22:52:59 +0200 Subject: [PATCH 497/710] Fixes #40127: Keep track if a line has before or after foreign elements --- .../browser/viewParts/lines/viewLine.ts | 26 ++++++++----- .../common/viewLayout/viewLineRenderer.ts | 38 +++++++++++++------ 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/vs/editor/browser/viewParts/lines/viewLine.ts b/src/vs/editor/browser/viewParts/lines/viewLine.ts index c1fa275be29..58ad197c515 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLine.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLine.ts @@ -9,7 +9,7 @@ import * as platform from 'vs/base/common/platform'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { IConfiguration } from 'vs/editor/common/editorCommon'; import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations'; -import { renderViewLine, RenderLineInput, CharacterMapping } from 'vs/editor/common/viewLayout/viewLineRenderer'; +import { renderViewLine, RenderLineInput, CharacterMapping, ForeignElementType } from 'vs/editor/common/viewLayout/viewLineRenderer'; import { IVisibleLine } from 'vs/editor/browser/view/viewLayer'; import { RangeUtil } from 'vs/editor/browser/viewParts/lines/rangeUtil'; import { HorizontalRange } from 'vs/editor/common/view/renderingContext'; @@ -222,7 +222,7 @@ export class ViewLine implements IVisibleLine { sb.appendASCIIString('
'); let renderedViewLine: IRenderedViewLine = null; - if (canUseFastRenderedViewLine && lineData.isBasicASCII && options.useMonospaceOptimizations && !output.containsForeignElements) { + if (canUseFastRenderedViewLine && lineData.isBasicASCII && options.useMonospaceOptimizations && output.containsForeignElements === ForeignElementType.None) { if (lineData.content.length < 1000 && renderLineInput.lineTokens.getCount() < 100) { // Browser rounding errors have been observed in Chrome and IE, so using the fast // view line only for short lines. Please test before removing the length check... @@ -380,7 +380,7 @@ class RenderedViewLine implements IRenderedViewLine { protected readonly _characterMapping: CharacterMapping; private readonly _isWhitespaceOnly: boolean; - private readonly _containsForeignElements: boolean; + private readonly _containsForeignElements: ForeignElementType; private _cachedWidth: number; /** @@ -388,7 +388,7 @@ class RenderedViewLine implements IRenderedViewLine { */ private _pixelOffsetCache: Int32Array; - constructor(domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean) { + constructor(domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) { this.domNode = domNode; this.input = renderLineInput; this._characterMapping = characterMapping; @@ -466,10 +466,18 @@ class RenderedViewLine implements IRenderedViewLine { protected _readPixelOffset(column: number, context: DomReadingContext): number { if (this._characterMapping.length === 0) { // This line has no content - if (!this._containsForeignElements) { + if (this._containsForeignElements === ForeignElementType.None) { // We can assume the line is really empty return 0; } + if (this._containsForeignElements === ForeignElementType.After) { + // We have foreign elements after the (empty) line + return 0; + } + if (this._containsForeignElements === ForeignElementType.Before) { + // We have foreign element before the (empty) line + return this.getWidth(); + } } if (this._pixelOffsetCache !== null) { @@ -498,7 +506,7 @@ class RenderedViewLine implements IRenderedViewLine { return r[0].left; } - if (column === this._characterMapping.length && this._isWhitespaceOnly && !this._containsForeignElements) { + if (column === this._characterMapping.length && this._isWhitespaceOnly && this._containsForeignElements === ForeignElementType.None) { // This branch helps in the case of whitespace only lines which have a width set return this.getWidth(); } @@ -581,17 +589,17 @@ class WebKitRenderedViewLine extends RenderedViewLine { } } -const createRenderedLine: (domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean) => RenderedViewLine = (function () { +const createRenderedLine: (domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) => RenderedViewLine = (function () { if (browser.isWebKit) { return createWebKitRenderedLine; } return createNormalRenderedLine; })(); -function createWebKitRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean): RenderedViewLine { +function createWebKitRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType): RenderedViewLine { return new WebKitRenderedViewLine(domNode, renderLineInput, characterMapping, containsRTL, containsForeignElements); } -function createNormalRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean): RenderedViewLine { +function createNormalRenderedLine(domNode: FastDomNode, renderLineInput: RenderLineInput, characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType): RenderedViewLine { return new RenderedViewLine(domNode, renderLineInput, characterMapping, containsRTL, containsForeignElements); } diff --git a/src/vs/editor/common/viewLayout/viewLineRenderer.ts b/src/vs/editor/common/viewLayout/viewLineRenderer.ts index f35989d4101..e4c075e7c15 100644 --- a/src/vs/editor/common/viewLayout/viewLineRenderer.ts +++ b/src/vs/editor/common/viewLayout/viewLineRenderer.ts @@ -221,14 +221,20 @@ export class CharacterMapping { } } +export const enum ForeignElementType { + None = 0, + Before = 1, + After = 2 +} + export class RenderLineOutput { _renderLineOutputBrand: void; readonly characterMapping: CharacterMapping; readonly containsRTL: boolean; - readonly containsForeignElements: boolean; + readonly containsForeignElements: ForeignElementType; - constructor(characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: boolean) { + constructor(characterMapping: CharacterMapping, containsRTL: boolean, containsForeignElements: ForeignElementType) { this.characterMapping = characterMapping; this.containsRTL = containsRTL; this.containsForeignElements = containsForeignElements; @@ -238,7 +244,7 @@ export class RenderLineOutput { export function renderViewLine(input: RenderLineInput, sb: IStringBuilder): RenderLineOutput { if (input.lineContent.length === 0) { - let containsForeignElements = false; + let containsForeignElements = ForeignElementType.None; // This is basically for IE's hit test to work let content: string = '\u00a0'; @@ -248,13 +254,17 @@ export function renderViewLine(input: RenderLineInput, sb: IStringBuilder): Rend let classNames: string[] = []; for (let i = 0, len = input.lineDecorations.length; i < len; i++) { const lineDecoration = input.lineDecorations[i]; - if (lineDecoration.type !== InlineDecorationType.Regular && lineDecoration.type !== InlineDecorationType.RegularAffectingLetterSpacing) { + if (lineDecoration.type === InlineDecorationType.Before) { classNames.push(input.lineDecorations[i].className); - containsForeignElements = true; + containsForeignElements |= ForeignElementType.Before; + } + if (lineDecoration.type === InlineDecorationType.After) { + classNames.push(input.lineDecorations[i].className); + containsForeignElements |= ForeignElementType.After; } } - if (containsForeignElements) { + if (containsForeignElements !== ForeignElementType.None) { content = ``; } } @@ -275,7 +285,7 @@ export class RenderLineOutput2 { public readonly characterMapping: CharacterMapping, public readonly html: string, public readonly containsRTL: boolean, - public readonly containsForeignElements: boolean + public readonly containsForeignElements: ForeignElementType ) { } } @@ -293,7 +303,7 @@ class ResolvedRenderLineInput { public readonly len: number, public readonly isOverflowing: boolean, public readonly parts: LinePart[], - public readonly containsForeignElements: boolean, + public readonly containsForeignElements: ForeignElementType, public readonly tabSize: number, public readonly containsRTL: boolean, public readonly spaceWidth: number, @@ -323,13 +333,17 @@ function resolveRenderLineInput(input: RenderLineInput): ResolvedRenderLineInput if (input.renderWhitespace === RenderWhitespace.All || input.renderWhitespace === RenderWhitespace.Boundary) { tokens = _applyRenderWhitespace(lineContent, len, tokens, input.fauxIndentLength, input.tabSize, useMonospaceOptimizations, input.renderWhitespace === RenderWhitespace.Boundary); } - let containsForeignElements = false; + let containsForeignElements = ForeignElementType.None; if (input.lineDecorations.length > 0) { for (let i = 0, len = input.lineDecorations.length; i < len; i++) { const lineDecoration = input.lineDecorations[i]; - if (lineDecoration.type !== InlineDecorationType.Regular) { - containsForeignElements = true; - break; + if (lineDecoration.type === InlineDecorationType.RegularAffectingLetterSpacing) { + // Pretend there are foreign elements... although not 100% accurate. + containsForeignElements |= ForeignElementType.Before; + } else if (lineDecoration.type === InlineDecorationType.Before) { + containsForeignElements |= ForeignElementType.Before; + } else if (lineDecoration.type === InlineDecorationType.After) { + containsForeignElements |= ForeignElementType.After; } } tokens = _applyInlineDecorations(lineContent, len, tokens, input.lineDecorations); From ed76a268d878a3bfad4c825f2b63aa27b1e42480 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 22:57:48 +0200 Subject: [PATCH 498/710] Fixes #33178 --- src/vs/editor/browser/viewParts/lines/viewLine.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/viewParts/lines/viewLine.ts b/src/vs/editor/browser/viewParts/lines/viewLine.ts index 58ad197c515..dcfc1dc3ad3 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLine.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLine.ts @@ -223,12 +223,15 @@ export class ViewLine implements IVisibleLine { let renderedViewLine: IRenderedViewLine = null; if (canUseFastRenderedViewLine && lineData.isBasicASCII && options.useMonospaceOptimizations && output.containsForeignElements === ForeignElementType.None) { - if (lineData.content.length < 1000 && renderLineInput.lineTokens.getCount() < 100) { + if (lineData.content.length < 300 && renderLineInput.lineTokens.getCount() < 100) { // Browser rounding errors have been observed in Chrome and IE, so using the fast // view line only for short lines. Please test before removing the length check... // --- // Another rounding error has been observed on Linux in VSCode, where width // rounding errors add up to an observable large number... + // --- + // Also see another example of rounding errors on Windows in + // https://github.com/Microsoft/vscode/issues/33178 renderedViewLine = new FastRenderedViewLine( this._renderedViewLine ? this._renderedViewLine.domNode : null, renderLineInput, From 91db9a6a888ebb0338d4c9bb5858a0fd1ed53378 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 23:01:11 +0200 Subject: [PATCH 499/710] Hide the contributed viewlet if no views are registered --- .../api/browser/activitybarExtensionPoint.ts | 2 +- .../parts/activitybar/activitybarPart.ts | 31 +++++++++++++++++-- src/vs/workbench/common/views.ts | 13 ++++---- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts index 15aed855355..09b6dfc9618 100644 --- a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts +++ b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts @@ -91,7 +91,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { const id = `workbench.view.extension.${descriptor.id}`; const title = descriptor.title; const cssClass = `extensionViewlet-${descriptor.id}`; - const location: ViewLocation = ViewLocation.register(id); + const location: ViewLocation = ViewLocation.register(id, true); // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 2382e8f9534..014ff3268ce 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -33,6 +33,8 @@ import { isMacintosh } from 'vs/base/common/platform'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Dimension, scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; import { Color } from 'vs/base/common/color'; +import { ViewLocation, ViewsRegistry } from 'vs/workbench/common/views'; +import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; export class ActivitybarPart extends Part { @@ -83,11 +85,14 @@ export class ActivitybarPart extends Part { }); this.registerListeners(); + this.updateCompositebar(); } private registerListeners(): void { - this.toUnbind.push(this.viewletService.onDidViewletRegister(viewletDescriptor => this.compositeBar.addComposite(viewletDescriptor, false))); + this.toUnbind.push(this.viewletService.onDidViewletRegister(() => this.updateCompositebar())); + this.toUnbind.push(ViewsRegistry.onViewsRegistered(() => this.updateCompositebar())); + this.toUnbind.push(ViewsRegistry.onViewsDeregistered(() => this.updateCompositebar())); // Activate viewlet action on opening of a viewlet this.toUnbind.push(this.viewletService.onDidViewletOpen(viewlet => this.compositeBar.activateComposite(viewlet.getId()))); @@ -183,7 +188,9 @@ export class ActivitybarPart extends Part { private showContextMenu(e: MouseEvent): void { const event = new StandardMouseEvent(e); - const actions: Action[] = this.viewletService.getViewlets().map(viewlet => this.instantiationService.createInstance(ToggleCompositePinnedAction, viewlet, this.compositeBar)); + const actions: Action[] = this.viewletService.getViewlets() + .filter(viewlet => this.canShow(viewlet)) + .map(viewlet => this.instantiationService.createInstance(ToggleCompositePinnedAction, viewlet, this.compositeBar)); actions.push(new Separator()); actions.push(this.instantiationService.createInstance(ToggleActivityBarVisibilityAction, ToggleActivityBarVisibilityAction.ID, nls.localize('hideActivitBar', "Hide Activity Bar"))); @@ -215,6 +222,26 @@ export class ActivitybarPart extends Part { }); } + private updateCompositebar(): void { + const viewlets = this.viewletService.getViewlets(); + for (const viewlet of viewlets) { + const canShow = this.canShow(viewlet); + if (canShow) { + this.compositeBar.addComposite(viewlet, false); + } else { + this.compositeBar.removeComposite(viewlet.id); + } + } + } + + private canShow(viewlet: ViewletDescriptor): boolean { + const viewLocation = ViewLocation.get(viewlet.id); + if (viewLocation && viewLocation.contributed) { + return ViewsRegistry.getViews(viewLocation).length > 0; + } + return true; + } + public getPinned(): string[] { return this.viewletService.getViewlets().map(v => v.id).filter(id => this.compositeBar.isPinned(id)); } diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index aa06fd035a2..4f721596537 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -18,8 +18,8 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; export class ViewLocation { private static locations: Map = new Map(); - static register(id: string): ViewLocation { - const viewLocation = new ViewLocation(id); + static register(id: string, contributed: boolean): ViewLocation { + const viewLocation = new ViewLocation(id, contributed); ViewLocation.locations.set(id, viewLocation); return viewLocation; } @@ -27,12 +27,13 @@ export class ViewLocation { return ViewLocation.locations.get(value); } - static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer'); - static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug'); - static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions'); + static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer', false); + static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug', false); + static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions', false); - private constructor(private _id: string) { } + private constructor(private _id: string, private _contributed: boolean) { } get id(): string { return this._id; } + get contributed(): boolean { return this._contributed; } } From b7985f4157336a4b075b4af7f76bc7b35ffafc90 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 18 Apr 2018 14:02:41 -0700 Subject: [PATCH 500/710] Polish exit, fix input --- .../api/electron-browser/mainThreadTerminalService.ts | 1 + src/vs/workbench/api/node/extHostTerminalService.ts | 11 ++++++++--- .../terminal/node/terminalProcessExtHostProxy.ts | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 482ab29cf44..2086db18928 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -129,5 +129,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $sendProcessExit(terminalId: number, exitCode: number): void { this._terminalProcesses[terminalId].emitExit(exitCode); + delete this._terminalProcesses[terminalId]; } } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 035f4c42664..cb546c2e8d8 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -243,9 +243,15 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public $acceptProcessResize(id: number, cols: number, rows: number): void { - console.log('send resize'); if (this._terminalProcesses[id].connected) { - this._terminalProcesses[id].send({ event: 'resize', cols, rows }); + try { + this._terminalProcesses[id].send({ event: 'resize', cols, rows }); + } catch (error) { + // We tried to write to a closed pipe / channel. + if (error.code !== 'EPIPE' && error.code !== 'ERR_IPC_CHANNEL_CLOSED') { + throw (error); + } + } } } @@ -256,7 +262,6 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } private _onProcessExit(id: number, exitCode: number): void { - console.log('exit'); // Remove listeners const process = this._terminalProcesses[id]; process.removeAllListeners('message'); diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index a302b7df10b..b03a15e8f69 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -52,7 +52,7 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin public onInput(listener: (data: string) => void): IDisposable { const outerListener = (data) => listener(data); - this.on('input', data => outerListener); + this.on('input', outerListener); return toDisposable(() => this.removeListener('input', outerListener)); } From 285107a2fbe0fb3552f7794329e03dd0b61a6cfe Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 23:08:40 +0200 Subject: [PATCH 501/710] Register views outside viewlet --- .../extensions.contribution.ts | 3 +- .../electron-browser/extensionsViewlet.ts | 117 ++++++++++-------- 2 files changed, 64 insertions(+), 56 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index c884bb1d179..20d875bae68 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -27,7 +27,7 @@ import { import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { ExtensionEditor } from 'vs/workbench/parts/extensions/electron-browser/extensionEditor'; -import { StatusUpdater, ExtensionsViewlet, MaliciousExtensionChecker } from 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; +import { StatusUpdater, ExtensionsViewlet, MaliciousExtensionChecker, ExtensionsViewletViewsContribution } from 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; import { IQuickOpenRegistry, Extensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import * as jsonContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; @@ -54,6 +54,7 @@ workbenchRegistry.registerWorkbenchContribution(StatusUpdater, LifecyclePhase.Ru workbenchRegistry.registerWorkbenchContribution(MaliciousExtensionChecker, LifecyclePhase.Eventually); workbenchRegistry.registerWorkbenchContribution(ConfigureRecommendedExtensionsCommandsContributor, LifecyclePhase.Eventually); workbenchRegistry.registerWorkbenchContribution(KeymapExtensions, LifecyclePhase.Running); +workbenchRegistry.registerWorkbenchContribution(ExtensionsViewletViewsContribution, LifecyclePhase.Starting); Registry.as(OutputExtensions.OutputChannels) .registerChannel(ExtensionsChannelId, ExtensionsLabel); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index ea9dc91ed78..2b02d88b44c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -66,65 +66,11 @@ const SearchBuiltInExtensionsContext = new RawContextKey('searchBuiltIn const RecommendedExtensionsContext = new RawContextKey('recommendedExtensions', false); const DefaultRecommendedExtensionsContext = new RawContextKey('defaultRecommendedExtensions', false); -export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtensionsViewlet { - - private onSearchChange: EventOf; - private nonEmptyWorkspaceContextKey: IContextKey; - private searchExtensionsContextKey: IContextKey; - private searchInstalledExtensionsContextKey: IContextKey; - private searchBuiltInExtensionsContextKey: IContextKey; - private recommendedExtensionsContextKey: IContextKey; - private defaultRecommendedExtensionsContextKey: IContextKey; - - private searchDelayer: ThrottledDelayer; - private root: HTMLElement; - - private searchBox: HTMLInputElement; - private extensionsBox: HTMLElement; - private primaryActions: IAction[]; - private secondaryActions: IAction[]; - private disposables: IDisposable[] = []; +export class ExtensionsViewletViewsContribution implements IWorkbenchContribution { constructor( - @IPartService partService: IPartService, - @ITelemetryService telemetryService: ITelemetryService, - @IProgressService private progressService: IProgressService, - @IInstantiationService instantiationService: IInstantiationService, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IEditorGroupService private editorInputService: IEditorGroupService, - @IExtensionManagementService private extensionManagementService: IExtensionManagementService, - @INotificationService private notificationService: INotificationService, - @IViewletService private viewletService: IViewletService, - @IThemeService themeService: IThemeService, - @IConfigurationService private configurationService: IConfigurationService, - @IStorageService storageService: IStorageService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IContextKeyService contextKeyService: IContextKeyService, - @IContextMenuService contextMenuService: IContextMenuService, - @IExtensionService extensionService: IExtensionService ) { - super(VIEWLET_ID, ViewLocation.Extensions, `${VIEWLET_ID}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); - this.registerViews(); - this.searchDelayer = new ThrottledDelayer(500); - this.nonEmptyWorkspaceContextKey = NonEmptyWorkspaceContext.bindTo(contextKeyService); - this.searchExtensionsContextKey = SearchExtensionsContext.bindTo(contextKeyService); - this.searchInstalledExtensionsContextKey = SearchInstalledExtensionsContext.bindTo(contextKeyService); - this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService); - this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService); - this.defaultRecommendedExtensionsContextKey = DefaultRecommendedExtensionsContext.bindTo(contextKeyService); - this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); - this.disposables.push(this.viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables)); - - this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(AutoUpdateConfigurationKey)) { - this.secondaryActions = null; - this.updateTitleArea(); - } - if (e.affectedKeys.indexOf(ShowRecommendationsOnlyOnDemandKey) > -1) { - this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); - } - }, this, this.disposables); } private registerViews(): void { @@ -247,6 +193,67 @@ export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtens canToggleVisibility: true }; } +} + +export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtensionsViewlet { + + private onSearchChange: EventOf; + private nonEmptyWorkspaceContextKey: IContextKey; + private searchExtensionsContextKey: IContextKey; + private searchInstalledExtensionsContextKey: IContextKey; + private searchBuiltInExtensionsContextKey: IContextKey; + private recommendedExtensionsContextKey: IContextKey; + private defaultRecommendedExtensionsContextKey: IContextKey; + + private searchDelayer: ThrottledDelayer; + private root: HTMLElement; + + private searchBox: HTMLInputElement; + private extensionsBox: HTMLElement; + private primaryActions: IAction[]; + private secondaryActions: IAction[]; + private disposables: IDisposable[] = []; + + constructor( + @IPartService partService: IPartService, + @ITelemetryService telemetryService: ITelemetryService, + @IProgressService private progressService: IProgressService, + @IInstantiationService instantiationService: IInstantiationService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IEditorGroupService private editorInputService: IEditorGroupService, + @IExtensionManagementService private extensionManagementService: IExtensionManagementService, + @INotificationService private notificationService: INotificationService, + @IViewletService private viewletService: IViewletService, + @IThemeService themeService: IThemeService, + @IConfigurationService private configurationService: IConfigurationService, + @IStorageService storageService: IStorageService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IContextKeyService contextKeyService: IContextKeyService, + @IContextMenuService contextMenuService: IContextMenuService, + @IExtensionService extensionService: IExtensionService + ) { + super(VIEWLET_ID, ViewLocation.Extensions, `${VIEWLET_ID}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); + + this.searchDelayer = new ThrottledDelayer(500); + this.nonEmptyWorkspaceContextKey = NonEmptyWorkspaceContext.bindTo(contextKeyService); + this.searchExtensionsContextKey = SearchExtensionsContext.bindTo(contextKeyService); + this.searchInstalledExtensionsContextKey = SearchInstalledExtensionsContext.bindTo(contextKeyService); + this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService); + this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService); + this.defaultRecommendedExtensionsContextKey = DefaultRecommendedExtensionsContext.bindTo(contextKeyService); + this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); + this.disposables.push(this.viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables)); + + this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(AutoUpdateConfigurationKey)) { + this.secondaryActions = null; + this.updateTitleArea(); + } + if (e.affectedKeys.indexOf(ShowRecommendationsOnlyOnDemandKey) > -1) { + this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); + } + }, this, this.disposables); + } async create(parent: HTMLElement): TPromise { addClass(parent, 'extensions-viewlet'); From b0f3fde216f37686d607566c8c0f8a8756cb7773 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 23:08:40 +0200 Subject: [PATCH 502/710] Register views outside viewlet --- .../extensions.contribution.ts | 3 +- .../electron-browser/extensionsViewlet.ts | 117 ++++++++++-------- 2 files changed, 64 insertions(+), 56 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index c884bb1d179..20d875bae68 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -27,7 +27,7 @@ import { import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { ExtensionEditor } from 'vs/workbench/parts/extensions/electron-browser/extensionEditor'; -import { StatusUpdater, ExtensionsViewlet, MaliciousExtensionChecker } from 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; +import { StatusUpdater, ExtensionsViewlet, MaliciousExtensionChecker, ExtensionsViewletViewsContribution } from 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; import { IQuickOpenRegistry, Extensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import * as jsonContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; @@ -54,6 +54,7 @@ workbenchRegistry.registerWorkbenchContribution(StatusUpdater, LifecyclePhase.Ru workbenchRegistry.registerWorkbenchContribution(MaliciousExtensionChecker, LifecyclePhase.Eventually); workbenchRegistry.registerWorkbenchContribution(ConfigureRecommendedExtensionsCommandsContributor, LifecyclePhase.Eventually); workbenchRegistry.registerWorkbenchContribution(KeymapExtensions, LifecyclePhase.Running); +workbenchRegistry.registerWorkbenchContribution(ExtensionsViewletViewsContribution, LifecyclePhase.Starting); Registry.as(OutputExtensions.OutputChannels) .registerChannel(ExtensionsChannelId, ExtensionsLabel); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index ea9dc91ed78..2b02d88b44c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -66,65 +66,11 @@ const SearchBuiltInExtensionsContext = new RawContextKey('searchBuiltIn const RecommendedExtensionsContext = new RawContextKey('recommendedExtensions', false); const DefaultRecommendedExtensionsContext = new RawContextKey('defaultRecommendedExtensions', false); -export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtensionsViewlet { - - private onSearchChange: EventOf; - private nonEmptyWorkspaceContextKey: IContextKey; - private searchExtensionsContextKey: IContextKey; - private searchInstalledExtensionsContextKey: IContextKey; - private searchBuiltInExtensionsContextKey: IContextKey; - private recommendedExtensionsContextKey: IContextKey; - private defaultRecommendedExtensionsContextKey: IContextKey; - - private searchDelayer: ThrottledDelayer; - private root: HTMLElement; - - private searchBox: HTMLInputElement; - private extensionsBox: HTMLElement; - private primaryActions: IAction[]; - private secondaryActions: IAction[]; - private disposables: IDisposable[] = []; +export class ExtensionsViewletViewsContribution implements IWorkbenchContribution { constructor( - @IPartService partService: IPartService, - @ITelemetryService telemetryService: ITelemetryService, - @IProgressService private progressService: IProgressService, - @IInstantiationService instantiationService: IInstantiationService, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IEditorGroupService private editorInputService: IEditorGroupService, - @IExtensionManagementService private extensionManagementService: IExtensionManagementService, - @INotificationService private notificationService: INotificationService, - @IViewletService private viewletService: IViewletService, - @IThemeService themeService: IThemeService, - @IConfigurationService private configurationService: IConfigurationService, - @IStorageService storageService: IStorageService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IContextKeyService contextKeyService: IContextKeyService, - @IContextMenuService contextMenuService: IContextMenuService, - @IExtensionService extensionService: IExtensionService ) { - super(VIEWLET_ID, ViewLocation.Extensions, `${VIEWLET_ID}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); - this.registerViews(); - this.searchDelayer = new ThrottledDelayer(500); - this.nonEmptyWorkspaceContextKey = NonEmptyWorkspaceContext.bindTo(contextKeyService); - this.searchExtensionsContextKey = SearchExtensionsContext.bindTo(contextKeyService); - this.searchInstalledExtensionsContextKey = SearchInstalledExtensionsContext.bindTo(contextKeyService); - this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService); - this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService); - this.defaultRecommendedExtensionsContextKey = DefaultRecommendedExtensionsContext.bindTo(contextKeyService); - this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); - this.disposables.push(this.viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables)); - - this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(AutoUpdateConfigurationKey)) { - this.secondaryActions = null; - this.updateTitleArea(); - } - if (e.affectedKeys.indexOf(ShowRecommendationsOnlyOnDemandKey) > -1) { - this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); - } - }, this, this.disposables); } private registerViews(): void { @@ -247,6 +193,67 @@ export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtens canToggleVisibility: true }; } +} + +export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtensionsViewlet { + + private onSearchChange: EventOf; + private nonEmptyWorkspaceContextKey: IContextKey; + private searchExtensionsContextKey: IContextKey; + private searchInstalledExtensionsContextKey: IContextKey; + private searchBuiltInExtensionsContextKey: IContextKey; + private recommendedExtensionsContextKey: IContextKey; + private defaultRecommendedExtensionsContextKey: IContextKey; + + private searchDelayer: ThrottledDelayer; + private root: HTMLElement; + + private searchBox: HTMLInputElement; + private extensionsBox: HTMLElement; + private primaryActions: IAction[]; + private secondaryActions: IAction[]; + private disposables: IDisposable[] = []; + + constructor( + @IPartService partService: IPartService, + @ITelemetryService telemetryService: ITelemetryService, + @IProgressService private progressService: IProgressService, + @IInstantiationService instantiationService: IInstantiationService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IEditorGroupService private editorInputService: IEditorGroupService, + @IExtensionManagementService private extensionManagementService: IExtensionManagementService, + @INotificationService private notificationService: INotificationService, + @IViewletService private viewletService: IViewletService, + @IThemeService themeService: IThemeService, + @IConfigurationService private configurationService: IConfigurationService, + @IStorageService storageService: IStorageService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IContextKeyService contextKeyService: IContextKeyService, + @IContextMenuService contextMenuService: IContextMenuService, + @IExtensionService extensionService: IExtensionService + ) { + super(VIEWLET_ID, ViewLocation.Extensions, `${VIEWLET_ID}.state`, true, partService, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService); + + this.searchDelayer = new ThrottledDelayer(500); + this.nonEmptyWorkspaceContextKey = NonEmptyWorkspaceContext.bindTo(contextKeyService); + this.searchExtensionsContextKey = SearchExtensionsContext.bindTo(contextKeyService); + this.searchInstalledExtensionsContextKey = SearchInstalledExtensionsContext.bindTo(contextKeyService); + this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService); + this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService); + this.defaultRecommendedExtensionsContextKey = DefaultRecommendedExtensionsContext.bindTo(contextKeyService); + this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); + this.disposables.push(this.viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables)); + + this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration(AutoUpdateConfigurationKey)) { + this.secondaryActions = null; + this.updateTitleArea(); + } + if (e.affectedKeys.indexOf(ShowRecommendationsOnlyOnDemandKey) > -1) { + this.defaultRecommendedExtensionsContextKey.set(!this.configurationService.getValue(ShowRecommendationsOnlyOnDemandKey)); + } + }, this, this.disposables); + } async create(parent: HTMLElement): TPromise { addClass(parent, 'extensions-viewlet'); From 2cdb1fb64777802581ab6fcc05306b07e65ba812 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 18 Apr 2018 23:12:03 +0200 Subject: [PATCH 503/710] Remove contributed property --- .../api/browser/activitybarExtensionPoint.ts | 2 +- .../browser/parts/activitybar/activitybarPart.ts | 2 +- src/vs/workbench/common/views.ts | 13 ++++++------- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts index 09b6dfc9618..15aed855355 100644 --- a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts +++ b/src/vs/workbench/api/browser/activitybarExtensionPoint.ts @@ -91,7 +91,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { const id = `workbench.view.extension.${descriptor.id}`; const title = descriptor.title; const cssClass = `extensionViewlet-${descriptor.id}`; - const location: ViewLocation = ViewLocation.register(id, true); + const location: ViewLocation = ViewLocation.register(id); // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 014ff3268ce..c6c432a65c0 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -236,7 +236,7 @@ export class ActivitybarPart extends Part { private canShow(viewlet: ViewletDescriptor): boolean { const viewLocation = ViewLocation.get(viewlet.id); - if (viewLocation && viewLocation.contributed) { + if (viewLocation) { return ViewsRegistry.getViews(viewLocation).length > 0; } return true; diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 4f721596537..aa06fd035a2 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -18,8 +18,8 @@ import { ThemeIcon } from 'vs/platform/theme/common/themeService'; export class ViewLocation { private static locations: Map = new Map(); - static register(id: string, contributed: boolean): ViewLocation { - const viewLocation = new ViewLocation(id, contributed); + static register(id: string): ViewLocation { + const viewLocation = new ViewLocation(id); ViewLocation.locations.set(id, viewLocation); return viewLocation; } @@ -27,13 +27,12 @@ export class ViewLocation { return ViewLocation.locations.get(value); } - static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer', false); - static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug', false); - static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions', false); + static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer'); + static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug'); + static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions'); - private constructor(private _id: string, private _contributed: boolean) { } + private constructor(private _id: string) { } get id(): string { return this._id; } - get contributed(): boolean { return this._contributed; } } From d0ef23949906a5dadcef30d70b122338db02bffe Mon Sep 17 00:00:00 2001 From: Piotr <4868063+Piotr-Nawrot@users.noreply.github.com> Date: Wed, 18 Apr 2018 23:14:58 +0200 Subject: [PATCH 504/710] Update processes.ts Grammar fix. --- src/vs/base/node/processes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index 1b61d41e675..38f414b2ffa 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -153,7 +153,7 @@ export abstract class AbstractProcess { public start(): PPromise { if (Platform.isWindows && ((this.options && this.options.cwd && TPath.isUNC(this.options.cwd)) || !this.options && !this.options.cwd && TPath.isUNC(process.cwd()))) { - return TPromise.wrapError(new Error(nls.localize('TaskRunner.UNC', 'Can\'t execute a shell command on an UNC drive.'))); + return TPromise.wrapError(new Error(nls.localize('TaskRunner.UNC', 'Can\'t execute a shell command on a UNC drive.'))); } return this.useExec().then((useExec) => { let cc: TValueCallback; From 2cabb75aedc49576fa6e26e6804758fb565584bb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 18 Apr 2018 23:41:15 +0200 Subject: [PATCH 505/710] increase CSS test timeout --- test/smoke/src/areas/css/css.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/smoke/src/areas/css/css.test.ts b/test/smoke/src/areas/css/css.test.ts index 176e634bf6d..785de831bd6 100644 --- a/test/smoke/src/areas/css/css.test.ts +++ b/test/smoke/src/areas/css/css.test.ts @@ -29,10 +29,12 @@ export function setup() { }); it('verifies that warning becomes an error once setting changed', async function () { + // settings might take a while to update? + this.timeout(40000); + const app = this.app as Application; await app.workbench.settingsEditor.addUserSetting('css.lint.emptyRules', '"error"'); await app.workbench.quickopen.openFile('style.css'); - await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); await app.code.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); From 558990d77367a49c4ac0c8624f1ed8d181a831ec Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 18 Apr 2018 23:56:50 +0200 Subject: [PATCH 506/710] Fixes #37271: Check height after possibly changing whitespace heights --- src/vs/editor/browser/viewParts/viewZones/viewZones.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts index 008e7c65129..175b237a2dd 100644 --- a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts +++ b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts @@ -99,7 +99,11 @@ export class ViewZones extends ViewPart { } public onLineMappingChanged(e: viewEvents.ViewLineMappingChangedEvent): boolean { - return this._recomputeWhitespacesProps(); + const hadAChange = this._recomputeWhitespacesProps(); + if (hadAChange) { + this._context.viewLayout.onHeightMaybeChanged(); + } + return hadAChange; } public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean { From 73d5269f3dee960264b0f41cff01747a589d23b7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 18 Apr 2018 15:51:58 -0700 Subject: [PATCH 507/710] Update markdown grammar --- .../markdown-basics/syntaxes/markdown.tmLanguage.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json index 47578f330b9..820134b366a 100644 --- a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json +++ b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json @@ -4,7 +4,7 @@ "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/microsoft/vscode-markdown-tm-grammar/commit/c41ddcc21a75655bd90708f1048023476b232ee0", + "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/e667795f83c83e36dc6f90bde14632a963c52e34", "name": "Markdown", "scopeName": "text.html.markdown", "patterns": [ @@ -2022,7 +2022,7 @@ "name": "meta.other.valid-ampersand.markdown" }, "bold": { - "begin": "(?x)\n ((?]*+> # HTML tags\n | (?`+)([^`]|(?!(?(?!`))`)*+\\k\n # Raw\n | \\\\[\\\\`*_{}\\[\\]()#.!+\\->]?+ # Escapes\n | \\[\n (\n (? # Named group\n [^\\[\\]\\\\] # Match most chars\n | \\\\. # Escaped chars\n | \\[ \\g*+ \\] # Nested brackets\n )*+\n \\]\n (\n ( # Reference Link\n [ ]? # Optional space\n \\[[^\\]]*+\\] # Ref name\n )\n | ( # Inline Link\n \\( # Opening paren\n [ \\t]*+ # Optional whitespace\n ? # URL\n [ \\t]*+ # Optional whitespace\n ( # Optional Title\n (?['\"])\n (.*?)\n \\k<title>\n )?\n \\)\n )\n )\n )\n | (?!(?<=\\S)\\1). # Everything besides\n # style closer\n )++\n (?<=\\S)\\1 # Close\n )\n", + "begin": "(?x)\n ((?<!\\w)\\*\\*\\b|\\b__)(?=\\S) # Open\n (?=\n (\n <[^>]*+> # HTML tags\n | (?<raw>`+)([^`]|(?!(?<!`)\\k<raw>(?!`))`)*+\\k<raw>\n # Raw\n | \\\\[\\\\`*_{}\\[\\]()#.!+\\->]?+ # Escapes\n | \\[\n (\n (?<square> # Named group\n [^\\[\\]\\\\] # Match most chars\n | \\\\. # Escaped chars\n | \\[ \\g<square>*+ \\] # Nested brackets\n )*+\n \\]\n (\n ( # Reference Link\n [ ]? # Optional space\n \\[[^\\]]*+\\] # Ref name\n )\n | ( # Inline Link\n \\( # Opening paren\n [ \\t]*+ # Optional whitespace\n <?(.*?)>? # URL\n [ \\t]*+ # Optional whitespace\n ( # Optional Title\n (?<title>['\"])\n (.*?)\n \\k<title>\n )?\n \\)\n )\n )\n )\n | (?!(?<=\\S)\\1). # Everything besides\n # style closer\n )++\n (?<=\\S)(?=__\\b|\\*\\*)\\1 # Close\n )\n", "captures": { "1": { "name": "punctuation.definition.bold.markdown" @@ -2164,7 +2164,7 @@ "name": "meta.image.reference.markdown" }, "italic": { - "begin": "(?x) (\\*\\b|\\b_)(?=\\S) # Open\n (?=\n (\n <[^>]*+> # HTML tags\n | (?<raw>`+)([^`]|(?!(?<!`)\\k<raw>(?!`))`)*+\\k<raw>\n # Raw\n | \\\\[\\\\`*_{}\\[\\]()#.!+\\->]?+ # Escapes\n | \\[\n (\n (?<square> # Named group\n [^\\[\\]\\\\] # Match most chars\n | \\\\. # Escaped chars\n | \\[ \\g<square>*+ \\] # Nested brackets\n )*+\n \\]\n (\n ( # Reference Link\n [ ]? # Optional space\n \\[[^\\]]*+\\] # Ref name\n )\n | ( # Inline Link\n \\( # Opening paren\n [ \\t]*+ # Optional whtiespace\n <?(.*?)>? # URL\n [ \\t]*+ # Optional whtiespace\n ( # Optional Title\n (?<title>['\"])\n (.*?)\n \\k<title>\n )?\n \\)\n )\n )\n )\n | \\1\\1 # Must be bold closer\n | (?!(?<=\\S)\\1). # Everything besides\n # style closer\n )++\n (?<=\\w)\\1 # Close\n )\n", + "begin": "(?x) (\\*\\b|\\b_)(?=\\S) # Open\n (?=\n (\n <[^>]*+> # HTML tags\n | (?<raw>`+)([^`]|(?!(?<!`)\\k<raw>(?!`))`)*+\\k<raw>\n # Raw\n | \\\\[\\\\`*_{}\\[\\]()#.!+\\->]?+ # Escapes\n | \\[\n (\n (?<square> # Named group\n [^\\[\\]\\\\] # Match most chars\n | \\\\. # Escaped chars\n | \\[ \\g<square>*+ \\] # Nested brackets\n )*+\n \\]\n (\n ( # Reference Link\n [ ]? # Optional space\n \\[[^\\]]*+\\] # Ref name\n )\n | ( # Inline Link\n \\( # Opening paren\n [ \\t]*+ # Optional whtiespace\n <?(.*?)>? # URL\n [ \\t]*+ # Optional whtiespace\n ( # Optional Title\n (?<title>['\"])\n (.*?)\n \\k<title>\n )?\n \\)\n )\n )\n )\n | \\1\\1 # Must be bold closer\n | (?!(?<=\\S)\\1). # Everything besides\n # style closer\n )++\n (?<=\\S)(?=_\\b|\\*)\\1 # Close\n )\n", "captures": { "1": { "name": "punctuation.definition.italic.markdown" From 7812e8190e3818b901ee5b531e9ac4a53322a9b8 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Wed, 18 Apr 2018 15:56:37 -0700 Subject: [PATCH 508/710] Fix ts/js insertText used with useCodeSnippetsOnMethodSuggest Fixes #48163 --- .../src/features/completionItemProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/features/completionItemProvider.ts b/extensions/typescript-language-features/src/features/completionItemProvider.ts index 2a2c58cab04..6b155ccfdd2 100644 --- a/extensions/typescript-language-features/src/features/completionItemProvider.ts +++ b/extensions/typescript-language-features/src/features/completionItemProvider.ts @@ -519,7 +519,7 @@ export default class TypeScriptCompletionItemProvider implements vscode.Completi const snippet = new vscode.SnippetString(); const methodName = detail.displayParts.find(part => part.kind === 'methodName'); - snippet.appendText((methodName && methodName.text) || item.label || item.insertText as string); + snippet.appendText((item.insertText as string) || (methodName && methodName.text) || item.label); snippet.appendText('('); let parenCount = 0; From cd55adf8a9f69fec8857fbcc33fab1d740cd01a6 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 00:56:50 +0200 Subject: [PATCH 509/710] Fixes #43922 --- src/vs/editor/common/diff/diffComputer.ts | 2 +- .../test/common/diff/diffComputer.test.ts | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/diff/diffComputer.ts b/src/vs/editor/common/diff/diffComputer.ts index a1b88e19a4b..6bccc31a789 100644 --- a/src/vs/editor/common/diff/diffComputer.ts +++ b/src/vs/editor/common/diff/diffComputer.ts @@ -284,7 +284,7 @@ class LineChange implements ILineChange { const originalCharSequence = originalLineSequence.getCharSequence(diffChange.originalStart, diffChange.originalStart + diffChange.originalLength - 1); const modifiedCharSequence = modifiedLineSequence.getCharSequence(diffChange.modifiedStart, diffChange.modifiedStart + diffChange.modifiedLength - 1); - let rawChanges = computeDiff(originalCharSequence, modifiedCharSequence, continueProcessingPredicate, false); + let rawChanges = computeDiff(originalCharSequence, modifiedCharSequence, continueProcessingPredicate, true); if (shouldPostProcessCharChanges) { rawChanges = postProcessCharChanges(rawChanges); diff --git a/src/vs/editor/test/common/diff/diffComputer.test.ts b/src/vs/editor/test/common/diff/diffComputer.test.ts index 0d521de7eb8..dd513f43452 100644 --- a/src/vs/editor/test/common/diff/diffComputer.test.ts +++ b/src/vs/editor/test/common/diff/diffComputer.test.ts @@ -673,4 +673,23 @@ suite('Editor Diff - DiffComputer', () => { ]; assertDiff(original, modified, expected, true, false); }); + + test('issue #43922', () => { + let original = [ + ' * `yarn [install]` -- Install project NPM dependencies. This is automatically done when you first create the project. You should only need to run this if you add dependencies in `package.json`.', + ]; + let modified = [ + ' * `yarn` -- Install project NPM dependencies. You should only need to run this if you add dependencies in `package.json`.', + ]; + var expected = [ + createLineChange( + 1, 1, 1, 1, + [ + createCharChange(1, 9, 1, 19, 0, 0, 0, 0), + createCharChange(1, 58, 1, 120, 0, 0, 0, 0), + ] + ) + ]; + assertDiff(original, modified, expected, true, false); + }); }); From fac0095643e3827aeb5c964084a59c24c86de474 Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Wed, 18 Apr 2018 20:36:13 -0700 Subject: [PATCH 510/710] Restore split include/exclude boxes Revert "Fix #47157 - Focus include/exclude box when toggling open" This reverts commit cf87ba36c0d62c3a9d77da5f96a5c24c9d87a122. See #46315 Revert "Fix #46628 - wrong "no results found" message" This reverts commit 0bd949c012df0081169728c77749a239eef73b62. See #46315 Revert "Fix default search exclusions string" This reverts commit 234d100603128cc1fe1c3b885df6e44c002d79c6. See #46315 Revert "Improve migrating from split include/exclude inputs to the new merged one" This reverts commit 22f49f8c93dfca48f9e631966b71b84c44371209. See #46315 Revert "Fix #45702 - merge include/exclude inputs" This reverts commit 7fdf1e3b50b57df7c0ab54cf4012ae1880aed01c. See #46315 --- .../parts/search/browser/searchActions.ts | 42 +++++++ .../parts/search/browser/searchView.ts | 116 ++++++++++++------ .../parts/search/common/queryBuilder.ts | 22 ---- .../electron-browser/search.contribution.ts | 5 +- .../search/test/common/queryBuilder.test.ts | 45 ------- 5 files changed, 125 insertions(+), 105 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index 0895c195cee..af43ddcccf4 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -126,6 +126,48 @@ export class ShowPreviousSearchIncludeAction extends Action { } } +export class ShowNextSearchExcludeAction extends Action { + + public static readonly ID = 'search.history.showNextExcludePattern'; + public static readonly LABEL = nls.localize('nextSearchExcludePattern', "Show Next Search Exclude Pattern"); + + constructor(id: string, label: string, + @IViewletService private viewletService: IViewletService, + @IPanelService private panelService: IPanelService, + @IContextKeyService private contextKeyService: IContextKeyService + ) { + super(id, label); + this.enabled = this.contextKeyService.contextMatchesRules(Constants.SearchViewVisibleKey); + } + + public run(): TPromise<any> { + const searchView = getSearchView(this.viewletService, this.panelService); + searchView.searchExcludePattern.showNextTerm(); + return TPromise.as(null); + } +} + +export class ShowPreviousSearchExcludeAction extends Action { + + public static readonly ID = 'search.history.showPreviousExcludePattern'; + public static readonly LABEL = nls.localize('previousSearchExcludePattern', "Show Previous Search Exclude Pattern"); + + constructor(id: string, label: string, + @IViewletService private viewletService: IViewletService, + @IContextKeyService private contextKeyService: IContextKeyService, + @IPanelService private panelService: IPanelService + ) { + super(id, label); + this.enabled = this.contextKeyService.contextMatchesRules(Constants.SearchViewVisibleKey); + } + + public run(): TPromise<any> { + const searchView = getSearchView(this.viewletService, this.panelService); + searchView.searchExcludePattern.showPreviousTerm(); + return TPromise.as(null); + } +} + export class ShowNextSearchTermAction extends Action { public static readonly ID = 'search.history.showNext'; diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index 52aaf31a014..1a1e0f46fd3 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -62,7 +62,6 @@ import { IPanel } from 'vs/workbench/common/panel'; import { IViewlet } from 'vs/workbench/common/viewlet'; import { Viewlet } from 'vs/workbench/browser/viewlet'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { splitGlobAware } from 'vs/base/common/glob'; export class SearchView extends Viewlet implements IViewlet, IPanel { @@ -80,6 +79,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { private viewletVisible: IContextKey<boolean>; private inputBoxFocused: IContextKey<boolean>; private inputPatternIncludesFocused: IContextKey<boolean>; + private inputPatternExclusionsFocused: IContextKey<boolean>; private firstMatchFocused: IContextKey<boolean>; private fileMatchOrMatchFocused: IContextKey<boolean>; private fileMatchOrFolderMatchFocus: IContextKey<boolean>; @@ -99,7 +99,8 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { private searchWidget: SearchWidget; private size: dom.Dimension; private queryDetails: HTMLElement; - private inputPatternIncludes: ExcludePatternInputWidget; + private inputPatternExcludes: ExcludePatternInputWidget; + private inputPatternIncludes: PatternInputWidget; private results: Builder; private currentSelectedFileMatch: FileMatch; @@ -136,6 +137,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.viewletVisible = Constants.SearchViewVisibleKey.bindTo(contextKeyService); this.inputBoxFocused = Constants.InputBoxFocusedKey.bindTo(this.contextKeyService); this.inputPatternIncludesFocused = Constants.PatternIncludesFocusedKey.bindTo(this.contextKeyService); + this.inputPatternExclusionsFocused = Constants.PatternExcludesFocusedKey.bindTo(this.contextKeyService); this.firstMatchFocused = Constants.FirstMatchFocusKey.bindTo(contextKeyService); this.fileMatchOrMatchFocused = Constants.FileMatchOrMatchFocusKey.bindTo(contextKeyService); this.fileMatchOrFolderMatchFocus = Constants.FileMatchOrFolderMatchFocusKey.bindTo(contextKeyService); @@ -182,7 +184,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { const filePatterns = this.viewletSettings['query.filePatterns'] || ''; const patternExclusions = this.viewletSettings['query.folderExclusions'] || ''; - delete this.viewletSettings['query.folderExclusions']; // Migrating from versions that have dedicated exclusions persisted + const patternExclusionsHistory = this.viewletSettings['query.folderExclusionsHistory'] || []; const patternIncludes = this.viewletSettings['query.folderIncludes'] || ''; const patternIncludesHistory = this.viewletSettings['query.folderIncludesHistory'] || []; const queryDetailsExpanded = this.viewletSettings['query.queryDetailsExpanded'] || ''; @@ -193,43 +195,27 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { builder.div({ 'class': 'more', 'tabindex': 0, 'role': 'button', 'title': nls.localize('moreSearch', "Toggle Search Details") }) .on(dom.EventType.CLICK, (e) => { dom.EventHelper.stop(e); - this.toggleQueryDetails(); + this.toggleQueryDetails(true); }).on(dom.EventType.KEY_UP, (e: KeyboardEvent) => { let event = new StandardKeyboardEvent(e); if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { dom.EventHelper.stop(e); - this.toggleQueryDetails(false); + this.toggleQueryDetails(); } }); //folder includes list builder.div({ 'class': 'file-types' }, (builder) => { - let title = nls.localize('searchIncludeExclude.label', "files to include/exclude"); + let title = nls.localize('searchScope.includes', "files to include"); builder.element('h4', { text: title }); - this.inputPatternIncludes = new ExcludePatternInputWidget(builder.getContainer(), this.contextViewService, this.themeService, { - ariaLabel: nls.localize('searchIncludeExclude.ariaLabel', 'Search Include/Exclude Patterns'), - placeholder: nls.localize('searchIncludeExclude.placeholder', "Examples: src, !*.ts, test/**/*.log") + this.inputPatternIncludes = new PatternInputWidget(builder.getContainer(), this.contextViewService, this.themeService, { + ariaLabel: nls.localize('label.includes', 'Search Include Patterns') }); - // For migrating from versions that have dedicated exclusions persisted - let mergedIncludeExcludes = patternIncludes; - if (patternExclusions) { - if (mergedIncludeExcludes) { - mergedIncludeExcludes += ', '; - } - - mergedIncludeExcludes += splitGlobAware(patternExclusions, ',') - .map(s => s.trim()) - .filter(s => !!s.length) - .map(s => '!' + s) - .join(', '); - } - - this.inputPatternIncludes.setValue(mergedIncludeExcludes); + this.inputPatternIncludes.setValue(patternIncludes); this.inputPatternIncludes.setHistory(patternIncludesHistory); - this.inputPatternIncludes.setUseExcludesAndIgnoreFiles(useExcludesAndIgnoreFiles); this.inputPatternIncludes .on(FindInput.OPTION_CHANGE, (e) => { @@ -240,6 +226,30 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.inputPatternIncludes.onCancel(() => this.viewModel.cancelSearch()); // Cancel search without focusing the search widget this.trackInputBox(this.inputPatternIncludes.inputFocusTracker, this.inputPatternIncludesFocused); }); + + //pattern exclusion list + builder.div({ 'class': 'file-types' }, (builder) => { + let title = nls.localize('searchScope.excludes', "files to exclude"); + builder.element('h4', { text: title }); + + this.inputPatternExcludes = new ExcludePatternInputWidget(builder.getContainer(), this.contextViewService, this.themeService, { + ariaLabel: nls.localize('label.excludes', 'Search Exclude Patterns') + }); + + this.inputPatternExcludes.setValue(patternExclusions); + this.inputPatternExcludes.setUseExcludesAndIgnoreFiles(useExcludesAndIgnoreFiles); + this.inputPatternExcludes.setHistory(patternExclusionsHistory); + + this.inputPatternExcludes + .on(FindInput.OPTION_CHANGE, (e) => { + this.onQueryChanged(false); + }); + + this.inputPatternExcludes.onSubmit(() => this.onQueryChanged(true, true)); + this.inputPatternExcludes.onSubmit(() => this.onQueryChanged(true, true)); + this.inputPatternExcludes.onCancel(() => this.viewModel.cancelSearch()); // Cancel search without focusing the search widget + this.trackInputBox(this.inputPatternExcludes.inputFocusTracker, this.inputPatternExclusionsFocused); + }); }).getHTMLElement(); this.messages = builder.div({ 'class': 'messages' }).hide().clone(); @@ -272,6 +282,10 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { return this.inputPatternIncludes; } + public get searchExcludePattern(): PatternInputWidget { + return this.inputPatternExcludes; + } + private updateActions(): void { for (const action of this.actions) { action.update(); @@ -328,7 +342,8 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.toUnbind.push(inputFocusTracker.onDidBlur(() => { this.inputBoxFocused.set(this.searchWidget.searchInputHasFocus() || this.searchWidget.replaceInputHasFocus() - || this.inputPatternIncludes.inputHasFocus()); + || this.inputPatternIncludes.inputHasFocus() + || this.inputPatternExcludes.inputHasFocus()); if (contextKey) { contextKey.set(false); } @@ -706,6 +721,12 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { } if (this.inputPatternIncludes.inputHasFocus()) { + this.inputPatternExcludes.focus(); + this.inputPatternExcludes.select(); + return; + } + + if (this.inputPatternExcludes.inputHasFocus()) { this.selectTreeIfNotSelected(); return; } @@ -734,6 +755,12 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { return; } + if (this.inputPatternExcludes.inputHasFocus()) { + this.inputPatternIncludes.focus(); + this.inputPatternIncludes.select(); + return; + } + if (this.tree.isDOMFocused()) { this.moveFocusFromResults(); return; @@ -742,7 +769,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { private moveFocusFromResults(): void { if (this.showsFileTypes()) { - this.toggleQueryDetails(true, true, false); + this.toggleQueryDetails(true, true, false, true); } else { this.searchWidget.focus(true, true); } @@ -761,6 +788,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.searchWidget.setWidth(this.size.width - 28 /* container margin */); + this.inputPatternExcludes.setWidth(this.size.width - 28 /* container margin */); this.inputPatternIncludes.setWidth(this.size.width - 28 /* container margin */); const messagesSize = this.messages.isHidden() ? 0 : dom.getTotalHeight(this.messages.getHTMLElement()); @@ -881,7 +909,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.onQueryChanged(true, true); } - public toggleQueryDetails(moveFocus = true, show?: boolean, skipLayout?: boolean): void { + public toggleQueryDetails(moveFocus?: boolean, show?: boolean, skipLayout?: boolean, reverse?: boolean): void { let cls = 'more'; show = typeof show === 'undefined' ? !dom.hasClass(this.queryDetails, cls) : Boolean(show); this.viewletSettings['query.queryDetailsExpanded'] = show; @@ -890,8 +918,13 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { if (show) { dom.addClass(this.queryDetails, cls); if (moveFocus) { - this.inputPatternIncludes.focus(); - this.inputPatternIncludes.select(); + if (reverse) { + this.inputPatternExcludes.focus(); + this.inputPatternExcludes.select(); + } else { + this.inputPatternIncludes.focus(); + this.inputPatternIncludes.select(); + } } } else { dom.removeClass(this.queryDetails, cls); @@ -959,7 +992,9 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { const isWholeWords = this.searchWidget.searchInput.getWholeWords(); const isCaseSensitive = this.searchWidget.searchInput.getCaseSensitive(); const contentPattern = this.searchWidget.searchInput.getValue(); - const useExcludesAndIgnoreFiles = this.inputPatternIncludes.useExcludesAndIgnoreFiles(); + const excludePatternText = this.inputPatternExcludes.getValue().trim(); + const includePatternText = this.inputPatternIncludes.getValue().trim(); + const useExcludesAndIgnoreFiles = this.inputPatternExcludes.useExcludesAndIgnoreFiles(); if (!rerunQuery) { return; @@ -992,8 +1027,8 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { isSmartCase: this.configurationService.getValue<ISearchConfiguration>().search.smartCase }; - const includeExcludePattern = this.inputPatternIncludes.getValue().trim(); - const { includePattern, excludePattern } = this.queryBuilder.parseIncludeExcludePattern(includeExcludePattern); + const excludePattern = this.inputPatternExcludes.getValue(); + const includePattern = this.inputPatternIncludes.getValue(); const options: IQueryOptions = { extraFileResources: getOutOfWorkspaceEditorResources(this.editorGroupService, this.contextService), @@ -1019,7 +1054,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { } this.validateQuery(query).then(() => { - this.onQueryTriggered(query, excludePattern, includePattern); + this.onQueryTriggered(query, excludePatternText, includePatternText); if (!preserveFocus) { this.searchWidget.focus(false); // focus back to input field @@ -1050,6 +1085,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { } private onQueryTriggered(query: ISearchQuery, excludePatternText: string, includePatternText: string): void { + this.inputPatternExcludes.onSearchSubmit(); this.inputPatternIncludes.onSearchSubmit(); this.viewModel.cancelSearch(); @@ -1110,8 +1146,8 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { } if (!hasResults) { - const hasExcludes = !!excludePatternText; - const hasIncludes = !!includePatternText; + let hasExcludes = !!excludePatternText; + let hasIncludes = !!includePatternText; let message: string; if (!completed) { @@ -1151,6 +1187,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { }).on(dom.EventType.CLICK, (e: MouseEvent) => { dom.EventHelper.stop(e, false); + this.inputPatternExcludes.setValue(''); this.inputPatternIncludes.setValue(''); this.onQueryChanged(true); @@ -1439,9 +1476,11 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { const isWholeWords = this.searchWidget.searchInput.getWholeWords(); const isCaseSensitive = this.searchWidget.searchInput.getCaseSensitive(); const contentPattern = this.searchWidget.searchInput.getValue(); + const patternExcludes = this.inputPatternExcludes.getValue().trim(); const patternIncludes = this.inputPatternIncludes.getValue().trim(); - const useExcludesAndIgnoreFiles = this.inputPatternIncludes.useExcludesAndIgnoreFiles(); + const useExcludesAndIgnoreFiles = this.inputPatternExcludes.useExcludesAndIgnoreFiles(); const searchHistory = this.searchWidget.getHistory(); + const patternExcludesHistory = this.inputPatternExcludes.getHistory(); const patternIncludesHistory = this.inputPatternIncludes.getHistory(); // store memento @@ -1450,7 +1489,9 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.viewletSettings['query.regex'] = isRegex; this.viewletSettings['query.wholeWords'] = isWholeWords; this.viewletSettings['query.caseSensitive'] = isCaseSensitive; + this.viewletSettings['query.folderExclusions'] = patternExcludes; this.viewletSettings['query.folderIncludes'] = patternIncludes; + this.viewletSettings['query.folderExclusionsHistory'] = patternExcludesHistory; this.viewletSettings['query.folderIncludesHistory'] = patternIncludesHistory; this.viewletSettings['query.useExcludesAndIgnoreFiles'] = useExcludesAndIgnoreFiles; @@ -1466,6 +1507,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.searchWidget.dispose(); this.inputPatternIncludes.dispose(); + this.inputPatternExcludes.dispose(); this.viewModel.dispose(); diff --git a/src/vs/workbench/parts/search/common/queryBuilder.ts b/src/vs/workbench/parts/search/common/queryBuilder.ts index d0a998f9117..417c6bdac24 100644 --- a/src/vs/workbench/parts/search/common/queryBuilder.ts +++ b/src/vs/workbench/parts/search/common/queryBuilder.ts @@ -182,28 +182,6 @@ export class QueryBuilder { return Object.keys(excludeExpression).length ? excludeExpression : undefined; } - /** - * A helper that splits positive and negative patterns from a string that combines both. - */ - public parseIncludeExcludePattern(pattern: string): { includePattern?: string, excludePattern?: string } { - const grouped = collections.groupBy( - splitGlobPattern(pattern), - s => strings.startsWith(s, '!') ? 'excludePattern' : 'includePattern'); - - const result = {}; - if (grouped.includePattern) { - result['includePattern'] = grouped.includePattern.join(', '); - } - - if (grouped.excludePattern) { - result['excludePattern'] = grouped.excludePattern - .map(s => strings.ltrim(s, '!')) - .join(', '); - } - - return result; - } - private mergeExcludesFromFolderQueries(folderQueries: IFolderQuery[]): glob.IExpression | undefined { const mergedExcludes = folderQueries.reduce((merged: glob.IExpression, fq: IFolderQuery) => { if (fq.excludePattern) { diff --git a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts index 90b31f579d5..b575b602528 100644 --- a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts @@ -53,7 +53,7 @@ import { getMultiSelectedResources } from 'vs/workbench/parts/files/browser/file import { Schemas } from 'vs/base/common/network'; import { PanelRegistry, Extensions as PanelExtensions, PanelDescriptor } from 'vs/workbench/browser/panel'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { openSearchView, getSearchView, ReplaceAllInFolderAction, ReplaceAllAction, CloseReplaceAction, FocusNextInputAction, FocusPreviousInputAction, FocusNextSearchResultAction, FocusPreviousSearchResultAction, ReplaceInFilesAction, FindInFilesAction, FocusActiveEditorCommand, toggleCaseSensitiveCommand, ShowNextSearchTermAction, ShowPreviousSearchTermAction, toggleRegexCommand, ShowPreviousSearchIncludeAction, ShowNextSearchIncludeAction, CollapseDeepestExpandedLevelAction, toggleWholeWordCommand, RemoveAction, ReplaceAction, ClearSearchResultsAction, copyPathCommand, copyMatchCommand, copyAllCommand } from 'vs/workbench/parts/search/browser/searchActions'; +import { openSearchView, getSearchView, ReplaceAllInFolderAction, ReplaceAllAction, CloseReplaceAction, FocusNextInputAction, FocusPreviousInputAction, FocusNextSearchResultAction, FocusPreviousSearchResultAction, ReplaceInFilesAction, FindInFilesAction, FocusActiveEditorCommand, toggleCaseSensitiveCommand, ShowNextSearchTermAction, ShowPreviousSearchTermAction, toggleRegexCommand, ShowPreviousSearchIncludeAction, ShowNextSearchIncludeAction, CollapseDeepestExpandedLevelAction, toggleWholeWordCommand, RemoveAction, ReplaceAction, ClearSearchResultsAction, copyPathCommand, copyMatchCommand, copyAllCommand, ShowNextSearchExcludeAction, ShowPreviousSearchExcludeAction } from 'vs/workbench/parts/search/browser/searchActions'; import { VIEW_ID, ISearchConfigurationProperties } from 'vs/platform/search/common/search'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; @@ -483,6 +483,9 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(ShowPreviousSearchTerm registry.registerWorkbenchAction(new SyncActionDescriptor(ShowNextSearchIncludeAction, ShowNextSearchIncludeAction.ID, ShowNextSearchIncludeAction.LABEL, ShowNextFindTermKeybinding, ContextKeyExpr.and(Constants.SearchViewVisibleKey, Constants.PatternIncludesFocusedKey)), 'Search: Show Next Search Include Pattern', category); registry.registerWorkbenchAction(new SyncActionDescriptor(ShowPreviousSearchIncludeAction, ShowPreviousSearchIncludeAction.ID, ShowPreviousSearchIncludeAction.LABEL, ShowPreviousFindTermKeybinding, ContextKeyExpr.and(Constants.SearchViewVisibleKey, Constants.PatternIncludesFocusedKey)), 'Search: Show Previous Search Include Pattern', category); +registry.registerWorkbenchAction(new SyncActionDescriptor(ShowNextSearchExcludeAction, ShowNextSearchExcludeAction.ID, ShowNextSearchExcludeAction.LABEL, ShowNextFindTermKeybinding, ContextKeyExpr.and(Constants.SearchViewVisibleKey, Constants.PatternExcludesFocusedKey)), 'Search: Show Next Search Exclude Pattern', category); +registry.registerWorkbenchAction(new SyncActionDescriptor(ShowPreviousSearchExcludeAction, ShowPreviousSearchExcludeAction.ID, ShowPreviousSearchExcludeAction.LABEL, ShowPreviousFindTermKeybinding, ContextKeyExpr.and(Constants.SearchViewVisibleKey, Constants.PatternExcludesFocusedKey)), 'Search: Show Previous Search Exclude Pattern', category); + registry.registerWorkbenchAction(new SyncActionDescriptor(CollapseDeepestExpandedLevelAction, CollapseDeepestExpandedLevelAction.ID, CollapseDeepestExpandedLevelAction.LABEL), 'Search: Collapse All', category); registry.registerWorkbenchAction(new SyncActionDescriptor(ShowAllSymbolsAction, ShowAllSymbolsAction.ID, ShowAllSymbolsAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_T }), 'Go to Symbol in Workspace...'); diff --git a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts index 4ae1b1a4faf..bb9e17f68f0 100644 --- a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts +++ b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts @@ -697,51 +697,6 @@ suite('QueryBuilder', () => { assert(query.sortByScore); }); }); - - suite('parseIncludeExcludePattern', () => { - test('nothing', () => { - assert.deepEqual( - queryBuilder.parseIncludeExcludePattern(''), - {}); - }); - - test('includes', () => { - assert.deepEqual( - queryBuilder.parseIncludeExcludePattern('src'), - { - includePattern: 'src' - }); - - assert.deepEqual( - queryBuilder.parseIncludeExcludePattern('src, test'), - { - includePattern: 'src, test' - }); - }); - - test('excludes', () => { - assert.deepEqual( - queryBuilder.parseIncludeExcludePattern('!src'), - { - excludePattern: 'src' - }); - - assert.deepEqual( - queryBuilder.parseIncludeExcludePattern('!src, !test'), - { - excludePattern: 'src, test' - }); - }); - - test('includes and excludes', () => { - assert.deepEqual( - queryBuilder.parseIncludeExcludePattern('!src, test, !foo, bar'), - { - includePattern: 'test, bar', - excludePattern: 'src, foo' - }); - }); - }); }); function assertEqualQueries(actual: ISearchQuery, expected: ISearchQuery): void { From 7683cb4bf438c46fa93491e232d7934fd23f5bf4 Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Wed, 18 Apr 2018 21:43:37 -0700 Subject: [PATCH 511/710] Transition combined include/exclude patterns back to split include/exclude boxes For #46315 --- .../parts/search/browser/searchView.ts | 37 +++++++++++++-- .../parts/search/common/queryBuilder.ts | 22 +++++++++ .../search/test/common/queryBuilder.test.ts | 45 +++++++++++++++++++ 3 files changed, 100 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index 1a1e0f46fd3..dccdd36adcd 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -183,14 +183,43 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.createSearchWidget(this.searchWidgetsContainer); const filePatterns = this.viewletSettings['query.filePatterns'] || ''; - const patternExclusions = this.viewletSettings['query.folderExclusions'] || ''; - const patternExclusionsHistory = this.viewletSettings['query.folderExclusionsHistory'] || []; - const patternIncludes = this.viewletSettings['query.folderIncludes'] || ''; - const patternIncludesHistory = this.viewletSettings['query.folderIncludesHistory'] || []; + let patternExclusions = this.viewletSettings['query.folderExclusions'] || ''; + const patternExclusionsHistory: string[] = this.viewletSettings['query.folderExclusionsHistory'] || []; + let patternIncludes = this.viewletSettings['query.folderIncludes'] || ''; + let patternIncludesHistory: string[] = this.viewletSettings['query.folderIncludesHistory'] || []; const queryDetailsExpanded = this.viewletSettings['query.queryDetailsExpanded'] || ''; const useExcludesAndIgnoreFiles = typeof this.viewletSettings['query.useExcludesAndIgnoreFiles'] === 'boolean' ? this.viewletSettings['query.useExcludesAndIgnoreFiles'] : true; + // Transition history from 1.22 combined include+exclude, to split include/exclude histories + const patternIncludesHistoryWithoutExcludes: string[] = []; + const patternExcludesHistoryFromIncludes: string[] = []; + patternIncludesHistory.forEach(historyEntry => { + const includeExclude = this.queryBuilder.parseIncludeExcludePattern(historyEntry); + if (includeExclude.includePattern) { + patternIncludesHistoryWithoutExcludes.push(includeExclude.includePattern); + } + + if (includeExclude.excludePattern) { + patternExcludesHistoryFromIncludes.push(includeExclude.excludePattern); + } + }); + + patternIncludesHistory = patternIncludesHistoryWithoutExcludes; + patternExclusionsHistory.push(...patternExcludesHistoryFromIncludes); + + // Split combined include/exclude to split include/exclude boxes + const includeExclude = this.queryBuilder.parseIncludeExcludePattern(patternIncludes); + patternIncludes = includeExclude.includePattern || ''; + + if (includeExclude.excludePattern) { + if (patternExclusions) { + patternExclusions += ', ' + includeExclude.excludePattern; + } else { + patternExclusions = includeExclude.excludePattern; + } + } + this.queryDetails = this.searchWidgetsContainer.div({ 'class': ['query-details'] }, (builder) => { builder.div({ 'class': 'more', 'tabindex': 0, 'role': 'button', 'title': nls.localize('moreSearch', "Toggle Search Details") }) .on(dom.EventType.CLICK, (e) => { diff --git a/src/vs/workbench/parts/search/common/queryBuilder.ts b/src/vs/workbench/parts/search/common/queryBuilder.ts index 417c6bdac24..d0a998f9117 100644 --- a/src/vs/workbench/parts/search/common/queryBuilder.ts +++ b/src/vs/workbench/parts/search/common/queryBuilder.ts @@ -182,6 +182,28 @@ export class QueryBuilder { return Object.keys(excludeExpression).length ? excludeExpression : undefined; } + /** + * A helper that splits positive and negative patterns from a string that combines both. + */ + public parseIncludeExcludePattern(pattern: string): { includePattern?: string, excludePattern?: string } { + const grouped = collections.groupBy( + splitGlobPattern(pattern), + s => strings.startsWith(s, '!') ? 'excludePattern' : 'includePattern'); + + const result = {}; + if (grouped.includePattern) { + result['includePattern'] = grouped.includePattern.join(', '); + } + + if (grouped.excludePattern) { + result['excludePattern'] = grouped.excludePattern + .map(s => strings.ltrim(s, '!')) + .join(', '); + } + + return result; + } + private mergeExcludesFromFolderQueries(folderQueries: IFolderQuery[]): glob.IExpression | undefined { const mergedExcludes = folderQueries.reduce((merged: glob.IExpression, fq: IFolderQuery) => { if (fq.excludePattern) { diff --git a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts index bb9e17f68f0..4ae1b1a4faf 100644 --- a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts +++ b/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts @@ -697,6 +697,51 @@ suite('QueryBuilder', () => { assert(query.sortByScore); }); }); + + suite('parseIncludeExcludePattern', () => { + test('nothing', () => { + assert.deepEqual( + queryBuilder.parseIncludeExcludePattern(''), + {}); + }); + + test('includes', () => { + assert.deepEqual( + queryBuilder.parseIncludeExcludePattern('src'), + { + includePattern: 'src' + }); + + assert.deepEqual( + queryBuilder.parseIncludeExcludePattern('src, test'), + { + includePattern: 'src, test' + }); + }); + + test('excludes', () => { + assert.deepEqual( + queryBuilder.parseIncludeExcludePattern('!src'), + { + excludePattern: 'src' + }); + + assert.deepEqual( + queryBuilder.parseIncludeExcludePattern('!src, !test'), + { + excludePattern: 'src, test' + }); + }); + + test('includes and excludes', () => { + assert.deepEqual( + queryBuilder.parseIncludeExcludePattern('!src, test, !foo, bar'), + { + includePattern: 'test, bar', + excludePattern: 'src, foo' + }); + }); + }); }); function assertEqualQueries(actual: ISearchQuery, expected: ISearchQuery): void { From b15ab83770e814fbdc3127e2dcc2f6b6fdbf193e Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 08:32:22 +0200 Subject: [PATCH 512/710] Fix tests --- .../editor/test/common/config/commonEditorConfig.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index 4d5da6aec32..ef16d492ef5 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -88,14 +88,14 @@ suite('Common Editor Config', () => { let config = new TestWrappingConfiguration({ wordWrap: <any>true }); - assertWrapping(config, true, 81); + assertWrapping(config, true, 80); }); test('wordWrap on', () => { let config = new TestWrappingConfiguration({ wordWrap: 'on' }); - assertWrapping(config, true, 81); + assertWrapping(config, true, 80); }); test('wordWrap on without minimap', () => { @@ -105,7 +105,7 @@ suite('Common Editor Config', () => { enabled: false } }); - assertWrapping(config, true, 89); + assertWrapping(config, true, 88); }); test('wordWrap on does not use wordWrapColumn', () => { @@ -113,7 +113,7 @@ suite('Common Editor Config', () => { wordWrap: 'on', wordWrapColumn: 10 }); - assertWrapping(config, true, 81); + assertWrapping(config, true, 80); }); test('wordWrap off', () => { From fdf22f962e90b924ccf18851bba45122bb65a5a4 Mon Sep 17 00:00:00 2001 From: Till Salinger <t-tisali@microsoft.com> Date: Thu, 19 Apr 2018 09:13:33 +0200 Subject: [PATCH 513/710] improves error message --- src/vs/workbench/parts/files/electron-browser/fileActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index f50d34c117d..7b75d27e51a 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -165,7 +165,7 @@ class TriggerRenameFileAction extends BaseFileAction { if (names.length > 1) { // error only occurs on multi-path const comparer = isLinux ? strings.compare : strings.compareIgnoreCase; if (comparer(names[0], this.element.name) === 0) { - return nls.localize('renameWhenSourcePathIsParentOfTargetError', "Cannot move/copy when source path is parent of target path."); + return nls.localize('renameWhenSourcePathIsParentOfTargetError', "Please use the 'New Folder' or 'New File' command to add children to an existing folder"); } } From 359108ae2aecf4af08dd8a0a66ce124af16222fe Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Thu, 19 Apr 2018 09:14:50 +0200 Subject: [PATCH 514/710] fix search smoketests --- src/vs/workbench/parts/search/browser/searchView.ts | 4 ++-- test/smoke/src/areas/search/search.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index dccdd36adcd..f367e4aae41 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -235,7 +235,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { }); //folder includes list - builder.div({ 'class': 'file-types' }, (builder) => { + builder.div({ 'class': 'file-types includes' }, (builder) => { let title = nls.localize('searchScope.includes', "files to include"); builder.element('h4', { text: title }); @@ -257,7 +257,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { }); //pattern exclusion list - builder.div({ 'class': 'file-types' }, (builder) => { + builder.div({ 'class': 'file-types excludes' }, (builder) => { let title = nls.localize('searchScope.excludes', "files to exclude"); builder.element('h4', { text: title }); diff --git a/test/smoke/src/areas/search/search.ts b/test/smoke/src/areas/search/search.ts index 632707e1bf9..9052aaca126 100644 --- a/test/smoke/src/areas/search/search.ts +++ b/test/smoke/src/areas/search/search.ts @@ -9,7 +9,7 @@ import { Code } from '../../vscode/code'; const VIEWLET = 'div[id="workbench.view.search"] .search-view'; const INPUT = `${VIEWLET} .search-widget .search-container .monaco-inputbox input`; -const INCLUDE_INPUT = `${VIEWLET} .query-details .monaco-inputbox input[aria-label="Search Include/Exclude Patterns"]`; +const INCLUDE_INPUT = `${VIEWLET} .query-details .file-types.includes .monaco-inputbox input`; export class Search extends Viewlet { From 4427c0ec9fc00710ee9525243c37e09993c0d0cc Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Thu, 19 Apr 2018 09:20:54 +0200 Subject: [PATCH 515/710] fix CSS smoketests --- test/smoke/src/areas/editor/editor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/areas/editor/editor.ts b/test/smoke/src/areas/editor/editor.ts index 0482c94bfd6..c3facfe1718 100644 --- a/test/smoke/src/areas/editor/editor.ts +++ b/test/smoke/src/areas/editor/editor.ts @@ -89,7 +89,7 @@ export class Editor { const line = `${editor} .view-lines > .view-line:nth-child(${lineNumber})`; const textarea = `${editor} textarea`; - await this.code.waitAndClick(line); + await this.code.waitAndClick(line, 0, 0); await this.code.waitForActiveElement(textarea); } From cc955e067098a2ca492daedb8b5c8a5ec7889e68 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Thu, 19 Apr 2018 10:19:48 +0200 Subject: [PATCH 516/710] comment out smoketest from product build for now --- build/tfs/product-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tfs/product-build.yml b/build/tfs/product-build.yml index e8ff8a943b8..2a0f41bb644 100644 --- a/build/tfs/product-build.yml +++ b/build/tfs/product-build.yml @@ -40,7 +40,7 @@ phases: - powershell: | npm run gulp -- "electron-$(VSCODE_ARCH)" .\scripts\test.bat --build --tfs - yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" + # yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" name: test - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 @@ -362,7 +362,7 @@ phases: - script: | ./scripts/test.sh --build --tfs APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`" - yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" + # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" name: test - script: | From 7bd54fca57160e0c252c17474ce453668b592c04 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 10:31:11 +0200 Subject: [PATCH 517/710] Fixes #48145 --- src/vs/editor/contrib/hover/hover.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/hover/hover.ts b/src/vs/editor/contrib/hover/hover.ts index 940bd118e3d..a48e61cb54f 100644 --- a/src/vs/editor/contrib/hover/hover.ts +++ b/src/vs/editor/contrib/hover/hover.ts @@ -190,7 +190,13 @@ class ShowHoverAction extends EditorAction { constructor() { super({ id: 'editor.action.showHover', - label: nls.localize('showHover', "Show Hover"), + label: nls.localize({ + key: 'showHover', + comment: [ + 'Label for action that will trigger the showing of a hover in the editor.', + 'This allows for users to show the hover without using the mouse.' + ] + }, "Show Hover"), alias: 'Show Hover', precondition: null, kbOpts: { From aba55335a96301306fe61d2eff7a86277e4a77ae Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Thu, 19 Apr 2018 10:29:47 +0200 Subject: [PATCH 518/710] fix #48140 --- src/vs/platform/environment/node/argv.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 336ec1dcbcb..d4ffb88f8f9 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -164,8 +164,8 @@ const troubleshootingHelp: { [name: string]: string; } = { '-p, --performance': localize('performance', "Start with the 'Developer: Startup Performance' command enabled."), '--prof-startup': localize('prof-startup', "Run CPU profiler during startup"), '--disable-extensions': localize('disableExtensions', "Disable all installed extensions."), - '--inspect-extensions': localize('inspect-extensions', "Allow debugging and profiling of extensions. Check the developer tools for the connection uri."), - '--inspect-brk-extensions': localize('inspect-brk-extensions', "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection uri."), + '--inspect-extensions': localize('inspect-extensions', "Allow debugging and profiling of extensions. Check the developer tools for the connection URI."), + '--inspect-brk-extensions': localize('inspect-brk-extensions', "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection URI."), '--disable-gpu': localize('disableGPU', "Disable GPU hardware acceleration."), '--upload-logs': localize('uploadLogs', "Uploads logs from current session to a secure endpoint."), '--max-memory': localize('maxMemory', "Max memory size for a window (in Mbytes).") From 17321a2d66b758ec949379b21d241e4150a659f2 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 10:44:32 +0200 Subject: [PATCH 519/710] Fixes #48144 --- src/vs/editor/browser/widget/diffReview.ts | 29 ++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/widget/diffReview.ts b/src/vs/editor/browser/widget/diffReview.ts index 7715c7482d7..f1d0c81f619 100644 --- a/src/vs/editor/browser/widget/diffReview.ts +++ b/src/vs/editor/browser/widget/diffReview.ts @@ -584,9 +584,34 @@ export class DiffReview extends Disposable { let cell = document.createElement('div'); cell.className = 'diff-review-cell diff-review-summary'; - cell.appendChild(document.createTextNode(`${diffIndex + 1}/${this._diffs.length}: @@ -${minOriginalLine},${maxOriginalLine - minOriginalLine + 1} +${minModifiedLine},${maxModifiedLine - minModifiedLine + 1} @@`)); + const originalChangedLinesCnt = maxOriginalLine - minOriginalLine + 1; + const modifiedChangedLinesCnt = maxModifiedLine - minModifiedLine + 1; + cell.appendChild(document.createTextNode(`${diffIndex + 1}/${this._diffs.length}: @@ -${minOriginalLine},${originalChangedLinesCnt} +${minModifiedLine},${modifiedChangedLinesCnt} @@`)); header.setAttribute('data-line', String(minModifiedLine)); - header.setAttribute('aria-label', nls.localize('header', "Difference {0} of {1}: original {2}, {3} lines, modified {4}, {5} lines", (diffIndex + 1), this._diffs.length, minOriginalLine, maxOriginalLine - minOriginalLine + 1, minModifiedLine, maxModifiedLine - minModifiedLine + 1)); + + const getAriaLines = (lines: number) => { + if (lines === 0) { + return nls.localize('no_lines', "no lines"); + } else if (lines === 1) { + return nls.localize('one_line', "1 line"); + } else { + return nls.localize('more_lines', "{0} lines", lines); + } + }; + + const originalChangedLinesCntAria = getAriaLines(originalChangedLinesCnt); + const modifiedChangedLinesCntAria = getAriaLines(modifiedChangedLinesCnt); + header.setAttribute('aria-label', nls.localize({ + key: 'header', + comment: [ + 'This is the ARIA label for a git diff header.', + 'A git diff header looks like this: @@ -154,12 +159,39 @@.', + 'That encodes that at original line 154 (which is now line 159), 12 lines were removed/changed with 39 lines.', + 'Variables 0 and 1 refer to the diff index out of total number of diffs.', + 'Variables 2 and 4 will be numbers (a line number).', + 'Variables 3 and 4 will be "no lines", "1 line" or "X lines", localized separately.' + ] + }, "Difference {0} of {1}: original {2}, {3}, modified {4}, {5}", (diffIndex + 1), this._diffs.length, minOriginalLine, originalChangedLinesCntAria, minModifiedLine, modifiedChangedLinesCntAria)); header.appendChild(cell); // @@ -504,7 +517,7 @@ From dbc4fbb008962e4594067ef8d64351f72dfdfb0b Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 10:55:14 +0200 Subject: [PATCH 520/710] debugStatus: always update the style since it is affected by debug state fixes #44989 --- src/vs/workbench/parts/debug/browser/debugStatus.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/debugStatus.ts b/src/vs/workbench/parts/debug/browser/debugStatus.ts index 318a96be4f6..f72afca4b5d 100644 --- a/src/vs/workbench/parts/debug/browser/debugStatus.ts +++ b/src/vs/workbench/parts/debug/browser/debugStatus.ts @@ -90,8 +90,9 @@ export class DebugStatus extends Themable implements IStatusbarItem { this.icon = dom.append(a, $('.icon')); this.label = dom.append(a, $('span.label')); this.setLabel(); - this.updateStyles(); } + + this.updateStyles(); } private setLabel(): void { From 1bf1b55e3d6e74415833a6b784df77c6333e660c Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 11:09:17 +0200 Subject: [PATCH 521/710] debug: do not listen on launch.json changes, re-read it before debug start fixes #47021 --- .../parts/debug/electron-browser/debugService.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 1550004184a..fdd564ef76b 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -82,7 +82,6 @@ export class DebugService implements debug.IDebugService { private debugType: IContextKey<string>; private debugState: IContextKey<string>; private breakpointsToSendOnResourceSaved: Set<string>; - private launchJsonChanged: boolean; private firstSessionStart: boolean; private skipRunningTask: boolean; private previousState: debug.State; @@ -698,7 +697,6 @@ export class DebugService implements debug.IDebugService { this.allProcesses.clear(); this.model.getBreakpoints().forEach(bp => bp.verified = false); } - this.launchJsonChanged = false; let config: debug.IConfig, compound: debug.ICompound; if (!configOrName) { @@ -1081,12 +1079,9 @@ export class DebugService implements debug.IDebugService { return new TPromise<void>((c, e) => { setTimeout(() => { - // Read the configuration again if a launch.json has been changed, if not just use the inmemory configuration let config = process.configuration; - const launch = process.session.root ? this.configurationManager.getLaunch(process.session.root.uri) : undefined; - if (this.launchJsonChanged && launch) { - this.launchJsonChanged = false; + if (launch) { config = launch.getConfiguration(process.configuration.name) || config; // Take the type from the process since the debug extension might overwrite it #21316 config.type = process.configuration.type; @@ -1303,13 +1298,9 @@ export class DebugService implements debug.IDebugService { } fileChangesEvent.getUpdated().forEach(event => { - if (this.breakpointsToSendOnResourceSaved.delete(event.resource.toString())) { this.sendBreakpoints(event.resource, true).done(null, errors.onUnexpectedError); } - if (strings.endsWith(event.resource.toString(), '.vscode/launch.json')) { - this.launchJsonChanged = true; - } }); } From 4fd4bef1355ef62ee734d5e6b0c03dbe808b7443 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 11:14:07 +0200 Subject: [PATCH 522/710] Change the extension point - Call it viewsContainers - Take the location where containers are contributed --- ...nt.ts => viewsContainersExtensionPoint.ts} | 115 +++++++++++------- .../api/browser/viewsExtensionPoint.ts | 6 +- src/vs/workbench/workbench.main.ts | 2 +- 3 files changed, 77 insertions(+), 46 deletions(-) rename src/vs/workbench/api/browser/{activitybarExtensionPoint.ts => viewsContainersExtensionPoint.ts} (61%) diff --git a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts similarity index 61% rename from src/vs/workbench/api/browser/activitybarExtensionPoint.ts rename to src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 15aed855355..df12b72fd5c 100644 --- a/src/vs/workbench/api/browser/activitybarExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -21,28 +21,84 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { IExtensionService, IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { ViewLocation } from 'vs/workbench/common/views'; import { PersistentViewsViewlet } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; +import { forEach } from 'vs/base/common/collections'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -export namespace schema { - // --activity group contribution point - export interface IUserFriendlyActivityGroupDescriptor { - id: string; - title: string; - icon: string; +export interface IUserFriendlyViewsContainerDescriptor { + id: string; + title: string; + icon: string; +} + +const viewsContainerSchema: IJSONSchema = { + type: 'object', + properties: { + id: { + description: localize('vscode.extension.contributes.views.containers.id', "Unique id used to identify the container in which views can be contributed using 'views' contribution point"), + type: 'string' + }, + label: { + description: localize('vscode.extension.contributes.views.containers.title', 'Human readable string used to render the container'), + type: 'string' + }, + icon: { + description: localize('vscode.extension.contributes.views.containers.icon', 'Path to the container icon'), + type: 'string' + } + } +}; + +export const viewsContainerContribution: IJSONSchema = { + description: localize('vscode.extension.contributes.viewsContainer', 'Contributes views containers to the editor'), + type: 'object', + properties: { + 'activitybar': { + description: localize('views.container.activitybar', "Activity Bar"), + type: 'array', + items: viewsContainerSchema + } + } +}; + +export const viewsContainersExtensionPoint: IExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }> = ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: IUserFriendlyViewsContainerDescriptor[] }>('viewsContainers', [], viewsContainerContribution); +class ViewsContainersExtensionHandler implements IWorkbenchContribution { + + constructor() { + this.handleViewsContainersExtensionPoint(); } - export function isValidActivityGroup(activityGroupDescriptors: IUserFriendlyActivityGroupDescriptor[], collector: ExtensionMessageCollector): boolean { - if (!Array.isArray(activityGroupDescriptors)) { - collector.error(localize('requirearray', "activity groups must be an array")); + private handleViewsContainersExtensionPoint() { + viewsContainersExtensionPoint.setHandler((extensions) => { + for (let extension of extensions) { + const { value, collector } = extension; + forEach(value, entry => { + if (!this.isValidViewsContainer(entry.value, collector)) { + return; + } + switch (entry.key) { + case 'activitybar': + this.contributeToActivitybar(entry.value, extension.description); + break; + } + }); + } + }); + } + + private isValidViewsContainer(viewsContainersDescriptors: IUserFriendlyViewsContainerDescriptor[], collector: ExtensionMessageCollector): boolean { + if (!Array.isArray(viewsContainersDescriptors)) { + collector.error(localize('requirearray', "views containers must be an array")); return false; } - for (let descriptor of activityGroupDescriptors) { + for (let descriptor of viewsContainersDescriptors) { if (typeof descriptor.id !== 'string') { collector.error(localize('requirestring', "property `{0}` is mandatory and must be of type `string`", 'id')); return false; @@ -60,34 +116,8 @@ export namespace schema { return true; } - export const activityGroupContribution: IJSONSchema = { - description: localize('vscode.extension.contributes.activityGroup', 'Contributes an activity group to activity bar'), - type: 'object', - properties: { - id: { - description: localize('vscode.extension.contributes.activityGroup.id', "Unique id used to identify the activity group in which views can be contributed using 'views' contribution point"), - type: 'string' - }, - label: { - description: localize('vscode.extension.contributes.activityGroup.title', 'Human readable string used to render the activity group'), - type: 'string' - }, - icon: { - description: localize('vscode.extension.contributes.activityGroup.icon', 'Path to the activityGroup icon'), - type: 'string' - } - } - }; -} - -export const activityGroupExtensionPoint: IExtensionPoint<schema.IUserFriendlyActivityGroupDescriptor[]> = ExtensionsRegistry.registerExtensionPoint<schema.IUserFriendlyActivityGroupDescriptor[]>('activityGroups', [], schema.activityGroupContribution); -activityGroupExtensionPoint.setHandler((extensions) => { - for (let extension of extensions) { - const { value, collector } = extension; - if (!schema.isValidActivityGroup(value, collector)) { - return; - } - value.forEach((descriptor, index) => { + private contributeToActivitybar(containers: IUserFriendlyViewsContainerDescriptor[], extension: IExtensionDescription) { + containers.forEach((descriptor, index) => { const id = `workbench.view.extension.${descriptor.id}`; const title = descriptor.title; const cssClass = `extensionViewlet-${descriptor.id}`; @@ -95,7 +125,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; - const iconPath = join(extension.description.extensionFolderPath, descriptor.icon); + const iconPath = join(extension.extensionFolderPath, descriptor.icon); createCSSRule(iconClass, `-webkit-mask: url('${iconPath}') no-repeat 50% 50%; -webkit-mask-size: 22px;`); // Register as viewlet @@ -143,4 +173,7 @@ activityGroupExtensionPoint.setHandler((extensions) => { ); }); } -}); +} + +const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench); +workbenchRegistry.registerWorkbenchContribution(ViewsContainersExtensionHandler, LifecyclePhase.Starting); \ No newline at end of file diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 4d0a9dcc528..24514349310 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -12,12 +12,10 @@ import { ViewLocation, ViewsRegistry, ICustomViewDescriptor } from 'vs/workbench import { CustomTreeViewPanel } from 'vs/workbench/browser/parts/views/customViewPanel'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { coalesce, } from 'vs/base/common/arrays'; -import { activityGroupExtensionPoint } from './activitybarExtensionPoint'; +import { viewsContainersExtensionPoint } from 'vs/workbench/api/browser/viewsContainersExtensionPoint'; namespace schema { - // --views contribution point - export interface IUserFriendlyViewDescriptor { id: string; name: string; @@ -92,7 +90,7 @@ function getViewLocation(value: string): ViewLocation { } } -ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyViewDescriptor[] }>('views', [activityGroupExtensionPoint], schema.viewsContribution) +ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyViewDescriptor[] }>('views', [viewsContainersExtensionPoint], schema.viewsContribution) .setHandler((extensions) => { for (let extension of extensions) { const { value, collector } = extension; diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 18d43b1b710..6b09e984955 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -19,8 +19,8 @@ import 'vs/editor/editor.all'; import 'vs/workbench/services/actions/electron-browser/menusExtensionPoint'; // Views +import 'vs/workbench/api/browser/viewsContainersExtensionPoint'; import 'vs/workbench/api/browser/viewsExtensionPoint'; -import 'vs/workbench/api/browser/activitybarExtensionPoint'; // Localizations import 'vs/workbench/parts/localizations/browser/localizations.contribution'; From 57a92cb312c5a181e6cff6e09ca579db24a1f4c0 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 10:50:33 +0200 Subject: [PATCH 523/710] Fixes #48141 --- src/vs/base/common/keybindingLabels.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/vs/base/common/keybindingLabels.ts b/src/vs/base/common/keybindingLabels.ts index c9a7cec8e18..29916e201d4 100644 --- a/src/vs/base/common/keybindingLabels.ts +++ b/src/vs/base/common/keybindingLabels.ts @@ -54,10 +54,10 @@ export const UILabelProvider = new ModifierLabelProvider( separator: '', }, { - ctrlKey: nls.localize('ctrlKey', "Ctrl"), - shiftKey: nls.localize('shiftKey', "Shift"), - altKey: nls.localize('altKey', "Alt"), - metaKey: nls.localize('windowsKey', "Windows"), + ctrlKey: nls.localize({ key: 'ctrlKey', comment: ['This is the short form for the Control key on the keyboard'] }, "Ctrl"), + shiftKey: nls.localize({ key: 'shiftKey', comment: ['This is the short form for the Shift key on the keyboard'] }, "Shift"), + altKey: nls.localize({ key: 'altKey', comment: ['This is the short form for the Alt key on the keyboard'] }, "Alt"), + metaKey: nls.localize({ key: 'windowsKey', comment: ['This is the short form for the Windows key on the keyboard'] }, "Windows"), separator: '+', } ); @@ -67,17 +67,17 @@ export const UILabelProvider = new ModifierLabelProvider( */ export const AriaLabelProvider = new ModifierLabelProvider( { - ctrlKey: nls.localize('ctrlKey.long', "Control"), - shiftKey: nls.localize('shiftKey.long', "Shift"), - altKey: nls.localize('altKey.long', "Alt"), - metaKey: nls.localize('cmdKey.long', "Command"), + ctrlKey: nls.localize({ key: 'ctrlKey.long', comment: ['This is the long form for the Control key on the keyboard'] }, "Control"), + shiftKey: nls.localize({ key: 'shiftKey.long', comment: ['This is the long form for the Shift key on the keyboard'] }, "Shift"), + altKey: nls.localize({ key: 'altKey.long', comment: ['This is the long form for the Alt key on the keyboard'] }, "Alt"), + metaKey: nls.localize({ key: 'cmdKey.long', comment: ['This is the long form for the Command key on the keyboard'] }, "Command"), separator: '+', }, { - ctrlKey: nls.localize('ctrlKey.long', "Control"), - shiftKey: nls.localize('shiftKey.long', "Shift"), - altKey: nls.localize('altKey.long', "Alt"), - metaKey: nls.localize('windowsKey.long', "Windows"), + ctrlKey: nls.localize({ key: 'ctrlKey.long', comment: ['This is the long form for the Control key on the keyboard'] }, "Control"), + shiftKey: nls.localize({ key: 'shiftKey.long', comment: ['This is the long form for the Shift key on the keyboard'] }, "Shift"), + altKey: nls.localize({ key: 'altKey.long', comment: ['This is the long form for the Alt key on the keyboard'] }, "Alt"), + metaKey: nls.localize({ key: 'windowsKey.long', comment: ['This is the long form for the Windows key on the keyboard'] }, "Windows"), separator: '+', } ); From 3500eb8731a516ca4f9ea8cf39c3886f5a211a65 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Thu, 19 Apr 2018 11:40:55 +0200 Subject: [PATCH 524/710] back to FileError, #47475 --- src/vs/platform/files/common/files.ts | 18 --------- src/vs/vscode.proposed.d.ts | 34 +++++----------- .../electron-browser/mainThreadFileSystem.ts | 4 +- src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- src/vs/workbench/api/node/extHostTypes.ts | 26 ++++++++++++ .../electron-browser/remoteFileService.ts | 40 ++++++++++++++++--- 6 files changed, 73 insertions(+), 51 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 25d4550d7fa..57e66accfa5 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -156,24 +156,6 @@ export enum FileType2 { SymbolicLink = 4, } -export class FileError extends Error { - - static readonly EntryExists = new FileError('EEXIST'); - static readonly EntryNotFound = new FileError('ENOENT'); - static readonly EntryNotADirectory = new FileError('ENOTDIR'); - static readonly EntryIsADirectory = new FileError('EISDIR'); - - constructor(readonly code: string, message?: string) { - super(message || code); - } - is(err: any): err is FileError { - if (!err || typeof err !== 'object') { - return false; - } - return err.code === this.code; - } -} - export enum FileOpenFlags { Read = 0b0001, Write = 0b0010, diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 7a55ba9b0e2..a78f6101190 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -84,32 +84,18 @@ declare module 'vscode' { // create(resource: Uri): Thenable<FileStat>; } - // export class FileError extends Error { + /** + * + */ + export class FileError extends Error { - // /** - // * Entry already exists, e.g. when creating a file or folder. - // */ - // static readonly EntryExists: FileError; + static EntryExists(message?: string): FileError; + static EntryNotFound(message?: string): FileError; + static EntryNotADirectory(message?: string): FileError; + static EntryIsADirectory(message?: string): FileError; - // /** - // * Entry does not exist. - // */ - // static readonly EntryNotFound: FileError; - - // /** - // * Entry is not a directory. - // */ - // static readonly EntryNotADirectory: FileError; - - // /** - // * Entry is a directory. - // */ - // static readonly EntryIsADirectory: FileError; - - // readonly code: string; - - // constructor(code: string, message?: string); - // } + constructor(message?: string); + } export enum FileChangeType2 { Changed = 1, diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index b3aedaab4a2..e2c1accca14 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOpenFlags, IFileChange, IFileService, IStat, IWatchOptions, FileError, FileSystemProviderCapabilities, IFileSystemProvider } from 'vs/platform/files/common/files'; +import { FileOpenFlags, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -88,7 +88,7 @@ class RemoteFileSystemProvider implements IFileSystemProvider { // --- forwarding calls - stat(resource: URI): TPromise<IStat, FileError> { + stat(resource: URI): TPromise<IStat> { return this._proxy.$stat(this._handle, resource).then(undefined, err => { throw err; }); diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 3de53551971..a69e5e34be1 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -713,7 +713,7 @@ export function createApiFactory( FileChangeType2: extHostTypes.FileChangeType2, FileType2: extHostTypes.FileType2, FileOpenFlags: files.FileOpenFlags, - FileError: files.FileError, + FileError: extHostTypes.FileError, FoldingRange: extHostTypes.FoldingRange, FoldingRangeKind: extHostTypes.FoldingRangeKind }; diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index f877921b5d5..ae88f3ded82 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1838,6 +1838,32 @@ export enum FileType2 { SymbolicLink = 4, } +export class FileError extends Error { + + static EntryExists(message?: string): FileError { + return new FileError(message, 'EntryExists', FileError.EntryExists); + } + static EntryNotFound(message?: string): FileError { + return new FileError(message, 'EntryNotFound', FileError.EntryNotFound); + } + static EntryNotADirectory(message?: string): FileError { + return new FileError(message, 'EntryNotADirectory', FileError.EntryNotADirectory); + } + static EntryIsADirectory(message?: string): FileError { + return new FileError(message, 'EntryIsADirectory', FileError.EntryIsADirectory); + } + + constructor(message?: string, code?: string, hide?: Function) { + super(message); + this.name = code ? `FileError/${code}` : `FileError`; + + if (typeof Error.captureStackTrace === 'function' && typeof hide === 'function') { + // nice stack traces + Error.captureStackTrace(this, hide); + } + } +} + //#endregion //#region folding api diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 3d6d056a71b..254c3c9d18f 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileError, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -200,6 +200,32 @@ export class RemoteFileService extends FileService { || this._supportedSchemes.indexOf(resource.scheme) >= 0; } + private _tryParseFileOperationResult(err: any): FileOperationResult { + if (!(err instanceof Error)) { + return undefined; + } + let match = /FileError\/(.+)$/.exec(err.name); + if (!match) { + return undefined; + } + let res: FileOperationResult; + switch (match[1]) { + case 'EntryNotFound': + res = FileOperationResult.FILE_NOT_FOUND; + break; + case 'EntryIsADirectory': + res = FileOperationResult.FILE_IS_DIRECTORY; + break; + case 'EntryExists': + case 'EntryNotADirectory': + default: + // todo + res = undefined; + break; + } + return res; + } + // --- stat private _withProvider(resource: URI): TPromise<IFileSystemProvider> { @@ -229,7 +255,10 @@ export class RemoteFileService extends FileService { } else { return this._doResolveFiles([{ resource, options }]).then(data => { if (data.length !== 1 || !data[0].success) { - throw new Error(`ENOENT, ${resource}`); + throw new FileOperationError( + localize('fileNotFoundError', "File not found ({0})", resource.toString(true)), + FileOperationResult.FILE_NOT_FOUND + ); } else { return data[0].stat; } @@ -369,10 +398,9 @@ export class RemoteFileService extends FileService { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); return fileStat; }, err => { - if (FileError.EntryExists.is(err)) { - return TPromise.wrapError(new FileOperationError(err.code, FileOperationResult.FILE_MODIFIED_SINCE, options)); - } - throw err; + const message = localize('err.create', "Failed to create file {0}", resource.toString(false)); + const result = this._tryParseFileOperationResult(err); + throw new FileOperationError(message, result, options); }); } } From c436e7735b8ae541dc0964724ac29e03d62b1f36 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 11:46:17 +0200 Subject: [PATCH 525/710] Compute 'enableProposedApi' property on main --- src/vs/workbench/api/node/extHost.api.impl.ts | 23 ------------ src/vs/workbench/api/node/extHost.protocol.ts | 2 -- .../electron-browser/extensionHost.ts | 5 +-- .../electron-browser/extensionService.ts | 36 +++++++++++++++++-- 4 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index a69e5e34be1..d368888e620 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -54,7 +54,6 @@ import { ExtHostFileSystem } from 'vs/workbench/api/node/extHostFileSystem'; import { ExtHostDecorations } from 'vs/workbench/api/node/extHostDecorations'; import { toGlobPattern, toLanguageSelector } from 'vs/workbench/api/node/extHostTypeConverters'; import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionActivator'; -import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { OverviewRulerLane } from 'vs/editor/common/model'; import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview'; @@ -164,28 +163,6 @@ export function createApiFactory( }; })(); - if (!isFalsyOrEmpty(product.extensionAllowedProposedApi) - && product.extensionAllowedProposedApi.indexOf(extension.id) >= 0 - ) { - // fast lane -> proposed api is available to all extensions - // that are listed in product.json-files - extension.enableProposedApi = true; - - } else if (extension.enableProposedApi && !extension.isBuiltin) { - if ( - !initData.environment.enableProposedApiForAll && - initData.environment.enableProposedApiFor.indexOf(extension.id) < 0 - ) { - extension.enableProposedApi = false; - console.error(`Extension '${extension.id} cannot use PROPOSED API (must started out of dev or enabled via --enable-proposed-api)`); - - } else { - // proposed api is available when developing or when an extension was explicitly - // spelled out via a command line argument - console.warn(`Extension '${extension.id}' uses PROPOSED API which is subject to change and removal without notice.`); - } - } - // namespace: commands const commands: typeof vscode.commands = { registerCommand(id: string, command: <T>(...args: any[]) => T | Thenable<T>, thisArgs?: any): vscode.Disposable { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index f18f37f7e78..6bd721a9ec9 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -52,8 +52,6 @@ import { TaskExecutionDTO, TaskDTO, TaskHandleDTO } from 'vs/workbench/api/share export interface IEnvironment { isExtensionDevelopmentDebug: boolean; - enableProposedApiForAll: boolean; - enableProposedApiFor: string | string[]; appRoot: string; appSettingsHome: string; disableExtensions: boolean; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index c57272a6b22..ad9aab56112 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -371,10 +371,7 @@ export class ExtensionHostProcessWorker { appSettingsHome: this._environmentService.appSettingsHome, disableExtensions: this._environmentService.disableExtensions, extensionDevelopmentPath: this._environmentService.extensionDevelopmentPath, - extensionTestsPath: this._environmentService.extensionTestsPath, - // globally disable proposed api when built and not insiders developing extensions - enableProposedApiForAll: !this._environmentService.isBuilt || (!!this._environmentService.extensionDevelopmentPath && product.nameLong.indexOf('Insiders') >= 0), - enableProposedApiFor: this._environmentService.args['enable-proposed-api'] || [] + extensionTestsPath: this._environmentService.extensionTestsPath }, workspace: this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : <IWorkspaceData>this._contextService.getWorkspace(), extensions: extensionDescriptions, diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index ec7847ca19b..7fb1c10edd1 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -41,6 +41,7 @@ import product from 'vs/platform/node/product'; import * as strings from 'vs/base/common/strings'; import { RPCProtocol } from 'vs/workbench/services/extensions/node/rpcProtocol'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { isFalsyOrEmpty } from 'vs/base/common/arrays'; let _SystemExtensionsRoot: string = null; function getSystemExtensionsRoot(): string { @@ -497,7 +498,7 @@ export class ExtensionService extends Disposable implements IExtensionService { private _scanAndHandleExtensions(): void { - this._getRuntimeExtension() + this._getRuntimeExtensions() .then(runtimeExtensons => { this._registry = new ExtensionDescriptionRegistry(runtimeExtensons); @@ -522,7 +523,7 @@ export class ExtensionService extends Disposable implements IExtensionService { }); } - private _getRuntimeExtension(): TPromise<IExtensionDescription[]> { + private _getRuntimeExtensions(): TPromise<IExtensionDescription[]> { const log = new Logger((severity, source, message) => { this._logOrShowMessage(severity, this._isDev ? messageWithSource2(source, message) : message); }); @@ -586,7 +587,36 @@ export class ExtensionService extends Disposable implements IExtensionService { return runtimeExtensions; } }); - }); + }).then(extensions => this._updateEnableProposedApi(extensions)); + } + + private _updateEnableProposedApi(extensions: IExtensionDescription[]): IExtensionDescription[] { + const enableProposedApiForAll = !this._environmentService.isBuilt || (!!this._environmentService.extensionDevelopmentPath && product.nameLong.indexOf('Insiders') >= 0); + const enableProposedApiFor = this._environmentService.args['enable-proposed-api'] || []; + for (const extension of extensions) { + if (!isFalsyOrEmpty(product.extensionAllowedProposedApi) + && product.extensionAllowedProposedApi.indexOf(extension.id) >= 0 + ) { + // fast lane -> proposed api is available to all extensions + // that are listed in product.json-files + extension.enableProposedApi = true; + + } else if (extension.enableProposedApi && !extension.isBuiltin) { + if ( + !enableProposedApiForAll && + enableProposedApiFor.indexOf(extension.id) < 0 + ) { + extension.enableProposedApi = false; + console.error(`Extension '${extension.id} cannot use PROPOSED API (must started out of dev or enabled via --enable-proposed-api)`); + + } else { + // proposed api is available when developing or when an extension was explicitly + // spelled out via a command line argument + console.warn(`Extension '${extension.id}' uses PROPOSED API which is subject to change and removal without notice.`); + } + } + } + return extensions; } private _handleExtensionPointMessage(msg: IMessage) { From e62c7b64efe407d5d37a1d2a74a5aadd22f8a640 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 11:54:48 +0200 Subject: [PATCH 526/710] Put contribution behind proposed flag --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index df12b72fd5c..1d28b391934 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -78,6 +78,10 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { viewsContainersExtensionPoint.setHandler((extensions) => { for (let extension of extensions) { const { value, collector } = extension; + if (extension.description.enableProposedApi) { + collector.error(localize('proposed', "'{0}' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {1}", 'viewsContainer', extension.description.id)); + continue; + } forEach(value, entry => { if (!this.isValidViewsContainer(entry.value, collector)) { return; From 8383050186d87bc1a415b3f8cbcc040362a7b638 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 12:09:31 +0200 Subject: [PATCH 527/710] debug: report error for postDebugTask fixes #46659 --- src/vs/workbench/parts/debug/electron-browser/debugService.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index fdd564ef76b..73d419154b0 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -1144,7 +1144,9 @@ export class DebugService implements debug.IDebugService { process.inactive = true; this._onDidEndProcess.fire(process); if (process.configuration.postDebugTask) { - this.runTask(process.getId(), process.session.root, process.configuration.postDebugTask); + this.runTask(process.getId(), process.session.root, process.configuration.postDebugTask).done(undefined, err => + this.notificationService.error(err) + ); } } From de10301afb5cd8b4ec0196532869e6b4f912bad1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 12:12:51 +0200 Subject: [PATCH 528/710] mistype --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 1d28b391934..5a2e2b78965 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -78,7 +78,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { viewsContainersExtensionPoint.setHandler((extensions) => { for (let extension of extensions) { const { value, collector } = extension; - if (extension.description.enableProposedApi) { + if (!extension.description.enableProposedApi) { collector.error(localize('proposed', "'{0}' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {1}", 'viewsContainer', extension.description.id)); continue; } From 54583ac65ae1612d6273250a46f10537371389d3 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 12:17:10 +0200 Subject: [PATCH 529/710] Fixes Microsoft/monaco-editor#830 --- src/vs/base/browser/dom.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 2a9a1b69116..9aee0d502d6 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -289,7 +289,7 @@ function doRequestAnimationFrame(callback: (time: number) => void): number { || emulatedRequestAnimationFrame ); } - return _animationFrame(callback); + return _animationFrame.call(self, callback); } /** From 433006eb798c7740db019583374dbb9752ce23ad Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Thu, 19 Apr 2018 12:28:15 +0200 Subject: [PATCH 530/710] add (empty) option bags to provider function to be save for the future, #47475 --- src/vs/vscode.proposed.d.ts | 24 ++++++++++++------- .../workbench/api/node/extHostFileSystem.ts | 12 +++++----- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index a78f6101190..ed80eb31cac 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -132,7 +132,7 @@ declare module 'vscode' { */ export interface FileSystemProvider2 { - _version: 7; + _version: 8; /** * An event to signal that a resource has been created, changed, or deleted. This @@ -149,13 +149,14 @@ declare module 'vscode' { watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; /** - * Retrieve metadata about a file. + * Retrieve metadata about a file. Throw an [`EntryNotFound`](#FileError.EntryNotFound)-error + * in case the file does not exist. * * @param uri The uri of the file to retrieve meta data about. * @param token A cancellation token. * @return The file metadata about the file. */ - stat(uri: Uri, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat2 | Thenable<FileStat2>; /** * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) @@ -164,7 +165,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return A thenable that resolves to an array of tuples of file names and files stats. */ - readDirectory(uri: Uri, token: CancellationToken): [string, FileStat2][] | Thenable<[string, FileStat2][]>; + readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat2][] | Thenable<[string, FileStat2][]>; /** * Create a new directory. *Note* that new files are created via `write`-calls. @@ -172,7 +173,7 @@ declare module 'vscode' { * @param uri The uri of the *new* folder. * @param token A cancellation token. */ - createDirectory(uri: Uri, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat2 | Thenable<FileStat2>; /** * Read the entire contents of a file. @@ -192,6 +193,15 @@ declare module 'vscode' { */ writeFile(uri: Uri, content: Uint8Array, options: { flags: FileOpenFlags }, token: CancellationToken): void | Thenable<void>; + /** + * Delete a file or folder from the underlying storage. + * + * @param uri The resource that is to be deleted + * @param options Options bag for future use + * @param token A cancellation token. + */ + delete(uri: Uri, options: { /*future: useTrash?, followSymlinks?*/ }, token: CancellationToken): void | Thenable<void>; + /** * Rename a file or folder. * @@ -210,10 +220,6 @@ declare module 'vscode' { * @param token A cancellation token. */ copy?(uri: Uri, target: Uri, options: { flags: FileOpenFlags }, token: CancellationToken): FileStat2 | Thenable<FileStat2>; - - // todo@remote - // ? useTrash, expose trash - delete(uri: Uri, token: CancellationToken): void | Thenable<void>; } export namespace workspace { diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 78d27342c02..ade7b978110 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -59,7 +59,7 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { class FileSystemProviderShim implements vscode.FileSystemProvider2 { - _version: 7 = 7; + _version: 8 = 8; onDidChangeFile: vscode.Event<vscode.FileChange2[]>; @@ -189,7 +189,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 7) { + if (newProvider && newProvider._version === 8) { return this._doRegisterFileSystemProvider(scheme, newProvider); } else if (provider) { return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); @@ -248,11 +248,11 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $stat(handle: number, resource: UriComponents): TPromise<files.IStat, any> { - return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), token)); + return asWinJsPromise(token => this._fsProvider.get(handle).stat(URI.revive(resource), {}, token)); } $readdir(handle: number, resource: UriComponents): TPromise<[string, files.IStat][], any> { - return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), token)); + return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {}, token)); } $readFile(handle: number, resource: UriComponents, flags: files.FileOpenFlags): TPromise<string> { @@ -268,7 +268,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $delete(handle: number, resource: UriComponents): TPromise<void, any> { - return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), token)); + return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), {}, token)); } $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, flags: files.FileOpenFlags): TPromise<files.IStat, any> { @@ -280,7 +280,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } $mkdir(handle: number, resource: UriComponents): TPromise<files.IStat, any> { - return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), token)); + return asWinJsPromise(token => this._fsProvider.get(handle).createDirectory(URI.revive(resource), {}, token)); } $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void { From 705de3da4d93ca7deac4dbcbeab1b87ce2a52bd1 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 12:34:00 +0200 Subject: [PATCH 531/710] debug: surface all errors from the variable substitution via modal dialogs fixes #46870 --- .../electron-browser/debugConfigurationManager.ts | 10 +++++++--- .../parts/debug/electron-browser/debugService.ts | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index e7b737dfddc..72681ca18a1 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -634,9 +634,13 @@ class Launch implements ILaunch { setOSProperties(isLinux, result.linux); // massage configuration attributes - append workspace path to relatvie paths, substitute variables in paths. - Object.keys(result).forEach(key => { - result[key] = this.configurationResolverService.resolveAny(this.getWorkspaceForResolving(), result[key]); - }); + try { + Object.keys(result).forEach(key => { + result[key] = this.configurationResolverService.resolveAny(this.getWorkspaceForResolving(), result[key]); + }); + } catch (e) { + return TPromise.wrapError(e); + } const adapter = this.configurationManager.getDebugger(result.type); return this.configurationResolverService.resolveInteractiveVariables(result, adapter ? adapter.variables : null); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 73d419154b0..0987dbaca10 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -786,7 +786,7 @@ export class DebugService implements debug.IDebugService { private createProcess(launch: debug.ILaunch, config: debug.IConfig, sessionId: string): TPromise<void> { return this.textFileService.saveAll().then(() => - (launch ? launch.substituteVariables(config) : TPromise.as(config)).then(resolvedConfig => { + (launch ? launch.substituteVariables(config).then(config => config, (err: Error) => this.showError(err.message)) : TPromise.as(config)).then(resolvedConfig => { if (!resolvedConfig) { // User canceled resolving of interactive variables, silently return return undefined; From 9934264f36aa2cb015cdf135e70e2b7ceae431b2 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 12:49:43 +0200 Subject: [PATCH 532/710] Fixes #42783: Make sure to call TextModel._setTrackedRange when undoing --- src/vs/editor/common/controller/oneCursor.ts | 5 --- .../test/browser/controller/cursor.test.ts | 37 +++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index 30d6a1fb615..363cda5bb40 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -93,11 +93,6 @@ export class OneCursor { viewState = new SingleCursorState(viewSelectionStart, modelState.selectionStartLeftoverVisibleColumns, viewPosition, modelState.leftoverVisibleColumns); } - if (this.modelState && this.viewState && this.modelState.equals(modelState) && this.viewState.equals(viewState)) { - // No-op, early return - return; - } - this.modelState = modelState; this.viewState = viewState; diff --git a/src/vs/editor/test/browser/controller/cursor.test.ts b/src/vs/editor/test/browser/controller/cursor.test.ts index 59d193db530..c7e109750ea 100644 --- a/src/vs/editor/test/browser/controller/cursor.test.ts +++ b/src/vs/editor/test/browser/controller/cursor.test.ts @@ -2125,6 +2125,43 @@ suite('Editor Controller - Regression tests', () => { model.dispose(); }); + + test('issue #42783: API Calls with Undo Leave Cursor in Wrong Position', () => { + let model = createTextModel( + [ + 'ab' + ].join('\n') + ); + + withTestCodeEditor(null, { model: model }, (editor, cursor) => { + editor.setSelections([ + new Selection(1, 1, 1, 1) + ]); + + editor.executeEdits('test', [{ + range: new Range(1, 1, 1, 3), + text: '' + }]); + assertCursor(cursor, [ + new Selection(1, 1, 1, 1), + ]); + + cursorCommand(cursor, H.Undo, null, 'keyboard'); + assertCursor(cursor, [ + new Selection(1, 1, 1, 1), + ]); + + editor.executeEdits('test', [{ + range: new Range(1, 1, 1, 2), + text: '' + }]); + assertCursor(cursor, [ + new Selection(1, 1, 1, 1), + ]); + }); + + model.dispose(); + }); }); suite('Editor Controller - Cursor Configuration', () => { From 19cb9665a9a35fd47a40a72e5011c109221364ee Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 12:56:02 +0200 Subject: [PATCH 533/710] Give a different id for SCM location - Views are contributed to a container inside SCM Viewlet --- src/vs/workbench/common/views.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index ae20aa703cd..c72806df4fb 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -30,7 +30,7 @@ export class ViewLocation { static readonly Explorer: ViewLocation = ViewLocation.register('workbench.view.explorer'); static readonly Debug: ViewLocation = ViewLocation.register('workbench.view.debug'); static readonly Extensions: ViewLocation = ViewLocation.register('workbench.view.extensions'); - static readonly SCM: ViewLocation = ViewLocation.register('workbench.view.scm'); + static readonly SCM: ViewLocation = ViewLocation.register('workbench.view.scm.views.contributed'); private constructor(private _id: string) { } get id(): string { return this._id; } From 98c94e009b9b1f96fdfbbf04226a946588f5e2cd Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 15:07:45 +0200 Subject: [PATCH 534/710] resources: use fsPath for comparing file resources --- src/vs/base/common/resources.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index 8a1e1853bfa..45814e12d24 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -14,6 +14,10 @@ export function basenameOrAuthority(resource: uri): string { export function isEqualOrParent(resource: uri, candidate: uri, ignoreCase?: boolean): boolean { if (resource.scheme === candidate.scheme && resource.authority === candidate.authority) { + if (resource.scheme === 'file') { + return paths.isEqualOrParent(resource.fsPath, candidate.fsPath, ignoreCase); + } + return paths.isEqualOrParent(resource.path, candidate.path, ignoreCase); } From 1fdf60b882f0edc6753fc964b253783eb46d56ef Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Thu, 19 Apr 2018 15:15:07 +0200 Subject: [PATCH 535/710] add DeprecatedXYZ-aliases, #47475 --- src/vs/vscode.proposed.d.ts | 23 +++++++++++++++---- src/vs/workbench/api/node/extHost.api.impl.ts | 2 ++ .../workbench/api/node/extHostFileSystem.ts | 10 ++++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index ed80eb31cac..d8cb1b5b3a5 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -11,7 +11,7 @@ declare module 'vscode' { export function sampleFunction(): Thenable<any>; } - //#region Joh: file system provider + //#region Joh: file system provider (OLD) export enum FileChangeType { Updated = 0, @@ -84,8 +84,22 @@ declare module 'vscode' { // create(resource: Uri): Thenable<FileStat>; } + export type DeprecatedFileChangeType = FileChangeType; + export type DeprecatedFileType = FileType; + export type DeprecatedFileChange = FileChange; + export type DeprecatedFileStat = FileStat; + export type DeprecatedFileSystemProvider = FileSystemProvider; + + export namespace workspace { + export function registerDeprecatedFileSystemProvider(scheme: string, provider: DeprecatedFileSystemProvider): Disposable; + } + + //#endregion + + //#region Joh: file system provider (new) + /** - * + * */ export class FileError extends Error { @@ -194,8 +208,8 @@ declare module 'vscode' { writeFile(uri: Uri, content: Uint8Array, options: { flags: FileOpenFlags }, token: CancellationToken): void | Thenable<void>; /** - * Delete a file or folder from the underlying storage. - * + * Delete a file or folder from the underlying storage. + * * @param uri The resource that is to be deleted * @param options Options bag for future use * @param token A cancellation token. @@ -224,7 +238,6 @@ declare module 'vscode' { export namespace workspace { export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; - export function registerDeprecatedFileSystemProvider(scheme: string, provider: FileSystemProvider): Disposable; } //#endregion diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index d368888e620..4c5cce2c9db 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -687,6 +687,8 @@ export function createApiFactory( FileChangeType: extHostTypes.FileChangeType, FileType: extHostTypes.FileType, + DeprecatedFileChangeType: extHostTypes.FileChangeType, + DeprecatedFileType: extHostTypes.FileType, FileChangeType2: extHostTypes.FileChangeType2, FileType2: extHostTypes.FileType2, FileOpenFlags: files.FileOpenFlags, diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index ade7b978110..18b53fc9687 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -63,7 +63,7 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { onDidChangeFile: vscode.Event<vscode.FileChange2[]>; - constructor(private readonly _delegate: vscode.FileSystemProvider) { + constructor(private readonly _delegate: vscode.DeprecatedFileSystemProvider) { if (!this._delegate.onDidChange) { this.onDidChangeFile = Event.None; } else { @@ -89,7 +89,7 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { }); } - private static _modernizeFileStat(stat: vscode.FileStat): vscode.FileStat2 { + private static _modernizeFileStat(stat: vscode.DeprecatedFileStat): vscode.FileStat2 { let { mtime, size, type } = stat; let newType: vscode.FileType2; @@ -108,7 +108,7 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { return { mtime, size, type: newType }; } - private static _modernizeFileChange(e: vscode.FileChange): vscode.FileChange2 { + private static _modernizeFileChange(e: vscode.DeprecatedFileChange): vscode.FileChange2 { let { resource, type } = e; let newType: vscode.FileChangeType2; switch (type) { @@ -184,11 +184,11 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { extHostLanguageFeatures.registerDocumentLinkProvider('*', this._linkProvider); } - registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider) { + registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider) { return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); } - registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, newProvider: vscode.FileSystemProvider2) { + registerFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider, newProvider: vscode.FileSystemProvider2) { if (newProvider && newProvider._version === 8) { return this._doRegisterFileSystemProvider(scheme, newProvider); } else if (provider) { From 42a5c7930948a4cddb8a371d3f2965ea475fefcd Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 15:46:39 +0200 Subject: [PATCH 536/710] Fixes #45146 --- .../contrib/snippet/snippetController2.ts | 8 ++++++ .../editor/contrib/snippet/snippetSession.ts | 27 +++++++++++++++++++ .../mainThreadSaveParticipant.ts | 7 +++++ 3 files changed, 42 insertions(+) diff --git a/src/vs/editor/contrib/snippet/snippetController2.ts b/src/vs/editor/contrib/snippet/snippetController2.ts index 9ec45c47c8f..83abd441a26 100644 --- a/src/vs/editor/contrib/snippet/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/snippetController2.ts @@ -14,6 +14,7 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/suggest'; import { ISuggestion } from 'vs/editor/common/modes'; import { Selection } from 'vs/editor/common/core/selection'; +import { Range } from 'vs/editor/common/core/range'; import { Choice } from 'vs/editor/contrib/snippet/snippetParser'; import { repeat } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -203,6 +204,13 @@ export class SnippetController2 implements IEditorContribution { this._session.next(); this._updateState(); } + + getSessionEnclosingRange(): Range { + if (this._session) { + return this._session.getEnclosingRange(); + } + return undefined; + } } diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index be8168b070e..31be6b2ba16 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -226,6 +226,20 @@ export class OneSnippet { this._placeholderGroups = groupBy(this._snippet.placeholders, Placeholder.compareByIndex); }); } + + public getEnclosingRange(): Range { + let result: Range; + const model = this._editor.getModel(); + this._placeholderDecorations.forEach((decorationId) => { + const placeholderRange = model.getDecorationRange(decorationId); + if (!result) { + result = placeholderRange; + } else { + result = result.plusRange(placeholderRange); + } + }); + return result; + } } export class SnippetSession { @@ -510,4 +524,17 @@ export class SnippetSession { // have any left, we don't have a selection anymore return allPossibleSelections.size > 0; } + + public getEnclosingRange(): Range { + let result: Range; + for (const snippet of this._snippets) { + const snippetRange = snippet.getEnclosingRange(); + if (!result) { + result = snippetRange; + } else { + result = result.plusRange(snippetRange); + } + } + return result; + } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts index bfa416d8b51..c5c267edb8d 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts @@ -29,6 +29,7 @@ import { localize } from 'vs/nls'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; import { shouldSynchronizeModel } from 'vs/editor/common/services/modelService'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; export interface ISaveParticipantParticipant extends ISaveParticipant { // progressMessage: string; @@ -60,6 +61,12 @@ class TrimWhitespaceParticipant implements ISaveParticipantParticipant { prevSelection = editor.getSelections(); if (isAutoSaved) { cursors.push(...prevSelection.map(s => new Position(s.positionLineNumber, s.positionColumn))); + const snippetsRange = SnippetController2.get(editor).getSessionEnclosingRange(); + if (snippetsRange) { + for (let lineNumber = snippetsRange.startLineNumber; lineNumber <= snippetsRange.endLineNumber; lineNumber++) { + cursors.push(new Position(lineNumber, model.getLineMaxColumn(lineNumber))); + } + } } } From ffd91480d7c8cdc38bec9f3476a82a0dc0c507d1 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 15:52:36 +0200 Subject: [PATCH 537/710] context menu on title area is specific for sidebarPart thus move it there fixes #46237 --- .../workbench/browser/parts/compositePart.ts | 29 ++----------------- .../browser/parts/sidebar/sidebarPart.ts | 27 ++++++++++++++++- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 5e919a5668c..4111789e023 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -15,7 +15,6 @@ import * as strings from 'vs/base/common/strings'; import { Emitter } from 'vs/base/common/event'; import * as types from 'vs/base/common/types'; import * as errors from 'vs/base/common/errors'; -import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { IActionItem, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; @@ -36,7 +35,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { Dimension, EventType } from 'vs/base/browser/dom'; +import { Dimension } from 'vs/base/browser/dom'; export interface ICompositeTitleLabel { @@ -74,7 +73,7 @@ export abstract class CompositePart<T extends Composite> extends Part { private telemetryService: ITelemetryService, protected contextMenuService: IContextMenuService, protected partService: IPartService, - private keybindingService: IKeybindingService, + protected keybindingService: IKeybindingService, protected instantiationService: IInstantiationService, themeService: IThemeService, protected readonly registry: CompositeRegistry<T>, @@ -408,8 +407,6 @@ export abstract class CompositePart<T extends Composite> extends Part { 'class': ['composite', 'title'] }); - $(titleArea).on(EventType.CONTEXT_MENU, (e: MouseEvent) => this.onTitleAreaContextMenu(new StandardMouseEvent(e))); - // Left Title Label this.titleLabel = this.createTitleLabel(titleArea.getHTMLElement()); @@ -456,27 +453,7 @@ export abstract class CompositePart<T extends Composite> extends Part { this.titleLabel.updateStyles(); } - private onTitleAreaContextMenu(event: StandardMouseEvent): void { - if (this.activeComposite) { - const contextMenuActions = this.getTitleAreaContextMenuActions(); - if (contextMenuActions.length) { - const anchor: { x: number, y: number } = { x: event.posx, y: event.posy }; - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - getActions: () => TPromise.as(contextMenuActions), - getActionItem: action => this.actionItemProvider(action as Action), - actionRunner: this.activeComposite.getActionRunner(), - getKeyBinding: action => this.keybindingService.lookupKeybinding(action.id) - }); - } - } - } - - protected getTitleAreaContextMenuActions(): IAction[] { - return this.activeComposite ? this.activeComposite.getContextMenuActions() : []; - } - - private actionItemProvider(action: Action): IActionItem { + protected actionItemProvider(action: Action): IActionItem { // Check Active Composite if (this.activeComposite) { diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 172dfe24ff2..d4826a2b8f6 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -26,8 +26,9 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND, SIDE_BAR_BORDER } from 'vs/workbench/common/theme'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { Dimension } from 'vs/base/browser/dom'; +import { Dimension, EventType } from 'vs/base/browser/dom'; import { $ } from 'vs/base/browser/builder'; +import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; export class SidebarPart extends CompositePart<Viewlet> { @@ -76,6 +77,13 @@ export class SidebarPart extends CompositePart<Viewlet> { return this._onDidCompositeClose.event as Event<IViewlet>; } + public createTitleArea(parent: HTMLElement): HTMLElement { + const titleArea = super.createTitleArea(parent); + $(titleArea).on(EventType.CONTEXT_MENU, (e: MouseEvent) => this.onTitleAreaContextMenu(new StandardMouseEvent(e))); + + return titleArea; + } + public updateStyles(): void { super.updateStyles(); @@ -133,6 +141,23 @@ export class SidebarPart extends CompositePart<Viewlet> { return super.layout(dimension); } + + private onTitleAreaContextMenu(event: StandardMouseEvent): void { + const activeViewlet = this.getActiveViewlet() as Viewlet; + if (activeViewlet) { + const contextMenuActions = activeViewlet ? activeViewlet.getContextMenuActions() : []; + if (contextMenuActions.length) { + const anchor: { x: number, y: number } = { x: event.posx, y: event.posy }; + this.contextMenuService.showContextMenu({ + getAnchor: () => anchor, + getActions: () => TPromise.as(contextMenuActions), + getActionItem: action => this.actionItemProvider(action as Action), + actionRunner: activeViewlet.getActionRunner(), + getKeyBinding: action => this.keybindingService.lookupKeybinding(action.id) + }); + } + } + } } class FocusSideBarAction extends Action { From f952b5d7be4aaf0971d762d337e63fb409534906 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 16:08:27 +0200 Subject: [PATCH 538/710] Fix #48216 --- src/vs/workbench/parts/markers/electron-browser/messages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/markers/electron-browser/messages.ts b/src/vs/workbench/parts/markers/electron-browser/messages.ts index 022b2a787a9..7368df79ae4 100644 --- a/src/vs/workbench/parts/markers/electron-browser/messages.ts +++ b/src/vs/workbench/parts/markers/electron-browser/messages.ts @@ -23,7 +23,7 @@ export default class Messages { public static MARKERS_PANEL_NO_PROBLEMS_BUILT: string = nls.localize('markers.panel.no.problems.build', "No problems have been detected in the workspace so far."); public static MARKERS_PANEL_NO_PROBLEMS_FILTERS: string = nls.localize('markers.panel.no.problems.filters', "No results found with provided filter criteria."); - public static MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER: string = nls.localize('markers.panel.no.problems.file.exclusions', "All problems are hidden because files exculde filter is enabled."); + public static MARKERS_PANEL_NO_PROBLEMS_FILE_EXCLUSIONS_FILTER: string = nls.localize('markers.panel.no.problems.file.exclusions', "All problems are hidden because files exclude filter is enabled."); public static MARKERS_PANEL_ACTION_TOOLTIP_USE_FILES_EXCLUDE: string = nls.localize('markers.panel.action.useFilesExclude', "Filter using Files Exclude Setting"); public static MARKERS_PANEL_ACTION_TOOLTIP_DO_NOT_USE_FILES_EXCLUDE: string = nls.localize('markers.panel.action.donotUseFilesExclude', "Do not use Files Exclude Setting"); From a8839f858e6c7001262d8219da7593dd28cbdcf9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Thu, 19 Apr 2018 16:30:26 +0200 Subject: [PATCH 539/710] add an arg to resolve code lenses, #44846 --- src/vs/editor/contrib/codelens/codelens.ts | 22 ++++++++++-- .../workbench/api/node/extHostApiCommands.ts | 7 ++-- .../api/extHostApiCommands.test.ts | 34 +++++++++++++++++++ 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/codelens/codelens.ts b/src/vs/editor/contrib/codelens/codelens.ts index 453b065969f..3f80ac5442a 100644 --- a/src/vs/editor/contrib/codelens/codelens.ts +++ b/src/vs/editor/contrib/codelens/codelens.ts @@ -14,6 +14,7 @@ import { registerLanguageCommand } from 'vs/editor/browser/editorExtensions'; import { CodeLensProviderRegistry, CodeLensProvider, ICodeLensSymbol } from 'vs/editor/common/modes'; import { IModelService } from 'vs/editor/common/services/modelService'; import { asWinJsPromise } from 'vs/base/common/async'; +import { CancellationToken } from 'vs/base/common/cancellation'; export interface ICodeLensData { symbol: ICodeLensSymbol; @@ -58,7 +59,7 @@ export function getCodeLensData(model: ITextModel): TPromise<ICodeLensData[]> { registerLanguageCommand('_executeCodeLensProvider', function (accessor, args) { - const { resource } = args; + let { resource, itemResolveCount } = args; if (!(resource instanceof URI)) { throw illegalArgument(); } @@ -68,5 +69,22 @@ registerLanguageCommand('_executeCodeLensProvider', function (accessor, args) { throw illegalArgument(); } - return getCodeLensData(model).then(value => value.map(item => item.symbol)); + const result: ICodeLensSymbol[] = []; + return getCodeLensData(model).then(value => { + + let resolve: Thenable<any>[] = []; + + for (const item of value) { + if (typeof itemResolveCount === 'undefined') { + result.push(item.symbol); + } else if (itemResolveCount-- > 0) { + resolve.push(Promise.resolve(item.provider.resolveCodeLens(model, item.symbol, CancellationToken.None)).then(symbol => result.push(symbol))); + } + } + + return Promise.all(resolve); + + }).then(() => { + return result; + }); }); diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index 92313180694..8c99eee403f 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -137,7 +137,8 @@ export class ExtHostApiCommands { this._register('vscode.executeCodeLensProvider', this._executeCodeLensProvider, { description: 'Execute CodeLens provider.', args: [ - { name: 'uri', description: 'Uri of a text document', constraint: URI } + { name: 'uri', description: 'Uri of a text document', constraint: URI }, + { name: 'itemResolveCount', description: '(optional) Number of lenses that should be resolved and returned. Will only retrun resolved lenses, will impact performance)', constraint: value => value === void 0 || typeof value === 'number' } ], returns: 'A promise that resolves to an array of CodeLens-instances.' }); @@ -472,8 +473,8 @@ export class ExtHostApiCommands { })); } - private _executeCodeLensProvider(resource: URI): Thenable<vscode.CodeLens[]> { - const args = { resource }; + private _executeCodeLensProvider(resource: URI, itemResolveCount: number): Thenable<vscode.CodeLens[]> { + const args = { resource, itemResolveCount }; return this._commands.executeCommand<modes.ICodeLensSymbol[]>('_executeCodeLensProvider', args) .then(tryMapWith(item => { return new types.CodeLens( diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index b024891dc84..b9a820e8e5b 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -534,6 +534,40 @@ suite('ExtHostLanguageFeatureCommands', function () { }); }); + test('CodeLens, resolve', async function () { + + let resolveCount = 0; + + disposables.push(extHost.registerCodeLensProvider(defaultSelector, <vscode.CodeLensProvider>{ + provideCodeLenses(): any { + return [ + new types.CodeLens(new types.Range(0, 0, 1, 1)), + new types.CodeLens(new types.Range(0, 0, 1, 1)), + new types.CodeLens(new types.Range(0, 0, 1, 1)), + new types.CodeLens(new types.Range(0, 0, 1, 1)) + ]; + }, + resolveCodeLens(codeLens: types.CodeLens) { + codeLens.command = { title: resolveCount.toString(), command: 'resolved' }; + resolveCount += 1; + return codeLens; + } + })); + + await rpcProtocol.sync(); + + let value = await commands.executeCommand<vscode.CodeLens[]>('vscode.executeCodeLensProvider', model.uri, 2); + + assert.equal(value.length, 2); // the resolve argument defines the number of results being returned + assert.equal(resolveCount, 2); + + resolveCount = 0; + value = await commands.executeCommand<vscode.CodeLens[]>('vscode.executeCodeLensProvider', model.uri); + + assert.equal(value.length, 4); + assert.equal(resolveCount, 0); + }); + test('Links, back and forth', function () { disposables.push(extHost.registerDocumentLinkProvider(defaultSelector, <vscode.DocumentLinkProvider>{ From 46386015a81eaa94a84413bd406c4364a77449e7 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Thu, 19 Apr 2018 16:48:39 +0200 Subject: [PATCH 540/710] Fixes #48206 --- src/vs/editor/common/config/commonEditorConfig.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index b898ce6fde7..2ae72c0dd17 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -211,7 +211,7 @@ const editorConfiguration: IConfigurationNode = { nls.localize('lineNumbers.interval', "Line numbers are rendered every 10 lines.") ], 'default': 'on', - 'description': nls.localize('lineNumbers', "Controls the display of line numbers. Possible values are 'on', 'off', 'relative' and 'interval'.") + 'description': nls.localize('lineNumbers', "Controls the display of line numbers.") }, 'editor.rulers': { 'type': 'array', @@ -268,13 +268,13 @@ const editorConfiguration: IConfigurationNode = { 'type': 'string', 'enum': ['left', 'right'], 'default': EDITOR_DEFAULTS.viewInfo.minimap.side, - 'description': nls.localize('minimap.side', "Controls the side where to render the minimap. Possible values are \'right\' and \'left\'") + 'description': nls.localize('minimap.side', "Controls the side where to render the minimap.") }, 'editor.minimap.showSlider': { 'type': 'string', 'enum': ['always', 'mouseover'], 'default': EDITOR_DEFAULTS.viewInfo.minimap.showSlider, - 'description': nls.localize('minimap.showSlider', "Controls whether the minimap slider is automatically hidden. Possible values are \'always\' and \'mouseover\'") + 'description': nls.localize('minimap.showSlider', "Controls whether the minimap slider is automatically hidden.") }, 'editor.minimap.renderCharacters': { 'type': 'boolean', @@ -520,7 +520,7 @@ const editorConfiguration: IConfigurationNode = { 'type': 'string', 'enum': ['blink', 'smooth', 'phase', 'expand', 'solid'], 'default': editorOptions.blinkingStyleToString(EDITOR_DEFAULTS.viewInfo.cursorBlinking), - 'description': nls.localize('cursorBlinking', "Control the cursor animation style, possible values are 'blink', 'smooth', 'phase', 'expand' and 'solid'") + 'description': nls.localize('cursorBlinking', "Control the cursor animation style.") }, 'editor.mouseWheelZoom': { 'type': 'boolean', From db9cddaa6eef3309ea28990fe1931de10ddd48dd Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 17:27:40 +0200 Subject: [PATCH 541/710] explorer: do not allow to creatae a new file / folder while in the process of creating a new file fixes #47606 --- src/vs/workbench/parts/files/common/explorerModel.ts | 3 ++- src/vs/workbench/parts/files/electron-browser/fileActions.ts | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/common/explorerModel.ts b/src/vs/workbench/parts/files/common/explorerModel.ts index 7b5493dfb3b..df76d082ac3 100644 --- a/src/vs/workbench/parts/files/common/explorerModel.ts +++ b/src/vs/workbench/parts/files/common/explorerModel.ts @@ -378,13 +378,14 @@ export class ExplorerItem { /* A helper that can be used to show a placeholder when creating a new stat */ export class NewStatPlaceholder extends ExplorerItem { + public static NAME = ''; private static ID = 0; private id: number; private directoryPlaceholder: boolean; constructor(isDirectory: boolean, root: ExplorerItem) { - super(URI.file(''), root, false, false, ''); + super(URI.file(''), root, false, false, NewStatPlaceholder.NAME); this.id = NewStatPlaceholder.ID++; this.isDirectoryResolved = isDirectory; diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 88358fa7f22..93d95cffa90 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -391,6 +391,10 @@ export class BaseNewAction extends BaseFileAction { if (!folder) { return TPromise.wrapError(new Error('Invalid parent folder to create.')); } + if (!!folder.getChild(NewStatPlaceholder.NAME)) { + // Do not allow to creatae a new file/folder while in the process of creating a new file/folder #47606 + return TPromise.as(new Error('Parent folder is already in the process of creating a file')); + } return this.tree.reveal(folder, 0.5).then(() => { return this.tree.expand(folder).then(() => { From 2ad75aa47bb4ff53c13acf28491c86ac5e1db554 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 18:12:56 +0200 Subject: [PATCH 542/710] Fix #48179 --- .../browser/parts/views/panelViewlet.ts | 31 +++++++++++++------ .../browser/parts/views/viewsViewlet.ts | 28 ++++++++++------- .../parts/debug/browser/debugViewlet.ts | 28 ++++++++++------- .../parts/scm/electron-browser/scmViewlet.ts | 12 +++---- 4 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/panelViewlet.ts b/src/vs/workbench/browser/parts/views/panelViewlet.ts index bd6e9fac431..76656e42490 100644 --- a/src/vs/workbench/browser/parts/views/panelViewlet.ts +++ b/src/vs/workbench/browser/parts/views/panelViewlet.ts @@ -247,7 +247,20 @@ export class PanelViewlet extends Viewlet { return Math.max(...sizes); } - addPanel(panel: ViewletPanel, size: number, index = this.panelItems.length - 1): void { + addPanels(panels: { panel: ViewletPanel, size: number, index?: number }[]): void { + const wasSingleView = this.isSingleView(); + + for (const { panel, size, index } of panels) { + this.addPanel(panel, size, index); + } + + this.updateViewHeaders(); + if (this.isSingleView() !== wasSingleView) { + this.updateTitleArea(); + } + } + + private addPanel(panel: ViewletPanel, size: number, index = this.panelItems.length - 1): void { const disposables: IDisposable[] = []; const onDidFocus = panel.onDidFocus(() => this.lastFocusedPanel = panel, null, disposables); const onDidChange = panel.onDidChange(() => { @@ -265,17 +278,22 @@ export class PanelViewlet extends Viewlet { const disposable = combinedDisposable([onDidFocus, panelStyler, onDidChange]); const panelItem: IViewletPanelItem = { panel, disposable }; - const wasSingleView = this.isSingleView(); this.panelItems.splice(index, 0, panelItem); this.panelview.addPanel(panel, size, index); + } + + removePanels(panels: ViewletPanel[]): void { + const wasSingleView = this.isSingleView(); + + panels.forEach(panel => this.removePanel(panel)); this.updateViewHeaders(); - if (this.isSingleView() !== wasSingleView) { + if (wasSingleView !== this.isSingleView()) { this.updateTitleArea(); } } - removePanel(panel: ViewletPanel): void { + private removePanel(panel: ViewletPanel): void { const index = firstIndex(this.panelItems, i => i.panel === panel); if (index === -1) { @@ -286,15 +304,10 @@ export class PanelViewlet extends Viewlet { this.lastFocusedPanel = undefined; } - const wasSingleView = this.isSingleView(); this.panelview.removePanel(panel); const [panelItem] = this.panelItems.splice(index, 1); panelItem.disposable.dispose(); - this.updateViewHeaders(); - if (wasSingleView !== this.isSingleView()) { - this.updateTitleArea(); - } } movePanel(from: ViewletPanel, to: ViewletPanel): void { diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index b6ab9b7a7bd..18f58d76c88 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -370,14 +370,15 @@ export class ViewsViewlet extends PanelViewlet implements IViewsViewlet { this.snapshotViewsStates(); if (toRemove.length) { - for (const viewDescriptor of toRemove) { - let view = this.getView(viewDescriptor.id); - this.removePanel(view); - this.viewsViewletPanels.splice(this.viewsViewletPanels.indexOf(view), 1); - view.dispose(); + const panelsToRemove: ViewsViewletPanel[] = toRemove.map(viewDescriptor => this.getView(viewDescriptor.id)); + this.removePanels(panelsToRemove); + for (const panel of panelsToRemove) { + this.viewsViewletPanels.splice(this.viewsViewletPanels.indexOf(panel), 1); + panel.dispose(); } } + const panelsToAdd: { panel: ViewsViewletPanel, size: number, index: number }[] = []; for (const viewDescriptor of toAdd) { let viewState = this.viewsStates.get(viewDescriptor.id); let index = visible.indexOf(viewDescriptor); @@ -392,8 +393,13 @@ export class ViewsViewlet extends PanelViewlet implements IViewsViewlet { toCreate.push(view); const size = (viewState && viewState.size) || 200; - this.addPanel(view, size, index); - this.viewsViewletPanels.splice(index, 0, view); + panelsToAdd.push({ panel: view, size, index }); + } + + this.addPanels(panelsToAdd); + + for (const { panel, index } of panelsToAdd) { + this.viewsViewletPanels.splice(index, 0, panel); } return TPromise.join(toCreate.map(view => view.create())) @@ -545,18 +551,16 @@ export class ViewsViewlet extends PanelViewlet implements IViewsViewlet { } if (ViewLocation.get(this.location.id)) { - let visibleViewsCount = 0; - if (this.areExtensionsReady) { - visibleViewsCount = this.getViewDescriptorsFromRegistry().reduce((visibleViewsCount, v) => visibleViewsCount + (this.canBeVisible(v) ? 1 : 0), 0); - } else { + if (!this.areExtensionsReady) { + let visibleViewsCount = 0; // Check in cache so that view do not jump. See #29609 this.viewsStates.forEach((viewState, id) => { if (!viewState.isHidden) { visibleViewsCount++; } }); + return visibleViewsCount === 1; } - return visibleViewsCount === 1; } return super.isSingleView(); diff --git a/src/vs/workbench/parts/debug/browser/debugViewlet.ts b/src/vs/workbench/parts/debug/browser/debugViewlet.ts index 5470e587f06..35ee37d8769 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewlet.ts @@ -109,22 +109,26 @@ export class DebugViewlet extends PersistentViewsViewlet { } } - addPanel(panel: ViewsViewletPanel, size: number, index?: number): void { - super.addPanel(panel, size, index); + addPanels(panels: { panel: ViewsViewletPanel, size: number, index?: number }[]): void { + super.addPanels(panels); - // attach event listener to - if (panel.id === BREAKPOINTS_VIEW_ID) { - this.breakpointView = panel; - this.updateBreakpointsMaxSize(); - } else { - this.panelListeners.set(panel.id, panel.onDidChange(() => this.updateBreakpointsMaxSize())); + for (const { panel } of panels) { + // attach event listener to + if (panel.id === BREAKPOINTS_VIEW_ID) { + this.breakpointView = panel; + this.updateBreakpointsMaxSize(); + } else { + this.panelListeners.set(panel.id, panel.onDidChange(() => this.updateBreakpointsMaxSize())); + } } } - removePanel(panel: ViewsViewletPanel): void { - super.removePanel(panel); - dispose(this.panelListeners.get(panel.id)); - this.panelListeners.delete(panel.id); + removePanels(panels: ViewsViewletPanel[]): void { + super.removePanels(panels); + for (const panel of panels) { + dispose(this.panelListeners.get(panel.id)); + this.panelListeners.delete(panel.id); + } } private updateBreakpointsMaxSize(): void { diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 24668ee7847..51dadcef081 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -1163,13 +1163,13 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { if (shouldMainPanelBeVisible) { this.mainPanel = this.instantiationService.createInstance(MainPanel, this); - this.addPanel(this.mainPanel, this.mainPanel.minimumSize, 0); + this.addPanels([{ panel: this.mainPanel, size: this.mainPanel.minimumSize, index: 0 }]); const selectionChangeDisposable = this.mainPanel.onSelectionChange(this.onSelectionChange, this); this.onSelectionChange(this.mainPanel.getSelection()); this.mainPanelDisposable = toDisposable(() => { - this.removePanel(this.mainPanel); + this.removePanels([this.mainPanel]); selectionChangeDisposable.dispose(); this.mainPanel.dispose(); }); @@ -1294,12 +1294,12 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { let index = repositoryPanels.length + (this.mainPanel ? 1 : 0); this.repositoryPanels = [...repositoryPanels, ...newRepositoryPanels]; newRepositoryPanels.forEach(panel => { - this.addPanel(panel, panel.minimumSize, index++); + this.addPanels([{ panel, size: panel.minimumSize, index: index++ }]); panel.repository.focus(); }); // Remove unselected panels - panelsToRemove.forEach(panel => this.removePanel(panel)); + this.removePanels(panelsToRemove); // Restore main panel height if (this.isVisible() && typeof this.cachedMainPanelHeight === 'number') { @@ -1350,7 +1350,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { viewletSettings: {} // what is this }) as ViewsViewletPanel; - this.addPanel(panel, size || panel.minimumSize, start + index); + this.addPanels([{ panel, size: size || panel.minimumSize, index: start + index }]); const contextMenuDisposable = addDisposableListener(panel.draggableElement, 'contextmenu', e => { e.stopPropagation(); @@ -1409,7 +1409,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { const start = this.getContributedViewsStartIndex(); const panel = this.panels[start + index]; - this.removePanel(panel); + this.removePanels([panel]); const [disposable] = this.contributedViewDisposables.splice(index, 1); disposable.dispose(); From 6c3cb56e490bbaddc75acfd3bd0953b1550bcbb7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Thu, 19 Apr 2018 18:14:33 +0200 Subject: [PATCH 543/710] don't count already resolved items, #44846 --- src/vs/editor/contrib/codelens/codelens.ts | 2 +- .../test/electron-browser/api/extHostApiCommands.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/codelens/codelens.ts b/src/vs/editor/contrib/codelens/codelens.ts index 3f80ac5442a..92821ec5ee6 100644 --- a/src/vs/editor/contrib/codelens/codelens.ts +++ b/src/vs/editor/contrib/codelens/codelens.ts @@ -75,7 +75,7 @@ registerLanguageCommand('_executeCodeLensProvider', function (accessor, args) { let resolve: Thenable<any>[] = []; for (const item of value) { - if (typeof itemResolveCount === 'undefined') { + if (typeof itemResolveCount === 'undefined' || Boolean(item.symbol.command)) { result.push(item.symbol); } else if (itemResolveCount-- > 0) { resolve.push(Promise.resolve(item.provider.resolveCodeLens(model, item.symbol, CancellationToken.None)).then(symbol => result.push(symbol))); diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index b9a820e8e5b..4801ffcda53 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -544,7 +544,7 @@ suite('ExtHostLanguageFeatureCommands', function () { new types.CodeLens(new types.Range(0, 0, 1, 1)), new types.CodeLens(new types.Range(0, 0, 1, 1)), new types.CodeLens(new types.Range(0, 0, 1, 1)), - new types.CodeLens(new types.Range(0, 0, 1, 1)) + new types.CodeLens(new types.Range(0, 0, 1, 1), { title: 'Already resolved', command: 'fff' }) ]; }, resolveCodeLens(codeLens: types.CodeLens) { @@ -558,7 +558,7 @@ suite('ExtHostLanguageFeatureCommands', function () { let value = await commands.executeCommand<vscode.CodeLens[]>('vscode.executeCodeLensProvider', model.uri, 2); - assert.equal(value.length, 2); // the resolve argument defines the number of results being returned + assert.equal(value.length, 3); // the resolve argument defines the number of results being returned assert.equal(resolveCount, 2); resolveCount = 0; From 1c7867152bc49efc304078829892c7fae12259e2 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Thu, 19 Apr 2018 18:25:21 +0200 Subject: [PATCH 544/710] fix bad loading root indentation fixes #41696 --- .../parts/files/electron-browser/views/explorerViewer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index c32ade7e82c..7fc664f81c4 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -76,7 +76,7 @@ export class FileDataSource implements IDataSource { } public hasChildren(tree: ITree, stat: ExplorerItem | Model): boolean { - return stat instanceof Model || (stat instanceof ExplorerItem && stat.isDirectory); + return stat instanceof Model || (stat instanceof ExplorerItem && (stat.isDirectory || stat.isRoot)); } public getChildren(tree: ITree, stat: ExplorerItem | Model): TPromise<ExplorerItem[]> { From 8574a05e0fc3bb2415aeb7d233c271ae0780f702 Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Thu, 19 Apr 2018 18:24:50 +0200 Subject: [PATCH 545/710] support configResolver in EH --- .../mainThreadDebugService.ts | 5 + src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- src/vs/workbench/api/node/extHost.protocol.ts | 1 + .../workbench/api/node/extHostDebugService.ts | 100 +++++- src/vs/workbench/parts/debug/common/debug.ts | 26 +- .../debugConfigurationManager.ts | 60 +--- .../debug/electron-browser/debugService.ts | 25 +- .../parts/debug/node/debugAdapter.ts | 26 +- src/vs/workbench/parts/debug/node/debugger.ts | 24 +- .../parts/debug/test/node/debugger.test.ts | 2 +- .../configurationResolverService.ts | 289 ++++-------------- .../node/variableResolver.ts | 196 ++++++++++++ .../configurationResolverService.test.ts | 29 +- 13 files changed, 468 insertions(+), 317 deletions(-) create mode 100644 src/vs/workbench/services/configurationResolver/node/variableResolver.ts diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts index c43140980b6..893b8962517 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts @@ -16,6 +16,7 @@ import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostC import severity from 'vs/base/common/severity'; import { AbstractDebugAdapter, convertToVSCPaths, convertToDAPaths } from 'vs/workbench/parts/debug/node/debugAdapter'; import * as paths from 'vs/base/common/paths'; +import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @extHostNamedCustomer(MainContext.MainThreadDebugService) @@ -66,6 +67,10 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb return da; } + substituteVariables(folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig> { + return this._proxy.$substituteVariables(folder.uri, config); + } + runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise<void> { return this._proxy.$runInTerminal(args, config); } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 4c5cce2c9db..a4a7b247fce 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -107,7 +107,7 @@ export function createApiFactory( const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, new ExtHostCommands(rpcProtocol, extHostHeapService, extHostLogService)); const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands)); rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace); - const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, new ExtHostDebugService(rpcProtocol, extHostWorkspace, extensionService)); + const extHostDebugService = rpcProtocol.set(ExtHostContext.ExtHostDebugService, new ExtHostDebugService(rpcProtocol, extHostWorkspace, extensionService, extHostDocumentsAndEditors, extHostConfiguration)); rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration); const extHostDiagnostics = rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, new ExtHostDiagnostics(rpcProtocol)); const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, null, extHostDocuments, extHostCommands, extHostHeapService, extHostDiagnostics)); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 6bd721a9ec9..7e1410d4de1 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -790,6 +790,7 @@ export interface ISourceMultiBreakpointDto { } export interface ExtHostDebugServiceShape { + $substituteVariables(folder: UriComponents | undefined, config: IConfig): TPromise<IConfig>; $runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise<void>; $startDASession(handle: number, debugType: string, adapterExecutableInfo: IAdapterExecutable | null): TPromise<void>; $stopDASession(handle: number): TPromise<void>; diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index 7e7a0fe405b..c8b29476bb2 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import * as paths from 'vs/base/common/paths'; +import { Schemas } from 'vs/base/common/network'; +import URI, { UriComponents } from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Event, Emitter } from 'vs/base/common/event'; import { asWinJsPromise } from 'vs/base/common/async'; @@ -11,16 +14,20 @@ import { MainContext, MainThreadDebugServiceShape, ExtHostDebugServiceShape, DebugSessionUUID, IMainContext, IBreakpointsDeltaDto, ISourceMultiBreakpointDto, IFunctionBreakpointDto } from 'vs/workbench/api/node/extHost.protocol'; -import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import * as vscode from 'vscode'; -import URI, { UriComponents } from 'vs/base/common/uri'; import { Disposable, Position, Location, SourceBreakpoint, FunctionBreakpoint } from 'vs/workbench/api/node/extHostTypes'; import { generateUuid } from 'vs/base/common/uuid'; import { DebugAdapter, convertToVSCPaths, convertToDAPaths } from 'vs/workbench/parts/debug/node/debugAdapter'; -import * as paths from 'vs/base/common/paths'; +import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; -import { IAdapterExecutable, ITerminalSettings, IDebuggerContribution } from 'vs/workbench/parts/debug/common/debug'; +import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; +import { IAdapterExecutable, ITerminalSettings, IDebuggerContribution, IConfig } from 'vs/workbench/parts/debug/common/debug'; import { getTerminalLauncher } from 'vs/workbench/parts/debug/node/terminals'; +import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { VariableResolver } from 'vs/workbench/services/configurationResolver/node/variableResolver'; +import { IConfigurationResolverService } from '../../services/configurationResolver/common/configurationResolver'; +import { IStringDictionary } from 'vs/base/common/collections'; +import { ExtHostConfiguration } from './extHostConfiguration'; export class ExtHostDebugService implements ExtHostDebugServiceShape { @@ -56,8 +63,15 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { private _debugAdapters: Map<number, DebugAdapter>; + private _variableResolver: IConfigurationResolverService; - constructor(mainContext: IMainContext, private _workspace: ExtHostWorkspace, private _extensionService: ExtHostExtensionService) { + + constructor(mainContext: IMainContext, + private _workspace: ExtHostWorkspace, + private _extensionService: ExtHostExtensionService, + private _editorsService: ExtHostDocumentsAndEditors, + private _configurationService: ExtHostConfiguration + ) { this._handleCounter = 0; this._handlers = new Map<number, vscode.DebugConfigurationProvider>(); @@ -110,6 +124,14 @@ export class ExtHostDebugService implements ExtHostDebugServiceShape { return void 0; } + public $substituteVariables(folderUri: UriComponents | undefined, config: IConfig): TPromise<IConfig> { + if (!this._variableResolver) { + this._variableResolver = new ExtHostVariableResolverService(this._workspace, this._editorsService, this._configurationService); + } + const folder = <IWorkspaceFolder>this.getFolder(folderUri); + return asWinJsPromise(token => DebugAdapter.substituteVariables(folder, config, this._variableResolver)); + } + public $startDASession(handle: number, debugType: string, adpaterExecutable: IAdapterExecutable | null): TPromise<void> { const mythis = this; @@ -503,3 +525,71 @@ export class ExtHostDebugConsole implements vscode.DebugConsole { this.append(value + '\n'); } } + +class ExtHostVariableResolverService implements IConfigurationResolverService { + + _serviceBrand: any; + _variableResolver: VariableResolver; + + constructor(workspace: ExtHostWorkspace, editors: ExtHostDocumentsAndEditors, configuration: ExtHostConfiguration) { + this._variableResolver = new VariableResolver({ + getFolderUri: (folderName: string): URI => { + const folders = workspace.getWorkspaceFolders(); + const found = folders.filter(f => f.name === folderName); + if (found && found.length > 0) { + return found[0].uri; + } + return undefined; + }, + getWorkspaceFolderCount: (): number => { + return workspace.getWorkspaceFolders().length; + }, + getConfigurationValue: (folderUri: URI, section: string) => { + return configuration.getConfiguration(undefined, folderUri).get<string>(section); + }, + getEnvironmentService: (name: string): string => { + return undefined; + }, + getFilePath: (): string | undefined => { + const activeEditor = editors.activeEditor(); + if (activeEditor) { + const resource = activeEditor.document.uri; + if (resource.scheme === Schemas.file) { + return paths.normalize(resource.fsPath, true); + } + } + return undefined; + }, + getSelectedText: (): string | undefined => { + debugger; + const activeEditor = editors.activeEditor(); + if (activeEditor && !activeEditor.selection.isEmpty) { + return activeEditor.document.getText(activeEditor.selection); + } + return undefined; + }, + getLineNumber: (): string => { + const activeEditor = editors.activeEditor(); + if (activeEditor) { + return String(activeEditor.selection.end.line + 1); + } + return undefined; + } + }, process.env); + } + + public resolve(root: IWorkspaceFolder, value: string): string; + public resolve(root: IWorkspaceFolder, value: string[]): string[]; + public resolve(root: IWorkspaceFolder, value: IStringDictionary<string>): IStringDictionary<string>; + public resolve(root: IWorkspaceFolder, value: any): any { + return this._variableResolver.resolveAny(root ? root.uri : undefined, value); + } + + public resolveAny(root: IWorkspaceFolder, value: any): any { + return this._variableResolver.resolveAny(root ? root.uri : undefined, value); + } + + resolveInteractiveVariables(configuration: any, interactiveVariablesMap: { [key: string]: string; }): TPromise<any, any> { + throw new Error('Method not implemented.'); + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 6477133f88a..566acd9d9af 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -360,23 +360,29 @@ export interface IGlobalConfig { } export interface IEnvConfig { - name?: string; - type: string; - request: string; internalConsoleOptions?: 'neverOpen' | 'openOnSessionStart' | 'openOnFirstSessionStart'; preLaunchTask?: string; postDebugTask?: string; - __restart?: any; - __sessionId?: string; debugServer?: number; noDebug?: boolean; - port?: number; } export interface IConfig extends IEnvConfig { + + // fundamental attributes + type: string; + request: string; + name?: string; + + // platform specifics windows?: IEnvConfig; osx?: IEnvConfig; linux?: IEnvConfig; + + // internals + __sessionId?: string; + __restart?: any; + port?: number; // TODO } export interface ICompound { @@ -398,6 +404,7 @@ export interface IDebugAdapter extends IDisposable { export interface IDebugAdapterProvider extends ITerminalLauncher { createDebugAdapter(debugType: string, adapterInfo: IAdapterExecutable | null): IDebugAdapter; + substituteVariables(folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig>; } export interface IAdapterExecutable { @@ -497,6 +504,7 @@ export interface IConfigurationManager { registerDebugAdapterProvider(debugTypes: string[], debugAdapterLauncher: IDebugAdapterProvider): IDisposable; createDebugAdapter(debugType: string, adapterExecutable: IAdapterExecutable | null): IDebugAdapter | undefined; + substituteVariables(debugType: string, folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig>; runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise<void>; } @@ -540,12 +548,6 @@ export interface ILaunch { */ getConfigurationNames(includeCompounds?: boolean): string[]; - /** - * Returns the resolved configuration. - * Replaces os specific values, system variables, interactive variables. - */ - substituteVariables(config: IConfig): TPromise<IConfig>; - /** * Opens the launch.json file. Creates if it does not exist. */ diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index 72681ca18a1..1428ee55ed1 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -8,7 +8,6 @@ import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { Event, Emitter } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import * as strings from 'vs/base/common/strings'; -import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import * as objects from 'vs/base/common/objects'; import uri from 'vs/base/common/uri'; import * as paths from 'vs/base/common/paths'; @@ -26,7 +25,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IDebugConfigurationProvider, IDebuggerContribution, ICompound, IDebugConfiguration, IConfig, IEnvConfig, IGlobalConfig, IConfigurationManager, ILaunch, IAdapterExecutable, IDebugAdapterProvider, IDebugAdapter, ITerminalSettings, ITerminalLauncher } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugConfigurationProvider, IDebuggerContribution, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IAdapterExecutable, IDebugAdapterProvider, IDebugAdapter, ITerminalSettings, ITerminalLauncher } from 'vs/workbench/parts/debug/common/debug'; import { Debugger } from 'vs/workbench/parts/debug/node/debugger'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; @@ -242,7 +241,8 @@ export class ConfigurationManager implements IConfigurationManager { @IInstantiationService private instantiationService: IInstantiationService, @ICommandService private commandService: ICommandService, @IStorageService private storageService: IStorageService, - @ILifecycleService lifecycleService: ILifecycleService + @ILifecycleService lifecycleService: ILifecycleService, + @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService ) { this.providers = []; this.debuggers = []; @@ -326,6 +326,14 @@ export class ConfigurationManager implements IConfigurationManager { return undefined; } + public substituteVariables(debugType: string, folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig> { + let dap = this.getDebugAdapterProvider(debugType); + if (dap) { + return dap.substituteVariables(folder, config); + } + return TPromise.as(config); + } + public runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments, config: ITerminalSettings): TPromise<void> { let tl: ITerminalLauncher = this.getDebugAdapterProvider(debugType); @@ -355,7 +363,7 @@ export class ConfigurationManager implements IConfigurationManager { if (duplicate) { duplicate.merge(rawAdapter, extension.description); } else { - this.debuggers.push(new Debugger(this, rawAdapter, extension.description, this.configurationService, this.commandService)); + this.debuggers.push(new Debugger(this, rawAdapter, extension.description, this.configurationService, this.commandService, this.configurationResolverService)); } }); }); @@ -548,7 +556,6 @@ class Launch implements ILaunch { @IFileService private fileService: IFileService, @IWorkbenchEditorService protected editorService: IWorkbenchEditorService, @IConfigurationService protected configurationService: IConfigurationService, - @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService, @IWorkspaceContextService protected contextService: IWorkspaceContextService, @IExtensionService private extensionService: IExtensionService ) { @@ -607,45 +614,6 @@ class Launch implements ILaunch { return config.configurations.filter(config => config && config.name === name).shift(); } - protected getWorkspaceForResolving(): IWorkspaceFolder { - if (this.workspace) { - return this.workspace; - } - - if (this.contextService.getWorkspace().folders.length === 1) { - return this.contextService.getWorkspace().folders[0]; - } - - return undefined; - } - - public substituteVariables(config: IConfig): TPromise<IConfig> { - const result = objects.deepClone(config) as IConfig; - // Set operating system specific properties #1873 - const setOSProperties = (flag: boolean, osConfig: IEnvConfig) => { - if (flag && osConfig) { - Object.keys(osConfig).forEach(key => { - result[key] = osConfig[key]; - }); - } - }; - setOSProperties(isWindows, result.windows); - setOSProperties(isMacintosh, result.osx); - setOSProperties(isLinux, result.linux); - - // massage configuration attributes - append workspace path to relatvie paths, substitute variables in paths. - try { - Object.keys(result).forEach(key => { - result[key] = this.configurationResolverService.resolveAny(this.getWorkspaceForResolving(), result[key]); - }); - } catch (e) { - return TPromise.wrapError(e); - } - - const adapter = this.configurationManager.getDebugger(result.type); - return this.configurationResolverService.resolveInteractiveVariables(result, adapter ? adapter.variables : null); - } - public openConfigFile(sideBySide: boolean, type?: string): TPromise<IEditor> { return this.extensionService.activateByEvent('onDebugInitialConfigurations').then(() => this.extensionService.activateByEvent('onDebug').then(() => { const resource = this.uri; @@ -715,7 +683,7 @@ class WorkspaceLaunch extends Launch implements ILaunch { @IWorkspaceContextService contextService: IWorkspaceContextService, @IExtensionService extensionService: IExtensionService ) { - super(configurationManager, undefined, fileService, editorService, configurationService, configurationResolverService, contextService, extensionService); + super(configurationManager, undefined, fileService, editorService, configurationService, contextService, extensionService); } get uri(): uri { @@ -747,7 +715,7 @@ class UserLaunch extends Launch implements ILaunch { @IWorkspaceContextService contextService: IWorkspaceContextService, @IExtensionService extensionService: IExtensionService ) { - super(configurationManager, undefined, fileService, editorService, configurationService, configurationResolverService, contextService, extensionService); + super(configurationManager, undefined, fileService, editorService, configurationService, contextService, extensionService); } get uri(): uri { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 0987dbaca10..afa634c5d1c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -784,9 +784,32 @@ export class DebugService implements debug.IDebugService { }); } + private substituteVariables(launch: debug.ILaunch, config: debug.IConfig): TPromise<debug.IConfig> { + const dbg = this.configurationManager.getDebugger(config.type); + if (dbg) { + let folder: IWorkspaceFolder = undefined; + if (launch.workspace) { + folder = launch.workspace; + } else { + const folders = this.contextService.getWorkspace().folders; + if (folders.length === 1) { + folder = folders[0]; + } + } + return dbg.substituteVariables(folder, config).then(config => { + return config; + }, (err: Error) => { + this.showError(err.message); + return undefined; // bail out + }); + } + return TPromise.as(config); + } + private createProcess(launch: debug.ILaunch, config: debug.IConfig, sessionId: string): TPromise<void> { return this.textFileService.saveAll().then(() => - (launch ? launch.substituteVariables(config).then(config => config, (err: Error) => this.showError(err.message)) : TPromise.as(config)).then(resolvedConfig => { + this.substituteVariables(launch, config).then(resolvedConfig => { + if (!resolvedConfig) { // User canceled resolving of interactive variables, silently return return undefined; diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index f09c6fadc0e..c74bd1c9e4d 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -17,7 +17,9 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { ExtensionsChannelId } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; -import { IDebugAdapter, IAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugAdapter, IAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution, IConfig } from 'vs/workbench/parts/debug/common/debug'; +import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; +import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; /** * Abstract implementation of the low level API for a debug adapter. @@ -406,6 +408,28 @@ export class DebugAdapter extends StreamDebugAdapter { }; } } + + static substituteVariables(workspaceFolder: IWorkspaceFolder, config: IConfig, resolverService: IConfigurationResolverService): IConfig { + + const result = objects.deepClone(config) as IConfig; + + // hoist platform specific attributes to top level + if (platform.isWindows && result.windows) { + Object.keys(result.windows).forEach(key => result[key] = result.windows[key]); + } else if (platform.isMacintosh && result.osx) { + Object.keys(result.osx).forEach(key => result[key] = result.osx[key]); + } else if (platform.isLinux && result.linux) { + Object.keys(result.linux).forEach(key => result[key] = result.linux[key]); + } + + // delete all platform specific sections + delete result.windows; + delete result.osx; + delete result.linux; + + // substitute all variables in string values + return resolverService.resolveAny(workspaceFolder, result); + } } // path hooks helpers diff --git a/src/vs/workbench/parts/debug/node/debugger.ts b/src/vs/workbench/parts/debug/node/debugger.ts index b3e1907e2ce..e6e1ffed7ab 100644 --- a/src/vs/workbench/parts/debug/node/debugger.ts +++ b/src/vs/workbench/parts/debug/node/debugger.ts @@ -15,6 +15,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ICommandService } from 'vs/platform/commands/common/commands'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; import { DebugAdapter } from 'vs/workbench/parts/debug/node/debugAdapter'; +import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; export class Debugger { @@ -22,7 +23,8 @@ export class Debugger { constructor(private configurationManager: IConfigurationManager, private debuggerContribution: IDebuggerContribution, public extensionDescription: IExtensionDescription, @IConfigurationService private configurationService: IConfigurationService, - @ICommandService private commandService: ICommandService + @ICommandService private commandService: ICommandService, + @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService, ) { this._mergedExtensionDescriptions = [extensionDescription]; } @@ -59,6 +61,26 @@ export class Debugger { }); } + public substituteVariables(folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig> { + + let configP: TPromise<IConfig>; + const debugConfigs = this.configurationService.getValue<IDebugConfiguration>('debug'); + if (debugConfigs.extensionHostDebugAdapter) { + configP = this.configurationManager.substituteVariables(this.type, folder, config); + } else { + try { + configP = TPromise.as(DebugAdapter.substituteVariables(folder, config, this.configurationResolverService)); + } catch (e) { + return TPromise.wrapError(e); + } + } + + return configP.then(result => { + // substitute 'command' variables (including interactive) + return this.configurationResolverService.resolveInteractiveVariables(result, this.variables); + }); + } + public runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments): TPromise<void> { const debugConfigs = this.configurationService.getValue<IDebugConfiguration>('debug'); const config = this.configurationService.getValue<ITerminalSettings>('terminal'); diff --git a/src/vs/workbench/parts/debug/test/node/debugger.test.ts b/src/vs/workbench/parts/debug/test/node/debugger.test.ts index 9e57914a9a9..0e7dadf2ea2 100644 --- a/src/vs/workbench/parts/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/parts/debug/test/node/debugger.test.ts @@ -120,7 +120,7 @@ suite('Debug - Debugger', () => { }; setup(() => { - _debugger = new Debugger(configurationManager, debuggerContribution, extensionDescriptor0, new TestConfigurationService(), null); + _debugger = new Debugger(configurationManager, debuggerContribution, extensionDescriptor0, new TestConfigurationService(), null, null); }); teardown(() => { diff --git a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts index 833a69b8929..26c6ee9cf95 100644 --- a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts @@ -3,10 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import uri from 'vs/base/common/uri'; import * as paths from 'vs/base/common/paths'; -import * as types from 'vs/base/common/types'; +import { Schemas } from 'vs/base/common/network'; import { TPromise } from 'vs/base/common/winjs.base'; import { sequence } from 'vs/base/common/async'; +import { toResource } from 'vs/workbench/common/editor'; import { IStringDictionary } from 'vs/base/common/collections'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -14,210 +16,11 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceFolder, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { toResource } from 'vs/workbench/common/editor'; -import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; +import { IProcessEnvironment } from 'vs/base/common/platform'; +import { VariableResolver } from 'vs/workbench/services/configurationResolver/node/variableResolver'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { relative } from 'path'; -import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; -import { normalizeDriveLetter } from 'vs/base/common/labels'; -import { Schemas } from 'vs/base/common/network'; -import { localize } from 'vs/nls'; +import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; -class VariableResolver { - static VARIABLE_REGEXP = /\$\{(.*?)\}/g; - private envVariables: IProcessEnvironment; - - constructor( - envVariables: IProcessEnvironment, - private configurationService: IConfigurationService, - private editorService: IWorkbenchEditorService, - private environmentService: IEnvironmentService, - private workspaceContextService: IWorkspaceContextService - ) { - if (isWindows) { - this.envVariables = Object.create(null); - Object.keys(envVariables).forEach(key => { - this.envVariables[key.toLowerCase()] = envVariables[key]; - }); - } else { - this.envVariables = envVariables; - } - } - - resolve(context: IWorkspaceFolder, value: string): string { - const filePath = this.getFilePath(); - return value.replace(VariableResolver.VARIABLE_REGEXP, (match: string, variable: string) => { - const parts = variable.split(':'); - let sufix: string; - if (parts && parts.length > 1) { - variable = parts[0]; - sufix = parts[1]; - } - - switch (variable) { - case 'env': { - if (sufix) { - if (isWindows) { - sufix = sufix.toLowerCase(); - } - - const env = this.envVariables[sufix]; - if (types.isString(env)) { - return env; - } - - // For `env` we should do the same as a normal shell does - evaluates missing envs to an empty string #46436 - return ''; - } - } - case 'config': { - if (sufix) { - const config = this.configurationService.getValue<string>(sufix, context ? { resource: context.uri } : undefined); - if (!types.isUndefinedOrNull(config) && !types.isObject(config)) { - return config; - } - } - } - default: { - if (sufix) { - const folder = this.workspaceContextService.getWorkspace().folders.filter(f => f.name === sufix).pop(); - if (folder) { - context = folder; - } - } - - switch (variable) { - case 'workspaceRoot': - case 'workspaceFolder': { - if (context) { - return normalizeDriveLetter(context.uri.fsPath); - } - if (this.workspaceContextService.getWorkspace().folders.length > 1) { - throw new Error(localize('canNotResolveWorkspaceFolderMultiRoot', "'${workspaceFolder}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.")); - } - - throw new Error(localize('canNotResolveWorkspaceFolder', "'${workspaceFolder}' can not be resolved. Please open a folder.")); - } case 'cwd': - return context ? normalizeDriveLetter(context.uri.fsPath) : process.cwd(); - case 'workspaceRootFolderName': - case 'workspaceFolderBasename': { - if (context) { - return paths.basename(context.uri.fsPath); - } - if (this.workspaceContextService.getWorkspace().folders.length > 1) { - throw new Error(localize('canNotResolveFolderBasenameMultiRoot', "'${workspaceFolderBasename}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.")); - } - - throw new Error(localize('canNotResolveFolderBasename', "'${workspaceFolderBasename}' can not be resolved. Please open a folder.")); - } case 'lineNumber': { - const lineNumber = this.getLineNumber(); - if (lineNumber) { - return lineNumber; - } - - throw new Error(localize('canNotResolveLineNumber', "'${lineNumber}' can not be resolved. Please open an editor.")); - } case 'selectedText': { - const selectedText = this.getSelectedText(); - if (selectedText) { - return selectedText; - } - - throw new Error(localize('canNotResolveSelectedText', "'${selectedText}' can not be resolved. Please open an editor.")); - } case 'file': { - if (filePath) { - return filePath; - } - - throw new Error(localize('canNotResolveFile', "'${file}' can not be resolved. Please open an editor.")); - } case 'relativeFile': { - if (context && filePath) { - return paths.normalize(relative(context.uri.fsPath, filePath)); - } - if (filePath) { - return filePath; - } - - throw new Error(localize('canNotResolveRelativeFile', "'${relativeFile}' can not be resolved. Please open an editor.")); - } case 'fileDirname': { - if (filePath) { - return paths.dirname(filePath); - } - - throw new Error(localize('canNotResolveFileDirname', "'${fileDirname}' can not be resolved. Please open an editor.")); - } case 'fileExtname': { - if (filePath) { - return paths.extname(filePath); - } - - throw new Error(localize('canNotResolveFileExtname', "'${fileExtname}' can not be resolved. Please open an editor.")); - } case 'fileBasename': { - if (filePath) { - return paths.basename(filePath); - } - - throw new Error(localize('canNotResolveFileBasename', "'${fileBasename}' can not be resolved. Please open an editor.")); - } case 'fileBasenameNoExtension': { - if (filePath) { - const basename = paths.basename(filePath); - return basename.slice(0, basename.length - paths.extname(basename).length); - } - - throw new Error(localize('canNotResolveFileBasenameNoExtension', "'${fileBasenameNoExtension}' can not be resolved. Please open an editor.")); - } - case 'execPath': - return this.environmentService.execPath; - - default: - return match; - } - } - } - }); - } - - private getSelectedText(): string { - const activeEditor = this.editorService.getActiveEditor(); - if (activeEditor) { - const editorControl = (<ICodeEditor>activeEditor.getControl()); - if (editorControl) { - const editorModel = editorControl.getModel(); - const editorSelection = editorControl.getSelection(); - if (editorModel && editorSelection) { - return editorModel.getValueInRange(editorSelection); - } - } - } - - return undefined; - } - - private getFilePath(): string { - let input = this.editorService.getActiveEditorInput(); - if (input instanceof DiffEditorInput) { - input = input.modifiedInput; - } - - const fileResource = toResource(input, { filter: Schemas.file }); - if (!fileResource) { - return undefined; - } - - return paths.normalize(fileResource.fsPath, true); - } - - private getLineNumber(): string { - const activeEditor = this.editorService.getActiveEditor(); - if (activeEditor) { - const editorControl = (<ICodeEditor>activeEditor.getControl()); - if (editorControl) { - const lineNumber = editorControl.getSelection().positionLineNumber; - return String(lineNumber); - } - } - - return undefined; - } -} export class ConfigurationResolverService implements IConfigurationResolverService { _serviceBrand: any; @@ -231,42 +34,68 @@ export class ConfigurationResolverService implements IConfigurationResolverServi @ICommandService private commandService: ICommandService, @IWorkspaceContextService workspaceContextService: IWorkspaceContextService ) { - this.resolver = new VariableResolver(envVariables, configurationService, editorService, environmentService, workspaceContextService); + this.resolver = new VariableResolver({ + getFolderUri: (folderName: string): uri => { + const folder = workspaceContextService.getWorkspace().folders.filter(f => f.name === folderName).pop(); + return folder ? folder.uri : undefined; + }, + getWorkspaceFolderCount: (): number => { + return workspaceContextService.getWorkspace().folders.length; + }, + getConfigurationValue: (folderUri: uri, suffix: string) => { + return configurationService.getValue<string>(suffix, folderUri ? { resource: folderUri } : undefined); + }, + getEnvironmentService: (name: string) => { + return environmentService[name]; + }, + getFilePath: (): string | undefined => { + let input = editorService.getActiveEditorInput(); + if (input instanceof DiffEditorInput) { + input = input.modifiedInput; + } + const fileResource = toResource(input, { filter: Schemas.file }); + if (!fileResource) { + return undefined; + } + return paths.normalize(fileResource.fsPath, true); + }, + getSelectedText: (): string | undefined => { + const activeEditor = editorService.getActiveEditor(); + if (activeEditor) { + const editorControl = (<ICodeEditor>activeEditor.getControl()); + if (editorControl) { + const editorModel = editorControl.getModel(); + const editorSelection = editorControl.getSelection(); + if (editorModel && editorSelection) { + return editorModel.getValueInRange(editorSelection); + } + } + } + return undefined; + }, + getLineNumber: (): string => { + const activeEditor = editorService.getActiveEditor(); + if (activeEditor) { + const editorControl = (<ICodeEditor>activeEditor.getControl()); + if (editorControl) { + const lineNumber = editorControl.getSelection().positionLineNumber; + return String(lineNumber); + } + } + return undefined; + } + }, envVariables); } public resolve(root: IWorkspaceFolder, value: string): string; public resolve(root: IWorkspaceFolder, value: string[]): string[]; public resolve(root: IWorkspaceFolder, value: IStringDictionary<string>): IStringDictionary<string>; public resolve(root: IWorkspaceFolder, value: any): any { - if (types.isString(value)) { - return this.resolver.resolve(root, value); - } else if (types.isArray(value)) { - return value.map(s => this.resolver.resolve(root, s)); - } else if (types.isObject(value)) { - let result: IStringDictionary<string | IStringDictionary<string> | string[]> = Object.create(null); - Object.keys(value).forEach(key => { - result[key] = this.resolve(root, value[key]); - }); - - return result; - } - return value; + return this.resolver.resolveAny(root ? root.uri : undefined, value); } public resolveAny(root: IWorkspaceFolder, value: any): any { - if (types.isString(value)) { - return this.resolver.resolve(root, value); - } else if (types.isArray(value)) { - return value.map(s => this.resolveAny(root, s)); - } else if (types.isObject(value)) { - let result: IStringDictionary<string | IStringDictionary<string> | string[]> = Object.create(null); - Object.keys(value).forEach(key => { - result[key] = this.resolveAny(root, value[key]); - }); - - return result; - } - return value; + return this.resolver.resolveAny(root ? root.uri : undefined, value); } /** diff --git a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts new file mode 100644 index 00000000000..edc0d4c0752 --- /dev/null +++ b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts @@ -0,0 +1,196 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as paths from 'vs/base/common/paths'; +import * as types from 'vs/base/common/types'; +import { IStringDictionary } from 'vs/base/common/collections'; +import { relative } from 'path'; +import { IProcessEnvironment, isWindows } from 'vs/base/common/platform'; +import { normalizeDriveLetter } from 'vs/base/common/labels'; +import { localize } from 'vs/nls'; +import uri from 'vs/base/common/uri'; + + +export interface IVariableAccessor { + getFolderUri(folderName: string): uri | undefined; + getWorkspaceFolderCount(): number; + getConfigurationValue(folderUri: uri, section: string): string | undefined; + getEnvironmentService(name: string): string | undefined; + getFilePath(): string | undefined; + getSelectedText(): string | undefined; + getLineNumber(): string; +} + +export class VariableResolver { + + static VARIABLE_REGEXP = /\$\{(.*?)\}/g; + + private envVariables: IProcessEnvironment; + + constructor( + private accessor: IVariableAccessor, + envVariables: IProcessEnvironment + ) { + if (isWindows) { + this.envVariables = Object.create(null); + Object.keys(envVariables).forEach(key => { + this.envVariables[key.toLowerCase()] = envVariables[key]; + }); + } else { + this.envVariables = envVariables; + } + } + + resolveAny(folderUri: uri, value: any): any { + if (types.isString(value)) { + return this.resolve(folderUri, value); + } else if (types.isArray(value)) { + return value.map(s => this.resolveAny(folderUri, s)); + } else if (types.isObject(value)) { + let result: IStringDictionary<string | IStringDictionary<string> | string[]> = Object.create(null); + Object.keys(value).forEach(key => { + result[key] = this.resolveAny(folderUri, value[key]); + }); + return result; + } + return value; + } + + resolve(folderUri: uri, value: string): string { + + const filePath = this.accessor.getFilePath(); + + return value.replace(VariableResolver.VARIABLE_REGEXP, (match: string, variable: string) => { + + let argument: string; + const parts = variable.split(':'); + if (parts && parts.length > 1) { + variable = parts[0]; + argument = parts[1]; + } + + switch (variable) { + case 'env': + if (argument) { + if (isWindows) { + argument = argument.toLowerCase(); + } + const env = this.envVariables[argument]; + if (types.isString(env)) { + return env; + } + // For `env` we should do the same as a normal shell does - evaluates missing envs to an empty string #46436 + return ''; + } + throw new Error(localize('missingEnvVarName', "'{0}' can not be resolved because no environment variable is given.", match)); + + case 'config': + if (argument) { + const config = this.accessor.getConfigurationValue(folderUri, argument); + if (!types.isUndefinedOrNull(config) && !types.isObject(config)) { + return config; + } + throw new Error(localize('configNoString', "'{0}' can not be resolved because '{1}' is a structured value.", match, argument)); + } + throw new Error(localize('missingConfigName', "'{0}' can not be resolved because no settings name is given.", match)); + + default: { + + if (argument) { + const folder = this.accessor.getFolderUri(argument); + if (folder) { + folderUri = folder; + } + } + + switch (variable) { + case 'workspaceRoot': + case 'workspaceFolder': + if (folderUri) { + return normalizeDriveLetter(folderUri.fsPath); + } + if (this.accessor.getWorkspaceFolderCount() > 1) { + throw new Error(localize('canNotResolveWorkspaceFolderMultiRoot', "'{0}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.", match)); + } + throw new Error(localize('canNotResolveWorkspaceFolder', "'{0}' can not be resolved. Please open a folder.", match)); + + case 'cwd': + return folderUri ? normalizeDriveLetter(folderUri.fsPath) : process.cwd(); + + case 'workspaceRootFolderName': + case 'workspaceFolderBasename': + if (folderUri) { + return paths.basename(folderUri.fsPath); + } + if (this.accessor.getWorkspaceFolderCount() > 1) { + throw new Error(localize('canNotResolveFolderBasenameMultiRoot', "'{0}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.", match)); + } + throw new Error(localize('canNotResolveFolderBasename', "'{0}' can not be resolved. Please open a folder.", match)); + + case 'lineNumber': + const lineNumber = this.accessor.getLineNumber(); + if (lineNumber) { + return lineNumber; + } + throw new Error(localize('canNotResolveLineNumber', "'{0}' can not be resolved. Please open an editor.", match)); + + case 'selectedText': + const selectedText = this.accessor.getSelectedText(); + if (selectedText) { + return selectedText; + } + throw new Error(localize('canNotResolveSelectedText', "'{0}' can not be resolved. Please open an editor and select some text.", match)); + + case 'file': + if (filePath) { + return filePath; + } + throw new Error(localize('canNotResolveFile', "'{0}' can not be resolved. Please open an editor.", match)); + + case 'relativeFile': + if (folderUri && filePath) { + return paths.normalize(relative(folderUri.fsPath, filePath)); + } + if (filePath) { + return filePath; + } + throw new Error(localize('canNotResolveRelativeFile', "'{0}' can not be resolved. Please open an editor.", match)); + + case 'fileDirname': + if (filePath) { + return paths.dirname(filePath); + } + throw new Error(localize('canNotResolveFileDirname', "'{0}' can not be resolved. Please open an editor.", match)); + + case 'fileExtname': + if (filePath) { + return paths.extname(filePath); + } + throw new Error(localize('canNotResolveFileExtname', "'{0}' can not be resolved. Please open an editor.", match)); + + case 'fileBasename': + if (filePath) { + return paths.basename(filePath); + } + throw new Error(localize('canNotResolveFileBasename', "'{0}' can not be resolved. Please open an editor.", match)); + + case 'fileBasenameNoExtension': + if (filePath) { + const basename = paths.basename(filePath); + return basename.slice(0, basename.length - paths.extname(basename).length); + } + throw new Error(localize('canNotResolveFileBasenameNoExtension', "'{0}' can not be resolved. Please open an editor.", match)); + + case 'execPath': + return this.accessor.getEnvironmentService('execPath'); + + default: + return match; + } + } + } + }); + } +} diff --git a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts index fe2ba2d40dd..5b514fb535b 100644 --- a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts @@ -196,18 +196,6 @@ suite('Configuration Resolver Service', () => { assert.strictEqual(service.resolve(workspace, 'abc ${config:editor.fontFamily} ${config:editor.lineNumbers} ${config:editor.insertSpaces} xyz'), 'abc foo 123 false xyz'); }); - test('configuration should not evaluate Javascript', () => { - let configurationService: IConfigurationService; - configurationService = new MockConfigurationService({ - editor: { - abc: 'foo' - } - }); - - let service = new ConfigurationResolverService(envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService, new TestContextService()); - assert.strictEqual(service.resolve(workspace, 'abc ${config:editor[\'abc\'.substr(0)]} xyz'), 'abc ${config:editor[\'abc\'.substr(0)]} xyz'); - }); - test('uses original variable as fallback', () => { let configurationService: IConfigurationService; configurationService = new MockConfigurationService({ @@ -215,10 +203,8 @@ suite('Configuration Resolver Service', () => { }); let service = new ConfigurationResolverService(envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService, new TestContextService()); - assert.strictEqual(service.resolve(workspace, 'abc ${invalidVariable} xyz'), 'abc ${invalidVariable} xyz'); - assert.strictEqual(service.resolve(workspace, 'abc ${env:invalidVariable} xyz'), 'abc xyz'); - assert.strictEqual(service.resolve(workspace, 'abc ${config:editor.abc.def} xyz'), 'abc ${config:editor.abc.def} xyz'); - assert.strictEqual(service.resolve(workspace, 'abc ${config:panel.abc} xyz'), 'abc ${config:panel.abc} xyz'); + assert.strictEqual(service.resolve(workspace, 'abc ${unknownVariable} xyz'), 'abc ${unknownVariable} xyz'); + assert.strictEqual(service.resolve(workspace, 'abc ${env:unknownVariable} xyz'), 'abc xyz'); }); test('configuration variables with invalid accessor', () => { @@ -230,9 +216,14 @@ suite('Configuration Resolver Service', () => { }); let service = new ConfigurationResolverService(envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService, new TestContextService()); - assert.strictEqual(service.resolve(workspace, 'abc ${config:} xyz'), 'abc ${config:} xyz'); - assert.strictEqual(service.resolve(workspace, 'abc ${config:editor..fontFamily} xyz'), 'abc ${config:editor..fontFamily} xyz'); - assert.strictEqual(service.resolve(workspace, 'abc ${config:editor.none.none2} xyz'), 'abc ${config:editor.none.none2} xyz'); + + assert.throws(() => service.resolve(workspace, 'abc ${env} xyz')); + assert.throws(() => service.resolve(workspace, 'abc ${env:} xyz')); + assert.throws(() => service.resolve(workspace, 'abc ${config} xyz')); + assert.throws(() => service.resolve(workspace, 'abc ${config:} xyz')); + assert.throws(() => service.resolve(workspace, 'abc ${config:editor} xyz')); + assert.throws(() => service.resolve(workspace, 'abc ${config:editor..fontFamily} xyz')); + assert.throws(() => service.resolve(workspace, 'abc ${config:editor.none.none2} xyz')); }); test('interactive variable simple', () => { From d907469a092efea2270698f56db8743f29f558f7 Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Thu, 19 Apr 2018 18:39:42 +0200 Subject: [PATCH 546/710] export ExtHostVariableResolverService --- src/vs/workbench/api/node/extHostDebugService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index c8b29476bb2..2ae91c279e1 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -526,7 +526,7 @@ export class ExtHostDebugConsole implements vscode.DebugConsole { } } -class ExtHostVariableResolverService implements IConfigurationResolverService { +export class ExtHostVariableResolverService implements IConfigurationResolverService { _serviceBrand: any; _variableResolver: VariableResolver; From 91191fb866914e667ce086458ff0b37cc34eddb5 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Thu, 19 Apr 2018 10:55:49 -0700 Subject: [PATCH 547/710] Promote webview Api to stable (#47989) * Promote webview Api to stable Fixes #43713 Fixes #28263 * Rename position back to viewColumn and mark viewColumn as deprecated This allows us to more easily re-introduce a `position` property once we have gridlayout * Move dispose methods onto webview itself Also better hide a few 'internal' methods / properties on the panel / webview * Revert "Move dispose methods onto webview itself" This reverts commit 8fab6cc1a10b7c1c8c18f09df196240e93939881. * Move title onto webview panel * Use _ names for private setters * Remove unused emitter and dispose onMessageEmitter * Preview internal emitters with _ --- .../src/features/preview.ts | 6 +- src/vs/vscode.d.ts | 179 ++++++++++++++++++ src/vs/vscode.proposed.d.ts | 178 +---------------- src/vs/workbench/api/node/extHost.api.impl.ts | 6 +- src/vs/workbench/api/node/extHostWebview.ts | 82 ++++---- 5 files changed, 227 insertions(+), 224 deletions(-) diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index a1c2cf45a13..067d0c11085 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -236,7 +236,7 @@ export class MarkdownPreview { } public get position(): vscode.ViewColumn | undefined { - return this.editor.position; + return this.editor.viewColumn; } public isWebviewOf(webview: vscode.WebviewPanel): boolean { @@ -269,7 +269,7 @@ export class MarkdownPreview { public toggleLock() { this._locked = !this._locked; - this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); + this.editor.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); } private isPreviewOf(resource: vscode.Uri): boolean { @@ -327,7 +327,7 @@ export class MarkdownPreview { this.currentVersion = { resource, version: document.version }; const content = await this._contentProvider.provideTextDocumentContent(document, this._previewConfigurations, this.line); if (this._resource === resource) { - this.editor.webview.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); + this.editor.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); this.editor.webview.html = content; } } diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 85bb26a4ed0..bebfdbb8891 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4820,6 +4820,173 @@ declare module 'vscode' { resolveTask(task: Task, token?: CancellationToken): ProviderResult<Task>; } + /** + * Content settings for a webview. + */ + export interface WebviewOptions { + /** + * Should scripts be enabled in the webview content? + * + * Defaults to false (scripts-disabled). + */ + readonly enableScripts?: boolean; + + /** + * Should command uris be enabled in webview content? + * + * Defaults to false. + */ + readonly enableCommandUris?: boolean; + + /** + * Root paths from which the webview can load local (filesystem) resources using the `vscode-resource:` scheme. + * + * Default to the root folders of the current workspace plus the extension's install directory. + * + * Pass in an empty array to disallow access to any local resources. + */ + readonly localResourceRoots?: ReadonlyArray<Uri>; + } + + /** + * A webview displays html content, like an iframe. + */ + export interface Webview { + /** + * Content settings for the webview. + */ + readonly options: WebviewOptions; + + /** + * Contents of the webview. + * + * Should be a complete html document. + */ + html: string; + + /** + * Fired when the webview content posts a message. + */ + readonly onDidReceiveMessage: Event<any>; + + /** + * Post a message to the webview content. + * + * Messages are only develivered if the webview is visible. + * + * @param message Body of the message. + */ + postMessage(message: any): Thenable<boolean>; + } + + /** + * Content settings for a webview panel. + */ + export interface WebviewPanelOptions { + /** + * Should the find widget be enabled in the panel? + * + * Defaults to false. + */ + readonly enableFindWidget?: boolean; + + /** + * Should the webview panel's content (iframe) be kept around even when the panel + * is no longer visible? + * + * Normally the webview panel's html context is created when the panel becomes visible + * and destroyed when it is is hidden. Extensions that have complex state + * or UI can set the `retainContextWhenHidden` to make VS Code keep the webview + * context around, even when the webview moves to a background tab. When + * the panel becomes visible again, the context is automatically restored + * in the exact same state it was in originally. + * + * `retainContextWhenHidden` has a high memory overhead and should only be used if + * your panel's context cannot be quickly saved and restored. + */ + readonly retainContextWhenHidden?: boolean; + } + + /** + * A panel that contains a webview. + */ + interface WebviewPanel { + /** + * Type of the webview panel, such as `'markdown.preview'`. + */ + readonly viewType: string; + + /** + * Title of the panel shown in UI. + */ + title: string; + + /** + * Webview belonging to the panel. + */ + readonly webview: Webview; + + /** + * Content settings for the webview panel. + */ + readonly options: WebviewPanelOptions; + + /** + * Editor position of the panel. This property is only set if the webview is in + * one of the three editor view columns. + * + * @deprecated + */ + readonly viewColumn?: ViewColumn; + + /** + * Is the panel currently visible? + */ + readonly visible: boolean; + + /** + * Fired when the panel's view state changes. + */ + readonly onDidChangeViewState: Event<WebviewPanelOnDidChangeViewStateEvent>; + + /** + * Fired when the panel is disposed. + * + * This may be because the user closed the panel or because `.dispose()` was + * called on it. + * + * Trying to use the panel after it has been disposed throws an exception. + */ + readonly onDidDispose: Event<void>; + + /** + * Show the webview panel in a given column. + * + * A webview panel may only show in a single column at a time. If it is already showing, this + * method moves it to a new column. + */ + reveal(viewColumn: ViewColumn): void; + + /** + * Dispose of the webview panel. + * + * This closes the panel if it showing and disposes of the resources owned by the webview. + * Webview panels are also disposed when the user closes the webview panel. Both cases + * fire the `onDispose` event. + */ + dispose(): any; + } + + /** + * Event fired when a webview panel's view state changes. + */ + export interface WebviewPanelOnDidChangeViewStateEvent { + /** + * Webview panel whose view state changed. + */ + readonly webviewPanel: WebviewPanel; + } + /** * Namespace describing the environment the editor runs in. */ @@ -5302,6 +5469,18 @@ declare module 'vscode' { */ export function createOutputChannel(name: string): OutputChannel; + /** + * Create and show a new webview panel. + * + * @param viewType Identifies the type of the webview panel. + * @param title Title of the panel. + * @param position Editor column to show the new panel in. + * @param options Settings for the new panel. + * + * @return New webview panel. + */ + export function createWebviewPanel(viewType: string, title: string, position: ViewColumn, options: WebviewPanelOptions & WebviewOptions): WebviewPanel; + /** * Set a message to the status bar. This is a short hand for the more powerful * status bar [items](#window.createStatusBarItem). diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index d8cb1b5b3a5..17164135bf9 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -474,171 +474,7 @@ declare module 'vscode' { //#endregion - //#region Matt: WebView - - /** - * Content settings for a webview. - */ - export interface WebviewOptions { - /** - * Should scripts be enabled in the webview content? - * - * Defaults to false (scripts-disabled). - */ - readonly enableScripts?: boolean; - - /** - * Should command uris be enabled in webview content? - * - * Defaults to false. - */ - readonly enableCommandUris?: boolean; - - /** - * Root paths from which the webview can load local (filesystem) resources using the `vscode-resource:` scheme. - * - * Default to the root folders of the current workspace plus the extension's install directory. - * - * Pass in an empty array to disallow access to any local resources. - */ - readonly localResourceRoots?: ReadonlyArray<Uri>; - } - - /** - * A webview displays html content, like an iframe. - */ - export interface Webview { - /** - * Content settings for the webview. - */ - readonly options: WebviewOptions; - - /** - * Title of the webview shown in UI. - */ - title: string; - - /** - * Contents of the webview. - * - * Should be a complete html document. - */ - html: string; - - /** - * Fired when the webview content posts a message. - */ - readonly onDidReceiveMessage: Event<any>; - - /** - * Post a message to the webview content. - * - * Messages are only develivered if the webview is visible. - * - * @param message Body of the message. - */ - postMessage(message: any): Thenable<boolean>; - } - - /** - * Content settings for a webview panel. - */ - export interface WebviewPanelOptions { - /** - * Should the find widget be enabled in the panel? - * - * Defaults to false. - */ - readonly enableFindWidget?: boolean; - - /** - * Should the webview panel's content (iframe) be kept around even when the panel - * is no longer visible? - * - * Normally the webview panel's html context is created when the panel becomes visible - * and destroyed when it is is hidden. Extensions that have complex state - * or UI can set the `retainContextWhenHidden` to make VS Code keep the webview - * context around, even when the webview moves to a background tab. When - * the panel becomes visible again, the context is automatically restored - * in the exact same state it was in originally. - * - * `retainContextWhenHidden` has a high memory overhead and should only be used if - * your panel's context cannot be quickly saved and restored. - */ - readonly retainContextWhenHidden?: boolean; - } - - /** - * A panel that contains a webview. - */ - interface WebviewPanel { - /** - * Type of the webview panel, such as `'markdown.preview'`. - */ - readonly viewType: string; - - /** - * Webview belonging to the panel. - */ - readonly webview: Webview; - - /** - * Content settings for the webview panel. - */ - readonly options: WebviewPanelOptions; - - /** - * Editor position of the panel. - */ - readonly position?: ViewColumn; - - /** - * Is the panel current visible? - */ - readonly visible: boolean; - - /** - * Fired when the panel's view state changes. - */ - readonly onDidChangeViewState: Event<WebviewPanelOnDidChangeViewStateEvent>; - - /** - * Fired when the panel is disposed. - * - * This may be because the user closed the panel or because `.dispose()` was - * called on it. - * - * Trying to use the panel after it has been disposed throws an exception. - */ - readonly onDidDispose: Event<void>; - - /** - * Show the webview panel in a given column. - * - * A webview panel may only show in a single column at a time. If it is already showing, this - * method moves it to a new column. - */ - reveal(viewColumn: ViewColumn): void; - - /** - * Dispose of the webview panel. - * - * This closes the panel if it showing and disposes of the resources owned by the webview. - * Webview panels are also disposed when the user closes the webview panel. Both cases - * fire the `onDispose` event. - */ - dispose(): any; - } - - /** - * Event fired when a webview panel's view state changes. - */ - export interface WebviewPanelOnDidChangeViewStateEvent { - /** - * Webview panel whose view state changed. - */ - readonly webviewPanel: WebviewPanel; - } + //#region Matt: WebView Serializer /** * Save and restore webview panels that have been persisted when vscode shuts down. @@ -670,18 +506,6 @@ declare module 'vscode' { } namespace window { - /** - * Create and show a new webview panel. - * - * @param viewType Identifies the type of the webview panel. - * @param title Title of the panel. - * @param position Editor column to show the new panel in. - * @param options Settings for the new webview panel. - * - * @return New webview panel. - */ - export function createWebviewPanel(viewType: string, title: string, position: ViewColumn, options: WebviewPanelOptions & WebviewOptions): WebviewPanel; - /** * Registers a webview panel serializer. * diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index a4a7b247fce..c91f1a47d3f 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -408,6 +408,9 @@ export function createApiFactory( createOutputChannel(name: string): vscode.OutputChannel { return extHostOutputService.createOutputChannel(name); }, + createWebviewPanel(viewType: string, title: string, column: vscode.ViewColumn, options: vscode.WebviewPanelOptions & vscode.WebviewOptions): vscode.WebviewPanel { + return extHostWebviews.createWebview(viewType, title, column, options, extension.extensionFolderPath); + }, createTerminal(nameOrOptions: vscode.TerminalOptions | string, shellPath?: string, shellArgs?: string[]): vscode.Terminal { if (typeof nameOrOptions === 'object') { return extHostTerminalService.createTerminalFromOptions(<vscode.TerminalOptions>nameOrOptions); @@ -427,9 +430,6 @@ export function createApiFactory( registerDecorationProvider: proposedApiFunction(extension, (provider: vscode.DecorationProvider) => { return extHostDecorations.registerDecorationProvider(provider, extension.id); }), - createWebviewPanel: proposedApiFunction(extension, (viewType: string, title: string, column: vscode.ViewColumn, options: vscode.WebviewPanelOptions & vscode.WebviewOptions) => { - return extHostWebviews.createWebview(viewType, title, column, options, extension.extensionFolderPath); - }), registerWebviewPanelSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviews.registerWebviewPanelSerializer(viewType, serializer); }) diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index a841e091574..7849ba9ea13 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -14,44 +14,25 @@ import { Disposable } from './extHostTypes'; export class ExtHostWebview implements vscode.Webview { private readonly _handle: WebviewPanelHandle; private readonly _proxy: MainThreadWebviewsShape; - private _title: string; private _html: string; private _options: vscode.WebviewOptions; private _isDisposed: boolean = false; - public readonly onMessageEmitter = new Emitter<any>(); - public readonly onDidReceiveMessage: Event<any> = this.onMessageEmitter.event; - - public readonly onDidChangeViewStateEmitter = new Emitter<vscode.WebviewPanelOnDidChangeViewStateEvent>(); - public readonly onDidChangeViewState: Event<vscode.WebviewPanelOnDidChangeViewStateEvent> = this.onDidChangeViewStateEmitter.event; + readonly _onMessageEmitter = new Emitter<any>(); + public readonly onDidReceiveMessage: Event<any> = this._onMessageEmitter.event; constructor( handle: WebviewPanelHandle, proxy: MainThreadWebviewsShape, - title: string, options: vscode.WebviewOptions ) { this._handle = handle; this._proxy = proxy; - this._title = title; this._options = options; } dispose() { - this.onDidChangeViewStateEmitter.dispose(); - } - - get title(): string { - this.assertNotDisposed(); - return this._title; - } - - set title(value: string) { - this.assertNotDisposed(); - if (this._title !== value) { - this._title = value; - this._proxy.$setTitle(this._handle, value); - } + this._onMessageEmitter.dispose(); } get html(): string { @@ -94,23 +75,26 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { private readonly _handle: WebviewPanelHandle; private readonly _proxy: MainThreadWebviewsShape; private readonly _viewType: string; + private _title: string; + private readonly _options: vscode.WebviewPanelOptions; private readonly _webview: ExtHostWebview; private _isDisposed: boolean = false; private _viewColumn: vscode.ViewColumn; private _visible: boolean = true; - public readonly onDisposeEmitter = new Emitter<void>(); - public readonly onDidDispose: Event<void> = this.onDisposeEmitter.event; + readonly _onDisposeEmitter = new Emitter<void>(); + public readonly onDidDispose: Event<void> = this._onDisposeEmitter.event; - public readonly onDidChangeViewStateEmitter = new Emitter<vscode.WebviewPanelOnDidChangeViewStateEvent>(); - public readonly onDidChangeViewState: Event<vscode.WebviewPanelOnDidChangeViewStateEvent> = this.onDidChangeViewStateEmitter.event; + readonly _onDidChangeViewStateEmitter = new Emitter<vscode.WebviewPanelOnDidChangeViewStateEvent>(); + public readonly onDidChangeViewState: Event<vscode.WebviewPanelOnDidChangeViewStateEvent> = this._onDidChangeViewStateEmitter.event; constructor( handle: WebviewPanelHandle, proxy: MainThreadWebviewsShape, viewType: string, + title: string, viewColumn: vscode.ViewColumn, editorOptions: vscode.WebviewPanelOptions, webview: ExtHostWebview @@ -120,6 +104,7 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { this._viewType = viewType; this._options = editorOptions; this._viewColumn = viewColumn; + this._title = title; this._webview = webview; } @@ -129,12 +114,14 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { } this._isDisposed = true; - this.onDisposeEmitter.fire(); + this._onDisposeEmitter.fire(); this._proxy.$disposeWebview(this._handle); - this.onDisposeEmitter.dispose(); - this.onDidChangeViewStateEmitter.dispose(); + this._webview.dispose(); + + this._onDisposeEmitter.dispose(); + this._onDidChangeViewStateEmitter.dispose(); } get webview() { @@ -147,16 +134,29 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { return this._viewType; } + get title(): string { + this.assertNotDisposed(); + return this._title; + } + + set title(value: string) { + this.assertNotDisposed(); + if (this._title !== value) { + this._title = value; + this._proxy.$setTitle(this._handle, value); + } + } + get options() { return this._options; } - get position(): vscode.ViewColumn { + get viewColumn(): vscode.ViewColumn { this.assertNotDisposed(); return this._viewColumn; } - set position(value: vscode.ViewColumn) { + _setViewColumn(value: vscode.ViewColumn) { this.assertNotDisposed(); this._viewColumn = value; } @@ -166,7 +166,7 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { return this._visible; } - set visible(value: boolean) { + _setVisible(value: boolean) { this.assertNotDisposed(); this._visible = value; } @@ -212,8 +212,8 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { const handle = ExtHostWebviews.webviewHandlePool++ + ''; this._proxy.$createWebviewPanel(handle, viewType, title, typeConverters.fromViewColumn(viewColumn), options, extensionFolderPath); - const webview = new ExtHostWebview(handle, this._proxy, title, options); - const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, viewColumn, options, webview); + const webview = new ExtHostWebview(handle, this._proxy, options); + const panel = new ExtHostWebviewPanel(handle, this._proxy, viewType, title, viewColumn, options, webview); this._webviewPanels.set(handle, panel); return panel; } @@ -238,7 +238,7 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { $onMessage(handle: WebviewPanelHandle, message: any): void { const panel = this.getWebviewPanel(handle); if (panel) { - panel.webview.onMessageEmitter.fire(message); + panel.webview._onMessageEmitter.fire(message); } } @@ -246,10 +246,10 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { const panel = this.getWebviewPanel(handle); if (panel) { const viewColumn = typeConverters.toViewColumn(position); - if (panel.visible !== visible || panel.position !== viewColumn) { - panel.visible = visible; - panel.position = viewColumn; - panel.onDidChangeViewStateEmitter.fire({ webviewPanel: panel }); + if (panel.visible !== visible || panel.viewColumn !== viewColumn) { + panel._setVisible(visible); + panel._setViewColumn(viewColumn); + panel._onDidChangeViewStateEmitter.fire({ webviewPanel: panel }); } } } @@ -276,8 +276,8 @@ export class ExtHostWebviews implements ExtHostWebviewsShape { return TPromise.wrapError(new Error(`No serializer found for '${viewType}'`)); } - const webview = new ExtHostWebview(webviewHandle, this._proxy, title, options); - const revivedPanel = new ExtHostWebviewPanel(webviewHandle, this._proxy, viewType, typeConverters.toViewColumn(position), options, webview); + const webview = new ExtHostWebview(webviewHandle, this._proxy, options); + const revivedPanel = new ExtHostWebviewPanel(webviewHandle, this._proxy, viewType, title, typeConverters.toViewColumn(position), options, webview); this._webviewPanels.set(webviewHandle, revivedPanel); return serializer.deserializeWebviewPanel(revivedPanel, state); } From 8bff39552567101bae2ba2f45c5e405e97c59f25 Mon Sep 17 00:00:00 2001 From: Daniel Imms <daimms@microsoft.com> Date: Thu, 19 Apr 2018 11:08:31 -0700 Subject: [PATCH 548/710] Dispose of proxy listeners properly --- .../mainThreadTerminalService.ts | 7 +++---- .../parts/terminal/common/terminal.ts | 9 +++++---- .../node/terminalProcessExtHostProxy.ts | 20 +++++++++++++------ 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 2086db18928..434652bfaf6 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -109,10 +109,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape env: request.shellLaunchConfig.env }; this._proxy.$createProcess(request.proxy.terminalId, shellLaunchConfigDto, request.cols, request.rows); - // TODO: Dispose of this properly when the terminal/process dies - this._toDispose.push(request.proxy.onInput(data => this._proxy.$acceptProcessInput(request.proxy.terminalId, data))); - this._toDispose.push(request.proxy.onResize((cols, rows) => this._proxy.$acceptProcessResize(request.proxy.terminalId, cols, rows))); - this._toDispose.push(request.proxy.onShutdown(() => this._proxy.$acceptProcessShutdown(request.proxy.terminalId))); + request.proxy.onInput(data => this._proxy.$acceptProcessInput(request.proxy.terminalId, data)); + request.proxy.onResize((cols, rows) => this._proxy.$acceptProcessResize(request.proxy.terminalId, cols, rows)); + request.proxy.onShutdown(() => this._proxy.$acceptProcessShutdown(request.proxy.terminalId)); } public $sendProcessTitle(terminalId: number, title: string): void { diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index c1fa9345179..dfe9d89cc12 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -518,16 +518,17 @@ export enum ProcessState { } -export interface ITerminalProcessExtHostProxy { +export interface ITerminalProcessExtHostProxy extends IDisposable { readonly terminalId: number; emitData(data: string): void; emitTitle(title: string): void; emitPid(pid: number): void; emitExit(exitCode: number): void; - onInput(listener: (data: string) => void): IDisposable; - onResize(listener: (cols: number, rows: number) => void): IDisposable; - onShutdown(listener: () => void): IDisposable; + + onInput(listener: (data: string) => void): void; + onResize(listener: (cols: number, rows: number) => void): void; + onShutdown(listener: () => void): void; } export interface ITerminalProcessExtHostRequest { diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index b03a15e8f69..e096a6b2532 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -12,6 +12,8 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin // For ext host processes connected checks happen on the ext host public connected: boolean = true; + private _disposables: IDisposable[] = []; + constructor( public terminalId: number, shellLaunchConfig: IShellLaunchConfig, @@ -25,6 +27,11 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin this._terminalService.requestExtHostProcess(this, shellLaunchConfig, cols, rows); } + public dispose(): void { + this._disposables.forEach(d => d.dispose()); + this._disposables.length = 0; + } + public emitData(data: string): void { this.emit('message', { type: 'data', content: data } as IMessageFromTerminalProcess); } @@ -39,6 +46,7 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin public emitExit(exitCode: number): void { this.emit('exit', exitCode); + this.dispose(); } public send(message: IMessageToTerminalProcess): boolean { @@ -50,21 +58,21 @@ export class TerminalProcessExtHostProxy extends EventEmitter implements ITermin return true; } - public onInput(listener: (data: string) => void): IDisposable { + public onInput(listener: (data: string) => void): void { const outerListener = (data) => listener(data); this.on('input', outerListener); - return toDisposable(() => this.removeListener('input', outerListener)); + this._disposables.push(toDisposable(() => this.removeListener('input', outerListener))); } - public onResize(listener: (cols: number, rows: number) => void): IDisposable { + public onResize(listener: (cols: number, rows: number) => void): void { const outerListener = (cols, rows) => listener(cols, rows); this.on('resize', outerListener); - return toDisposable(() => this.removeListener('resize', outerListener)); + this._disposables.push(toDisposable(() => this.removeListener('resize', outerListener))); } - public onShutdown(listener: () => void): IDisposable { + public onShutdown(listener: () => void): void { const outerListener = () => listener(); this.on('shutdown', outerListener); - return toDisposable(() => this.removeListener('shutdown', outerListener)); + this._disposables.push(toDisposable(() => this.removeListener('shutdown', outerListener))); } } \ No newline at end of file From c96a5875805c1621219fd19e4155fe4916deb113 Mon Sep 17 00:00:00 2001 From: Daniel Imms <daimms@microsoft.com> Date: Thu, 19 Apr 2018 11:22:33 -0700 Subject: [PATCH 549/710] Increase delay before sending ext host process requests Macbook seems to take longer that my Ubuntu desktop --- .../parts/terminal/electron-browser/terminalService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 744961567f8..99b68f28a89 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -101,7 +101,7 @@ export class TerminalService extends AbstractTerminalService implements ITermina // TODO: MainThreadTerminalService is not ready at this point, fix this setTimeout(() => { this._onInstanceRequestExtHostProcess.fire({ proxy, shellLaunchConfig, cols, rows }); - }, 100); + }, 500); }); } From d6a7167064b43a273e10ab0a0ae6a12d52f15a24 Mon Sep 17 00:00:00 2001 From: Daniel Imms <daimms@microsoft.com> Date: Thu, 19 Apr 2018 11:39:33 -0700 Subject: [PATCH 550/710] Import absolute paths --- .../parts/terminal/electron-browser/terminalService.ts | 2 +- .../parts/terminal/node/terminalProcessExtHostProxy.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 99b68f28a89..1ee8373b643 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -27,7 +27,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { ipcRenderer as ipc } from 'electron'; import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; import { TerminalInstance } from 'vs/workbench/parts/terminal/electron-browser/terminalInstance'; -import { IExtensionService } from '../../../services/extensions/common/extensions'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export class TerminalService extends AbstractTerminalService implements ITerminalService { private _configHelper: TerminalConfigHelper; diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts index e096a6b2532..9c842fbbfa8 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts @@ -6,7 +6,7 @@ import { ITerminalChildProcess, IMessageToTerminalProcess, IMessageFromTerminalProcess } from 'vs/workbench/parts/terminal/node/terminal'; import { EventEmitter } from 'events'; import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; -import { IDisposable, toDisposable } from '../../../../base/common/lifecycle'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; export class TerminalProcessExtHostProxy extends EventEmitter implements ITerminalChildProcess, ITerminalProcessExtHostProxy { // For ext host processes connected checks happen on the ext host From 42d89b795600886bd7388fcb85a084fcd246307c Mon Sep 17 00:00:00 2001 From: Pine Wu <octref@gmail.com> Date: Thu, 19 Apr 2018 11:52:16 -0700 Subject: [PATCH 551/710] [css] update service --- extensions/css-language-features/server/package.json | 2 +- extensions/css-language-features/server/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 060c0ee7732..24a014d533a 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.7", + "vscode-css-languageservice": "^3.0.9-next.9", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2" }, diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 06e9bd19565..3c9a4d205dd 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -10,9 +10,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.9-next.7: - version "3.0.9-next.7" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.7.tgz#1eb8deadaa6bfaf55187656ea6fb6b7e8d71cd7f" +vscode-css-languageservice@^3.0.9-next.9: + version "3.0.9-next.9" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.9.tgz#19ccc4d27a0ce0bed0ebbc3f884fcaea974ae497" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From 0dfd04470bd7e05351435f3d65aa05452c79e648 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Thu, 19 Apr 2018 21:23:24 +0200 Subject: [PATCH 552/710] #43645 Update schema --- .../api/browser/viewsContainersExtensionPoint.ts | 2 +- .../workbench/api/browser/viewsExtensionPoint.ts | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 5a2e2b78965..36a9e67cbb1 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -60,7 +60,7 @@ export const viewsContainerContribution: IJSONSchema = { type: 'object', properties: { 'activitybar': { - description: localize('views.container.activitybar', "Activity Bar"), + description: localize('views.container.activitybar', "Contribute views containers to Activity Bar"), type: 'array', items: viewsContainerSchema } diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 24514349310..0fda4bcaa1a 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -69,15 +69,23 @@ namespace schema { type: 'object', properties: { 'explorer': { - description: localize('views.explorer', "Explorer View"), + description: localize('views.explorer', "Contributes views to Explorer container in the Activity bar"), type: 'array', - items: viewDescriptor + items: viewDescriptor, + default: [] }, 'debug': { - description: localize('views.debug', "Debug View"), + description: localize('views.debug', "Contributes views to Debug container in the Activity bar"), type: 'array', - items: viewDescriptor + items: viewDescriptor, + default: [] } + }, + additionalProperties: { + description: localize('views.contributed', "Contributes views to contributed views container"), + type: 'array', + items: viewDescriptor, + default: [] } }; } From be4e48fbe77d193487b907f17656882b5a44dc9a Mon Sep 17 00:00:00 2001 From: Pine Wu <octref@gmail.com> Date: Thu, 19 Apr 2018 14:45:07 -0700 Subject: [PATCH 553/710] [css] update service --- extensions/css-language-features/server/package.json | 2 +- extensions/css-language-features/server/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 24a014d533a..97379871be5 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.9", + "vscode-css-languageservice": "^3.0.9-next.10", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2" }, diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 3c9a4d205dd..9cf05dd88ee 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -10,9 +10,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.9-next.9: - version "3.0.9-next.9" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.9.tgz#19ccc4d27a0ce0bed0ebbc3f884fcaea974ae497" +vscode-css-languageservice@^3.0.9-next.10: + version "3.0.9-next.10" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.10.tgz#be73d571221176b43d2c398a4a27f7d38206952d" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From d770ce503a136c8592d8cb30c033ce7027cdfb13 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Thu, 19 Apr 2018 15:50:54 -0700 Subject: [PATCH 554/710] Make sure we handle webview position updates when an entire editor group moves --- src/vs/vscode.d.ts | 4 +++- .../api/electron-browser/mainThreadWebview.ts | 17 ++++++++++++++++- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostWebview.ts | 9 ++------- .../webview/electron-browser/webviewEditor.ts | 2 +- .../electron-browser/webviewEditorInput.ts | 2 +- .../electron-browser/webviewEditorService.ts | 6 +----- 7 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index bebfdbb8891..93650ca4d4c 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4964,8 +4964,10 @@ declare module 'vscode' { * * A webview panel may only show in a single column at a time. If it is already showing, this * method moves it to a new column. + * + * @param viewColumn View column to show the panel in. Shows in the current `viewColumn` if undefined. */ - reveal(viewColumn: ViewColumn): void; + reveal(viewColumn?: ViewColumn): void; /** * Dispose of the webview panel. diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index c6411afa704..501549b3bbc 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -52,6 +52,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv ) { this._proxy = context.getProxy(ExtHostContext.ExtHostWebviews); editorGroupService.onEditorsChanged(this.onEditorsChanged, this, this._toDispose); + editorGroupService.onEditorGroupMoved(this.onEditorGroupMoved, this, this._toDispose); this._toDispose.push(_webviewService.registerReviver(MainThreadWebviews.viewType, this)); @@ -96,7 +97,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv webview.html = value; } - $reveal(handle: WebviewPanelHandle, column: Position): void { + $reveal(handle: WebviewPanelHandle, column: Position | undefined): void { const webview = this.getWebview(handle); this._webviewService.revealWebview(webview, column); } @@ -227,6 +228,20 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv } } + private onEditorGroupMoved(): void { + for (const workbenchEditor of this._editorService.getVisibleEditors()) { + if (!workbenchEditor.input) { + return; + } + + this._webviews.forEach((input, handle) => { + if (workbenchEditor.input.matches(input) && input.position !== workbenchEditor.position) { + input.updatePosition(workbenchEditor.position); + this._proxy.$onDidChangeWebviewPanelViewState(handle, handle === this._activeWebview, workbenchEditor.position); + } + }); + } + } private onDidClickLink(handle: WebviewPanelHandle, link: URI): void { if (!link) { return; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index a6130803b52..798b71e2207 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -355,7 +355,7 @@ export type WebviewPanelHandle = string; export interface MainThreadWebviewsShape extends IDisposable { $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, column: EditorPosition, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionFolderPath: string): void; $disposeWebview(handle: WebviewPanelHandle): void; - $reveal(handle: WebviewPanelHandle, column: EditorPosition): void; + $reveal(handle: WebviewPanelHandle, column: EditorPosition | undefined): void; $setTitle(handle: WebviewPanelHandle, value: string): void; $setHtml(handle: WebviewPanelHandle, value: string): void; $postMessage(handle: WebviewPanelHandle, value: any): Thenable<boolean>; diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 7849ba9ea13..e91157377ab 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -58,11 +58,6 @@ export class ExtHostWebview implements vscode.Webview { return this._proxy.$postMessage(this._handle, message); } - public reveal(viewColumn: vscode.ViewColumn): void { - this.assertNotDisposed(); - this._proxy.$reveal(this._handle, typeConverters.fromViewColumn(viewColumn)); - } - private assertNotDisposed() { if (this._isDisposed) { throw new Error('Webview is disposed'); @@ -176,9 +171,9 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { return this._proxy.$postMessage(this._handle, message); } - public reveal(viewColumn: vscode.ViewColumn): void { + public reveal(viewColumn?: vscode.ViewColumn): void { this.assertNotDisposed(); - this._proxy.$reveal(this._handle, typeConverters.fromViewColumn(viewColumn)); + this._proxy.$reveal(this._handle, viewColumn ? typeConverters.fromViewColumn(viewColumn) : undefined); } private assertNotDisposed() { diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts index 6ff804fc51d..aada9f588dc 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts @@ -148,7 +148,7 @@ export class WebviewEditor extends BaseWebviewEditor { await super.setInput(input, options); await input.resolve(); - await input.onBecameActive(this.position); + await input.updatePosition(this.position); this.updateWebview(input); } diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts index 13bdd34b0a4..516b46d3d5b 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts @@ -224,7 +224,7 @@ export class WebviewEditorInput extends EditorInput { this._currentWebviewHtml = ''; } - public onBecameActive(position: Position): void { + public updatePosition(position: Position): void { this._position = position; } } diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts index 03cf243a74a..1d0f11200ca 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +++ b/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts @@ -100,11 +100,7 @@ export class WebviewEditorService implements IWebviewEditorService { webview: WebviewEditorInput, column: Position | undefined ): void { - if (typeof column === 'undefined') { - column = webview.position; - } - - if (webview.position === column) { + if (typeof column === 'undefined' || webview.position === column) { this._editorService.openEditor(webview, { preserveFocus: false }, column); } else { this._editorGroupService.moveEditor(webview, webview.position, column, { preserveFocus: false }); From cfb6059563596ed306b953d397a634833b18cb89 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Thu, 19 Apr 2018 16:23:11 -0700 Subject: [PATCH 555/710] Refactoring few emmet unit tests --- .../emmet/src/test/abbreviationAction.test.ts | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/extensions/emmet/src/test/abbreviationAction.test.ts b/extensions/emmet/src/test/abbreviationAction.test.ts index bff15fc6ecc..a8bd637da32 100644 --- a/extensions/emmet/src/test/abbreviationAction.test.ts +++ b/extensions/emmet/src/test/abbreviationAction.test.ts @@ -339,45 +339,21 @@ suite('Tests for jsx, xml and xsl', () => { }); test('No expanding text inside open tag in completion list (jsx)', () => { - return withRandomFileEditor(htmlContents, 'jsx', (editor, doc) => { - editor.selection = new Selection(2, 4, 2, 4); - const cancelSrc = new CancellationTokenSource(); - const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); - assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); - return Promise.resolve(); - }); + return testNoCompletion('jsx', htmlContents, new Selection(2, 4, 2, 4)); }); test('No expanding tag that is opened, but not closed in completion list (jsx)', () => { - return withRandomFileEditor(htmlContents, 'jsx', (editor, doc) => { - editor.selection = new Selection(9, 6, 9, 6); - const cancelSrc = new CancellationTokenSource(); - const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); - assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); - return Promise.resolve(); - }); + return testNoCompletion('jsx', htmlContents, new Selection(9, 6, 9, 6)); }); test('No expanding text inside open tag when there is no closing tag in completion list (jsx)', () => { - return withRandomFileEditor(htmlContents, 'jsx', (editor, doc) => { - editor.selection = new Selection(9, 8, 9, 8); - const cancelSrc = new CancellationTokenSource(); - const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); - assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); - return Promise.resolve(); - }); + return testNoCompletion('jsx', htmlContents, new Selection(9, 8, 9, 8)); }); test('No expanding text in completion list inside open tag when there is no closing tag when there is no parent node (jsx)', () => { - const fileContents = '<img s'; - return withRandomFileEditor(fileContents, 'jsx', (editor, doc) => { - editor.selection = new Selection(0, 6, 0, 6); - const cancelSrc = new CancellationTokenSource(); - const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); - assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); - return Promise.resolve(); - }); + return testNoCompletion('jsx', '<img s', new Selection(0, 6, 0, 6)); }); + }); function testExpandAbbreviation(syntax: string, selection: Selection, abbreviation: string, expandedText: string, shouldFail?: boolean): Thenable<any> { @@ -424,3 +400,12 @@ function testHtmlCompletionProvider(selection: Selection, abbreviation: string, }); } +function testNoCompletion(syntax: string, fileContents: string, selection: Selection): Thenable<any> { + return withRandomFileEditor(fileContents, syntax, (editor, doc) => { + editor.selection = selection; + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); + return Promise.resolve(); + }); +} From 30a82b4adac7c42555e739c47cadb916ac2a7894 Mon Sep 17 00:00:00 2001 From: Daniel Ye <danyeh@microsoft.com> Date: Thu, 19 Apr 2018 17:29:20 -0700 Subject: [PATCH 556/710] 2018-04-19. Merged in translations from Transifex. --- i18n/chs/extensions/emmet/package.i18n.json | 5 +- .../out/security.i18n.json | 2 + i18n/chs/extensions/php/package.i18n.json | 2 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 65 +++++++++++++++++++ i18n/chs/src/vs/base/node/processes.i18n.json | 3 +- i18n/chs/src/vs/base/node/zip.i18n.json | 1 + .../issue/issueReporterMain.i18n.json | 3 +- .../issue/issueReporterPage.i18n.json | 15 ++--- .../processExplorerMain.i18n.json | 15 +++++ .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 10 +++ .../config/commonEditorConfig.i18n.json | 6 ++ .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 18 +++++ .../contrib/find/findController.i18n.json | 1 + .../vs/editor/contrib/links/links.i18n.json | 2 + .../message/messageController.i18n.json | 9 +++ .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionValidator.i18n.json | 2 +- .../node/integrityServiceImpl.i18n.json | 4 +- .../electron-main/issueService.i18n.json | 3 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadWebview.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../parts/editor/resourceViewer.i18n.json | 6 +- .../parts/quickinput/quickInput.i18n.json | 11 ++++ .../parts/quickinput/quickInputBox.i18n.json | 10 +++ .../electron-browser/actions.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../electron-browser/accessibility.i18n.json | 4 +- .../debug/browser/breakpointsView.i18n.json | 2 +- .../breakpointWidget.i18n.json | 5 +- .../debug.contribution.i18n.json | 3 +- .../debugConfigurationManager.i18n.json | 2 +- .../debugEditorContribution.i18n.json | 7 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 17 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../extensionEditor.i18n.json | 2 +- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 6 +- .../extensionsViewlet.i18n.json | 2 +- .../browser/editors/textFileEditor.i18n.json | 4 +- .../electron-browser/fileActions.i18n.json | 2 +- .../files.contribution.i18n.json | 6 +- .../views/explorerViewer.i18n.json | 1 - .../htmlPreviewPart.i18n.json | 2 +- .../localizations.contribution.i18n.json | 4 +- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 11 ++++ .../markersPanelActions.i18n.json | 10 +++ .../electron-browser/messages.i18n.json | 8 ++- .../browser/keybindingsEditor.i18n.json | 31 +++++---- .../keybindingsEditorContribution.i18n.json | 2 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 3 +- .../browser/preferencesRenderers.i18n.json | 6 +- .../preferences.contribution.i18n.json | 2 +- .../browser/gotoLineHandler.i18n.json | 2 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 7 +- .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../task.contribution.i18n.json | 9 ++- .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 6 +- .../terminalService.i18n.json | 2 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 8 +-- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 4 +- .../menusExtensionPoint.i18n.json | 6 +- .../configurationExtensionPoint.i18n.json | 1 + .../configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 11 ++++ .../configurationResolverService.i18n.json | 24 +++---- .../common/extensionsRegistry.i18n.json | 4 ++ .../extensionService.i18n.json | 3 +- .../electron-browser/fileService.i18n.json | 17 ++++- .../remoteFileService.i18n.json | 1 + .../common/keybindingEditing.i18n.json | 6 +- .../keybindingService.i18n.json | 6 +- .../colorThemeStore.i18n.json | 2 +- .../fileIconThemeStore.i18n.json | 2 +- i18n/cht/extensions/css/package.i18n.json | 4 +- i18n/cht/extensions/emmet/package.i18n.json | 3 +- i18n/cht/extensions/html/package.i18n.json | 4 +- i18n/cht/extensions/json/package.i18n.json | 4 +- .../out/security.i18n.json | 2 + i18n/cht/extensions/php/package.i18n.json | 3 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 62 ++++++++++++++++++ i18n/cht/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 2 +- .../issue/issueReporterPage.i18n.json | 10 +-- .../processExplorerMain.i18n.json | 12 ++++ .../src/vs/code/electron-main/menus.i18n.json | 2 +- .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../config/commonEditorConfig.i18n.json | 1 + .../common/view/editorColorRegistry.i18n.json | 4 ++ .../codeAction/codeActionCommands.i18n.json | 12 ++++ .../vs/editor/contrib/links/links.i18n.json | 2 + .../message/messageController.i18n.json | 9 +++ .../snippet/snippetVariables.i18n.json | 7 ++ .../wordHighlighter/wordHighlighter.i18n.json | 2 + .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionManagementService.i18n.json | 1 + .../node/extensionValidator.i18n.json | 2 +- .../node/integrityServiceImpl.i18n.json | 4 +- .../theme/common/colorRegistry.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 3 +- .../parts/editor/editorStatus.i18n.json | 1 - .../parts/editor/resourceViewer.i18n.json | 2 - .../parts/quickinput/quickInput.i18n.json | 10 +++ .../parts/quickinput/quickInputBox.i18n.json | 9 +++ .../main.contribution.i18n.json | 7 ++ .../debug/browser/breakpointsView.i18n.json | 3 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 5 +- .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 8 +-- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 2 + .../extensionEditor.i18n.json | 2 - .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 3 +- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 2 +- .../localizations.contribution.i18n.json | 3 +- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 13 +++- .../output/browser/outputActions.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 1 - .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 3 +- .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 7 +- .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 3 + .../task.contribution.i18n.json | 7 +- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 7 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 6 +- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 10 +++ .../telemetryOptOut.i18n.json | 2 + .../vs_code_welcome_page.i18n.json | 2 - .../node/configurationService.i18n.json | 10 +++ .../configurationResolverService.i18n.json | 11 +--- .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 16 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 1 + .../electron-browser/TMSyntax.i18n.json | 1 + .../css-language-features/package.i18n.json | 1 + i18n/deu/extensions/css/package.i18n.json | 3 +- i18n/deu/extensions/emmet/package.i18n.json | 4 +- .../deu/extensions/git/out/commands.i18n.json | 1 + i18n/deu/extensions/git/package.i18n.json | 1 + i18n/deu/extensions/html/package.i18n.json | 4 +- i18n/deu/extensions/json/package.i18n.json | 4 +- .../out/features/preview.i18n.json | 1 + .../package.i18n.json | 1 + .../php-language-features/package.i18n.json | 3 +- i18n/deu/extensions/php/package.i18n.json | 2 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 12 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 58 +++++++++++++++++ i18n/deu/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 1 - .../issue/issueReporterPage.i18n.json | 10 +-- .../processExplorerMain.i18n.json | 10 +++ .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../common/view/editorColorRegistry.i18n.json | 3 + .../codeAction/codeActionCommands.i18n.json | 12 ++++ .../message/messageController.i18n.json | 9 +++ .../snippet/snippetVariables.i18n.json | 40 +++++++++++- .../wordHighlighter/wordHighlighter.i18n.json | 2 + .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionManagementService.i18n.json | 2 + .../node/extensionValidator.i18n.json | 1 - .../node/integrityServiceImpl.i18n.json | 4 +- .../theme/common/colorRegistry.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 3 +- .../api/node/extHostProgress.i18n.json | 3 +- .../parts/editor/editorStatus.i18n.json | 1 - .../parts/editor/resourceViewer.i18n.json | 2 - .../notificationsCenter.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 10 +++ .../parts/quickinput/quickInputBox.i18n.json | 9 +++ .../main.contribution.i18n.json | 9 +++ .../debug/browser/breakpointsView.i18n.json | 3 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 5 +- .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 8 +-- .../electron-browser/debugService.i18n.json | 4 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 1 + .../extensionEditor.i18n.json | 7 +- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 7 +- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 3 +- .../localizations.contribution.i18n.json | 3 +- .../electron-browser/markers.i18n.json | 3 +- .../markersFileDecorations.i18n.json | 2 + .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 13 +++- .../output/browser/outputActions.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 1 - .../browser/preferencesRenderers.i18n.json | 6 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 4 ++ .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 7 ++ .../task.contribution.i18n.json | 8 ++- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 4 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 6 +- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../telemetryOptOut.i18n.json | 2 + .../vs_code_welcome_page.i18n.json | 2 - .../node/configurationService.i18n.json | 10 +++ .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 15 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 1 + .../electron-browser/TMSyntax.i18n.json | 1 + .../css-language-features/package.i18n.json | 2 + i18n/esn/extensions/css/package.i18n.json | 1 + i18n/esn/extensions/emmet/package.i18n.json | 6 +- .../esn/extensions/git/out/commands.i18n.json | 1 + i18n/esn/extensions/html/package.i18n.json | 3 +- .../out/security.i18n.json | 3 + .../php-language-features/package.i18n.json | 4 +- i18n/esn/extensions/php/package.i18n.json | 3 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 64 ++++++++++++++++++ i18n/esn/src/vs/base/node/processes.i18n.json | 3 +- i18n/esn/src/vs/base/node/zip.i18n.json | 1 + .../issue/issueReporterMain.i18n.json | 3 +- .../issue/issueReporterPage.i18n.json | 13 ++-- .../processExplorerMain.i18n.json | 15 +++++ .../src/vs/code/electron-main/menus.i18n.json | 2 + .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 10 +++ .../config/commonEditorConfig.i18n.json | 6 ++ .../common/view/editorColorRegistry.i18n.json | 4 ++ .../codeAction/codeActionCommands.i18n.json | 17 +++++ .../contrib/find/findController.i18n.json | 1 + .../contrib/format/formatActions.i18n.json | 4 +- .../vs/editor/contrib/links/links.i18n.json | 2 + .../message/messageController.i18n.json | 10 +++ .../snippet/snippetVariables.i18n.json | 35 ++++++++++ .../wordHighlighter/wordHighlighter.i18n.json | 2 + .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionManagementService.i18n.json | 5 ++ .../node/extensionValidator.i18n.json | 2 +- .../node/integrityServiceImpl.i18n.json | 4 +- .../electron-main/issueService.i18n.json | 3 +- .../list/browser/listService.i18n.json | 3 +- .../theme/common/colorRegistry.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 2 +- .../api/node/extHostProgress.i18n.json | 3 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../parts/editor/resourceViewer.i18n.json | 6 +- .../notificationsCenter.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 11 ++++ .../parts/quickinput/quickInputBox.i18n.json | 10 +++ .../electron-browser/actions.i18n.json | 1 + .../main.contribution.i18n.json | 10 +++ .../debug/browser/breakpointsView.i18n.json | 3 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 5 +- .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 8 +-- .../electron-browser/debugService.i18n.json | 3 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 3 + .../extensionEditor.i18n.json | 7 +- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 3 + .../browser/editors/textFileEditor.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 7 +- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 3 +- .../localizations.contribution.i18n.json | 3 +- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 13 +++- .../output/browser/outputActions.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 3 +- .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 4 ++ .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 7 ++ .../task.contribution.i18n.json | 8 ++- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 8 ++- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 8 +-- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../telemetryOptOut.i18n.json | 2 + .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 2 - .../configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 11 ++++ .../configurationResolverService.i18n.json | 11 +--- .../common/extensionsRegistry.i18n.json | 4 ++ .../extensionService.i18n.json | 3 +- .../electron-browser/fileService.i18n.json | 16 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 1 + .../electron-browser/TMSyntax.i18n.json | 1 + i18n/fra/extensions/css/package.i18n.json | 4 +- i18n/fra/extensions/emmet/package.i18n.json | 5 +- .../fra/extensions/git/out/commands.i18n.json | 1 + i18n/fra/extensions/git/package.i18n.json | 1 + .../out/security.i18n.json | 2 + .../php-language-features/package.i18n.json | 3 +- i18n/fra/extensions/php/package.i18n.json | 3 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 65 +++++++++++++++++++ i18n/fra/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 3 +- .../issue/issueReporterPage.i18n.json | 13 ++-- .../processExplorerMain.i18n.json | 15 +++++ .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../config/commonEditorConfig.i18n.json | 6 ++ .../common/view/editorColorRegistry.i18n.json | 3 + .../codeAction/codeActionCommands.i18n.json | 18 +++++ .../vs/editor/contrib/links/links.i18n.json | 2 + .../message/messageController.i18n.json | 9 +++ .../snippet/snippetVariables.i18n.json | 27 ++++++++ .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionValidator.i18n.json | 2 +- .../node/integrityServiceImpl.i18n.json | 4 +- .../electron-main/issueService.i18n.json | 3 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../parts/editor/resourceViewer.i18n.json | 6 +- .../notificationsCenter.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 11 ++++ .../parts/quickinput/quickInputBox.i18n.json | 10 +++ .../electron-browser/actions.i18n.json | 1 + .../main.contribution.i18n.json | 7 ++ .../debug/browser/breakpointsView.i18n.json | 3 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 6 +- .../debug.contribution.i18n.json | 3 +- .../debugConfigurationManager.i18n.json | 2 +- .../debugEditorContribution.i18n.json | 8 +-- .../electron-browser/debugService.i18n.json | 3 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 3 + .../extensionEditor.i18n.json | 10 ++- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 3 + .../browser/editors/textFileEditor.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 8 ++- .../files.contribution.i18n.json | 2 + .../views/explorerViewer.i18n.json | 3 +- .../localizations.contribution.i18n.json | 3 +- .../markers.contribution.i18n.json | 3 +- .../electron-browser/markers.i18n.json | 3 +- .../markersFileDecorations.i18n.json | 1 + .../electron-browser/markersPanel.i18n.json | 11 ++++ .../markersPanelActions.i18n.json | 10 +++ .../electron-browser/messages.i18n.json | 18 ++++- .../output/browser/outputActions.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 3 +- .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 4 ++ .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 7 ++ .../task.contribution.i18n.json | 10 ++- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 8 ++- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 8 +-- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../telemetryOptOut.i18n.json | 2 + .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 4 +- .../configurationExtensionPoint.i18n.json | 1 + .../configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 11 ++++ .../configurationResolverService.i18n.json | 24 +++---- .../common/extensionsRegistry.i18n.json | 4 ++ .../extensionService.i18n.json | 3 +- .../electron-browser/fileService.i18n.json | 16 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 1 + .../electron-browser/TMSyntax.i18n.json | 1 + i18n/hun/extensions/emmet/package.i18n.json | 1 - .../out/security.i18n.json | 1 + i18n/hun/extensions/php/package.i18n.json | 1 - .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 58 +++++++++++++++++ i18n/hun/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 3 +- .../issue/issueReporterPage.i18n.json | 13 ++-- .../processExplorerMain.i18n.json | 15 +++++ .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../config/commonEditorConfig.i18n.json | 6 ++ .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 18 +++++ .../vs/editor/contrib/links/links.i18n.json | 2 + .../message/messageController.i18n.json | 9 +++ .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionValidator.i18n.json | 2 +- .../node/integrityServiceImpl.i18n.json | 4 +- .../electron-main/issueService.i18n.json | 3 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadWebview.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../parts/editor/resourceViewer.i18n.json | 6 +- .../parts/quickinput/quickInput.i18n.json | 11 ++++ .../parts/quickinput/quickInputBox.i18n.json | 10 +++ .../electron-browser/actions.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../debug/browser/breakpointsView.i18n.json | 1 - .../breakpointWidget.i18n.json | 5 +- .../debug.contribution.i18n.json | 3 +- .../debugConfigurationManager.i18n.json | 2 +- .../debugEditorContribution.i18n.json | 6 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 17 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 +- .../browser/editors/textFileEditor.i18n.json | 4 +- .../electron-browser/fileActions.i18n.json | 2 +- .../files.contribution.i18n.json | 2 +- .../views/explorerViewer.i18n.json | 1 - .../localizations.contribution.i18n.json | 2 +- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 1 - .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 3 +- .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 7 +- .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../task.contribution.i18n.json | 9 ++- .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 6 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 8 +-- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../vs_code_welcome_page.i18n.json | 2 - .../configurationExtensionPoint.i18n.json | 1 + .../node/configurationService.i18n.json | 11 ++++ .../configurationResolverService.i18n.json | 14 +--- .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 16 ++++- .../remoteFileService.i18n.json | 1 + i18n/ita/extensions/css/package.i18n.json | 4 +- i18n/ita/extensions/emmet/package.i18n.json | 4 +- .../ita/extensions/git/out/commands.i18n.json | 1 + i18n/ita/extensions/git/package.i18n.json | 1 + i18n/ita/extensions/html/package.i18n.json | 4 +- .../json-language-features/package.i18n.json | 1 + i18n/ita/extensions/json/package.i18n.json | 4 +- .../php-language-features/package.i18n.json | 4 +- i18n/ita/extensions/php/package.i18n.json | 2 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 57 ++++++++++++++++ i18n/ita/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 1 - .../issue/issueReporterPage.i18n.json | 10 +-- .../processExplorerMain.i18n.json | 10 +++ .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../config/commonEditorConfig.i18n.json | 1 + .../common/view/editorColorRegistry.i18n.json | 4 ++ .../codeAction/codeActionCommands.i18n.json | 12 ++++ .../message/messageController.i18n.json | 9 +++ .../snippet/snippetVariables.i18n.json | 40 +++++++++++- .../wordHighlighter/wordHighlighter.i18n.json | 2 + .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionManagementService.i18n.json | 3 + .../node/extensionValidator.i18n.json | 1 - .../node/integrityServiceImpl.i18n.json | 4 +- .../list/browser/listService.i18n.json | 3 +- .../theme/common/colorRegistry.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 3 +- .../api/node/extHostProgress.i18n.json | 3 +- .../parts/editor/editorStatus.i18n.json | 1 - .../parts/editor/resourceViewer.i18n.json | 2 - .../notificationsCenter.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 10 +++ .../parts/quickinput/quickInputBox.i18n.json | 9 +++ .../main.contribution.i18n.json | 9 +++ .../debug/browser/breakpointsView.i18n.json | 3 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 5 +- .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 8 +-- .../electron-browser/debugService.i18n.json | 4 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 23 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 3 + .../extensionEditor.i18n.json | 6 +- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 7 +- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 3 +- .../localizations.contribution.i18n.json | 3 +- .../markers.contribution.i18n.json | 3 +- .../electron-browser/markers.i18n.json | 3 +- .../markersFileDecorations.i18n.json | 4 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 13 +++- .../output/browser/outputActions.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 1 - .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 4 ++ .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 7 ++ .../task.contribution.i18n.json | 8 ++- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 4 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 6 +- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../telemetryOptOut.i18n.json | 2 + .../vs_code_welcome_page.i18n.json | 2 - .../node/configurationService.i18n.json | 10 +++ .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 15 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 1 + .../electron-browser/TMSyntax.i18n.json | 1 + i18n/jpn/extensions/emmet/package.i18n.json | 5 +- .../out/security.i18n.json | 2 + i18n/jpn/extensions/php/package.i18n.json | 2 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 65 +++++++++++++++++++ i18n/jpn/src/vs/base/node/processes.i18n.json | 3 +- .../browser/quickOpenModel.i18n.json | 2 +- .../issue/issueReporterMain.i18n.json | 3 +- .../issue/issueReporterPage.i18n.json | 13 ++-- .../processExplorerMain.i18n.json | 15 +++++ .../src/vs/code/electron-main/menus.i18n.json | 1 + .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../config/commonEditorConfig.i18n.json | 6 ++ .../common/view/editorColorRegistry.i18n.json | 1 + .../codeAction/codeActionCommands.i18n.json | 18 +++++ .../contrib/format/formatActions.i18n.json | 1 + .../vs/editor/contrib/links/links.i18n.json | 2 + .../message/messageController.i18n.json | 9 +++ .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionValidator.i18n.json | 2 +- .../node/integrityServiceImpl.i18n.json | 4 +- .../electron-main/issueService.i18n.json | 3 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadWebview.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 2 +- .../parts/editor/resourceViewer.i18n.json | 6 +- .../parts/quickinput/quickInput.i18n.json | 11 ++++ .../parts/quickinput/quickInputBox.i18n.json | 10 +++ .../electron-browser/actions.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../debug/browser/breakpointsView.i18n.json | 2 +- .../breakpointWidget.i18n.json | 5 +- .../debug.contribution.i18n.json | 3 +- .../debugConfigurationManager.i18n.json | 2 +- .../debugEditorContribution.i18n.json | 7 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 17 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../extensionEditor.i18n.json | 2 +- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 +- .../browser/editors/textFileEditor.i18n.json | 4 +- .../electron-browser/fileActions.i18n.json | 2 +- .../files.contribution.i18n.json | 2 +- .../views/explorerViewer.i18n.json | 1 - .../localizations.contribution.i18n.json | 2 +- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 11 ++++ .../markersPanelActions.i18n.json | 10 +++ .../electron-browser/messages.i18n.json | 8 ++- .../browser/keybindingsEditor.i18n.json | 1 - .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 3 +- .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 7 +- .../search.contribution.i18n.json | 8 ++- .../snippetsService.i18n.json | 2 +- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../task.contribution.i18n.json | 9 ++- .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 8 ++- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 8 +-- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../overlay/browser/welcomeOverlay.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 2 - .../configurationExtensionPoint.i18n.json | 1 + .../configurationEditingService.i18n.json | 1 + .../node/configurationService.i18n.json | 11 ++++ .../configurationResolverService.i18n.json | 24 +++---- .../common/extensionsRegistry.i18n.json | 4 ++ .../extensionService.i18n.json | 3 +- .../electron-browser/fileService.i18n.json | 17 ++++- .../remoteFileService.i18n.json | 1 + i18n/kor/extensions/css/package.i18n.json | 4 +- i18n/kor/extensions/emmet/package.i18n.json | 4 +- .../kor/extensions/git/out/commands.i18n.json | 1 + i18n/kor/extensions/git/package.i18n.json | 1 + i18n/kor/extensions/html/package.i18n.json | 4 +- .../json-language-features/package.i18n.json | 1 + i18n/kor/extensions/json/package.i18n.json | 4 +- .../out/features/preview.i18n.json | 1 + .../package.i18n.json | 2 + i18n/kor/extensions/php/package.i18n.json | 2 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 10 +++ .../package.i18n.json | 58 +++++++++++++++++ i18n/kor/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 1 - .../issue/issueReporterPage.i18n.json | 10 +-- .../processExplorerMain.i18n.json | 10 +++ .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../common/view/editorColorRegistry.i18n.json | 6 +- .../codeAction/codeActionCommands.i18n.json | 12 ++++ .../message/messageController.i18n.json | 9 +++ .../snippet/snippetVariables.i18n.json | 40 +++++++++++- .../wordHighlighter/wordHighlighter.i18n.json | 2 + .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionManagementService.i18n.json | 3 + .../node/extensionValidator.i18n.json | 1 - .../node/integrityServiceImpl.i18n.json | 4 +- .../list/browser/listService.i18n.json | 3 +- .../theme/common/colorRegistry.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 3 +- .../api/node/extHostProgress.i18n.json | 3 +- .../parts/editor/editorStatus.i18n.json | 1 - .../parts/editor/resourceViewer.i18n.json | 2 - .../notificationsCenter.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 10 +++ .../parts/quickinput/quickInputBox.i18n.json | 9 +++ .../main.contribution.i18n.json | 9 +++ .../debug/browser/breakpointsView.i18n.json | 3 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 5 +- .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 8 +-- .../electron-browser/debugService.i18n.json | 4 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 3 + .../extensionEditor.i18n.json | 4 +- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 5 +- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 3 +- .../localizations.contribution.i18n.json | 3 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 13 +++- .../output/browser/outputActions.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 1 - .../browser/preferencesRenderers.i18n.json | 6 +- .../search/browser/searchActions.i18n.json | 1 - .../parts/search/browser/searchView.i18n.json | 4 ++ .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 7 ++ .../task.contribution.i18n.json | 8 ++- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 15 +++++ .../terminalActions.i18n.json | 4 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 6 +- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../telemetryOptOut.i18n.json | 2 + .../vs_code_welcome_page.i18n.json | 2 - .../node/configurationService.i18n.json | 10 +++ .../configurationResolverService.i18n.json | 13 +--- .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 15 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 1 + .../electron-browser/TMSyntax.i18n.json | 1 + .../configuration-editing/package.i18n.json | 3 +- .../css-language-features/package.i18n.json | 2 + i18n/ptb/extensions/css/package.i18n.json | 4 +- i18n/ptb/extensions/emmet/package.i18n.json | 6 +- .../extension-editing/package.i18n.json | 3 +- i18n/ptb/extensions/fsharp/package.i18n.json | 3 +- .../ptb/extensions/git/out/commands.i18n.json | 1 + i18n/ptb/extensions/git/package.i18n.json | 1 + i18n/ptb/extensions/go/package.i18n.json | 3 +- i18n/ptb/extensions/groovy/package.i18n.json | 3 +- .../extensions/handlebars/package.i18n.json | 3 +- i18n/ptb/extensions/hlsl/package.i18n.json | 3 +- .../html-language-features/package.i18n.json | 1 + i18n/ptb/extensions/html/package.i18n.json | 4 +- i18n/ptb/extensions/ini/package.i18n.json | 3 +- i18n/ptb/extensions/java/package.i18n.json | 3 +- .../extensions/javascript/package.i18n.json | 3 +- i18n/ptb/extensions/json/package.i18n.json | 4 +- i18n/ptb/extensions/less/package.i18n.json | 3 +- i18n/ptb/extensions/log/package.i18n.json | 3 +- i18n/ptb/extensions/lua/package.i18n.json | 3 +- i18n/ptb/extensions/make/package.i18n.json | 3 +- .../markdown-basics/package.i18n.json | 3 +- .../features/previewContentProvider.i18n.json | 1 + .../out/security.i18n.json | 8 ++- .../package.i18n.json | 8 ++- .../merge-conflict/package.i18n.json | 1 + .../extensions/objective-c/package.i18n.json | 3 +- i18n/ptb/extensions/perl/package.i18n.json | 3 +- .../php-language-features/package.i18n.json | 4 +- i18n/ptb/extensions/php/package.i18n.json | 3 +- .../extensions/powershell/package.i18n.json | 3 +- i18n/ptb/extensions/pug/package.i18n.json | 3 +- i18n/ptb/extensions/python/package.i18n.json | 3 +- i18n/ptb/extensions/r/package.i18n.json | 3 +- i18n/ptb/extensions/razor/package.i18n.json | 3 +- i18n/ptb/extensions/ruby/package.i18n.json | 3 +- i18n/ptb/extensions/rust/package.i18n.json | 3 +- i18n/ptb/extensions/scss/package.i18n.json | 3 +- .../extensions/shaderlab/package.i18n.json | 3 +- .../extensions/shellscript/package.i18n.json | 3 +- i18n/ptb/extensions/sql/package.i18n.json | 3 +- i18n/ptb/extensions/swift/package.i18n.json | 3 +- .../typescript-basics/package.i18n.json | 3 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 64 ++++++++++++++++++ i18n/ptb/extensions/vb/package.i18n.json | 3 +- i18n/ptb/extensions/xml/package.i18n.json | 3 +- i18n/ptb/extensions/yaml/package.i18n.json | 3 +- i18n/ptb/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 3 +- .../issue/issueReporterPage.i18n.json | 13 ++-- .../processExplorerMain.i18n.json | 15 +++++ .../src/vs/code/electron-main/menus.i18n.json | 1 + .../vs/code/electron-main/windows.i18n.json | 2 +- .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../config/commonEditorConfig.i18n.json | 6 ++ .../common/view/editorColorRegistry.i18n.json | 4 ++ .../codeAction/codeActionCommands.i18n.json | 11 ++++ .../message/messageController.i18n.json | 9 +++ .../snippet/snippetVariables.i18n.json | 40 +++++++++++- .../wordHighlighter/wordHighlighter.i18n.json | 2 + .../platform/environment/node/argv.i18n.json | 4 +- .../node/extensionManagementService.i18n.json | 3 + .../node/extensionValidator.i18n.json | 1 - .../node/integrityServiceImpl.i18n.json | 4 +- .../list/browser/listService.i18n.json | 3 +- .../theme/common/colorRegistry.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadWebview.i18n.json | 3 +- .../editor/editor.contribution.i18n.json | 1 + .../parts/editor/editorStatus.i18n.json | 1 - .../parts/editor/resourceViewer.i18n.json | 2 - .../notificationsCenter.i18n.json | 2 + .../notificationsStatus.i18n.json | 5 +- .../parts/quickinput/quickInput.i18n.json | 10 +++ .../parts/quickinput/quickInputBox.i18n.json | 9 +++ .../vs/workbench/browser/viewlet.i18n.json | 1 + .../electron-browser/actions.i18n.json | 4 +- .../main.contribution.i18n.json | 4 ++ .../debug/browser/breakpointsView.i18n.json | 6 +- .../debug/browser/debugCommands.i18n.json | 1 + .../browser/debugContentProvider.i18n.json | 3 +- .../breakpointWidget.i18n.json | 2 - .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 6 +- .../electron-browser/debugService.i18n.json | 5 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 23 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 6 ++ .../extensionEditor.i18n.json | 8 ++- .../extensionTipsService.i18n.json | 4 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 3 +- .../views/explorerViewer.i18n.json | 1 - .../localizations.contribution.i18n.json | 3 +- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 1 - .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 1 - .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 4 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 6 +- .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../task.contribution.i18n.json | 5 +- .../common/terminalColorRegistry.i18n.json | 12 ++++ .../terminal.contribution.i18n.json | 1 + .../terminalActions.i18n.json | 1 + ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 6 +- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../vs_code_welcome_page.i18n.json | 2 - .../configurationEditingService.i18n.json | 5 ++ .../node/configurationService.i18n.json | 10 +++ .../common/extensionsRegistry.i18n.json | 1 + .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 14 +++- .../remoteFileService.i18n.json | 1 + .../themes/common/colorThemeSchema.i18n.json | 1 + .../css-language-features/package.i18n.json | 1 + i18n/rus/extensions/css/package.i18n.json | 4 +- i18n/rus/extensions/emmet/package.i18n.json | 4 +- .../rus/extensions/git/out/commands.i18n.json | 1 + i18n/rus/extensions/git/package.i18n.json | 1 + i18n/rus/extensions/html/package.i18n.json | 4 +- .../json-language-features/package.i18n.json | 1 + i18n/rus/extensions/json/package.i18n.json | 4 +- .../out/features/preview.i18n.json | 3 +- .../out/security.i18n.json | 3 + .../package.i18n.json | 1 + .../php-language-features/package.i18n.json | 4 +- i18n/rus/extensions/php/package.i18n.json | 2 +- .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 9 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 58 +++++++++++++++++ i18n/rus/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 1 - .../issue/issueReporterPage.i18n.json | 10 +-- .../processExplorerMain.i18n.json | 10 +++ .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../common/view/editorColorRegistry.i18n.json | 3 + .../codeAction/codeActionCommands.i18n.json | 12 ++++ .../message/messageController.i18n.json | 9 +++ .../snippet/snippetVariables.i18n.json | 40 +++++++++++- .../wordHighlighter/wordHighlighter.i18n.json | 2 + .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionManagementService.i18n.json | 3 + .../node/extensionValidator.i18n.json | 1 - .../node/integrityServiceImpl.i18n.json | 4 +- .../list/browser/listService.i18n.json | 3 +- .../theme/common/colorRegistry.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 1 - .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 3 +- .../api/node/extHostProgress.i18n.json | 3 +- .../parts/editor/editorStatus.i18n.json | 1 - .../parts/editor/resourceViewer.i18n.json | 2 - .../notificationsCenter.i18n.json | 1 + .../parts/quickinput/quickInput.i18n.json | 10 +++ .../parts/quickinput/quickInputBox.i18n.json | 9 +++ .../main.contribution.i18n.json | 9 +++ .../debug/browser/breakpointsView.i18n.json | 3 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 5 +- .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 8 +-- .../electron-browser/debugService.i18n.json | 4 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 16 +---- .../parts/debug/node/debugger.i18n.json | 24 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 3 + .../extensionEditor.i18n.json | 9 ++- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 7 +- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 3 +- .../localizations.contribution.i18n.json | 3 +- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 13 +++- .../output/browser/outputActions.i18n.json | 3 +- .../output.contribution.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 1 - .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 4 ++ .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 7 ++ .../task.contribution.i18n.json | 8 ++- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 4 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 6 +- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../telemetryOptOut.i18n.json | 2 + .../vs_code_welcome_page.i18n.json | 2 - .../node/configurationService.i18n.json | 10 +++ .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 15 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 1 + .../electron-browser/TMSyntax.i18n.json | 1 + .../css-language-features/package.i18n.json | 6 +- i18n/trk/extensions/emmet/package.i18n.json | 4 +- .../trk/extensions/git/out/commands.i18n.json | 1 + i18n/trk/extensions/git/package.i18n.json | 1 + i18n/trk/extensions/php/package.i18n.json | 1 - .../out/commands.i18n.json | 16 +++++ .../features/completionItemProvider.i18n.json | 13 ++++ ...rectiveCommentCompletionProvider.i18n.json | 12 ++++ .../implementationsCodeLensProvider.i18n.json | 12 ++++ .../jsDocCompletionProvider.i18n.json | 10 +++ .../out/features/organizeImports.i18n.json | 10 +++ .../out/features/quickFixProvider.i18n.json | 10 +++ .../referencesCodeLensProvider.i18n.json | 12 ++++ .../out/features/taskProvider.i18n.json | 11 ++++ .../out/typescriptServiceClient.i18n.json | 19 ++++++ .../out/utils/api.i18n.json | 10 +++ .../out/utils/logger.i18n.json | 10 +++ .../out/utils/projectStatus.i18n.json | 13 ++++ .../out/utils/typingsStatus.i18n.json | 12 ++++ .../out/utils/versionPicker.i18n.json | 13 ++++ .../out/utils/versionProvider.i18n.json | 11 ++++ .../package.i18n.json | 58 +++++++++++++++++ i18n/trk/src/vs/base/node/processes.i18n.json | 3 +- .../issue/issueReporterMain.i18n.json | 1 - .../issue/issueReporterPage.i18n.json | 10 +-- .../processExplorerMain.i18n.json | 10 +++ .../browser/widget/diffReview.i18n.json | 1 - .../editor/common/commonCodeEditor.i18n.json | 9 +++ .../codeAction/codeActionCommands.i18n.json | 12 ++++ .../message/messageController.i18n.json | 9 +++ .../platform/environment/node/argv.i18n.json | 2 - .../node/extensionValidator.i18n.json | 1 - .../node/integrityServiceImpl.i18n.json | 4 +- .../viewsContainersExtensionPoint.i18n.json | 12 ++++ .../api/browser/viewsExtensionPoint.i18n.json | 5 +- .../mainThreadSaveParticipant.i18n.json | 2 + .../mainThreadWebview.i18n.json | 3 +- .../api/node/extHostTreeViews.i18n.json | 2 +- .../parts/editor/editorStatus.i18n.json | 7 +- .../parts/editor/resourceViewer.i18n.json | 2 - .../parts/quickinput/quickInput.i18n.json | 10 +++ .../parts/quickinput/quickInputBox.i18n.json | 9 +++ .../src/vs/workbench/common/views.i18n.json | 2 +- .../main.contribution.i18n.json | 9 +++ .../debug/browser/breakpointsView.i18n.json | 2 +- .../browser/debugEditorActions.i18n.json | 1 + .../breakpointWidget.i18n.json | 2 - .../debugConfigurationManager.i18n.json | 1 - .../debugEditorContribution.i18n.json | 7 +- .../electron-browser/debugService.i18n.json | 4 +- .../rawDebugSession.i18n.json | 3 - .../parts/debug/node/debugAdapter.i18n.json | 17 +---- .../parts/debug/node/debugger.i18n.json | 23 +++++++ .../parts/debug/node/terminals.i18n.json | 14 ++++ .../browser/extensionsActions.i18n.json | 1 + .../extensionEditor.i18n.json | 6 +- .../extensionTipsService.i18n.json | 2 +- .../extensionsUtils.i18n.json | 4 +- .../extensionsViewlet.i18n.json | 2 + .../electron-browser/fileActions.i18n.json | 7 +- .../files.contribution.i18n.json | 1 + .../views/explorerViewer.i18n.json | 3 +- .../localizations.contribution.i18n.json | 9 +-- .../markers.contribution.i18n.json | 2 +- .../electron-browser/markers.i18n.json | 3 +- .../electron-browser/markersPanel.i18n.json | 9 +++ .../markersPanelActions.i18n.json | 9 +++ .../electron-browser/messages.i18n.json | 13 +++- .../output/browser/outputActions.i18n.json | 3 +- .../browser/keybindingsEditor.i18n.json | 3 +- .../browser/preferencesActions.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 1 - .../browser/preferencesRenderers.i18n.json | 6 +- .../scm/electron-browser/scmViewlet.i18n.json | 3 +- .../search/browser/searchActions.i18n.json | 3 +- .../parts/search/browser/searchView.i18n.json | 4 ++ .../search.contribution.i18n.json | 8 ++- .../languageSurveys.contribution.i18n.json | 4 +- .../nps.contribution.i18n.json | 4 +- .../tasks/common/problemMatcher.i18n.json | 1 + .../electron-browser/jsonSchema_v2.i18n.json | 7 ++ .../task.contribution.i18n.json | 7 +- .../tasks/node/taskConfiguration.i18n.json | 1 + .../common/terminalColorRegistry.i18n.json | 16 +++++ .../terminalActions.i18n.json | 4 +- ...edWorkspaceSettings.contribution.i18n.json | 4 +- .../update/electron-browser/update.i18n.json | 6 +- .../webview.contribution.i18n.json | 3 +- .../webviewCommands.i18n.json | 11 ++++ .../telemetryOptOut.i18n.json | 2 + .../vs_code_welcome_page.i18n.json | 2 - .../node/configurationService.i18n.json | 10 +++ .../extensionService.i18n.json | 1 - .../electron-browser/fileService.i18n.json | 15 ++++- .../remoteFileService.i18n.json | 1 + .../electron-browser/TMGrammars.i18n.json | 3 +- .../electron-browser/TMSyntax.i18n.json | 1 + .../common/fileIconThemeSchema.i18n.json | 6 +- 1320 files changed, 7478 insertions(+), 1433 deletions(-) create mode 100644 i18n/chs/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/chs/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/chs/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/chs/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/cht/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/deu/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/esn/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/esn/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/fra/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/fra/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/hun/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/hun/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/hun/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/ita/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/jpn/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/kor/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/kor/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/rus/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/rus/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/rus/src/vs/workbench/services/configuration/node/configurationService.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/commands.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/organizeImports.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/features/taskProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/utils/api.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/utils/logger.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/utils/projectStatus.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/utils/versionPicker.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/out/utils/versionProvider.i18n.json create mode 100644 i18n/trk/extensions/typescript-language-features/package.i18n.json create mode 100644 i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json create mode 100644 i18n/trk/src/vs/editor/common/commonCodeEditor.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json create mode 100644 i18n/trk/src/vs/editor/contrib/message/messageController.i18n.json create mode 100644 i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json create mode 100644 i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json create mode 100644 i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/debug/node/terminals.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json create mode 100644 i18n/trk/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json create mode 100644 i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json diff --git a/i18n/chs/extensions/emmet/package.i18n.json b/i18n/chs/extensions/emmet/package.i18n.json index 14e1d1d65e4..5cf0382870f 100644 --- a/i18n/chs/extensions/emmet/package.i18n.json +++ b/i18n/chs/extensions/emmet/package.i18n.json @@ -35,7 +35,7 @@ "emmetExtensionsPath": "包含 Emmet 配置文件与代码片段的文件夹路径。", "emmetShowExpandedAbbreviation": "在建议中显示展开的 Emmet 缩写。\n选择 \"inMarkupAndStylesheetFilesOnly\" 选项将仅应用于 html、haml、jade、slim、xml、xsl、css、scss、sass、less 和 stylus 文件。\n选择 \"always\" 选项将应用于所有适用文件不限于标记或 CSS 的所有部分。", "emmetShowAbbreviationSuggestions": "显示可能的 Emmet 缩写作为建议。在样式表中或当 emmet.showExpandedAbbreviation 设置为 \"never\" 时不适用。", - "emmetIncludeLanguages": "在默认不支持 Emmet 的语言中启用 Emmet 缩写功能。在此添加该语言与支持 Emmet 的语言之间的映射。\n示例: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", + "emmetIncludeLanguages": "在默认不支持 Emmet 的语言中启用 Emmet 缩写功能。在此添加该语言与受支持的语言间的映射。\n示例: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "用于 Emmet 代码片段的变量", "emmetTriggerExpansionOnTab": "启用后,按下 TAB 键,将展开 Emmet 缩写。", "emmetPreferences": "用于修改 Emmet 某些操作和解析程序的行为的首选项。", @@ -60,5 +60,6 @@ "emmetPreferencesCssMozProperties": "Emmet 缩写中使用的由 \"-\" 打头有 \"moz\" 前缀的 CSS 属性,使用半角逗号 (\",\") 进行分隔。若要始终避免 \"moz\" 前缀,请设为空字符串。", "emmetPreferencesCssOProperties": "Emmet 缩写中使用的由 \"-\" 打头有 \"o\" 前缀的 CSS 属性,使用半角逗号 (\",\") 进行分隔。若要始终避免 \"o\" 前缀,请设为空字符串。", "emmetPreferencesCssMsProperties": "Emmet 缩写中使用的由 \"-\" 打头有 \"ms\" 前缀的 CSS 属性,使用半角逗号 (\",\") 进行分隔。若要始终避免 \"ms\" 前缀,请设为空字符串。", - "emmetPreferencesCssFuzzySearchMinScore": "显示的缩写模糊匹配应达到的最低分数 (0 到 1 之间)。较低的值可能使匹配错误变多,较高的值可能将不会显示应有的匹配项。" + "emmetPreferencesCssFuzzySearchMinScore": "显示的缩写模糊匹配应达到的最低分数 (0 到 1 之间)。较低的值可能使匹配错误变多,较高的值可能将不会显示应有的匹配项。", + "emmetOptimizeStylesheetParsing": "当设置为 false 时,将分析整个文件并确定当前位置能否展开 Emmet 缩写。当设置为 true 时,则仅在 CSS/SCSS/LESS 文件中进行分析。" } \ No newline at end of file diff --git a/i18n/chs/extensions/markdown-language-features/out/security.i18n.json b/i18n/chs/extensions/markdown-language-features/out/security.i18n.json index 152913f9116..43ddb78737c 100644 --- a/i18n/chs/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/chs/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "严格", "strict.description": "仅载入安全内容", + "insecureLocalContent.title": "允许不安全的本地内容", + "insecureLocalContent.description": "允许通过 http 载入来自 localhost 的内容", "insecureContent.title": "允许不安全内容", "insecureContent.description": "允许通过 http 载入内容", "disable.title": "禁用", diff --git a/i18n/chs/extensions/php/package.i18n.json b/i18n/chs/extensions/php/package.i18n.json index 4de84845dc2..f946b5c8649 100644 --- a/i18n/chs/extensions/php/package.i18n.json +++ b/i18n/chs/extensions/php/package.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "PHP 语言功能", + "displayName": "PHP 语言基础功能", "description": "为 PHP 文件提供语法高亮和括号匹配功能。" } \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/commands.i18n.json b/i18n/chs/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..71f03151b6f --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "请在 VS Code 中打开一个文件夹,以使用 TypeScript 或 JavaScript 项目", + "typescript.projectConfigUnsupportedFile": "无法确定 TypeScript 或 JavaScript 项目。不受支持的文件类型", + "typescript.projectConfigCouldNotGetInfo": "无法确定 TypeScript 或 JavaScript 项目", + "typescript.noTypeScriptProjectConfig": "文件不属于 TypeScript 项目。点击[这里]({0})了解更多。", + "typescript.noJavaScriptProjectConfig": "文件不属于 JavaScript 项目。点击[这里]({0})了解更多。", + "typescript.configureTsconfigQuickPick": "配置 tsconfig.json", + "typescript.configureJsconfigQuickPick": "配置 jsconfig.json" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..cec1f8a1e0a --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "选择要应用的代码操作", + "acquiringTypingsLabel": "正在获取 typings...", + "acquiringTypingsDetail": "获取 IntelliSense 的 typings 定义。", + "autoImportLabel": "从 {0} 自动导入" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..0e60e3412a4 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "在 JavaScript 文件中启用语义检查。必须在文件顶部。", + "ts-nocheck": "在 JavaScript 文件中禁用语义检查。必须在文件顶部。", + "ts-ignore": "取消文件下一行的 @ts-check 错误提示。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..021db468b54 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 个实现", + "manyImplementationLabel": "{0} 个实现", + "implementationsErrorLabel": "无法确定实现" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..1d385873b11 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "JSDoc 注释" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..77f30b069ab --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "整理 import 语句" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..d22ade03db1 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (修复文件中所有)" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..5410b680677 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 个引用", + "manyReferenceLabel": "{0} 个引用", + "referenceErrorLabel": "无法确定引用" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..cd6842c9ce3 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "构建 - {0}", + "buildAndWatchTscLabel": "监视 - {0}" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/chs/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..d4107581eba --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "路径 {0} 未指向有效的 tsserver 安装。请回退到捆绑的 TypeScript 版本。", + "serverCouldNotBeStarted": "无法启动 TypeScript 语言服务器。错误消息为: {0}", + "typescript.openTsServerLog.notSupported": "TS 服务器日志记录需要 TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "TS 服务器日志记录已关闭。请设置 \"typescript.tsserver.log\" 并重启\n TS 服务器以启用日志记录", + "typescript.openTsServerLog.enableAndReloadOption": "启用日志记录并重启 TS 服务器", + "typescript.openTsServerLog.noLogFile": "TS 服务器尚未启动日志记录。", + "openTsServerLog.openFileFailedFailed": "无法打开 TS 服务器日志文件", + "serverDiedAfterStart": "TypeScript 语言服务在其启动后已中止 5 次。将不会重启该服务。", + "serverDiedReportIssue": "使用英文报告问题", + "serverDied": "在过去 5 分钟内,TypeScript 语言服务意外中止了 5 次。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/chs/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..006fe312258 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "无效版本" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/chs/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/chs/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..cd5096356f3 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "若要启用项目范围内的 JavaScript/TypeScript 语言功能,请排除包含多个文件的文件夹,例如: {0}", + "hintExclude.generic": "若要启用项目范围内的 JavaScript/TypeScript 语言功能,请排除包含不需要处理的源文件的大型文件夹。", + "large.label": "配置排除", + "hintExclude.tooltip": "若要启用项目范围内的 JavaScript/TypeScript 语言功能,请排除包含不需要处理的源文件的大型文件夹。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/chs/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..fe9128f40d0 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "提取数据以实现更好的 TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "无法为 JavaScript 语言功能安装 typings 文件。请确认 NPM 已安装,或在你的用户设置中配置 “typescript.npm”。点击[这里]({0})了解更多。", + "typesInstallerInitializationFailed.doNotCheckAgain": "不再显示" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/chs/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..c9f87e17e81 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "使用 VS Code 的版本", + "useWorkspaceVersionOption": "使用工作区版本", + "learnMore": "了解详细信息", + "selectTsVersion": "选择用于 JavaScript 和 TypeScript 语言功能的 TypeScript 版本" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/chs/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..4bb999f00f5 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "无法获取此目录 TypeScript 的版本", + "noBundledServerFound": "VS Code 的 tsserver 已被其他应用程序(例如运行异常的病毒检测工具)删除。请重新安装 VS Code。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript-language-features/package.i18n.json b/i18n/chs/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..d12cc2e3f75 --- /dev/null +++ b/i18n/chs/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,65 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "JavaScript 和 TypeScript 的语言功能", + "description": "为 JavaScript 和 TypeScript 提供丰富的语言支持。", + "typescript.reloadProjects.title": "重载项目", + "javascript.reloadProjects.title": "重载项目", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "完成函数的参数签名。", + "typescript.tsdk.desc": "指定包含要使用的 tsserver 和 lib*.d.ts 文件的文件夹路径。", + "typescript.disableAutomaticTypeAcquisition": "禁用自动获取类型。需要 TypeScript >= 2.0.6。", + "typescript.tsserver.log": "将 TS 服务器的日志保存到一个文件。此日志可用于诊断 TS 服务器问题。日志可能包含你的项目中的文件路径、源代码和其他可能敏感的信息。", + "typescript.tsserver.pluginPaths": "其他可搜索 TypeScript 语言服务插件的路径。需要 TypeScript >= 2.3.0。", + "typescript.tsserver.pluginPaths.item": "相对或绝对路径。相对路径将根据工作区文件夹进行解析。", + "typescript.tsserver.trace": "对发送到 TS 服务器的消息启用跟踪。此跟踪信息可用于诊断 TS 服务器问题。 跟踪信息可能包含你的项目中的文件路径、源代码和其他可能敏感的信息。", + "typescript.validate.enable": "启用/禁用 TypeScript 验证。", + "typescript.format.enable": "启用/禁用默认 TypeScript 格式化程序。", + "javascript.format.enable": "启用/禁用 JavaScript 格式化程序。", + "format.insertSpaceAfterCommaDelimiter": "定义逗号分隔符后面的空格处理。", + "format.insertSpaceAfterConstructor": "定义构造器关键字后的空格处理。要求 TypeScript >= 2.3.0。", + "format.insertSpaceAfterSemicolonInForStatements": "在 For 语句中,定义分号后面的空格处理。", + "format.insertSpaceBeforeAndAfterBinaryOperators": "定义二进制运算符后面的空格处理", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "定义控制流语句中关键字后面的空格处理。", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "定义匿名函数的函数关键字后面的空格处理。", + "format.insertSpaceBeforeFunctionParenthesis": "在函数参数括号前定义空格处理。需要 TypeScript >= 2.1.5。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "定义非空小括号的左括号后和右括号前的空格处理方式。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "定义非空中括号的左括号后和右括号前的空格处理方式。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "定义非空大括号的左括号后和右括号前的空格处理方式。要求 TypeScript >= 2.3.0。", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "定义模板字符串的左括号后面和右括号前面的空格处理。要求 TypeScript >= 2.0.6。", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "定义 JSX 表达式左括号后面和右括号前面的空格处理。要求 TypeScript >= 2.0.6。", + "format.insertSpaceAfterTypeAssertion": "定义 TypeScript 中类型断言后的空格处理。要求 TypeScript >= 2.4。", + "format.placeOpenBraceOnNewLineForFunctions": "定义函数的左大括号是否放置在新的一行。", + "format.placeOpenBraceOnNewLineForControlBlocks": "定义控制块的左括号是否放置在新的一行。", + "javascript.validate.enable": "启用/禁用 JavaScript 验证。", + "typescript.goToProjectConfig.title": "转到项目配置", + "javascript.goToProjectConfig.title": "转到项目配置", + "javascript.referencesCodeLens.enabled": "启用/禁用在 JavaScript 文件中引用 CodeLens。", + "typescript.referencesCodeLens.enabled": "启用/禁用在 TypeScript 文件中引用 CodeLens。要求 TypeScript >= 2.0.6。", + "typescript.implementationsCodeLens.enabled": "启用/禁用实现 CodeLens。要求 TypeScript >= 2.2.0。", + "typescript.openTsServerLog.title": "打开 TS 服务器日志", + "typescript.restartTsServer": "重启 TS 服务器", + "typescript.selectTypeScriptVersion.title": "选择 TypeScript 版本", + "typescript.reportStyleChecksAsWarnings": "将风格检查问题报告为警告", + "jsDocCompletion.enabled": "启用/禁用自动 JSDoc 注释", + "javascript.implicitProjectConfig.checkJs": "启用/禁用 JavaScript 文件的语义检查。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", + "typescript.npm": "指定用于自动获取类型的 NPM 可执行文件的路径。要求 TypeScript >= 2.3.4。", + "typescript.check.npmIsInstalled": "检查是否安装了 NPM 以自动获取类型。", + "javascript.nameSuggestions": "启用/禁用在 JavaScript 建议列表中包含文件中的唯一名称。", + "typescript.tsc.autoDetect": "控制 tsc 任务的自动检测。\"off\" 关闭此功能。\"build\" 仅创建单次运行编译任务。\"watch\" 仅创建编译及监视任务。\"on\" 创建构建及监视任务。默认值为 \"on\"。", + "typescript.problemMatchers.tsc.label": "TypeScript 问题", + "typescript.problemMatchers.tscWatch.label": "TypeScript 问题(观看模式)", + "typescript.quickSuggestionsForPaths": "当输入导入路径时启用或禁用快速建议。", + "typescript.locale": "设置报告 TypeScript 错误时使用的区域设置。要求 TypeScript >= 2.6.0。默认 (\"null\") 将使用 VS Code 的区域设置。", + "javascript.implicitProjectConfig.experimentalDecorators": "对不属于任何工程的 JavaScript 文件启用或禁用 \"experimentalDecorators\" 设置。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", + "typescript.autoImportSuggestions.enabled": "启用或禁用自动导入建议。要求 TypeScript >= 2.6.1", + "typescript.experimental.syntaxFolding": "启用或禁用语法折叠标记。", + "taskDefinition.tsconfig.description": "定义 TS 生成的 tsconfig 文件。", + "javascript.suggestionActions.enabled": "在 JavaScript 文件中启用或禁用编辑器的建议诊断。需要 TypeScript >= 2.8", + "typescript.suggestionActions.enabled": "在 TypeScript 文件中启用或禁用编辑器的建议诊断。需要 TypeScript >= 2.8" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/base/node/processes.i18n.json b/i18n/chs/src/vs/base/node/processes.i18n.json index a3eb373eac7..35229bd6699 100644 --- a/i18n/chs/src/vs/base/node/processes.i18n.json +++ b/i18n/chs/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "无法对 UNC 驱动器执行 shell 命令。" + ] } \ No newline at end of file diff --git a/i18n/chs/src/vs/base/node/zip.i18n.json b/i18n/chs/src/vs/base/node/zip.i18n.json index ac2caa975de..15ef1807072 100644 --- a/i18n/chs/src/vs/base/node/zip.i18n.json +++ b/i18n/chs/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "解压不完整。提取了 {0} / {1} 个项目", "notFound": "在 Zip 中找不到 {0}。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 1be236770c9..5bdbd842cb2 100644 --- a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,10 +8,11 @@ ], "previewOnGitHub": "在 GitHub 中预览", "loadingData": "正在加载数据...", + "rateLimited": "超出 GitHub 查询限制。请稍候。", "similarIssues": "类似的问题", "open": "开放", "closed": "已关闭", - "noResults": "未找到结果", + "noSimilarIssues": "没有找到类似问题", "settingsSearchIssue": "设置搜索的问题", "bugReporter": "问题报告", "featureRequest": "功能请求", diff --git a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index e66e99336b1..e0e39df949d 100644 --- a/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/chs/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -6,8 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "completeInEnglish": "请使用英文填写表单。", + "completeInEnglish": "请使用英文进行填写。", "issueTypeLabel": "这是一个", + "issueSourceLabel": "提交到", + "vscode": "Visual Studio Code", + "extension": "扩展", + "disableExtensionsLabelText": "请试着在{0}之后重现问题。如果此问题仅在扩展运行时才能重现,那么这可能是一个扩展的问题。", + "disableExtensions": "禁用所有扩展并重新加载窗口", + "chooseExtension": "扩展", "issueTitleLabel": "标题", "issueTitleRequired": "请输入标题。", "titleLengthValidation": "标题太长。", @@ -18,13 +24,6 @@ "extensions": "我的扩展", "searchedExtensions": "已搜索的扩展", "settingsSearchDetails": "设置搜索的详细信息", - "tryDisablingExtensions": "能否在禁用扩展后重现此问题?", - "yes": "是", - "no": "否", - "disableExtensionsLabelText": "尝试在{0}之后重现问题。", - "disableExtensions": "禁用所有扩展并重新加载窗口", - "showRunningExtensionsLabelText": "如果您怀疑这是扩展的问题,请{0}并进行报告。", - "showRunningExtensions": "查看所有运行中的扩展", "details": "请输入详细信息。", "loadingData": "正在加载数据..." } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..fd812926a90 --- /dev/null +++ b/i18n/chs/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cpu": "CPU %", + "memory": "内存 (MB)", + "pid": "PID", + "name": "名称", + "killProcess": "结束进程", + "forceKillProcess": "强制结束进程" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index ba4e0d03653..4f71710a76a 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -161,6 +161,7 @@ "mMergeAllWindows": "合并所有窗口", "miToggleDevTools": "切换开发人员工具(&&T)", "miAccessibilityOptions": "辅助功能选项(&&O)", + "miOpenProcessExplorerer": "打开进程管理器(&&P)", "miReportIssue": "使用英文报告问题(&&I)", "miWelcome": "欢迎使用(&&W)", "miInteractivePlayground": "交互式演练场(&&I)", diff --git a/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json index 46a0d879f13..2397f44f074 100644 --- a/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/chs/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "关闭", - "header": "第 {0} 个差异(共 {1} 个): 未修改 {2}, {3} 行,已修改 {4}, {5} 行", "blankLine": "空白", "equalLine": "未修改 {0},已修改 {1}: {2}", "insertLine": "+ 已修改 {0}: {1}", diff --git a/i18n/chs/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/chs/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..c66c25ea99c --- /dev/null +++ b/i18n/chs/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "光标数量被限制为 {0}。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index 3a1ef19744b..f3c51a42e64 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "映射为 \"Ctrl\" (Windows 和 Linux) 或 \"Command\" (macOS)", "multiCursorModifier.alt": "映射为 \"Alt\" (Windows 和 Linux) 或 \"Option\" (macOS)", "multiCursorModifier": "在通过鼠标添加多个光标时使用的修改键。\"ctrlCmd\" 会映射为 \"Ctrl\" (Windows 和 Linux) 或 \"Command\" (macOS)。“转到定义”和“打开链接”功能所需的鼠标动作将会相应调整,不与多光标修改键冲突。", + "multiCursorMergeOverlapping": "当多个光标重叠时进行合并。", "quickSuggestions.strings": "在字符串内启用快速建议。", "quickSuggestions.comments": "在注释内启用快速建议。", "quickSuggestions.other": "在字符串和注释外启用快速建议。", @@ -88,6 +89,9 @@ "renderLineHighlight": "控制编辑器应如何呈现当前行突出显示,可能为“无”、“装订线”、“线”和“全部”。", "codeLens": "控制编辑器是否显示 CodeLens", "folding": "控制编辑器是否启用代码折叠功能", + "foldingStrategyAuto": "若语言特定的折叠策略可用,将直接使用;否则,将回退到基于缩进的折叠策略。", + "foldingStrategyIndentation": "始终使用基于缩进的折叠策略", + "foldingStrategy": "控制折叠范围的计算方式。\"auto\" 将使用语言特定的折叠策略 (若可用)。\"indentation\" 将强制使用基于缩进的折叠策略。", "showFoldingControls": "控制是否自动隐藏导航线上的折叠控件。", "matchBrackets": "当选择其中一项时,将突出显示匹配的括号。", "glyphMargin": "控制编辑器是否应呈现垂直字形边距。字形边距最常用于调试。", @@ -105,5 +109,7 @@ "selectionClipboard": "控制是否支持 Linux 主剪贴板。", "sideBySide": "控制 Diff 编辑器以并排或内联形式显示差异", "ignoreTrimWhitespace": "控制差异编辑器是否将对前导空格或尾随空格的更改显示为差异", + "largeFileSize": "控制以字节为单位的文件大小阈值,大于此值时将应用特殊的优化规则", + "largeFileLineCount": "控制文件行数的阈值,大于此值时将应用特殊的优化规则", "renderIndicators": "控制差异编辑器是否为已添加/删除的更改显示 +/- 指示符号" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json index 30bc289af02..30fcc2ac988 100644 --- a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "编辑器缩进参考线的颜色。", "editorLineNumbers": "编辑器行号的颜色。", "editorActiveLineNumber": "编辑器活动行号的颜色", + "deprecatedEditorActiveLineNumber": "\"Id\" 已被弃用,请改用 \"editorLineNumber.activeForeground\"。", "editorRuler": "编辑器标尺的颜色。", "editorCodeLensForeground": "编辑器 CodeLens 的前景色", "editorBracketMatchBackground": "匹配括号的背景色", diff --git a/i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..e3436f18367 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "显示修补程序({0})", + "quickFix": "显示修补程序", + "quickfix.trigger.label": "快速修复...", + "editor.action.quickFix.noneMessage": "没有可用的代码操作", + "refactor.label": "重构...", + "editor.action.refactor.noneMessage": "没有可用的重构操作", + "source.label": "源代码操作...", + "editor.action.source.noneMessage": "没有可用的源代码操作", + "organizeImports.label": "整理 import 语句" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/find/findController.i18n.json b/i18n/chs/src/vs/editor/contrib/find/findController.i18n.json index 7339816bb64..3d18cdf8a9e 100644 --- a/i18n/chs/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "查找", + "startFindWithSelectionAction": "查找选定内容", "findNextMatchAction": "查找下一个", "findPreviousMatchAction": "查找上一个", "nextSelectionMatchFindAction": "查找下一个选择", diff --git a/i18n/chs/src/vs/editor/contrib/links/links.i18n.json b/i18n/chs/src/vs/editor/contrib/links/links.i18n.json index 40e284cf659..587ed84ae6a 100644 --- a/i18n/chs/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "按住 Ctrl 并单击可访问链接", "links.command.mac": "Cmd + 单击以执行命令", "links.command": "Ctrl + 单击以执行命令", + "links.navigate.al.mac": "按住 Option 并单击可访问链接", "links.navigate.al": "按住 Alt 并单击可访问链接", + "links.command.al.mac": "按住 Option 并单击可执行命令", "links.command.al": "Alt + 单击以执行命令", "invalid.url": "此链接格式不正确,无法打开: {0}", "missing.url": "此链接目标已丢失,无法打开。", diff --git a/i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json index e97406a614d..53a94cfbcad 100644 --- a/i18n/chs/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/chs/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "通过启用 \"Developer: Startup Performance\" 命令开始。", "prof-startup": "启动期间运行 CPU 探查器", "disableExtensions": "禁用所有已安装的扩展。", - "inspect-extensions": "允许进行扩展的调试与分析。检查开发人员工具可获取连接 URI。", - "inspect-brk-extensions": "允许在扩展主机在启动后暂停时进行扩展的调试与分析。检查开发人员工具可获取连接 URI。", "disableGPU": "禁用 GPU 硬件加速。", "uploadLogs": "将当前会话的日志上传到安全端点。", "maxMemory": "单个窗口最大内存大小 (单位为 MB)。", diff --git a/i18n/chs/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/chs/src/vs/platform/extensions/node/extensionValidator.i18n.json index aed6a75a1f7..ee27fc55d23 100644 --- a/i18n/chs/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/chs/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "无法分析 \"engines.vscode\" 值 {0}。例如请使用: ^0.10.0、^1.2.3、^0.11.0、^0.10.x 等。", + "versionSyntax": "无法解析 \"engines.vscode\" 的值 {0}。请改为如 ^1.22.0, ^1.22.x 等。", "versionSpecificity1": "\"engines.vscode\" ({0}) 中指定的版本不够具体。对于 1.0.0 之前的 vscode 版本,请至少定义主要和次要想要的版本。例如: ^0.10.0、0.10.x、0.11.0 等。", "versionSpecificity2": "\"engines.vscode\" ({0}) 中指定的版本不够具体。对于 1.0.0 之后的 vscode 版本,请至少定义主要想要的版本。例如: ^1.10.0、1.10.x、1.x.x、2.x.x 等。", "versionMismatch": "扩展与 Code {0} 不兼容。扩展需要: {1}。" diff --git a/i18n/chs/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/chs/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index 8d2d09183ec..ab22eb3b5eb 100644 --- a/i18n/chs/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/chs/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "{0} 安装似乎损坏。请重新安装。", "integrity.moreInformation": "详细信息", - "integrity.dontShowAgain": "不再显示", - "integrity.prompt": "{0} 安装似乎损坏。请重新安装。" + "integrity.dontShowAgain": "不再显示" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/chs/src/vs/platform/issue/electron-main/issueService.i18n.json index 5d2b8cde0c8..6e606ef5354 100644 --- a/i18n/chs/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/chs/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "问题报告程序" + "issueReporter": "问题报告程序", + "processExplorer": "进程管理器" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..962583508c2 --- /dev/null +++ b/i18n/chs/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "属性“{0}”是必要属性,其类型必须是 \"string\"", + "showViewlet": "显示 {0}", + "view": "查看" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index a34d566c750..e6fa52bd0f9 100644 --- a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "向编辑器提供视图", "views.explorer": "资源管理器视图", "views.debug": "调试视图", - "locationId.invalid": "“{0}”为无效视图位置", "duplicateView1": "无法在位置“{1}”注册多个 ID 同为“{0}”的视图。", "duplicateView2": "ID 为“{0}”的视图在位置“{1}”已被注册" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index de275d5e951..a9a4a765557 100644 --- a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview 编辑器" + "errorMessage": "还原视图时出错: {0}" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 4e5c5c77028..885d0713a18 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,7 @@ "screenReaderDetectedExtra": "如果你没有使用屏幕阅读器,请将设置中的“editor.accessibilitySupport”改为“off”。", "disableTabMode": "禁用辅助功能模式", "gotoLine": "转到行", - "indentation": "缩进", + "selectIndentation": "选择缩进", "selectEncoding": "选择编码", "selectEOL": "选择行尾序列", "selectLanguageMode": "选择语言模式", diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 4962fa0f678..041d404a5fb 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,11 @@ "sizeMB": "{0} MB", "sizeGB": "{0} GB", "sizeTB": "{0} TB", - "largeImageError": "图像文件太大 (>1 MB),无法在编辑器中显示。", + "largeImageError": "图片太大,无法在编辑器中显示 ({0})。 ", "resourceOpenExternalButton": "使用外部程序打开图片?", - "nativeBinaryError": "因为此文件是二进制文件,或文件过大,或使用了不受支持的文本编码,将不会在编辑器中显示。", + "nativeFileTooLargeError": "文件太大,无法在编辑器中显示 ({0})。", + "nativeBinaryError": "此文件是二进制文件或使用了不支持的文本编码,无法在编辑器中显示。", + "openAsText": "是否仍要打开?", "zoom.action.fit.label": "整个图像", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..47373efa523 --- /dev/null +++ b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInput.countSelected": "已选 {0} 项", + "ok": "确定" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..a968ba2efad --- /dev/null +++ b/i18n/chs/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInputBox.ariaLabel": "在此输入可缩小结果范围。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json index 55cd77d54ee..c8466983eb9 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "打开最近的文件…", "quickOpenRecent": "快速打开最近的文件…", "reportIssueInEnglish": "使用英文报告问题", + "openProcessExplorer": "打开进程管理器", "reportPerformanceIssue": "报告性能问题", "keybindingsReference": "键盘快捷方式参考", "openDocumentationUrl": "文档", diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index a50946c2cfc..9a315eae3a8 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -80,6 +80,7 @@ "titleBarStyle": "调整窗口标题栏的外观。更改需要在完全重启后才能应用。", "window.nativeTabs": "\n启用macOS Sierra窗口选项卡。请注意,更改需要完全重新启动程序才能生效。如果配置此选项,本机选项卡将禁用自定义标题栏样式。", "window.smoothScrollingWorkaround": "启用解决方案来修复还原最小化的 VS Code 窗口后平滑滚动消失的问题。这个滚动的卡顿问题出现在拥有精确式触控板的设备上,比如来自 Microsoft 的 Surface 设备(https://github.com/Microsoft/vscode/issues/13612)。如果启用这个解决方案,窗口布局可能会在从最小化状态中还原后有些许闪烁,其他方面则无大碍。", + "window.clickThroughInactive": "启用后,点击非活动窗口后将在激活窗口的同时触发光标之下的元素 (若可点击)。禁用后,点击非活动窗口仅能激活窗口,再次点击才能触发元素。", "zenModeConfigurationTitle": "Zen 模式", "zenMode.fullScreen": "控制打开 Zen Mode 是否也会将工作台置于全屏模式。", "zenMode.centerLayout": "控制是否在 Zen 模式中启用居中布局", diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json index dc3cfbfb4b8..e5e6d7d0f1c 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.i18n.json @@ -18,9 +18,9 @@ "configuredOn": "编辑器被配置为对屏幕阅读器的使用进行永久优化 — 你可以编辑设置中的“editor.accessibilitySupport”以改变此行为。", "configuredOff": "编辑器被配置为不对屏幕阅读器的使用进行优化。", "tabFocusModeOnMsg": "在当前编辑器中按 Tab 会将焦点移动到下一个可聚焦的元素。按 {0} 来切换此行为。", - "tabFocusModeOnMsgNoKb": "在当前编辑器中按 Tab 会将焦点移动到下一个可聚焦的元素。当前无法通过键绑定触发命令 {0}。", + "tabFocusModeOnMsgNoKb": "若在当前编辑器中按 Tab 键,将移动焦点到下一个可聚焦的元素。当前无法通过按键绑定触发命令 {0}。", "tabFocusModeOffMsg": "在当前编辑器中按 Tab 将插入制表符。按 {0} 来切换此行为。", - "tabFocusModeOffMsgNoKb": "在当前编辑器中按 Tab 会插入制表符。当前无法通过键绑定触发命令 {0}。", + "tabFocusModeOffMsgNoKb": "若在当前编辑器中按 Tab 键,将插入制表符。当前无法通过按键绑定触发命令 {0}。", "openDocMac": "按 Command+H 以打开浏览器窗口,其中包含更多有关 VS Code 辅助功能的信息。", "openDocWinLinux": "按 Ctrl+H 以打开浏览器窗口,其中包含更多有关 VS Code 辅助功能的信息。", "outroMsg": "你可以按 Esc 或 Shift+Esc 消除此工具提示并返回到编辑器。", diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 934cfe0c69a..ab823eb2338 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "编辑断点...", + "breakpoint": "断点", "functionBreakpointsNotSupported": "此调试类型不支持函数断点", "functionBreakpointPlaceholder": "要断开的函数", "functionBreakPointInputAriaLabel": "键入函数断点", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index dd2cc47ea67..b5164359e2a 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,12 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "breakpointWidgetLogMessagePlaceholder": "断点命中时记录的消息。“Enter”键确认,“Esc”键取消。", + "breakpointWidgetLogMessagePlaceholder": "断点命中时记录的消息。{} 内的表达式将被替换。“Enter”键确认,“Esc”键取消。", "breakpointWidgetHitCountPlaceholder": "在满足命中次数条件时中断。按 \"Enter\" 表示接受,\"Esc\" 表示取消。", "breakpointWidgetExpressionPlaceholder": "在表达式计算结果为 true 时中断。按 \"Enter\" 表示接受,\"Esc\" 表示取消。", - "breakpointWidgetLogMessageAriaLabel": "程序将在每次命中此断点时记录这条消息。按 Enter 键接受或按 Esc 键取消。", - "breakpointWidgetHitCountAriaLabel": "如果达到命中次数,程序仅会在此处停止。按 Enter 接受或按 Esc 取消。", - "breakpointWidgetAriaLabel": "如果此条件为 true,程序仅会在此处停止。按 Enter 接受或按 Esc 取消。", "expression": "表达式", "hitCount": "命中次数", "logMessage": "记录消息" diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index f853c73cc83..9c53ac4e9d4 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,5 +27,6 @@ "onFirstSessionStart": "仅于第一次启动调试后在状态栏中显示调试", "showInStatusBar": "控制何时显示调试状态栏", "openDebug": "控制是否在调试会话开始时打开调试视图。", - "launch": "全局的调试启动配置。应用作跨工作区共享的 \"launch.json\" 的替代。" + "launch": "全局的调试启动配置。应用作跨工作区共享的 \"launch.json\" 的替代。", + "extensionHostDebugAdapter": "在扩展主机中运行调试适配器" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index be1deb32604..63d4c153cfe 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,7 @@ "useUniqueNames": "配置名称必须唯一。", "app.launch.json.compound.folder": "复合项所在的文件夹的名称。", "app.launch.json.compounds.configurations": "将作为此复合的一部分启动的配置名称。", - "debugNoType": "不可省略调试适配器“类型”,其类型必须是“字符串”。", + "debugNoType": "不可省略调试器的 \"type\" 属性,且其类型必须是 \"string\" 。", "selectDebug": "选择环境", "DebugConfig.failed": "无法在 \".vscode\" 文件夹({0})内创建 \"launch.json\" 文件。", "workspace": "工作区", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index aaeabd5e279..d32e1d3481b 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "编辑断点...", - "disableBreakpoint": "禁用断点", - "enableBreakpoint": "启用断点", + "breakpoint": "断点", "removeBreakpoints": "删除断点", "removeBreakpointOnColumn": "在列 {0} 上删除断点", "removeLineBreakpoint": "删除行断点", @@ -21,7 +19,8 @@ "enableBreakpoints": "在列 {0} 上启用断点", "enableBreakpointOnLine": "启用行断点", "addBreakpoint": "添加断点", - "conditionalBreakpoint": "添加条件断点...", + "addConditionalBreakpoint": "添加条件断点...", "addLogPoint": "添加记录点...", + "cancel": "取消", "addConfiguration": "添加配置..." } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 8f802a6783e..3a56b23d721 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "详细信息", - "unableToLaunchDebugAdapter": "无法从“{0}”启动调试适配器。", - "unableToLaunchDebugAdapterNoArgs": "无法启动调试适配器。", - "stoppingDebugAdapter": "{0}。正在停止调试适配器。", "debugAdapterCrash": "调试适配器进程已意外终止" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 8348a07cd0e..cd5c87160d6 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,19 +8,6 @@ ], "debugAdapterBinNotFound": "调试适配器可执行的“{0}”不存在。", "debugAdapterCannotDetermineExecutable": "无法确定调试适配器“{0}”的可执行文件。", - "launch.config.comment1": "使用 IntelliSense 了解相关属性。 ", - "launch.config.comment2": "悬停以查看现有属性的描述。", - "launch.config.comment3": "欲了解更多信息,请访问: {0}", - "debugType": "配置类型。", - "debugTypeNotRecognised": "无法识别此调试类型。确保已经安装并启用相应的调试扩展。", - "node2NotSupported": "不再支持 \"node2\",改用 \"node\",并将 \"protocol\" 属性设为 \"inspector\"。", - "debugName": "配置名称;在启动配置下拉菜单中显示。", - "debugRequest": "请求配置类型。可以是“启动”或“附加”。", - "debugServer": "仅用于调试扩展开发: 如果已指定端口,VS 代码会尝试连接到在服务器模式中运行的调试适配器", - "debugPrelaunchTask": "调试会话开始前要运行的任务。", - "debugPostDebugTask": "调试会话结束后运行的任务。", - "debugWindowsConfiguration": "特定于 Windows 的启动配置属性。", - "debugOSXConfiguration": "特定于 OS X 的启动配置属性。", - "debugLinuxConfiguration": "特定于 Linux 的启动配置属性。", - "deprecatedVariables": "已弃用 \"env.\"、\"config.\" 和 \"command.\",改用 \"env:\"、\"config:\" 和 \"command:\"。" + "unableToLaunchDebugAdapter": "无法从“{0}”启动调试适配器。", + "unableToLaunchDebugAdapterNoArgs": "无法启动调试适配器。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..d94c69e8e71 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "使用 IntelliSense 了解相关属性。 ", + "launch.config.comment2": "悬停以查看现有属性的描述。", + "launch.config.comment3": "欲了解更多信息,请访问: {0}", + "debugType": "配置类型。", + "debugTypeNotRecognised": "无法识别此调试类型。确保已经安装并启用相应的调试扩展。", + "node2NotSupported": "不再支持 \"node2\",改用 \"node\",并将 \"protocol\" 属性设为 \"inspector\"。", + "debugName": "配置名称;在启动配置下拉菜单中显示。", + "debugRequest": "请求配置类型。可以是“启动”或“附加”。", + "debugServer": "仅用于调试扩展开发: 如果已指定端口,VS 代码会尝试连接到在服务器模式中运行的调试适配器", + "debugPrelaunchTask": "调试会话开始前要运行的任务。", + "debugPostDebugTask": "调试会话结束后运行的任务。", + "debugWindowsConfiguration": "特定于 Windows 的启动配置属性。", + "debugOSXConfiguration": "特定于 OS X 的启动配置属性。", + "debugLinuxConfiguration": "特定于 Linux 的启动配置属性。", + "deprecatedVariables": "已弃用 \"env.\"、\"config.\" 和 \"command.\",改用 \"env:\"、\"config:\" 和 \"command:\"。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..87183ec39c7 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "VS Code 控制台", + "mac.terminal.script.failed": "脚本“{0}”失败,退出代码为 {1}", + "mac.terminal.type.not.supported": "不支持“{0}”", + "press.any.key": "按任意键继续...", + "linux.term.failed": "“{0}”失败,退出代码为 {1}" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 8c7037df74f..9b363a90786 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -37,7 +37,7 @@ "localizations": "本地化 ({0})", "localizations language id": "语言 ID", "localizations language name": "语言名称", - "localizations localized language name": "语言的本地名称", + "localizations localized language name": "语言本地名称", "colorThemes": "颜色主题 ({0})", "iconThemes": "图标主题 ({0})", "colors": "颜色 ({0})", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index d16ee08c77d..4cf0194eb30 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "当前工作区的用户推荐此扩展。", "reallyRecommended2": "建议对这种类型的文件使用“{0}”扩展。", "reallyRecommendedExtensionPack": "建议对这种类型的文件使用“{0}”扩展包。", - "showRecommendations": "显示建议", "install": "安装", + "showRecommendations": "显示建议", "showLanguageExtensions": "商店中有可以对 \".{0}\" 文件提供帮助的扩展。", "workspaceRecommended": "此工作区具有扩展建议。", "installAll": "全部安装", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 60280263286..7b7f8b2905f 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "disableOtherKeymapsConfirmation": "禁用其他键映射 ({0}) 以避免键绑定之间的冲突?", + "disableOtherKeymapsConfirmation": "是否禁用其他按键映射扩展 ({0}),从而避免按键绑定之间的冲突?", "yes": "是", - "no": "否", - "betterMergeDisabled": "现已内置 Better Merge 扩展。此扩展已被安装并禁用,且能被卸载。", - "uninstall": "卸载" + "no": "否" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 292dde16d60..64a4ac691b3 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -14,7 +14,7 @@ "workspaceRecommendedExtensions": "工作区推荐", "builtInExtensions": "功能", "builtInThemesExtensions": "主题", - "builtInBasicsExtensions": "语言", + "builtInBasicsExtensions": "编程语言", "searchExtensions": "在商店中搜索扩展", "sort by installs": "排序依据: 安装计数", "sort by rating": "排序依据: 分级", diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index 1b8f196bc9e..97c7ad980da 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,8 +8,8 @@ ], "textFileEditor": "文本文件编辑器", "createFile": "创建文件", - "relaunchWithIncreasedMemoryLimit": "重新启动", - "configureMemoryLimit": "配置", + "relaunchWithIncreasedMemoryLimit": "以 {0} MB 重启", + "configureMemoryLimit": "配置内存限制", "fileEditorWithInputAriaLabel": "{0}。文本文件编辑器。", "fileEditorAriaLabel": "文本文件编辑器。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index aef6c2652d0..e836660825f 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -38,7 +38,7 @@ "trashFailed": "无法删除到废纸篓。是否永久删除?", "deletePermanentlyButtonLabel": "永久删除(&&D)", "retryButtonLabel": "重试(&&R)", - "importFiles": "导入文件", + "addFiles": "添加文件", "confirmOverwrite": "目标文件夹中已存在具有相同名称的文件或文件夹。是否要替换它?", "replaceButtonLabel": "替换(&&R)", "fileIsAncestor": "粘贴的项目是目标文件夹的上级", diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 15d0a742680..b5dc3e0f2f8 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -30,12 +30,12 @@ "autoSaveDelay": "控制在多少毫秒后自动保存更改过的文件。仅在“files.autoSave”设置为“{0}”时适用。", "watcherExclude": "配置文件路径的 glob 模式以从文件监视排除。模式必须在绝对路径上匹配(例如 ** 前缀或完整路径需正确匹配)。更改此设置需要重启。如果在启动时遇到 Code 消耗大量 CPU 时间,则可以排除大型文件夹以减少初始加载。", "hotExit.off": "禁用热退出。", - "hotExit.onExit": "应用程序关闭时将触发热退出。在 Windows/Linux 上关闭最后一个窗口或触发 workbench.action.quit 命令(命令托盘、键绑定、菜单)会引起应用程序关闭。下次启动时将还原所有已备份的窗口。", - "hotExit.onExitAndWindowClose": "应用程序关闭时将触发热退出。在 Windows/Linux 上关闭最后一个窗口、触发 workbench.action.quit 命令(命令托盘、键绑定、菜单)会引起应用程序关闭。对于任何有文件夹打开的窗口,则不论该窗口是否是最后一个窗口。下次启动时将还原所有未打开文件夹的窗口。若要还原打开有文件夹的窗口,请将“window.restoreWindows”设置为“all”。", + "hotExit.onExit": "应用程序关闭时将自动保留未保存内容 (热退出)。关闭的定义为,在 Windows/Linux 上关闭最后一个窗口或者在全平台触发 workbench.action.quit 命令 (命令托盘、键绑定、菜单)。下次启动时将还原所有已备份的窗口。", + "hotExit.onExitAndWindowClose": "应用程序关闭时将自动保留未保存内容 (热退出)。关闭的定义为,在 Windows/Linux 上关闭最后一个窗口,在全平台触发 workbench.action.quit 命令 (命令托盘、键绑定、菜单),对于任何打开有文件夹的窗口,则不论该窗口是否是最后一个窗口。下次启动时将还原所有未打开文件夹的窗口。若要还原打开有文件夹的窗口,请将“window.restoreWindows”设置为“all”。", "hotExit": "控制是否在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示。", "useExperimentalFileWatcher": "使用新的试验文件观察程序。", "defaultLanguage": "分配给新文件的默认语言模式。", - "maxMemoryForLargeFilesMB": "在尝试打开大型文件时,重新启动程序后应用的新的内存限制 (MB)。如果您希望以较高的限制启动,可以在命令行启动时添加参数 \"--max-memory=新的大小\" 。", + "maxMemoryForLargeFilesMB": "在打开大型文件时,控制 VS Code 可在重启后使用的内存。在命令行中指定“--max-memory=新的大小”参数可达到相同效果。", "editorConfigurationTitle": "编辑器", "formatOnSave": "保存时设置文件的格式。格式化程序必须可用,不能自动保存文件,并且不能关闭编辑器。", "formatOnSaveTimeout": "在保存时格式化操作的超时时间。为 formatOnSave 命令指定时间限制 (单位: 毫秒)。运行超过设定时间的命令将被取消。", diff --git a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 50c7a30328b..805d10ae124 100644 --- a/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "键入文件名。按 Enter 以确认或按 Esc 以取消。", - "constructedPath": "在 **{1}** 创建{0}", "filesExplorerViewerAriaLabel": "{0},文件资源管理器", "dropFolders": "你是否要将文件夹添加到工作区?", "dropFolder": "你是否要将文件夹添加到工作区?", diff --git a/i18n/chs/src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.i18n.json b/i18n/chs/src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.i18n.json index 2d7ab40f3c9..3cbb0b9c0cb 100644 --- a/i18n/chs/src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "html.voidInput": "无效的编辑器输入。" + "html.voidInput": "编辑器输入无效。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index 2bc538eaf9f..3654ab60cb3 100644 --- a/i18n/chs/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -9,8 +9,8 @@ "updateLocale": "是否将 VS Code 的界面语言更换为 {0} 并重新启动?", "yes": "是", "no": "否", - "doNotAskAgain": "不再询问", - "JsonSchema.locale": "要使用的 UI 语言。", + "neverAgain": "不再显示", + "JsonSchema.locale": "使用的界面语言。", "vscode.extension.contributes.localizations": "向编辑器提供本地化内容", "vscode.extension.contributes.localizations.languageId": "显示字符串翻译的目标语言 ID。", "vscode.extension.contributes.localizations.languageName": "语言的英文名称。", diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index 7cf34baa098..04a7e7edc85 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "复制", - "copyMarkerMessage": "复制消息" + "copyMessage": "复制消息" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 158b3a24233..f53a9ecd185 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "总计 {0} 个问题", - "filteredProblems": "显示 {0} 个 (共 {1} 个) 问题" + "totalProblems": "总计 {0} 个问题" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..1a1f6eea1b6 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "disableFilesExclude": "禁用文件排除。", + "clearFilter": "清除筛选。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..30ef269d07d --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showing filtered problems": "显示 {0} / {1}" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 9e91dc0ee53..86939d328ca 100644 --- a/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,13 @@ "markers.panel.title.problems": "问题", "markers.panel.aria.label.problems.tree": "按文件分组的问题", "markers.panel.no.problems.build": "目前尚未在工作区检测到问题。", - "markers.panel.no.problems.filters": "使用提供的筛选条件未找到结果", + "markers.panel.no.problems.filters": "在给定的筛选条件下,没有找到结果。", + "markers.panel.no.problems.file.exclusions": "在启用排除筛选器的情况下,所有问题已隐藏。", + "markers.panel.action.useFilesExclude": "使用文件排除设置进行筛选", + "markers.panel.action.donotUseFilesExclude": "不使用文件排除设置", "markers.panel.action.filter": "筛选器问题", - "markers.panel.filter.placeholder": "按类型或文本进行筛选", + "markers.panel.filter.ariaLabel": "筛选器问题", + "markers.panel.filter.placeholder": "筛选。例: text, **/*.ts, !**/node_modules/**", "markers.panel.filter.errors": "错误", "markers.panel.filter.warnings": "警告", "markers.panel.filter.infos": "信息", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index c40f2b67618..03b2d9ae25a 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,35 +6,34 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "键盘快捷方式", - "showDefaultKeybindings": "显示默认键绑定", - "showUserKeybindings": "显示用户键绑定", - "SearchKeybindings.AriaLabel": "搜索键绑定", - "SearchKeybindings.Placeholder": "搜索键绑定", + "showDefaultKeybindings": "显示默认按键绑定", + "showUserKeybindings": "显示用户按键绑定", + "SearchKeybindings.AriaLabel": "搜索按键绑定", + "SearchKeybindings.Placeholder": "搜索按键绑定", "sortByPrecedene": "按优先级排序", "header-message": "高级自定义请打开和编辑", "keybindings-file-name": "keybindings.json", - "keybindingsLabel": "键绑定", - "changeLabel": "更改键绑定", - "addLabel": "添加键绑定", + "keybindingsLabel": "按键绑定", + "changeLabel": "更改按键绑定", + "addLabel": "添加按键绑定", "removeLabel": "删除键绑定", - "resetLabel": "重置键绑定", - "showSameKeybindings": "显示相同的键绑定", + "resetLabel": "重置按键绑定", + "showSameKeybindings": "显示相同的按键绑定", "copyLabel": "复制", "copyCommandLabel": "拷贝命令", - "error": "编辑键绑定时发生错误“{0}”。请打开 \"keybindings.json\" 文件并检查错误。", + "error": "编辑按键绑定时发生错误“{0}”。请打开 \"keybindings.json\" 文件并检查错误。", "command": "命令", - "keybinding": "键绑定", + "keybinding": "按键绑定", "source": "来源", "when": "何时", - "editKeybindingLabelWithKey": "更改键绑定{0}", + "editKeybindingLabelWithKey": "更改按键绑定 {0}", "editKeybindingLabel": "更改键绑定", - "addKeybindingLabelWithKey": "添加键绑定", + "addKeybindingLabelWithKey": "添加按键绑定 {0}", "addKeybindingLabel": "添加键绑定", "title": "{0} ({1})", "commandAriaLabel": "命令为 {0}。", - "keybindingAriaLabel": "键绑定为 {0}。", - "noKeybinding": "未分配键绑定。", + "keybindingAriaLabel": "按键绑定为 {0}。", + "noKeybinding": "没有绑定按键。", "sourceAriaLabel": "源为 {0}。", "whenAriaLabel": "时间为 {0}。", "noWhen": "没有时间上下文。" diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json index 0459db1c2d2..78e022fe03f 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "defineKeybinding.start": "定义键绑定", + "defineKeybinding.start": "定义按键绑定", "defineKeybinding.kbLayoutErrorMessage": "在当前键盘布局下无法生成此组合键。", "defineKeybinding.kbLayoutLocalAndUSMessage": "在你的键盘布局上为 **{0}**(美国标准布局上为 **{1}**)。", "defineKeybinding.kbLayoutLocalMessage": "在你的键盘布局上为 **{0}**。" diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 4195d289c28..630c1ad7278 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "打开默认设置原始文档", + "openSettings": "打开设置", "openGlobalSettings": "打开用户设置", "openGlobalKeybindings": "打开键盘快捷方式", "openGlobalKeybindingsFile": "打开键盘快捷方式文件", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index b8c1759906a..2a65e037066 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "默认设置", "SearchSettingsWidget.AriaLabel": "搜索设置", "SearchSettingsWidget.Placeholder": "搜索设置", "noSettingsFound": "无结果", @@ -16,6 +15,8 @@ "nlpResult": "自然语言结果", "filterResult": "筛选结果", "defaultSettings": "默认设置", + "defaultUserSettings": "默认用户设置", + "defaultWorkspaceSettings": "默认工作区设置", "defaultFolderSettings": "默认文件夹设置", "defaultEditorReadonly": "在右侧编辑器中编辑以覆盖默认值。", "preferencesAriaLabel": "默认首选项。只读文本编辑器。" diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 31db168fde9..9fc53ead3b4 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "显示扩展“{0}”", "editTtile": "编辑", "replaceDefaultValue": "在设置中替换", - "copyDefaultValue": "复制到设置", - "unsupportedPHPExecutablePathSetting": "此设置必须是“用户设置”。若要为工作区配置 PHP,请打开 PHP 文件并单击状态栏中的“PHP 路径”。", - "unsupportedWorkspaceSetting": "此设置必须是“用户设置”。", - "unsupportedWorkbenchSetting": "当前无法应用此设置。将在直接打开此文件夹时应用。", - "unsupportedWorkbenchSettingDevMode": "当前无法应用此设置。将你在注册时定义其作用域为 \"resource\",或是直接打开此文件夹时应用。" + "copyDefaultValue": "复制到设置" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json index ef63a56a1b7..4afe48715b2 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.i18n.json @@ -7,6 +7,6 @@ "Do not edit this file. It is machine generated." ], "defaultPreferencesEditor": "默认首选项编辑器", - "keybindingsEditor": "键绑定编辑器", + "keybindingsEditor": "按键绑定编辑器", "preferences": "首选项" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json b/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json index 3f7880867ff..295e4c52d56 100644 --- a/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json @@ -10,7 +10,7 @@ "gotoLineLabelEmptyWithLimit": "键入要导航到的介于 1 和 {0} 之间的行号", "gotoLineLabelEmpty": "键入要导航到的行号", "gotoLineColumnLabel": "转到行 {0} 和字符 {1}", - "gotoLineLabel": "转至行 {0}", + "gotoLineLabel": "转至第 {0} 行", "gotoLineHandlerAriaLabel": "键入要导航到的行号。", "cannotRunGotoLine": "首先打开文本文件以转到行" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 8c1111d5098..72a33d59853 100644 --- a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "安装其他源代码管理提供程序...", "no open repo": "没有活动的源代码管理提供程序。", "source control": "源代码管理", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "隐藏" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 4fc9ae1d616..76dc7862437 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "显示下一个搜索包含模式", "previousSearchIncludePattern": "显示上一个搜索包含模式", + "nextSearchExcludePattern": "显示下一个搜索排除模式", + "previousSearchExcludePattern": "显示上一个搜索排除模式", "nextSearchTerm": "显示下一个搜索词", "previousSearchTerm": "显示上一个搜索词", - "showSearchViewlet": "显示搜索", "findInFiles": "在文件中查找", "replaceInFiles": "在文件中替换", "RefreshAction.label": "刷新", diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json index 101ca4d9984..e6d06592621 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,9 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "切换搜索详细信息", - "searchIncludeExclude.label": "包含或排除的文件", - "searchIncludeExclude.ariaLabel": "搜索中包含或排除项的模式", - "searchIncludeExclude.placeholder": "例: src, !*.ts, test/**/*.log", + "searchScope.includes": "要包含的文件", + "label.includes": "搜索包含模式", + "searchScope.excludes": "要排除的文件", + "label.excludes": "搜索排除模式", "replaceAll.confirmation.title": "全部替换", "replaceAll.confirm.button": "替换(&&R)", "replaceAll.occurrence.file.message": "已将 {1} 文件中出现的 {0} 替换为“{2}”。", diff --git a/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index b45279594d3..a48247a7489 100644 --- a/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "搜索", + "copyMatchLabel": "复制", + "copyPathLabel": "复制路径", + "copyAllLabel": "全部复制", + "toggleSearchViewPositionLabel": "切换搜索视图位置", "findInFolder": "在文件夹中查找...", "findInWorkspace": "在工作区中查找...", "showTriggerActions": "转到工作区中的符号...", "name": "搜索", - "search": "搜索", "showSearchViewl": "显示搜索", "view": "查看", "findInFiles": "在文件中查找", @@ -26,5 +30,5 @@ "search.followSymlinks": "控制是否在搜索中跟踪符号链接。", "search.smartCase": "若搜索词全为小写,则不区分大小写进行搜索,否则区分大小写进行搜索", "search.globalFindClipboard": "控制“搜索”视图是否读取或修改 macOS 的共享查找剪贴板", - "search.location": "预览: 控制搜索功能显示在侧边栏还是水平空间更大的面板区域。我们将在下个版本优化面板中搜索的水平布局,之后这将不再是一个预览功能。" + "search.location": "控制搜索功能显示在侧边栏还是水平空间更大的面板区域。我们将在下个版本中优化面板搜索的水平布局,此后,这将不再是一个预览功能。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index d5ec61330df..8f54754adc7 100644 --- a/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "帮助我们改善对 {0} 的支持", "takeShortSurvey": "参与小调查", "remindLater": "稍后提醒", - "neverAgain": "不再显示", - "helpUs": "帮助我们改善对 {0} 的支持" + "neverAgain": "不再显示" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 79f86172895..5f305836c67 100644 --- a/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "您愿意参与一次简短的反馈调查吗?", "takeSurvey": "参与调查", "remindLater": "稍后提醒", - "neverAgain": "不再显示", - "surveyQuestion": "您愿意参与一次简短的反馈调查吗?" + "neverAgain": "不再显示" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index b4c4b3ab561..41326098874 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,6 +11,7 @@ "totalErrors": "{0} 个错误", "totalWarnings": "{0} 条警告", "totalInfos": "{0} 条信息", + "problems": "问题", "building": "正在生成...", "manyProblems": "1万+", "runningTasks": "显示运行中的任务", @@ -30,8 +31,10 @@ "selectProblemMatcher": "选择针对何种错误和警告扫描任务输出", "customizeParseErrors": "当前任务配置存在错误。请先更正错误,再自定义任务。", "moreThanOneBuildTask": "当前 tasks.json 中定义了多个生成任务。正在执行第一个。\n", - "TaskSystem.activeSame.background": "任务 \"{0}\" 已激活并处于后台模式。若要终止任务,请选择“任务”菜单中的“终止任务...”。", - "TaskSystem.activeSame.noBackground": "任务 \"{0}\" 已处于活动状态。若要终止任务,请选择“任务”菜单中的“终止任务...”。", + "TaskSystem.activeSame.background": "任务“{0}”已激活,并且处于后台模式。", + "TaskSystem.activeSame.noBackground": "任务“{0}”已处于活动状态。", + "terminateTask": "终止任务", + "restartTask": "重启任务", "TaskSystem.active": "当前已有任务正在运行。请先终止它,然后再执行另一项任务。", "TaskSystem.restartFailed": "未能终止并重启任务 {0}", "TaskService.noConfiguration": "错误: {0} 任务检测没有提供拥有下列配置的任务:\n{1}\n将忽略此任务。\n", @@ -48,8 +51,8 @@ "recentlyUsed": "最近使用的任务", "configured": "已配置的任务", "detected": "检测到的任务", - "TaskService.notAgain": "不再显示", "TaskService.ignoredFolder": "由于使用任务版本 0.1.0,以下工作区文件夹将被忽略: {0}", + "TaskService.notAgain": "不再显示", "TaskService.pickRunTask": "选择要运行的任务", "TaslService.noEntryToRun": "没有找到要运行的任务。配置任务...", "TaskService.fetchingBuildTasks": "正在获取生成任务...", diff --git a/i18n/chs/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..1c55c29463d --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "终端的背景颜色,允许终端的颜色与面板不同。", + "terminal.foreground": "终端的前景颜色。", + "terminalCursor.foreground": "终端光标的前景色。", + "terminalCursor.background": "终端光标的背景色。允许自定义被 block 光标遮住的字符的颜色。", + "terminal.selectionBackground": "终端选中内容的背景颜色。", + "terminal.border": "分隔终端中拆分窗格的边框的颜色。默认值为 panel.border 的颜色", + "terminal.ansiColor": "终端中的 ANSI 颜色“{0}”。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 66844979174..e381f21cfa1 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -21,6 +21,7 @@ "workbench.action.terminal.newWorkspacePlaceholder": "选择当前工作目录新建终端", "workbench.action.terminal.newInActiveWorkspace": "新建集成终端 (活动工作区)", "workbench.action.terminal.split": "拆分终端", + "workbench.action.terminal.splitInActiveWorkspace": "拆分终端 (活动工作区)", "workbench.action.terminal.focusPreviousPane": "聚焦于上一个窗格", "workbench.action.terminal.focusNextPane": "聚焦于下一个窗格", "workbench.action.terminal.resizePaneLeft": "向左调整窗格大小", @@ -43,6 +44,7 @@ "workbench.action.terminal.scrollUpPage": "向上滚动(页)", "workbench.action.terminal.scrollToTop": "滚动到顶部", "workbench.action.terminal.clear": "清除", + "workbench.action.terminal.clearSelection": "清除选定内容", "workbench.action.terminal.allowWorkspaceShell": "允许配置工作区 Shell", "workbench.action.terminal.disallowWorkspaceShell": "禁止配置工作区 Shell", "workbench.action.terminal.rename": "重命名", @@ -52,8 +54,8 @@ "nextTerminalFindTerm": "显示下一个搜索结果", "previousTerminalFindTerm": "显示上一个搜索结果", "quickOpenTerm": "切换活动终端", - "workbench.action.terminal.focusPreviousCommand": "聚焦于上一条命令", - "workbench.action.terminal.focusNextCommand": "聚焦于下一条命令", + "workbench.action.terminal.scrollToPreviousCommand": "滚动到上一条命令", + "workbench.action.terminal.scrollToNextCommand": "滚动到下一条命令", "workbench.action.terminal.selectToPreviousCommand": "选择上一条命令所有内容", "workbench.action.terminal.selectToNextCommand": "选择下一条命令所有内容" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json index a03f33d6630..226ce4dc16f 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "terminal.integrated.chooseWindowsShellInfo": "可通过选择“自定义”按钮来更改默认的终端 shell。", + "terminal.integrated.chooseWindowsShellInfo": "你可以按下“自定义”按钮并更换默认终端 Shell。", "customize": "自定义", "never again": "不再显示", "terminal.integrated.chooseWindowsShell": "选择首选的终端 shell,你可稍后在设置中进行更改", diff --git a/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 8b074252bc9..05f2427856b 100644 --- a/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "此工作区包含仅可在“用户设置”中配置的设置 ({0})。单击[这里]({1})了解更多信息。", "openWorkspaceSettings": "打开工作区设置", - "dontShowAgain": "不再显示", - "unsupportedWorkspaceSettings": "此工作区包含仅可在“用户设置”中配置的设置 ({0})。单击[这里]({1})了解更多信息。" + "dontShowAgain": "不再显示" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 1fcb4a17477..0020728737d 100644 --- a/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "稍后", "releaseNotes": "发行说明", "showReleaseNotes": "显示发行说明", "read the release notes": "欢迎使用 {0} v{1}! 是否要阅读发布说明?", @@ -16,13 +15,14 @@ "updateIsReady": "有新的 {0} 的更新可用。", "noUpdatesAvailable": "当前没有可用的更新。", "ok": "确定", - "download now": "立即下载", "thereIsUpdateAvailable": "存在可用更新。", + "download now": "立即下载", + "later": "稍后", + "updateAvailable": "现有更新可用: {0} {1}", "installUpdate": "安装更新", - "updateAvailable": "存在可用更新: {0} {1}", "updateInstalling": "{0} {1} 正在后台安装,我们会在完成后通知您。", + "updateAvailableAfterRestart": "重新启动 {0} 即可应用最新更新。", "updateNow": "立即更新", - "updateAvailableAfterRestart": "{0} 将在重启后更新。", "commandPalette": "命令面板...", "settings": "设置", "keyboardShortcuts": "键盘快捷方式", diff --git a/i18n/chs/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index de275d5e951..2de51221fc9 100644 --- a/i18n/chs/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview 编辑器" + "webview.editor.label": "webview 编辑器", + "developer": "开发者" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/chs/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..bad27cc286a --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "打开 Webview 开发工具", + "refreshWebviewLabel": "重新加载 Webview" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index 0340660b904..3f4b053f902 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "管理扩展", "welcomeOverlay.problems": "查看错误和警告", "welcomeOverlay.commandPalette": "查找并运行所有命令", + "welcomeOverlay.notifications": "显示通知", "welcomeOverlay": "用户界面概览", "hideWelcomeOverlay": "隐藏界面概览", "help": "帮助" diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 96a695ce8bd..ce47605351f 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,8 @@ "welcomePage.installExtensionPacks": "工具和语言", "welcomePage.installExtensionPacksDescription": "安装对 {0} 和 {1} 的支持", "welcomePage.moreExtensions": "更多", - "welcomePage.installKeymapDescription": "安装键盘快捷方式", - "welcomePage.installKeymapExtension": "安装 {0} 和 {1} 的键盘快捷方式", + "welcomePage.installKeymapDescription": "设置与按键绑定", + "welcomePage.installKeymapExtension": "安装 {0} 和 {1} 的设置和快捷键", "welcomePage.others": "其他", "welcomePage.colorTheme": "颜色主题", "welcomePage.colorThemeDescription": "使编辑器和代码呈现你喜欢的外观", diff --git a/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json index aee4d86d554..4f7c3efb7aa 100644 --- a/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/services/actions/electron-browser/menusExtensionPoint.i18n.json @@ -32,9 +32,9 @@ "requireStringOrObject": "属性“{0}”是必要属性,其类型必须是 \"string\" 或 \"object\"", "requirestrings": "属性“{0}”和“{1}”是必要属性,其类型必须是 \"string\"", "vscode.extension.contributes.commandType.command": "要执行的命令的标识符", - "vscode.extension.contributes.commandType.title": "在 UI 中依据其表示命令的标题", - "vscode.extension.contributes.commandType.category": "(可选)类别字符串按命令在 UI 中分组", - "vscode.extension.contributes.commandType.icon": "(可选)在 UI 中用来表示命令的图标。文件路径或者主题配置", + "vscode.extension.contributes.commandType.title": "在界面中显示的命令名称", + "vscode.extension.contributes.commandType.category": "(可选) 类别字符串,命令在界面中根据此项分组", + "vscode.extension.contributes.commandType.icon": "(可选) 在界面中显示的命令图标。可为文件路径或主题配置", "vscode.extension.contributes.commandType.icon.light": "使用浅色主题时的图标路径", "vscode.extension.contributes.commandType.icon.dark": "使用深色主题时的图标路径", "vscode.extension.contributes.commands": "对命令面板提供命令。", diff --git a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 8ae0d8347fb..43e4308fb70 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "设置摘要。此标签将在设置文件中用作分隔注释。", "vscode.extension.contributes.configuration.properties": "配置属性的描述。", + "scope.application.description": "特定于应用的配置,仅可在“用户”设置中配置。", "scope.window.description": "特定于窗口的配置,可在“用户”或“工作区”设置中配置。", "scope.resource.description": "特定于资源的配置,可在“用户”、“工作区”或“文件夹”设置中配置。", "scope.description": "配置适用的范围。可用范围有“窗口”和“资源”。", diff --git a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 5a029ae777e..5acf3a0fa36 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "打开设置", "saveAndRetry": "保存并重试", "errorUnknownKey": "没有注册配置 {1},因此无法写入 {0}。", + "errorInvalidWorkspaceConfigurationApplication": "无法将 {0} 写入“工作区设置”。此设置只能写于“用户设置”。", "errorInvalidFolderConfiguration": "{0} 不支持文件夹资源域,因此无法写入\"文件夹设置\"。", "errorInvalidUserTarget": "{0} 不支持全局域,因此无法写入\"用户设置\"。", "errorInvalidWorkspaceTarget": "{0} 不在多文件夹工作区环境下支持工作区作用域,因此无法写入“工作区设置”。", diff --git a/i18n/chs/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..96542629007 --- /dev/null +++ b/i18n/chs/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedApplicationSetting": "此设置仅可应用于“用户设置”", + "unsupportedWindowSetting": "当前无法应用此设置。将在直接打开此文件夹时应用。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index e28b73aabd5..a6ae2efb80f 100644 --- a/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,16 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolderMultiRoot": "无法在多文件夹工作区中解析 ${workspaceFolder}。使用 : 和文件夹名称来限定此变量的作用域。", - "canNotResolveWorkspaceFolder": "无法解析 ${workspaceFolder}。请打开一个文件夹。", - "canNotResolveFolderBasenameMultiRoot": "无法在多文件夹工作区中解析 ${workspaceFolderBasename}。使用 : 和文件夹名称来限定此变量的作用域。", - "canNotResolveFolderBasename": "无法解析 ${workspaceFolderBasename}。请打开一个文件夹。", - "canNotResolveLineNumber": "无法解析 ${lineNumber}。请打开一个编辑器。", - "canNotResolveSelectedText": "无法解析 ${selectedText}。请打开一个编辑器。", - "canNotResolveFile": "无法解析 ${file}。请打开一个编辑器。", - "canNotResolveRelativeFile": "无法解析 ${relativeFile}。请打开一个编辑器。", - "canNotResolveFileDirname": "无法解析 ${fileDirname}。请打开一个编辑器。", - "canNotResolveFileExtname": "无法解析 ${fileExtname}。请打开一个编辑器。", - "canNotResolveFileBasename": "无法解析 ${fileBasename}。请打开一个编辑器。", - "canNotResolveFileBasenameNoExtension": "无法解析 ${fileBasenameNoExtension}。请打开一个编辑器。" + "canNotResolveWorkspaceFolderMultiRoot": "无法在多文件夹工作区中解析 \"${workspaceFolder}\"。使用 \":\" 和工作区文件夹名称来限定此变量的作用域。", + "canNotResolveWorkspaceFolder": "无法解析 \"${workspaceFolder}\"。请打开一个文件夹。", + "canNotResolveFolderBasenameMultiRoot": "无法在多文件夹工作区中解析 \"${workspaceFolderBasename}\"。使用 \":\" 和工作区文件夹名称来限定此变量的作用域。", + "canNotResolveFolderBasename": "无法解析 \"${workspaceFolderBasename}\"。请打开一个文件夹。", + "canNotResolveLineNumber": "无法解析 \"${lineNumber}\"。请打开一个编辑器。", + "canNotResolveSelectedText": "无法解析 \"${selectedText}\"。请打开一个编辑器。", + "canNotResolveFile": "无法解析 \"${file}\"。请打开一个编辑器。", + "canNotResolveRelativeFile": "无法解析 \"${relativeFile}\"。请打开一个编辑器。", + "canNotResolveFileDirname": "无法解析 \"${fileDirname}\"。请打开一个编辑器。", + "canNotResolveFileExtname": "无法解析 \"${fileExtname}\"。请打开一个编辑器。", + "canNotResolveFileBasename": "无法解析 \"${fileBasename}\"。请打开一个编辑器。", + "canNotResolveFileBasenameNoExtension": "无法解析 \"${fileBasenameNoExtension}\"。请打开一个编辑器。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index 57b5dd7d36a..ff684f7426b 100644 --- a/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/chs/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "引擎兼容性。", "vscode.extension.engines.vscode": "对于 VS Code 扩展,指定与其兼容的 VS Code 版本。不能为 *。 例如: ^0.10.5 表示最低兼容 VS Code 版本 0.10.5。", "vscode.extension.publisher": "VS Code 扩展的发布者。", "vscode.extension.displayName": "VS Code 库中使用的扩展的显示名称。", "vscode.extension.categories": "VS Code 库用于对扩展进行分类的类别。", + "vscode.extension.category.languages.deprecated": "请改用 \"Programming Languages\"", "vscode.extension.galleryBanner": "VS Code 商城使用的横幅。", "vscode.extension.galleryBanner.color": "VS Code 商城页标题上的横幅颜色。", "vscode.extension.galleryBanner.theme": "横幅文字的颜色主题。", @@ -28,6 +30,8 @@ "vscode.extension.badges.url": "徽章图像 URL。", "vscode.extension.badges.href": "徽章链接。", "vscode.extension.badges.description": "徽章说明。", + "vscode.extension.markdown": "控制商店中使用的 Markdown 渲染引擎。可为 \"github\" (默认) 或 \"standard\" (标准)。", + "vscode.extension.qna": "控制市场中的“问与答”(Q&A)链接。设置为 \"marketplace\" 可启用市场的默认“问与答”页面。设置为其他字符串可指向自定义的“问与答”页面。设置为 \"false\" 可完全禁用“问与答”。", "vscode.extension.extensionDependencies": "其他扩展的依赖关系。扩展的标识符始终是 ${publisher}.${name}。例如: vscode.csharp。", "vscode.extension.scripts.prepublish": "包作为 VS Code 扩展发布前执行的脚本。", "vscode.extension.scripts.uninstall": "VS Code 扩展的卸载钩子。在扩展从 VS Code 卸载且 VS Code 重启 (关闭后开启) 后执行的脚本。仅支持 Node 脚本。", diff --git a/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index f38c68b8cf3..53d5f14ef4a 100644 --- a/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "已禁用所有扩展。", "extensionHostProcess.crash": "扩展宿主意外终止。", "extensionHostProcess.unresponsiveCrash": "扩展宿主因没有响应而被终止。", - "devTools": "开发人员工具", + "devTools": "打开开发人员工具", "restart": "重启扩展宿主", "overwritingExtension": "使用扩展程序 {1} 覆盖扩展程序 {0}。", "extensionUnderDevelopment": "正在 {0} 处加载开发扩展程序", diff --git a/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 1dd9885b81f..2c68f58f2bb 100644 --- a/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,11 +6,24 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "需要 Microsoft .NET Framework 4.5。请访问链接安装它。", "installNet": "下载 .NET Framework 4.5", "neverShowAgain": "不再显示", - "netVersionError": "需要 Microsoft .NET Framework 4.5。请访问链接安装它。", - "learnMore": "说明", "enospcError": "{0} 无法监视这个大型工作区的文件变化。请访问说明链接解决此问题。", + "learnMore": "说明", + "fileInvalidPath": "无效的文件资源({0})", + "fileIsDirectoryError": "文件是目录", + "fileNotModifiedError": "自以下时间未修改的文件:", + "fileTooLargeForHeapError": "若要打开此大小的文件,需要重新启动 VS Code,并允许其使用更多内存", + "fileTooLargeError": "文件太大,无法打开", + "fileNotFoundError": "找不到文件({0})", + "fileBinaryError": "文件似乎是二进制文件,无法作为文档打开", + "filePermission": "写入文件时权限被拒绝 ({0})", + "fileExists": "已存在要创建的文件 ({0})", + "fileModifiedError": "自以下时间已修改的文件:", + "fileReadOnlyError": "文件为只读文件", + "fileMoveConflict": "无法移动/复制。文件已存在于目标位置。", + "unableToMoveCopyError": "无法移动/复制。文件将替换其所在的文件夹。", "binFailed": "未能将“{0}”移动到回收站", "trashFailed": "未能将“{0}”移动到废纸篓" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index c5303d62f77..9cc3a9437e2 100644 --- a/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "找不到文件({0})", "fileIsDirectoryError": "文件是目录", "fileNotModifiedError": "自以下时间未修改的文件:", "fileBinaryError": "文件似乎是二进制文件,无法作为文档打开" diff --git a/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json b/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json index c4dacad57b2..d566302d24d 100644 --- a/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json +++ b/i18n/chs/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "errorKeybindingsFileDirty": "键绑定配置文件已变更,无法写入。请先保存此文件,然后重试。", - "parseErrors": "无法写入键绑定配置文件。请打开文件并更正错误或警告,然后重试。", - "errorInvalidConfiguration": "无法写入键绑定配置文件。文件内含有不是数组类型的对象。请打开文件进行清理,然后重试。", + "errorKeybindingsFileDirty": "按键绑定配置文件已变更,现在无法写入。请先保存此文件,然后重试。", + "parseErrors": "无法写入按键绑定配置文件。请打开文件并更正错误或警告,然后重试。", + "errorInvalidConfiguration": "无法写入按键绑定配置文件。文件内含有非数组类型对象。请打开文件进行清理,然后重试。", "emptyKeybindingsHeader": "将键绑定放入此文件中以覆盖默认值" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 17e2dcc8f30..79efaf75e8d 100644 --- a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -9,16 +9,16 @@ "nonempty": "应为非空值。", "requirestring": "属性“{0}”是必需的,其类型必须是“字符串”", "optstring": "属性“{0}”可以省略,或者其类型必须是“字符串”", - "vscode.extension.contributes.keybindings.command": "要在触发键绑定时运行的命令的标识符。", + "vscode.extension.contributes.keybindings.command": "触发按键绑定时运行的命令的标识符。", "vscode.extension.contributes.keybindings.key": "按键或按键序列。用加号分隔按键,用空格分隔序列。例如,Ctrl+O 和 Ctrl+L L(连续按键)。", "vscode.extension.contributes.keybindings.mac": "Mac 特定的键或键序列。", "vscode.extension.contributes.keybindings.linux": "Linux 特定的键或键序列。", "vscode.extension.contributes.keybindings.win": "Windows 特定的键或键序列。", "vscode.extension.contributes.keybindings.when": "键处于活动状态时的条件。", - "vscode.extension.contributes.keybindings": "用于键绑定。", + "vscode.extension.contributes.keybindings": "提供按键绑定。", "invalid.keybindings": "无效的“contributes.{0}”: {1}", "unboundCommands": "以下是其他可用命令:", - "keybindings.json.title": "键绑定配置", + "keybindings.json.title": "按键绑定配置", "keybindings.json.key": "键或键序列(用空格分隔)", "keybindings.json.command": "要执行的命令的名称", "keybindings.json.when": "键处于活动状态时的条件。", diff --git a/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeStore.i18n.json b/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeStore.i18n.json index e14af982802..d77c2cc06df 100644 --- a/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeStore.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeStore.i18n.json @@ -8,7 +8,7 @@ ], "vscode.extension.contributes.themes": "请提供 TextMate 颜色主题。", "vscode.extension.contributes.themes.id": "用户设置中使用的图标主题的 ID。", - "vscode.extension.contributes.themes.label": "显示在 UI 中的颜色主题标签。", + "vscode.extension.contributes.themes.label": "颜色主题在界面中的显示名称。", "vscode.extension.contributes.themes.uiTheme": "用于定义编辑器周围颜色的基本主题: \"vs\" 是浅色主题,\"vs-dark\" 是深色主题。\"hc-black\" 是深色高对比度主题。", "vscode.extension.contributes.themes.path": "tmTheme 文件的路径。该路径相对于扩展文件夹,通常为 \"./themes/themeFile.tmTheme\"。", "reqarray": "扩展点“{0}”必须是一个数组。", diff --git a/i18n/chs/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.i18n.json b/i18n/chs/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.i18n.json index 0690cd68ce9..a8fabec9ee1 100644 --- a/i18n/chs/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.i18n.json @@ -8,7 +8,7 @@ ], "vscode.extension.contributes.iconThemes": "提供文件图标主题。", "vscode.extension.contributes.iconThemes.id": "用户设置中使用的图标主题的 ID。", - "vscode.extension.contributes.iconThemes.label": "UI 中显示的图标主题的标签。", + "vscode.extension.contributes.iconThemes.label": "在界面中显示的图标主题名称 ", "vscode.extension.contributes.iconThemes.path": "图标主题定义文件的路径。该路径相对于扩展文件夹,通常是 \"./icons/awesome-icon-theme.json\"。", "reqarray": "扩展点“{0}”必须是一个数组。", "reqpath": "“contributes.{0}.path”中应为字符串。提供的值: {1}", diff --git a/i18n/cht/extensions/css/package.i18n.json b/i18n/cht/extensions/css/package.i18n.json index 35229bd6699..3b83a3b860e 100644 --- a/i18n/cht/extensions/css/package.i18n.json +++ b/i18n/cht/extensions/css/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "CSS 語言基礎知識", + "description": "為 CSS、LESS 與 SCSS 檔案提供語法醒目提示與括弧對應功能。" } \ No newline at end of file diff --git a/i18n/cht/extensions/emmet/package.i18n.json b/i18n/cht/extensions/emmet/package.i18n.json index b356553fff9..b3dc8be8bb9 100644 --- a/i18n/cht/extensions/emmet/package.i18n.json +++ b/i18n/cht/extensions/emmet/package.i18n.json @@ -60,5 +60,6 @@ "emmetPreferencesCssMozProperties": "在以 `-` 開頭的 Emmet 縮寫中使用時,會取得 'moz' 廠商前綴的逗點分隔 CSS 屬性。設定為空白字串可避免總是取得 'moz' 前綴。", "emmetPreferencesCssOProperties": "在以 `-` 開頭的 Emmet 縮寫中使用時,會取得 'o' 廠商前綴的逗點分隔 CSS 屬性。設定為空白字串可避免總是取得 'o' 前綴。", "emmetPreferencesCssMsProperties": "在以 `-` 開頭的 Emmet 縮寫中使用時,會取得 'ms' 廠商前綴的逗點分隔 CSS 屬性。設定為空白字串可避免總是取得 'ms' 前綴。", - "emmetPreferencesCssFuzzySearchMinScore": "模糊比對的縮寫應該達到最低分數(從 0 到 1)。較低數值可能產生錯誤的比對,較高的數值可能會降低可能的比對。" + "emmetPreferencesCssFuzzySearchMinScore": "模糊比對的縮寫應該達到最低分數(從 0 到 1)。較低數值可能產生錯誤的比對,較高的數值可能會降低可能的比對。", + "emmetOptimizeStylesheetParsing": "當設定為 false 時,將解析整個檔案以確定目前的位置是否適用於展開 Emmet 縮寫。當設定為 true 時,僅會解析 css/scss/less 檔案中目前位置周圍的內容。" } \ No newline at end of file diff --git a/i18n/cht/extensions/html/package.i18n.json b/i18n/cht/extensions/html/package.i18n.json index 35229bd6699..eb9141c8094 100644 --- a/i18n/cht/extensions/html/package.i18n.json +++ b/i18n/cht/extensions/html/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "HTML 語言基礎知識", + "description": "為 HTML 檔案提供語法醒目提示、括弧對應與程式碼片段功能。" } \ No newline at end of file diff --git a/i18n/cht/extensions/json/package.i18n.json b/i18n/cht/extensions/json/package.i18n.json index 35229bd6699..909f55cf270 100644 --- a/i18n/cht/extensions/json/package.i18n.json +++ b/i18n/cht/extensions/json/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "JSON 語言基礎知識", + "description": "為 JSON 檔案提供語法醒目提示與括弧對應功能。" } \ No newline at end of file diff --git a/i18n/cht/extensions/markdown-language-features/out/security.i18n.json b/i18n/cht/extensions/markdown-language-features/out/security.i18n.json index cc4260be39f..6f41794bacc 100644 --- a/i18n/cht/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/cht/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "嚴謹", "strict.description": "僅載入安全內容", + "insecureLocalContent.title": "允許不安全的本機內容", + "insecureLocalContent.description": "啟用從本機提供 http 載入內容", "insecureContent.title": "允許不安全的內容", "insecureContent.description": "啟用 http 載入內容", "disable.title": "停用", diff --git a/i18n/cht/extensions/php/package.i18n.json b/i18n/cht/extensions/php/package.i18n.json index 0b1d70297e1..d6cdfe9a0f2 100644 --- a/i18n/cht/extensions/php/package.i18n.json +++ b/i18n/cht/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "PHP 語言功能" + "displayName": "PHP 語言基礎知識", + "description": "為 PHP 檔案提供語法醒目提示與括弧對應功能。" } \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/commands.i18n.json b/i18n/cht/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..90f4f953b40 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "請在 VS Code 中開啟資料夾,以使用 TypeScript 或 JavaScript 專案", + "typescript.projectConfigUnsupportedFile": "無法判斷 TypeScript 或 JavaScript 專案。不支援的檔案類型", + "typescript.projectConfigCouldNotGetInfo": "無法判斷 TypeScript 或 JavaScript 專案", + "typescript.noTypeScriptProjectConfig": "檔案不屬於 TypeScript 專案。若要深入了解,請按一下[這裡]({0})。", + "typescript.noJavaScriptProjectConfig": "檔案不屬於 JavaScript 專案。若要深入了解,請按一下[這裡]({0})。", + "typescript.configureTsconfigQuickPick": "設定 tsconfig.json", + "typescript.configureJsconfigQuickPick": "設定 jsconfig.json" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..18117a677b6 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "選擇要套用的程式碼動作", + "acquiringTypingsLabel": "正在擷取 typings...", + "acquiringTypingsDetail": "正在為 IntelliSense 擷取 typings 定義。", + "autoImportLabel": "自動從 {0} 匯入" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..7d901d9ed96 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "啟用 JavaScript 檔案的語意檢查。必須在檔案的最上面。", + "ts-nocheck": "停用 JavaScript 檔案的語意檢查。必須在檔案的最上面。", + "ts-ignore": "隱藏下一行@ts-check 的錯誤警告。" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..16a3b7e5e58 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 個實作", + "manyImplementationLabel": "{0} 個實作", + "implementationsErrorLabel": "無法判斷實作數" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..2851c131eab --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "JSDoc 註解" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..d3f0fb21867 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "組織匯入" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..85939cee970 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (檔案中修復全部)" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..4ae222d6a1d --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 個參考", + "manyReferenceLabel": "{0} 個參考", + "referenceErrorLabel": "無法判斷參考" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..61ba5737e64 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "建置 - {0}", + "buildAndWatchTscLabel": "監看 - {0}" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/cht/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..54beeeb5b8d --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "路徑 {0} 未指向有效的 tsserver 安裝。即將回復為配套的 TypeScript 版本。", + "serverCouldNotBeStarted": "無法啟動 TypeScript 語言伺服器。錯誤訊息為: {0}", + "typescript.openTsServerLog.notSupported": "TS 伺服器的記錄功能需要 TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "TS 伺服器記錄功能已關閉。請設定 `typescript.tsserver.log` 並重新啟動 TS 伺服器,以啟用記錄功能", + "typescript.openTsServerLog.enableAndReloadOption": "啟用記錄功能並重新啟動 TS 伺服器", + "typescript.openTsServerLog.noLogFile": "TS 伺服器尚未開始記錄。", + "openTsServerLog.openFileFailedFailed": "無法開啟 TS 伺服器記錄檔", + "serverDiedAfterStart": "TypeScript 語言服務在啟動後立即中止 5 次。服務將不會重新啟動。", + "serverDiedReportIssue": "回報問題", + "serverDied": "TypeScript 語言服務在過去 5 分鐘內意外中止 5 次。" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/cht/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..bb0bb1a4af9 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "無效的版本" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/cht/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/cht/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..5d6e558a988 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "若要讓整個專案都能使用 JavaScript/TypeScript 語言功能,請排除內含許多檔案的資料夾,例如: {0}", + "hintExclude.generic": "若要讓整個專案都能使用 JavaScript/TypeScript 語言功能,請排除內含您未使用之來源檔案的大型資料夾。", + "large.label": "設定排除項目", + "hintExclude.tooltip": "若要讓整個專案都能使用 JavaScript/TypeScript 語言功能,請排除內含您未使用之來源檔案的大型資料夾。" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/cht/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..e80262263f7 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "正在擷取資料以改善 TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "無法為 JavaScript 語言功能安裝 typings 檔案。請確認已安裝 NPM,或在使用者設定中設定 'typescript.npm'。若要深入了解,請按一下[這裡]({0})。", + "typesInstallerInitializationFailed.doNotCheckAgain": "不要再顯示" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/cht/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..fdf7133b824 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "使用 VS Code 的版本", + "useWorkspaceVersionOption": "使用工作區版本", + "learnMore": "深入了解", + "selectTsVersion": "選取 JavaScript 與 TypeScript 功能使用的 TypeScript 版本" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/cht/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..8d374cb1886 --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "無法在此路徑載入 TypeScript 版本", + "noBundledServerFound": "其他應用程式已刪除了 VS Code 的 tsserver,例如行為不當的病毒偵測工具。請重新安裝 VS Code。" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript-language-features/package.i18n.json b/i18n/cht/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..f48586c4f1d --- /dev/null +++ b/i18n/cht/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,62 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "TypeScript 和 JavaScript 語言功能", + "description": "為 JavaScript 和 TypeScript 提供豐富的語言支援。", + "typescript.reloadProjects.title": "重新載入專案", + "javascript.reloadProjects.title": "重新載入專案", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "使用其參數簽章完成函式。", + "typescript.tsdk.desc": "指定資料夾路徑,其中包含要使用的 tsserver 和 lib*.d.ts 檔案。", + "typescript.disableAutomaticTypeAcquisition": "停用自動類型取得。需要 TypeScript >= 2.0.6。", + "typescript.tsserver.log": "允許 TS 伺服器記錄到檔案。此記錄可用來診斷 TS 伺服器問題。記錄可能包含檔案路徑、原始程式碼及您專案中可能具有敏感性的其他資訊。", + "typescript.tsserver.pluginPaths": "發現 TypeScript 語言服務外掛的其他路徑。需要 TypeScript >= 2.3.0。", + "typescript.tsserver.pluginPaths.item": "無論是絕對路徑或是相對路徑。相對路徑將會根據工作區資料夾進行解析。", + "typescript.tsserver.trace": "允許將訊息追蹤傳送到 TS 伺服器。此追蹤可用來診斷 TS 伺服器問題。追蹤可能包含檔案路徑、原始程式碼及您專案中可能具有敏感性的其他資訊。", + "typescript.validate.enable": "啟用/停用 TypeScript 驗證。", + "typescript.format.enable": "啟用/停用預設 TypeScript 格式器。", + "javascript.format.enable": "啟用/停用預設 JavaScript 格式器。", + "format.insertSpaceAfterCommaDelimiter": "定義逗號分隔符號後的空格處理。", + "format.insertSpaceAfterConstructor": "定義 constructor 關鍵字後空格處理。需要 TypeScript >= 2.3.0。", + "format.insertSpaceAfterSemicolonInForStatements": " 定義 for 陳述式內分號後的空格處理。", + "format.insertSpaceBeforeAndAfterBinaryOperators": "定義二元運算子後的空格處理。", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "定義控制流程陳述式內關鍵字後的空格處理方式。", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "定義匿名函式之函式關鍵字後的空格處理。", + "format.insertSpaceBeforeFunctionParenthesis": "定義如何處理函式引數括號之前的空格。TypeScript 必須 >= 2.1.5。", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "定義範本字串左右大括弧間的空格處理。需要 TypeScript >= 2.0.6。", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "定義 JSX 運算式左右大括弧間的空格處理。需要 TypeScript >= 2.0.6。", + "format.insertSpaceAfterTypeAssertion": "定義在 TypeScript 內類型宣告後空格處理。需要 TypeScript >= 2.4。", + "format.placeOpenBraceOnNewLineForFunctions": "定義是否將左大括弧放入函式的新行。", + "format.placeOpenBraceOnNewLineForControlBlocks": "定義是否將左大括弧放入控制區塊的新行。", + "javascript.validate.enable": "啟用/停用 JavaScript 驗證。", + "typescript.goToProjectConfig.title": "移至專案組態", + "javascript.goToProjectConfig.title": "移至專案組態", + "javascript.referencesCodeLens.enabled": "在JavaScript檔案啟用/停用 參考CodeLens ", + "typescript.referencesCodeLens.enabled": "在TypeScript檔案啟用/停用CodeLens參考。需要TypeScript>=2.0.6。", + "typescript.implementationsCodeLens.enabled": "啟用/停用實作 CodeLens。需要 TypeScript >= 2.2.0。", + "typescript.openTsServerLog.title": "開啟 TS 伺服器記錄", + "typescript.restartTsServer": "重新啟動TS伺服器", + "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", + "typescript.reportStyleChecksAsWarnings": "使用警告顯示樣式檢查", + "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", + "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", + "typescript.npm": "指定用於自動類型取得的 NPM 可執行檔路徑。TypeScript 必須 >= 2.3.4.", + "typescript.check.npmIsInstalled": "檢查是否已安裝NPM用以取得自動類型擷取.", + "javascript.nameSuggestions": "從JavaScript推薦表檔案中啟用/停用包含唯一檔名", + "typescript.tsc.autoDetect": "控制自動偵測 tsc 任務。 'off' 停用此功能。 'build' 僅建立單次編譯任務。 'watch' 僅建立編譯並監看任務。 'on' 同時建立編譯及監看任務。預設值為 'on'。", + "typescript.problemMatchers.tsc.label": "TypeScript 問題", + "typescript.problemMatchers.tscWatch.label": " TypeScript 問題 (監看模式)", + "typescript.quickSuggestionsForPaths": "啟用/停用在輸入匯入路徑顯示即時建議。", + "typescript.locale": "設定報告 TypeScript 錯誤的語系。需要 TypeScript >= 2.6.0。預設值 'null' 則使用 VS Code 的語系來顯示 TypeScript 錯誤。", + "javascript.implicitProjectConfig.experimentalDecorators": "啟用/停用 JavaScript 檔案中非專案部分的 'experimentalDecorators'。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", + "typescript.autoImportSuggestions.enabled": "啟用/停用 自動匯入建議。需要 TypeScript >=2.6.1", + "typescript.experimental.syntaxFolding": "啟用/停用語法感知摺疊標記。", + "taskDefinition.tsconfig.description": "定義 TS 組建的 tsconfig 檔案。", + "javascript.suggestionActions.enabled": "編輯器內啟用/停用 JavaScript 檔案建議診斷。需要 TypeScript >= 2.8", + "typescript.suggestionActions.enabled": "編輯器內啟用/停用 TypeScript 檔案建議診斷。需要 TypeScript >= 2.8" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/base/node/processes.i18n.json b/i18n/cht/src/vs/base/node/processes.i18n.json index 5989cf78970..35229bd6699 100644 --- a/i18n/cht/src/vs/base/node/processes.i18n.json +++ b/i18n/cht/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "無法在 UNC 磁碟機上執行殼層命令。" + ] } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index a2daae312b9..b51abfd46f9 100644 --- a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,10 +8,10 @@ ], "previewOnGitHub": "在 GitHub 預覽", "loadingData": "正在載入資料...", + "rateLimited": "超出了 GitHub 查詢限制。請稍候。", "similarIssues": "相似的問題", "open": "開啟", "closed": "已關閉", - "noResults": "找不到結果", "settingsSearchIssue": "設定值搜尋問題", "bugReporter": "臭蟲回報", "featureRequest": "功能要求", diff --git a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 4d744adee44..a03e5ae0f53 100644 --- a/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/cht/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,9 @@ ], "completeInEnglish": "請用英語填寫這張表格。", "issueTypeLabel": "這是一個", + "vscode": "Visual Studio Code", + "disableExtensions": "停用所有延伸模組並重新載入視窗", + "chooseExtension": "擴充功能", "issueTitleLabel": "標題", "issueTitleRequired": "請輸入標題。", "titleLengthValidation": "標題太長。", @@ -18,13 +21,6 @@ "extensions": "我的擴充功能", "searchedExtensions": "搜尋過的擴充功能", "settingsSearchDetails": "設定值搜尋詳細資料", - "tryDisablingExtensions": "是否在停用擴充功能後問題仍會發生?", - "yes": "是", - "no": "否", - "disableExtensionsLabelText": "請在 {0} 之後嘗試複製問題。", - "disableExtensions": "停用所有延伸模組並重新載入視窗", - "showRunningExtensionsLabelText": "如果您認為這是延伸模組問題,請 {0} 以回報延伸模組問題。", - "showRunningExtensions": "檢視所有執行中的延伸模組", "details": "請輸入詳細資料。", "loadingData": "正在載入資料..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..5ad17302606 --- /dev/null +++ b/i18n/cht/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "名稱", + "killProcess": "關閉處理序", + "forceKillProcess": "強制關閉處理序" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index 70d119fbd0c..a0a1e927719 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -113,7 +113,7 @@ "miZoomOut": "縮小(&&U)", "miZoomReset": "重設縮放(&&R)", "miBack": "上一步(&B)", - "miForward": "轉寄(&&F)", + "miForward": "下一頁(&&F)", "miNextEditor": "下一個編輯器(&&N)", "miPreviousEditor": "上一個編輯器(&&P)", "miNextEditorInGroup": "群組中下一個已使用的編輯器(&&N)", diff --git a/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json index 20db8e59ff5..36323e840be 100644 --- a/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/cht/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "關閉", - "header": "差異 {0} / {1}: 原始 {2},{3} 行,修改後 {4},{5} 行", "blankLine": "空白", "equalLine": "原始 {0},修改後{1}: {2", "insertLine": "+ 修改後 {0}: {1}", diff --git a/i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index abe0e03af43..1ffb558df45 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "對應 Windows 和 Linux 的 `Control` 與對應 macOS 的 `Command`", "multiCursorModifier.alt": "對應 Windows 和 Linux 的 `Alt` 與對應 macOS 的 `Option`", "multiCursorModifier": "用於新增多個滑鼠游標的修改。 `ctrlCmd` 會對應到 Windows 和 Linux 上的 `Control` 以及 macOS 上的 `Command`。 [移至定義] 及 [開啟連結] 滑鼠手勢將會適應以避免和 multicursor 修改衝突。", + "multiCursorMergeOverlapping": "在重疊時合併多個游標。", "quickSuggestions.strings": "允許在字串內顯示即時建議。", "quickSuggestions.comments": "允許在註解中顯示即時建議。", "quickSuggestions.other": "允許在字串與註解以外之處顯示即時建議。", diff --git a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json index 0dd95be0c2c..6690219f7e0 100644 --- a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "編輯器縮排輔助線的色彩。", "editorLineNumbers": "編輯器行號的色彩。", "editorActiveLineNumber": "編輯器使用中行號的色彩 ", + "deprecatedEditorActiveLineNumber": "Id 已取代。請改用 'editorLineNumber.activeForeground' 。", "editorRuler": "編輯器尺規的色彩", "editorCodeLensForeground": "編輯器程式碼濾鏡的前景色彩", "editorBracketMatchBackground": "成對括號背景色彩", @@ -28,6 +29,9 @@ "warningBorder": "編輯器內警告提示線的邊框色彩.", "infoForeground": "編輯器內資訊提示線的前景色彩", "infoBorder": "編輯器內資訊提示線的邊框色彩", + "hintForeground": "編輯器內提示訊息的提示線前景色彩", + "hintBorder": "編輯器內提示訊息的提示線邊框色彩", + "overviewRulerRangeHighlight": "概述反白範圍的尺規標記顏色。不能使用非透明的顏色來隱藏底層的樣式。", "overviewRuleError": "錯誤的概觀尺規標記色彩。", "overviewRuleWarning": "警示的概觀尺規標記色彩。", "overviewRuleInfo": "資訊的概觀尺規標記色彩。" diff --git a/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..7a628e7ee2b --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "顯示修正 ({0})", + "quickFix": "顯示修正", + "organizeImports.label": "組織匯入" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/links/links.i18n.json b/i18n/cht/src/vs/editor/contrib/links/links.i18n.json index 2671372341b..d175645515a 100644 --- a/i18n/cht/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "按住 Ctrl 並按一下滑鼠按鈕可連入連結", "links.command.mac": "按住 Cmd 並按一下滑鼠以執行命令", "links.command": "按住 Ctrl 並按一下滑鼠以執行命令", + "links.navigate.al.mac": "按住 Option 並按一下滑鼠按鈕以追蹤連結", "links.navigate.al": "按住Alt並點擊以追蹤連結", + "links.command.al.mac": "按住 Option 並按一下滑鼠以執行命令", "links.command.al": "按住 Alt 並按一下滑鼠以執行命令", "invalid.url": "因為此連結的格式不正確,所以無法開啟: {0}", "missing.url": "因為此連結目標遺失,所以無法開啟。", diff --git a/i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/cht/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index 5fc5a3e66a6..54de5e0d2da 100644 --- a/i18n/cht/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -13,6 +13,13 @@ "Thursday": "星期四", "Friday": "星期五", "Saturday": "星期六", + "SundayShort": "週日", + "MondayShort": "週一", + "TuesdayShort": "週二", + "WednesdayShort": "週三", + "ThursdayShort": "週四", + "FridayShort": "週五", + "SaturdayShort": "週六", "January": "1月", "February": "2月", "March": "3月", diff --git a/i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json index c903408c5fd..1018aa75dc7 100644 --- a/i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -10,6 +10,8 @@ "wordHighlightStrong": "寫入存取符號時的背景顏色,如寫入變數。不能使用非透明的顏色來隱藏底層的樣式。", "wordHighlightBorder": "讀取存取期間 (例如讀取變數時) 符號的邊框顏色。", "wordHighlightStrongBorder": "寫入存取期間 (例如寫入變數時) 符號的邊框顏色。 ", + "overviewRulerWordHighlightForeground": "概述反白符號的尺規標記顏色。不能使用非透明的顏色來隱藏底層的樣式。", + "overviewRulerWordHighlightStrongForeground": "概述反白寫入權限符號的尺規標記顏色。不能使用非透明的顏色來隱藏底層的樣式。", "wordHighlight.next.label": "移至下一個反白符號", "wordHighlight.previous.label": "移至上一個反白符號" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json index 7656568be84..fea1fa5538f 100644 --- a/i18n/cht/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/cht/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "在已啟用 'Developer: Startup Performance' 命令的情況下開始。", "prof-startup": "啟動時執行 CPU 分析工具", "disableExtensions": "停用所有已安裝的擴充功能。", - "inspect-extensions": "允許對擴充功能進行除錯和分析。檢查開發工具的連接 uri。", - "inspect-brk-extensions": "允許對擴展主機在啟動後暫停擴充功能進行除錯和分析。檢查開發工具中的連接 uri。", "disableGPU": "停用 GPU 硬體加速。", "uploadLogs": "上傳目前的工作階段紀錄至安全的端點。", "maxMemory": "視窗的最大記憶體大小 (以 MB 為單位)。", diff --git a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 3faa343fdfd..066b714df00 100644 --- a/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/cht/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -21,6 +21,7 @@ "quitCode": "無法安裝擴充功能。重新安裝以前請重啟 VS Code。", "exitCode": "無法安裝擴充功能。重新安裝以前請離開並再次啟動 VS Code。", "uninstallDependeciesConfirmation": "只要將 '{0}' 解除安裝,或要包含其相依性?", + "uninstallOnly": "僅擴充功能", "uninstallAll": "全部解除安裝", "uninstallConfirmation": "確定要將 '{0}' 解除安裝嗎?", "ok": "確定", diff --git a/i18n/cht/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/cht/src/vs/platform/extensions/node/extensionValidator.i18n.json index 53fba7137de..3c3d0f5631d 100644 --- a/i18n/cht/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/cht/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "無法剖析 'engines.vscode` 值 {0}。例如,請使用:^0.10.0、^1.2.3、^0.11.0、^0.10.x 等。", + "versionSyntax": "無法解析 'engines.vscode` 值 {0}。請使用範例:^1.22.0, ^1.22.x, 等。", "versionSpecificity1": "在 `engines.vscode` ({0}) 中指定的版本不夠具體。對於 1.0.0 之前的 vscode 版本,請至少定義所需的主要和次要版本。 例如 ^0.10.0、0.10.x、0.11.0 等。", "versionSpecificity2": "在 `engines.vscode` ({0}) 中指定的版本不夠具體。對於 1.0.0 之後的 vscode 版本,請至少定義所需的主要和次要版本。 例如 ^1.10.0、1.10.x、1.x.x、2.x.x 等。", "versionMismatch": "擴充功能與 Code {0} 不相容。擴充功能需要: {1}。" diff --git a/i18n/cht/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/cht/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index 5102b2af0d7..f4431d41910 100644 --- a/i18n/cht/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/cht/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "您的 {0} 安裝似乎已損毀。請重新安裝。", "integrity.moreInformation": "詳細資訊", - "integrity.dontShowAgain": "不要再顯示", - "integrity.prompt": "您的 {0} 安裝似乎已損毀。請重新安裝。" + "integrity.dontShowAgain": "不要再顯示" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json index 7117ed7c722..1633b008b0b 100644 --- a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -92,5 +92,7 @@ "mergeBorder": "內嵌合併衝突中標頭及分隔器的邊界色彩。", "overviewRulerCurrentContentForeground": "目前內嵌合併衝突的概觀尺規前景。", "overviewRulerIncomingContentForeground": "傳入內嵌合併衝突的概觀尺規前景。", - "overviewRulerCommonContentForeground": "內嵌合併衝突中的共同上階概觀尺規前景。" + "overviewRulerCommonContentForeground": "內嵌合併衝突中的共同上階概觀尺規前景。", + "overviewRulerFindMatchForeground": "概述符合尋找條件的尺規標記顏色。不能使用非透明的顏色來隱藏底層的樣式。", + "overviewRulerSelectionHighlightForeground": "概述反白選擇的尺規標記顏色。不能使用非透明的顏色來隱藏底層的樣式。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..efc4571aceb --- /dev/null +++ b/i18n/cht/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "屬性 '{0}' 為強制項目且必須屬於 `string` 類型", + "showViewlet": "顯示 {0}", + "view": "檢視" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 4a5f6d65148..97fd8a138b1 100644 --- a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "提供意見給編輯者", "views.explorer": "檔案總管檢視", "views.debug": "偵錯檢視", - "locationId.invalid": "`{0}`不是有效的識別位置", "duplicateView1": "無法在位置 '{1}' 使用相同的識別碼 '{0}' 註冊多個檢視", "duplicateView2": "識別碼為 '{0}' 的檢視已在位置 '{1}' 註冊" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 4bf77a965be..ca923fa42ab 100644 --- a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "在 {0} 毫秒後儲存時中止格式", + "timeout.onWillSave": "在 1750 亳秒後中止 onWillSaveTextDocument 事件", "saveParticipants": "執行儲存參與者..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 7aa96ea3f1e..35229bd6699 100644 --- a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "webview.editor.label": "webview 編輯器" + ] } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index afae41621bb..7dc8700e978 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,6 @@ "screenReaderDetectedExtra": "若您不打算使用螢幕助讀程式,請將設定 `editor.accessibilitySupport` 變更為 \"off\"。", "disableTabMode": "停用協助工具模式", "gotoLine": "移至行", - "indentation": "縮排", "selectEncoding": "選取編碼", "selectEOL": "選取行尾順序", "selectLanguageMode": "選取語言模式", diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 56500848556..3c1c3df6d55 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,7 @@ "sizeMB": "{0}MB", "sizeGB": "{0}GB", "sizeTB": "{0}TB", - "largeImageError": "影像的檔案大小太大 (>1MB),無法在編輯器中顯示。", "resourceOpenExternalButton": "要使用外部程式打開影像嗎?", - "nativeBinaryError": "檔案為二進位檔、非常大或使用不支援的文字編碼,因此將不會顯示於編輯器中。", "zoom.action.fit.label": "整個影像", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..e7e11a078b1 --- /dev/null +++ b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ok": "確定" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index f8343577d89..b8069009fb7 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,12 +45,17 @@ "windowConfigurationTitle": "視窗", "window.openFilesInNewWindow.on": "檔案會在新視窗中開啟", "window.openFilesInNewWindow.off": "檔案會在開啟了檔案資料夾的視窗,或在上一個使用中的視窗中開啟", + "window.openFilesInNewWindow.defaultMac": "除非從擴充座或 Finder 中開啟,否則檔案會在開啟了檔案資料夾的視窗,或在上一個使用中的視窗中開啟", + "window.openFilesInNewWindow.default": "除非已從應用程式內挑選 (例如透過 [檔案] 功能表),否則檔案會在新視窗中開啟", + "openFilesInNewWindowMac": "控制檔案是否應在新視窗中開啟。\n- default: 檔案會在視窗中隨檔案的資料夾開啟或在上一個使用中視窗開啟,除非透過擴充座或從尋找工具開啟\n- on: 檔案會在新視窗開啟\n- off: 檔案會在視窗中隨檔案的資料夾開啟或在上一個使用中視窗開啟\n請注意,在某些情況下會略過此設定 (例如,使用了 -new-window 或 -reuse-window 命令列選項時)。", + "openFilesInNewWindow": "控制是否在新視窗中打開檔案。\n- default: 檔案會在新視窗中開啟,除非從應用程式中選擇 (例如透過 \"檔案\" 功能表)\n- on: 檔案會在新視窗中開啟\n- off: 檔案會在視窗中隨檔案的資料夾開啟或在上一個使用中視窗開啟\n請注意,在某些情況下會略過此設定 (例如,使用 the -new-window 或 -reuse-window 命令列選項時)。", "window.openFoldersInNewWindow.on": "資料夾會在新視窗中開啟", "window.openFoldersInNewWindow.off": "資料夾會取代上一個使用中的視窗", "window.openFoldersInNewWindow.default": "除非已從應用程式內挑選了資料夾 (例如透過 [檔案] 功能表),否則資料夾會在新視窗中開啟", "openFoldersInNewWindow": "控制資料夾應在新視窗中開啟或取代上一個使用中的視窗。\n- default: 除非已從應用程式內挑選資料夾 (例如,透過 [檔案] 功能表),否則會在新視窗開啟\n- on: 資料夾會在新視窗開啟\n- off: 資料夾會取代上一個使用中視窗\n請注意,在某些情況下會略過此設定 (例如,使用了 -new-window 或 -reuse-window 命令列選項時)。", "window.openWithoutArgumentsInNewWindow.on": "開啟新空白視窗", "window.openWithoutArgumentsInNewWindow.off": "聚焦在上一個正在運行的執行個體", + "openWithoutArgumentsInNewWindow": "控制不以引數啟動第二個執行個體時是否要開啟新的空白視窗,或是應聚焦於上一個執行的執行個體。\n- on: 開啟新的空白視窗\n- off: 上一個使用中的執行中執行個體將會受到聚焦\n請注意:仍可能發生忽略此設定的情形 (例如,在使用 -new-window 或 -reuse-window 命令列選項時)。", "window.reopenFolders.all": "重新開啟所有視窗。", "window.reopenFolders.folders": "重新開啟所有資料夾。空白工作區將不會還原。", "window.reopenFolders.one": "重新開啟上一個使用中的視窗。", @@ -58,6 +63,7 @@ "restoreWindows": "控制重新啟動後視窗重新開啟的方式。選取 [無] 一律以空白工作區開始、選取 [一] 從上一個編輯的視窗重新開啟、選取 [資料夾] 重新開啟所有資料夾曾經開啟的視窗,或選取 [全部] 重新開啟上一個工作階段的所有視窗。", "restoreFullscreen": "控制當視窗在全螢幕模式下結束後,下次是否仍以全螢幕模式開啟。", "zoomLevel": "調整視窗的縮放比例。原始大小為 0,而且每個向上增量 (例如 1) 或向下增量 (例如 -1) 代表放大或縮小 20%。您也可以輸入小數,更細微地調整縮放比例。", + "title": "依據使用中的編輯器控制視窗標題。變數會依據內容替換:\n${activeEditorShort}: 檔案名稱 (例如 myFile.txt)\n${activeEditorMedium}: 與工作區資料夾相關的檔案路徑 (例如 myFolder/myFile.txt)\n${activeEditorLong}: 完整的檔案路徑 (例如 /Users/Development/myProject/myFolder/myFile.txt)\n${folderName}: 包含著資料夾之工作區資料夾的名稱 (例如 myFolder)\n${folderPath}: 包含著資料夾之工作區資料夾的檔案路徑 (例如 /Users/Development/myFolder)\n${rootName}: 工作區的名稱 (例如 myFolder 或 myWorkspace)\n${rootPath}: 工作區的檔案路徑 (例如 /Users/Development/myWorkspace)\n${appName}: 例如 VS Code\n${dirty}: 已變更指示 (若使用中編輯器已變更)\n${separator}: 僅在受具有值或靜態文字之變數括住時才顯示的條件式分隔符號 (\" - \")", "window.newWindowDimensions.default": "在螢幕中央開啟新視窗。", "window.newWindowDimensions.inherit": "以相同於上一個使用中之視窗的維度開啟新視窗。", "window.newWindowDimensions.maximized": "開啟並最大化新視窗。", @@ -73,6 +79,7 @@ "autoDetectHighContrast": "若啟用,如果 Windows 使用高對比佈景主題,就會自動變更為高對比佈景主題,切換掉 Windows 高對比佈景主題時則變更為深色佈景主題。", "titleBarStyle": "調整視窗標題列的外觀。變更需要完整重新啟動才會套用。", "window.nativeTabs": "啟用 macOS Sierra 視窗索引標籤。請注意需要完全重新啟動才能套用變更,並且完成設定後原始索引標籤將會停用自訂標題列樣式。", + "window.smoothScrollingWorkaround": "在還原最小化的 VS Code 視窗後,若捲動功能不再流暢,請啟用此因應措施。此因應措施適用於 Microsoft Surface 等具備精確軌跡板發生的捲動延遲問題 (https://github.com/Microsoft/vscode/issues/13612)。啟用此因應措施可能會在將視窗從最小化狀態還原後,導致版面稍微閃爍,但並不會造成任何傷害。", "zenModeConfigurationTitle": "Zen Mode", "zenMode.fullScreen": "控制開啟 Zen Mode 是否也會將 Workbench 轉換為全螢幕模式。", "zenMode.centerLayout": "控制開啟 Zen Mode 是否也會置中配置。", diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 219551b11e8..cd5762d9e8b 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "編輯中斷點...", + "breakpoint": "中斷點", "functionBreakpointsNotSupported": "此偵錯類型不支援函式中斷點", "functionBreakpointPlaceholder": "要中斷的函式", "functionBreakPointInputAriaLabel": "輸入函式中斷點", @@ -14,6 +14,7 @@ "breakpointUnverifieddHover": "未驗證的中斷點", "functionBreakpointUnsupported": "此偵錯類型不支援函式中斷點", "breakpointDirtydHover": "未驗證的中斷點。檔案已修改,請重新啟動偵錯工作階段。", + "logBreakpointUnsupported": "此偵錯類型不支援紀錄點", "conditionalBreakpointUnsupported": "此偵錯類型不支援的條件式中斷點", "hitBreakpointUnsupported": "此偵錯類型不支援點擊條件式中斷點" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index c84d5a3227a..2c747d5afe2 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "偵錯: 切換中斷點", "conditionalBreakpointEditorAction": "偵錯: 新增條件中斷點...", + "logPointEditorAction": "偵錯: 新增紀錄點...", "runToCursor": "執行至游標處", "debugEvaluate": "偵錯: 評估", "debugAddToWatch": "偵錯: 加入監看", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 314e9cddf9c..357f07f4254 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,7 @@ ], "breakpointWidgetHitCountPlaceholder": "符合叫用次數條件時中斷。按 'Enter' 鍵接受,按 'esc' 鍵取消。", "breakpointWidgetExpressionPlaceholder": "在運算式評估為 true 時中斷。按 'Enter' 鍵接受,按 'esc' 鍵取消。", - "breakpointWidgetHitCountAriaLabel": "程式只會在符合叫用次數時於此處停止。按 Enter 鍵接受,或按 Escape 鍵取消。", - "breakpointWidgetAriaLabel": "程式只有在此條件為 true 時才會在此停止。請按 Enter 鍵接受,或按 Esc 鍵取消。", "expression": "運算式", - "hitCount": "叫用次數" + "hitCount": "叫用次數", + "logMessage": "日誌訊息" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index a3ce7418d3b..94fb09e76eb 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "請使用唯一的組態名稱。", "app.launch.json.compound.folder": "複合所在的資料夾名稱。", "app.launch.json.compounds.configurations": "將會作為此複合一部份而啟動之組態的名稱。", - "debugNoType": "偵錯配接器 'type' 不能省略且必須屬於 'string' 類型。", "selectDebug": "選取環境", "DebugConfig.failed": "無法在 '.vscode' 資料夾 ({0}) 中建立 'launch.json' 檔案。", "workspace": "工作區", diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 21124f7d54b..e48c78a24f2 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "編輯中斷點...", - "disableBreakpoint": "停用中斷點", - "enableBreakpoint": "啟用中斷點", + "breakpoint": "中斷點", "removeBreakpoints": "移除中斷點", "removeBreakpointOnColumn": "移除資料行 {0} 的中斷點", "removeLineBreakpoint": "移除行中斷點", @@ -21,6 +19,8 @@ "enableBreakpoints": "啟用資料行 {0} 的中斷點", "enableBreakpointOnLine": "啟用行中斷點", "addBreakpoint": "加入中斷點", - "conditionalBreakpoint": "新增條件中斷點...", + "addConditionalBreakpoint": "新增條件中斷點...", + "addLogPoint": "新增紀錄點...", + "cancel": "取消", "addConfiguration": "新增組態..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index a23b2bbf4ba..00af2e04bbf 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "詳細資訊", - "unableToLaunchDebugAdapter": "無法從 '{0}' 啟動偵錯配接器。", - "unableToLaunchDebugAdapterNoArgs": "無法啟動偵錯配接器。", - "stoppingDebugAdapter": "{0}。正在停止偵錯配接器。", "debugAdapterCrash": "偵錯配接器處理序已意外終止" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index d4a12e733ff..b15f9a6ac6a 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "偵錯配接器可執行檔 '{0}' 不存在。", "debugAdapterCannotDetermineExecutable": "無法判斷偵錯配接器 '{0}' 的可執行檔。", - "launch.config.comment1": "使用 IntelliSense 以得知可用的屬性。", - "launch.config.comment2": "暫留以檢視現有屬性的描述。", - "launch.config.comment3": "如需詳細資訊,請瀏覽: {0}", - "debugType": "組態的類型。", - "debugTypeNotRecognised": "無法辨識此偵錯類型.請確認已有安裝並啟用相對應的偵錯擴充功能.", - "node2NotSupported": "\"node2\" 已不再支援,請改用 \"node\",並將 \"protocol\" 屬性設為 \"inspector\"。", - "debugName": "組態的名稱; 出現在啟動組態下拉式功能表中。", - "debugRequest": "要求組態的類型。可以是 [啟動] 或 [附加]。", - "debugServer": "僅限偵錯延伸模組開發: 如果指定了連接埠,VS Code 會嘗試連線至以伺服器模式執行的偵錯配接器", - "debugPrelaunchTask": "偵錯工作階段啟動前要執行的工作。", - "debugWindowsConfiguration": "Windows 特定的啟動設定屬性。", - "debugOSXConfiguration": "OS X 特定的啟動設定屬性。", - "debugLinuxConfiguration": "Linux 特定的啟動設定屬性。", - "deprecatedVariables": "'env.'、'config.' 及 'command.' 已標示為即將淘汰,請改用 'env:'、'config:' 及 'command:'。" + "unableToLaunchDebugAdapter": "無法從 '{0}' 啟動偵錯配接器。", + "unableToLaunchDebugAdapterNoArgs": "無法啟動偵錯配接器。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..49c1a7df761 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "使用 IntelliSense 以得知可用的屬性。", + "launch.config.comment2": "暫留以檢視現有屬性的描述。", + "launch.config.comment3": "如需詳細資訊,請瀏覽: {0}", + "debugType": "組態的類型。", + "debugTypeNotRecognised": "無法辨識此偵錯類型.請確認已有安裝並啟用相對應的偵錯擴充功能.", + "node2NotSupported": "\"node2\" 已不再支援,請改用 \"node\",並將 \"protocol\" 屬性設為 \"inspector\"。", + "debugName": "組態的名稱; 出現在啟動組態下拉式功能表中。", + "debugRequest": "要求組態的類型。可以是 [啟動] 或 [附加]。", + "debugServer": "僅限偵錯延伸模組開發: 如果指定了連接埠,VS Code 會嘗試連線至以伺服器模式執行的偵錯配接器", + "debugPrelaunchTask": "偵錯工作階段啟動前要執行的工作。", + "debugPostDebugTask": "偵錯工作階段結束後要執行的工作。", + "debugWindowsConfiguration": "Windows 特定的啟動設定屬性。", + "debugOSXConfiguration": "OS X 特定的啟動設定屬性。", + "debugLinuxConfiguration": "Linux 特定的啟動設定屬性。", + "deprecatedVariables": "'env.'、'config.' 及 'command.' 已標示為即將淘汰,請改用 'env:'、'config:' 及 'command:'。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..afdfcfb0e98 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "VS Code 主控台", + "mac.terminal.script.failed": "指令碼 '{0}' 失敗,結束代碼為 {1}", + "mac.terminal.type.not.supported": "不支援 '{0}'", + "press.any.key": "請按任意鍵繼續...", + "linux.term.failed": "'{0}' 失敗,結束代碼為 {1}" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 5709df0fdf0..beddde6d10c 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -58,6 +58,8 @@ "configureWorkspaceFolderRecommendedExtensions": "設定建議的延伸模組 (工作區資料夾) ", "malicious tooltip": "這個延伸模組曾經被回報是有問題的。", "malicious": "惡意", + "disabled": "停用", + "disabled globally": "停用", "disabled workspace": "在此工作區停用", "disableAll": "停用所有已安裝的延伸模組", "disableAllWorkspace": "停用此工作區的所有已安裝延伸模組", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 0f0a8bc1904..49e59b56429 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -36,8 +36,6 @@ "view location": "位置", "localizations": "當地語系化 ({0})", "localizations language id": "語言識別碼", - "localizations language name": "語言名稱", - "localizations localized language name": "語言名稱 (在地化)", "colorThemes": "色彩佈景主題 ({0})", "iconThemes": "圖示佈景主題 ({0}) ", "colors": "色彩 ({0})", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index a6842652e2e..4c641b129be 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "根據目前工作區的使用者,建議您使用此延伸模組。", "reallyRecommended2": "建議對此檔案類型使用 '{0}' 延伸模組。", "reallyRecommendedExtensionPack": "建議對此檔案類型使用 '{0}' 延伸模組套件。", - "showRecommendations": "顯示建議", "install": "安裝", + "showRecommendations": "顯示建議", "showLanguageExtensions": "市集有 '.{0}' 個文件的擴充功能可以提供協助", "workspaceRecommended": "此工作區具有擴充功能建議。", "installAll": "全部安裝", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index c1249a2f499..c096eb60a7d 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "要停用其他按鍵對應 ({0}),以避免按鍵繫結關係間的衝突嗎?", "yes": "是", - "no": "否", - "betterMergeDisabled": "目前已內建 Better Merge 延伸模組,安裝的延伸模組已停用並且可以移除。", - "uninstall": "解除安裝" + "no": "否" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 4bed8103f5e..14b49f43b71 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,8 @@ "recommendedExtensions": " 推薦項目", "otherRecommendedExtensions": "其他建議", "workspaceRecommendedExtensions": "工作區建議", + "builtInExtensions": "功能", + "builtInThemesExtensions": "主題", "searchExtensions": "在 Marketplace 中搜尋擴充功能", "sort by installs": "排序依據: 安裝計數", "sort by rating": "排序依據: 評等", diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 313bfa047bc..79ad427acdd 100644 --- a/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -36,7 +36,8 @@ "irreversible": "此動作無法回復!", "binFailed": "無法使用資源回收筒刪除。您要改為永久刪除嗎? ", "trashFailed": "無法使用垃圾筒刪除。您要改為永久刪除嗎?", - "importFiles": "匯入檔案", + "deletePermanentlyButtonLabel": "永久刪除(&&D)", + "retryButtonLabel": "重試(&&R)", "confirmOverwrite": "目的資料夾中已有同名的檔案或資料夾。要取代它嗎?", "replaceButtonLabel": "取代(&&R)", "fileIsAncestor": "要貼上的檔案是在目地資料夾的上層 ", diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index c024cac3cb0..ef1a56ddaa3 100644 --- a/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -37,6 +37,7 @@ "defaultLanguage": "指派給新檔案的預設語言模式。", "editorConfigurationTitle": "編輯器", "formatOnSave": "在儲存時設定檔案格式。格式器必須處於可用狀態、檔案不得自動儲存,且編輯器不得關機。", + "formatOnSaveTimeout": "儲存時格式化超時。指定 formatOnSave 命令的時間限制 (以毫秒為單位)。超過指定超時時間的命令將被取消。", "explorerConfigurationTitle": "檔案總管", "openEditorsVisible": "[開放式編輯器] 窗格中顯示的編輯器數目。", "autoReveal": "控制總管是否在開啟檔案時自動加以顯示及選取。", diff --git a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 3f54e82bcea..b183fbaeaf8 100644 --- a/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,12 +7,12 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "輸入檔案名稱。請按 Enter 鍵確認或按 Esc 鍵取消。", - "constructedPath": "在 **{1}** 建立 {0}", "filesExplorerViewerAriaLabel": "{0},檔案總管", "dropFolders": "要在工作區新增資料夾嗎?", "dropFolder": "要在工作區新增資料夾嗎?", "addFolders": "新增資料夾(&A)", "addFolder": "新增資料夾(&A)", + "confirmRootsMove": "您確定要變更工作區中多個根資料夾的順序嗎?", "confirmMultiMove": "確定要移動以下 {0} 個文件嗎?", "confirmRootMove": "您確定要變更工作區中根資料夾 '{0}' 的順序嗎? ", "confirmMove": "確定要移動 '{0}' 嗎?", diff --git a/i18n/cht/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index c79987737e6..42320096aec 100644 --- a/i18n/cht/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "您想要變更 VS Code 的 UI 語言為 {0} 並重新啟動嗎?", "yes": "是", "no": "否", - "doNotAskAgain": "不要再詢問我", + "neverAgain": "不要再顯示", "JsonSchema.locale": "要使用的 UI 語言。", "vscode.extension.contributes.localizations": "提供在地化服務給編輯者", "vscode.extension.contributes.localizations.languageId": "顯示已翻譯字串的語言 Id", diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index 88fd157d4b8..505303ab7e3 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "複製", - "copyMarkerMessage": "複製訊息" + "copyMessage": "複製訊息" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 8e9b2618050..9459b771c76 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "共 {0} 項問題", - "filteredProblems": "顯示 {1} 的 {0} 問題" + "totalProblems": "共 {0} 項問題" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 84c0330c5cb..cc0be28b025 100644 --- a/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "問題", "markers.panel.aria.label.problems.tree": "依檔案分組的問題", "markers.panel.no.problems.build": "目前在工作區中未偵測到任何問題。", - "markers.panel.no.problems.filters": "使用提供的篩選準則找不到任何結果", "markers.panel.action.filter": "篩選問題", - "markers.panel.filter.placeholder": "依類型或文字篩選", + "markers.panel.filter.ariaLabel": "篩選問題", "markers.panel.filter.errors": "錯誤", "markers.panel.filter.warnings": "警告", "markers.panel.filter.infos": "資訊", @@ -30,5 +29,15 @@ "markers.panel.multiple.unknowns.label": "{0} 個未知", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "發生 {1} 個問題的 {0}", + "problems.tree.aria.label.marker.relatedInformation": "此問題在 {0} 個位置有參考。", + "problems.tree.aria.label.error.marker": "{0} 產生的錯誤: 在行 {2} 與字元 {3} 的 {1}。{4} ", + "problems.tree.aria.label.error.marker.nosource": "錯誤: {0} 在行 {1} 和字元 {2}.{3}", + "problems.tree.aria.label.warning.marker": "{0} 產生的警告: 在行 {2} 與字元 {3} 的 {1}。{4} ", + "problems.tree.aria.label.warning.marker.nosource": "警告: 在行 {1} 與字元 {2} 的 {0}。{3}", + "problems.tree.aria.label.info.marker": "{0} 產生的資訊: 在行 {2} 與字元 {3} 的 {1}。{4}", + "problems.tree.aria.label.info.marker.nosource": "資訊: 在行 {1} 與字元 {2} 的 {0}。{3} ", + "problems.tree.aria.label.marker": "{0} 產生的問題: 在行 {2} 與字元 {3} 的 {1}。{4} ", + "problems.tree.aria.label.marker.nosource": "問題: 在行 {1} 與字元 {2} 的 {0}。{3} ", + "problems.tree.aria.label.relatedinfo.message": "在第 {1} 行的 {0},以及在 {3} 的 {2} 字元", "errors.warnings.show.label": "顯示錯誤和警告" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/cht/src/vs/workbench/parts/output/browser/outputActions.i18n.json index 6f396ee79c2..f5bbc727caf 100644 --- a/i18n/cht/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "切換輸出", "clearOutput": "清除輸出", "toggleOutputScrollLock": "切換輸出 SCROLL LOCK", - "switchToOutput.label": "切換至輸出" + "switchToOutput.label": "切換至輸出", + "openInLogViewer": "開啟日誌檔案" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index b1a05feb9e7..d1554edfa0a 100644 --- a/i18n/cht/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "輸出", "logViewer": "紀錄檢視器", "viewCategory": "檢視", - "clearOutput.label": "清除輸出" + "clearOutput.label": "清除輸出", + "openActiveLogOutputFile": "檢視: 開啟活動日誌輸出檔案" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 8134d240e08..fc90fe51e84 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "鍵盤快速鍵(&&K)", "showDefaultKeybindings": "顯示預設按鍵繫結", "showUserKeybindings": "顯示使用者按鍵繫結", "SearchKeybindings.AriaLabel": "搜尋按鍵繫結關係", diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 903d12aaed4..aadc754a854 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "開啟原始預設設置", + "openSettings": "開啟設定", "openGlobalSettings": "開啟使用者設定", "openGlobalKeybindings": "開啟鍵盤快速鍵", "openGlobalKeybindingsFile": "開啟鍵盤快速鍵檔案", diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 7f9e4282439..566a9672a3c 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "預設設定", "SearchSettingsWidget.AriaLabel": "搜尋設定", "SearchSettingsWidget.Placeholder": "搜尋設定", "noSettingsFound": "沒有結果", @@ -16,6 +15,8 @@ "nlpResult": "自然語言結果", "filterResult": "篩選結果", "defaultSettings": "預設設定", + "defaultUserSettings": "預設使用者設定", + "defaultWorkspaceSettings": "預設工作區設定", "defaultFolderSettings": "預設資料夾設定", "defaultEditorReadonly": "在右方編輯器中編輯以覆寫預設。", "preferencesAriaLabel": "預設喜好設定。唯讀文字編輯器。" diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 1349faf0322..912f924cec9 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "顯示擴充功能 \"{0}\"", "editTtile": "編輯", "replaceDefaultValue": "在設定中取代", - "copyDefaultValue": "複製到設定", - "unsupportedPHPExecutablePathSetting": "這項設定必須是使用者設定。若要設定工作區的 PHP,請開啟 PHP 檔案並按一下狀態列中的 [PHP 路徑]。", - "unsupportedWorkspaceSetting": "這項設定必須是使用者設定。", - "unsupportedWorkbenchSetting": "目前無法套用此設定。要在您直接開啟此資料夾時才會套用。", - "unsupportedWorkbenchSettingDevMode": "目前無法套用此設定。若您在註冊時將其範圍定義為「資源」,或您直接開啟此資料夾時,才會套用該設定。 " + "copyDefaultValue": "複製到設定" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index d4515832082..4bf0fb57a82 100644 --- a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "安裝額外SCM提供者...", "no open repo": "沒有使用中的原始檔控制提供者。", "source control": "原始檔控制", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "隱藏" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 41f5ce40bb7..1b7c3b9b6fa 100644 --- a/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "顯示下一個搜尋包含模式", "previousSearchIncludePattern": "顯示上一個搜尋包含模式", + "nextSearchExcludePattern": "顯示下一個搜尋排除模式", + "previousSearchExcludePattern": "顯示上一個搜尋排除模式", "nextSearchTerm": "顯示下一個搜尋字詞", "previousSearchTerm": "顯示上一個搜尋字詞", - "showSearchViewlet": "顯示搜尋", "findInFiles": "在檔案中尋找", "replaceInFiles": "檔案中取代", "RefreshAction.label": "重新整理", diff --git a/i18n/cht/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/cht/src/vs/workbench/parts/search/browser/searchView.i18n.json index bbc143a1217..4578dbafa9e 100644 --- a/i18n/cht/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,9 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "切換搜尋詳細資料", - "searchIncludeExclude.label": "要包含/排除的檔案", - "searchIncludeExclude.ariaLabel": "搜索包含/排除模式 ", - "searchIncludeExclude.placeholder": "例如:src, !*.ts, test/**/*.log", + "searchScope.includes": "要包含的檔案", + "label.includes": "搜尋包含模式", + "searchScope.excludes": "要排除的檔案", + "label.excludes": "搜尋排除模式", "replaceAll.confirmation.title": "全部取代", "replaceAll.confirm.button": "取代(&&R)", "replaceAll.occurrence.file.message": "已將 {1} 個檔案中的 {0} 個相符項目取代為 '{2}'。", diff --git a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 39cad4cb3d4..1ab677e6ae2 100644 --- a/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "搜尋", + "copyMatchLabel": "複製", + "copyPathLabel": "複製路徑", + "copyAllLabel": "全部複製", "findInFolder": "在資料夾中尋找...", "findInWorkspace": "在工作區中尋找...", "showTriggerActions": "前往工作區中的符號...", "name": "搜尋", - "search": "搜尋", "showSearchViewl": "顯示搜尋", "view": "檢視", "findInFiles": "在檔案中尋找", @@ -25,6 +28,5 @@ "search.quickOpen.includeSymbols": "設定以將全域符號搜尋的結果納入 Quick Open 的檔案結果中。", "search.followSymlinks": "控制是否要在搜尋時遵循 symlink。", "search.smartCase": "如果搜尋式為全部小寫,則用不分大小寫的搜尋,否則用分大小寫的搜尋", - "search.globalFindClipboard": "控制搜尋檢視是否應讀取或修改 macOS 上的共用尋找剪貼簿 (shared find clipboard)", - "search.location": "預覽: 控制搜尋會在資訊看板顯示為檢視,或在面板區域顯示為面板以取得更多水平空間。下個版本的面板搜尋將具有改善的水平版面配置,而此項目將不再處於預覽階段。" + "search.globalFindClipboard": "控制搜尋檢視是否應讀取或修改 macOS 上的共用尋找剪貼簿 (shared find clipboard)" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index ef6eef03108..0d09e32233d 100644 --- a/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "協助我們改善{0}", "takeShortSurvey": "填寫簡短調查問卷", "remindLater": "稍後再提醒我", - "neverAgain": "不要再顯示", - "helpUs": "協助我們改善{0}" + "neverAgain": "不要再顯示" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 9d71ec68080..4b75935cfb3 100644 --- a/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "您願意填寫簡短的意見反應問卷嗎?", "takeSurvey": "填寫問卷", "remindLater": "稍後再提醒我", - "neverAgain": "不要再顯示", - "surveyQuestion": "您願意填寫簡短的意見反應問卷嗎?" + "neverAgain": "不要再顯示" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index 229384af3d5..bd7d5bfc2f7 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "問題模式或所提供或預先定義之問題模式的名稱。如有指定基底,即可發出。", "ProblemMatcherSchema.base": "要使用之基底問題比對器的名稱。", "ProblemMatcherSchema.owner": "Code 內的問題擁有者。如果指定基底,則可以省略。如果省略且未指定基底,預設為 [外部]。", + "ProblemMatcherSchema.source": "可供人們閱讀的診斷描述來源,例如 'typescript' 或 'super lint'。", "ProblemMatcherSchema.severity": "擷取項目問題的預設嚴重性。如果模式未定義嚴重性的符合群組,就會加以使用。", "ProblemMatcherSchema.applyTo": "控制文字文件上所回報的問題僅會套用至開啟的文件、關閉的文件或所有文件。", "ProblemMatcherSchema.fileLocation": "定義問題模式中所回報檔案名稱的解譯方式。", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 02db571b804..4c9bd3ae056 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -29,6 +29,9 @@ "JsonSchema.tasks.group": "定義工作屬於哪個執行群組。支援將 「組建」新增到組建群組,以及將「測試」新增到測試群組。", "JsonSchema.tasks.type": "定義工作在殼層中會作為處理序或命令來執行。", "JsonSchema.command.quotedString.value": "實際命令值", + "JsonSchema.tasks.quoting.escape": "使用殼層逸出字元的逸出字元 (例如 ` under PowerShell 與 \\ under bash)。", + "JsonSchema.tasks.quoting.strong": "使用殼層的強式引號字元將引數括住 (例如 PowerShell 及 Bash 下的 \")。", + "JsonSchema.tasks.quoting.weak": "使用殼層的弱式引號字元將引數括住 (例如 PowerShell 及 Bash 下的 ')", "JsonSchema.command.quotesString.quote": "如何引用命令值。", "JsonSchema.command": "要執行的命令。可以是外部程式或殼層命令。", "JsonSchema.args.quotedString.value": "實際參數值", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index d2f0c4f360a..06b20143d00 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,6 +11,7 @@ "totalErrors": "{0} 個錯誤", "totalWarnings": "{0} 個警告", "totalInfos": "{0} 個資訊", + "problems": "問題", "building": "建置中...", "manyProblems": "10K+", "runningTasks": "顯示執行中的工作", @@ -30,8 +31,8 @@ "selectProblemMatcher": "選取錯誤和警告的種類以掃描工作輸出", "customizeParseErrors": "當前的工作組態存在錯誤.請更正錯誤再執行工作.", "moreThanOneBuildTask": "定義了很多建置工作於tasks.json.執行第一個.", - "TaskSystem.activeSame.background": "工作 '{0}' 已在使用中並處於背景模式。若要予以終止,請使用 [Tasks] \\(工作\\) 功能表的 [Terminate Task...] \\(終止工作...\\)。", - "TaskSystem.activeSame.noBackground": "工作 '{0}' 已在使用中。若要予以終止,請使用 [Tasks] \\(工作\\) 功能表的 [Terminate Task...] \\(終止工作...\\)。", + "terminateTask": "終止工作", + "restartTask": "重新啟動工作", "TaskSystem.active": "已有工作在執行。請先終止該工作,然後再執行其他工作。", "TaskSystem.restartFailed": "無法終止再重新啟動工作 {0}", "TaskService.noConfiguration": "錯誤: {0} 工作偵測未替下列組態提供工作:\n{1}\n將會忽略該工作。\n", @@ -48,8 +49,8 @@ "recentlyUsed": "最近使用的工作", "configured": "設定的工作", "detected": "偵測到的工作", - "TaskService.notAgain": "不要再顯示", "TaskService.ignoredFolder": "因為下列工作區資料夾使用工作版本 0.1.0,所以已略過: {0}", + "TaskService.notAgain": "不要再顯示", "TaskService.pickRunTask": "請選取要執行的工作", "TaslService.noEntryToRun": "找不到任何要執行的工作。請設定工作...", "TaskService.fetchingBuildTasks": "正在擷取組建工作...", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 00b03ef2ad6..b9d0cc54748 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "警告: options.cwd 必須屬於字串類型。即將忽略值 {0}。", + "ConfigurationParser.inValidArg": "錯誤: 命令參數必須是字串或帶引號的字串。提供的值為:\n{0}", "ConfigurationParser.noargs": "錯誤: 命令引數必須是字串陣列。提供的值為:\n{0}", "ConfigurationParser.noShell": "警告: 只有在終端機中執行工作時才支援殼層組態。", "ConfigurationParser.noName": "錯誤: 宣告範圍中的問題比對器必須有名稱:\n{0}\n", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..2657899133e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "終端機的背景色彩,允許終端機和面板的色彩不同。", + "terminal.foreground": "終端機的前景色彩。", + "terminalCursor.foreground": "終端機游標的前景色彩。", + "terminalCursor.background": "終端機游標的背景色彩。允許區塊游標重疊於自訂字元色彩。", + "terminal.selectionBackground": "終端機的選取項目背景色彩。", + "terminal.border": "在終端機內將窗格分割之邊界的色彩。預設為 panel.border。", + "terminal.ansiColor": "終端機中的 '{0}' ANSI 色彩。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 08bb4aff71d..5ca89988fe2 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -43,6 +43,7 @@ "workbench.action.terminal.scrollUpPage": "向上捲動 (頁)", "workbench.action.terminal.scrollToTop": "捲動至頂端", "workbench.action.terminal.clear": "清除", + "workbench.action.terminal.clearSelection": "清除選取項目", "workbench.action.terminal.allowWorkspaceShell": "允許工作區外觀配置", "workbench.action.terminal.disallowWorkspaceShell": "不允許工作區外觀設置", "workbench.action.terminal.rename": "重新命名", @@ -51,5 +52,9 @@ "workbench.action.terminal.hideFindWidget": "隱藏尋找小工具", "nextTerminalFindTerm": "顯示下一個尋找字詞", "previousTerminalFindTerm": "顯示上一個尋找字詞", - "quickOpenTerm": "切換使用中的終端機 " + "quickOpenTerm": "切換使用中的終端機 ", + "workbench.action.terminal.scrollToPreviousCommand": "捲動至上一個命令", + "workbench.action.terminal.scrollToNextCommand": "捲動至下一個命令", + "workbench.action.terminal.selectToPreviousCommand": "選取上一個命令", + "workbench.action.terminal.selectToNextCommand": "選取下一個命令" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 0b5ee94a971..18f46d9ce41 100644 --- a/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "此工作區包含只能在 [使用者設定] 中進行的設定 ({0})。點擊 [這裡]({1}) 了解更多。", "openWorkspaceSettings": "開啟工作區設定", - "dontShowAgain": "不要再顯示", - "unsupportedWorkspaceSettings": "此工作區包含只能在 [使用者設定] 中進行的設定 ({0})。點擊 [這裡]({1}) 了解更多。" + "dontShowAgain": "不要再顯示" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 2e7dd953797..bc2c29afc58 100644 --- a/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "稍後", "releaseNotes": "版本資訊", "showReleaseNotes": "顯示版本資訊", "read the release notes": "歡迎使用 {0} v{1}! 您要閱讀版本資訊嗎?", @@ -16,13 +15,12 @@ "updateIsReady": "新的 {0} 更新已可用。", "noUpdatesAvailable": "目前沒有任何可用的更新。", "ok": "確定", - "download now": "立即下載", "thereIsUpdateAvailable": "已有更新可用。", + "download now": "立即下載", + "later": "稍後", "installUpdate": "安裝更新", - "updateAvailable": "已有更新可用: {0} {1}", "updateInstalling": "{0} {1} 正在背景執行安裝,完成後我們會通知您。", "updateNow": "立即更新", - "updateAvailableAfterRestart": "{0} 重新啟動後將會更新。", "commandPalette": "命令選擇區...", "settings": "設定", "keyboardShortcuts": "鍵盤快速鍵(&&K)", diff --git a/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 7aa96ea3f1e..b50b4d83e7d 100644 --- a/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview 編輯器" + "webview.editor.label": "webview 編輯器", + "developer": "開發人員" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..b418d6bed42 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "開啟 Webview Developer 工具" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index c7e785dc15e..c089b63f259 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "允許 Microsoft 收集使用率資料來協助改進 VS Code。閱讀我們的 [隱私權聲明] ({0}) 以及學習如何 [選擇退出] ({1})。", + "telemetryOptOut.optInNotice": "允許 Microsoft 收集使用率資料來協助改進 VS Code。閱讀我們的 [隱私權聲明] ({0}) 以及學習如何 [選擇參加] ({1})。", "telemetryOptOut.readMore": "閱讀其他資訊" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 8104e02472c..c1ac321018a 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "工具與語言", "welcomePage.installExtensionPacksDescription": "安裝{0}與{1}的支援功能。", "welcomePage.moreExtensions": "更多", - "welcomePage.installKeymapDescription": "安裝鍵盤快速鍵", - "welcomePage.installKeymapExtension": "安裝鍵盤快速鍵{0}與{1}", "welcomePage.others": "其他", "welcomePage.colorTheme": "彩色佈景主題", "welcomePage.colorThemeDescription": "將編輯器及您的程式碼設定成您喜愛的外觀", diff --git a/i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..b292db4923f --- /dev/null +++ b/i18n/cht/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedWindowSetting": "目前無法套用此設定。要在您直接開啟此資料夾時才會套用。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 325db145496..35229bd6699 100644 --- a/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,14 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "canNotResolveWorkspaceFolder": "無法解析 $ {workspaceFolder}。請開啟一個資料夾。", - "canNotResolveLineNumber": " 無法解析 $ {lineNumber} , 請打開編輯器。", - "canNotResolveSelectedText": "無法解析 $ {selectedText} , 請開啟編輯器。", - "canNotResolveFile": "無法解析 $ {file} , 請開啟編輯器。", - "canNotResolveRelativeFile": "無法解析 $ {relativeFile} , 請開啟編輯器。", - "canNotResolveFileDirname": "無法解析 $ {fileDirname} , 請開啟編輯器。", - "canNotResolveFileExtname": "無法解析 $ {fileExtname} , 請開啟編輯器。", - "canNotResolveFileBasename": "無法解析 $ {fileBasename} , 請開啟編輯器。", - "canNotResolveFileBasenameNoExtension": "無法解析 $ {fileBasenameNoExtension} , 請開啟編輯器。" + ] } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index b8196a053ae..4d5641feb37 100644 --- a/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "延伸主機意外終止。", "extensionHostProcess.unresponsiveCrash": "因為延伸主機沒有回應,所以意外終止。", - "devTools": "開發人員工具", "restart": "重新啟動延伸主機", "overwritingExtension": "正在以 {1} 覆寫延伸模組 {0}。", "extensionUnderDevelopment": "正在載入位於 {0} 的開發延伸模組", diff --git a/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 5a1684b4dee..5f4414cf665 100644 --- a/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,11 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "需要 Microsoft .NET Framework 4.5。請連入此連結進行安裝。", "installNet": "下載 .NET Framework 4.5", "neverShowAgain": "不要再顯示", - "netVersionError": "需要 Microsoft .NET Framework 4.5。請連入此連結進行安裝。", - "learnMore": "說明", "enospcError": "{0} 無法監看此大型工作區中的檔案變更。請按照連結中的說明來解決此問題。", + "learnMore": "說明", + "fileInvalidPath": "檔案資源 ({0}) 無效", + "fileIsDirectoryError": "檔案是目錄", + "fileNotModifiedError": "未修改檔案的時間", + "fileTooLargeError": "檔案太大無法開啟", + "fileNotFoundError": "找不到檔案 ({0})", + "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟", + "filePermission": "寫至檔案 ({0}) 的權限遭拒", + "fileExists": "要建立的檔案已存在 ({0})", + "fileModifiedError": "修改檔案的時間", + "fileReadOnlyError": "檔案為唯讀", + "fileMoveConflict": "無法移動/複製。目的地已存在檔案。", + "unableToMoveCopyError": "無法移動/複製。檔案會取代其所在的資料夾。", "binFailed": "無法將 '{0}' 移至資源回收筒", "trashFailed": "無法將 '{0}' 移動至垃圾" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 445082ba333..5b44b85bd11 100644 --- a/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "找不到檔案 ({0})", "fileIsDirectoryError": "檔案是目錄", "fileNotModifiedError": "未修改檔案的時間", "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟" diff --git a/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index 5b30d29c44f..9579a990fa8 100644 --- a/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "tmLanguage 檔案所使用的 textmate 範圍名稱。", "vscode.extension.contributes.grammars.path": "tmLanguage 檔案的路徑。此路徑是擴充功能資料夾的相對路徑,而且一般會以 './syntaxes/' 開頭。", "vscode.extension.contributes.grammars.embeddedLanguages": "如果此文法包含內嵌語言,即為範圍名稱到語言識別碼的對應。", + "vscode.extension.contributes.grammars.tokenTypes": "範圍名稱到象徵類型的對應。", "vscode.extension.contributes.grammars.injectTo": "要插入此文法的語言範圍名稱清單。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index a06e75b15d3..2f6acd42b1f 100644 --- a/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/cht/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "'contributes.{0}.path' 中應有字串。提供的值: {1}", "invalid.injectTo": "`contributes.{0}.injectTo` 中的值無效。必須是語言範圍名稱的陣列。提供的值: {1}", "invalid.embeddedLanguages": "`contributes.{0}.embeddedLanguages` 中的值無效。必須是從範圍名稱到語言的物件對應。提供的值: {1}", + "invalid.tokenTypes": "`contributes.{0}.tokenTypes` 的值無效。必須是從範圍名稱到象徵類型的物件對應。提供的值: {1} ", "invalid.path.1": "擴充功能資料夾 ({2}) 應包含 'contributes.{0}.path' ({1})。這可能會導致擴充功能無法移植。", "no-tm-grammar": "此語言未註冊任何 TM 文法。" } \ No newline at end of file diff --git a/i18n/deu/extensions/css-language-features/package.i18n.json b/i18n/deu/extensions/css-language-features/package.i18n.json index 0d84b581b18..6c525265ecf 100644 --- a/i18n/deu/extensions/css-language-features/package.i18n.json +++ b/i18n/deu/extensions/css-language-features/package.i18n.json @@ -8,6 +8,7 @@ ], "displayName": "CSS Sprachfeatures", "description": "Bietet umfangreiche Sprachunterstützung für CSS-, LESS- und SCSS-Dateien.", + "css.title": "CSS", "css.lint.argumentsInColorFunction.desc": "Ungültige Parameteranzahl.", "css.lint.boxModel.desc": "Verwenden Sie width oder height nicht beim Festlegen von padding oder border", "css.lint.compatibleVendorPrefixes.desc": "Stellen Sie beim Verwenden vom anbieterspezifischen Präfix sicher, dass alle anderen anbieterspezifischen Eigenschaften miteinbezogen werden", diff --git a/i18n/deu/extensions/css/package.i18n.json b/i18n/deu/extensions/css/package.i18n.json index a9ceacd1102..aed34432417 100644 --- a/i18n/deu/extensions/css/package.i18n.json +++ b/i18n/deu/extensions/css/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "CSS-Sprachgrundlagen" + "displayName": "CSS-Sprachgrundlagen", + "description": "Bietet Syntax-Highlighting und Bracket-Matching für CSS, LESS und SCSS Dateien." } \ No newline at end of file diff --git a/i18n/deu/extensions/emmet/package.i18n.json b/i18n/deu/extensions/emmet/package.i18n.json index 0dac2469d98..280cca4ed3d 100644 --- a/i18n/deu/extensions/emmet/package.i18n.json +++ b/i18n/deu/extensions/emmet/package.i18n.json @@ -35,7 +35,6 @@ "emmetExtensionsPath": "Pfad zu einem Ordner mit Emmet-Profilen und Ausschnitten.", "emmetShowExpandedAbbreviation": "Zeigt erweiterte Emmet-Abkürzungen als Vorschläge an.\nDie Option inMarkupAndStylesheetFilesOnly gilt für HTML, HAML, Jade, Slim, XML, XSL, CSS, SCSS, Sass, Less und Stylus.\nDie Option \"always\" gilt unabhängig vom Markup/CSS für alle Teile der Datei.", "emmetShowAbbreviationSuggestions": "Zeigt mögliche Emmet-Abkürzungen als Vorschläge an. Diese Option gilt nicht in Stylesheets oder wenn emmet.showExpandedAbbreviation auf \"never\" festgelegt ist.", - "emmetIncludeLanguages": "Aktivieren Sie Emmet-Abkürzungen in Sprachen, die nicht standardmäßig unterstützt werden. Fügen Sie hier ein Mapping zwischen der Sprache und der von Emmet unterstützten Sprache hinzu.\nBeispiel: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "In Emmet-Ausschnitten zu verwendende Codeausschnitte", "emmetTriggerExpansionOnTab": "Wenn aktiviert, werden Emmet-Abkürzungen beim Drücken der TAB-Taste erweitert.", "emmetPreferences": "Einstellungen, die zum Ändern des Verhaltens einiger Aktionen und Konfliktlöser von Emmet verwendet werden.", @@ -59,5 +58,6 @@ "emmetPreferencesCssWebkitProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"webkit\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"webkit\"-Präfix immer zu vermeiden.", "emmetPreferencesCssMozProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"moz\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"moz\"-Präfix immer zu vermeiden.", "emmetPreferencesCssOProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"o\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"o\"-Präfix immer zu vermeiden.", - "emmetPreferencesCssMsProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"ms\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"ms\"-Präfix immer zu vermeiden." + "emmetPreferencesCssMsProperties": "Durch Trennzeichen getrennte CSS-Eigenschaften, die das \"ms\"-Herstellerpräfix erhalten, wenn sie in einer Emmet-Abkürzung verwendet werden, die mit \"-\" beginnt. Legen Sie eine leere Zeichenfolge fest, um das \"ms\"-Präfix immer zu vermeiden.", + "emmetPreferencesCssFuzzySearchMinScore": "Das Mindestergebnis (zwischen 0 und 1), das die Abkürzung mit Fuzzyübereinstimmung erreichen muss. Niedrigere Werte führen zu vielen falsch positiven Übereinstimmungen, höhere Werte verringern unter Umständen die möglichen Übereinstimmungen." } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/commands.i18n.json b/i18n/deu/extensions/git/out/commands.i18n.json index af42eef9ac7..7efb13a1a10 100644 --- a/i18n/deu/extensions/git/out/commands.i18n.json +++ b/i18n/deu/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "OK", "push with tags success": "Push mit Tags erfolgreich ausgeführt.", "pick remote": "Remotespeicherort auswählen, an dem der Branch \"{0}\" veröffentlicht wird:", + "sync is unpredictable": "Mit dieser Aktion werden Commits per Push und Pull an und von \"{0}/{1}\" übertragen.", "never again": "OK, nicht mehr anzeigen", "no remotes to publish": "In Ihrem Repository wurden keine Remoteelemente für die Veröffentlichung konfiguriert.", "no changes stash": "Es sind keine Änderungen vorhanden, für die ein Stash ausgeführt werden kann.", diff --git a/i18n/deu/extensions/git/package.i18n.json b/i18n/deu/extensions/git/package.i18n.json index 4c745be0f35..70e0819e8ad 100644 --- a/i18n/deu/extensions/git/package.i18n.json +++ b/i18n/deu/extensions/git/package.i18n.json @@ -77,6 +77,7 @@ "config.showInlineOpenFileAction": "Steuert, ob eine Inlineaktion zum Öffnen der Datei in der Ansicht \"Git-Änderungen\" angezeigt wird.", "config.inputValidation": "Steuert, wann die Commit-Meldung der Eingabevalidierung angezeigt wird.", "config.detectSubmodules": "Steuert, ob Git-Submodule automatisch erkannt werden.", + "config.detectSubmodulesLimit": "Steuert die Begrenzung der Git-Submodule.", "colors.modified": "Farbe für geänderte Ressourcen.", "colors.deleted": "Farbe für gelöschten Ressourcen.", "colors.untracked": "Farbe für nicht verfolgte Ressourcen.", diff --git a/i18n/deu/extensions/html/package.i18n.json b/i18n/deu/extensions/html/package.i18n.json index 35229bd6699..9ce5789f793 100644 --- a/i18n/deu/extensions/html/package.i18n.json +++ b/i18n/deu/extensions/html/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "HTML-Sprachgrundlagen", + "description": "Bietet Syntaxhervorhebung, Klammernpaare und Ausschnitte in HTML-Dateien." } \ No newline at end of file diff --git a/i18n/deu/extensions/json/package.i18n.json b/i18n/deu/extensions/json/package.i18n.json index 35229bd6699..b9be795e738 100644 --- a/i18n/deu/extensions/json/package.i18n.json +++ b/i18n/deu/extensions/json/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "JSON-Sprachgrundlagen", + "description": "Bietet Syntaxhervorhebung und Klammernpaare in JSON-Dateien." } \ No newline at end of file diff --git a/i18n/deu/extensions/markdown-language-features/out/features/preview.i18n.json b/i18n/deu/extensions/markdown-language-features/out/features/preview.i18n.json index 98c4ffb61e2..145213b7b2e 100644 --- a/i18n/deu/extensions/markdown-language-features/out/features/preview.i18n.json +++ b/i18n/deu/extensions/markdown-language-features/out/features/preview.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "lockedPreviewTitle": "[Vorschau] {0}", "previewTitle": "Vorschau von {0}" } \ No newline at end of file diff --git a/i18n/deu/extensions/markdown-language-features/package.i18n.json b/i18n/deu/extensions/markdown-language-features/package.i18n.json index 8cae9ecc07d..8a886edcb00 100644 --- a/i18n/deu/extensions/markdown-language-features/package.i18n.json +++ b/i18n/deu/extensions/markdown-language-features/package.i18n.json @@ -15,6 +15,7 @@ "markdown.preview.fontSize.desc": "Steuert den Schriftgrad in Pixeln, der in der Markdownvorschau verwendet wird.", "markdown.preview.lineHeight.desc": "Steuert die Zeilenhöhe, die in der Markdownvorschau verwendet wird. Diese Zahl ist relativ zum Schriftgrad.", "markdown.preview.markEditorSelection.desc": "Markieren Sie die aktuelle Editor-Auswahl in der Markdown-Vorschau.", + "markdown.preview.scrollEditorWithPreview.desc": "Wenn für eine Markdown-Vorschau ein Bildlauf durchgeführt wird, die Ansicht des Editors aktualisieren.", "markdown.preview.scrollPreviewWithEditor.desc": "Wenn für die Markdown-Vorschau ein Bildlauf durchgeführt wird, aktualisieren Sie die Ansicht der Vorschau.", "markdown.preview.scrollPreviewWithEditorSelection.desc": "[Veraltet] Führt einen Bildlauf für die Markdown-Vorschau durch, um die aktuell ausgewählte Zeile im Editor anzuzeigen.", "markdown.preview.scrollPreviewWithEditorSelection.deprecationMessage": "Diese Einstellung wurde durch \"markdown.preview.scrollPreviewWithEditor\" ersetzt und ist nicht mehr wirksam.", diff --git a/i18n/deu/extensions/php-language-features/package.i18n.json b/i18n/deu/extensions/php-language-features/package.i18n.json index 3b7f987e66a..7124411caa7 100644 --- a/i18n/deu/extensions/php-language-features/package.i18n.json +++ b/i18n/deu/extensions/php-language-features/package.i18n.json @@ -13,5 +13,6 @@ "configuration.title": "PHP", "commands.categroy.php": "PHP", "command.untrustValidationExecutable": "Ausführbare Datei für PHP-Überprüfung nicht zulassen (als Arbeitsbereicheinstellung definiert)", - "displayName": "PHP-Sprachfeatures" + "displayName": "PHP-Sprachfeatures", + "description": "Bietet umfangreiche Sprachunterstützung für PHP-Dateien." } \ No newline at end of file diff --git a/i18n/deu/extensions/php/package.i18n.json b/i18n/deu/extensions/php/package.i18n.json index ef10b47a8b3..25f008aacf8 100644 --- a/i18n/deu/extensions/php/package.i18n.json +++ b/i18n/deu/extensions/php/package.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "PHP-Sprachfeatures" + "description": "Bietet Syntaxhervorhebung und Klammernpaare für PHP-Dateien." } \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/commands.i18n.json b/i18n/deu/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..cdebacc88db --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Öffnen Sie einen Ordner in VS Code, um ein TypeScript- oder JavaScript-Projekt zu verwenden.", + "typescript.projectConfigUnsupportedFile": "TypeScript- oder JavaScript-Projekt konnte nicht ermittelt werden. Nicht unterstützter Dateityp.", + "typescript.projectConfigCouldNotGetInfo": "TypeScript- oder JavaScript-Projekt konnte nicht ermittelt werden.", + "typescript.noTypeScriptProjectConfig": "Datei ist nicht Teil eines TypeScript-Projekt. Klicken Sie [hier]({0}), um mehr zu erfahren.", + "typescript.noJavaScriptProjectConfig": "Datei ist nicht Teil eines JavaScript-Projekt. Klicken Sie [hier]({0}), um mehr zu erfahren.", + "typescript.configureTsconfigQuickPick": "tsconfig.json konfigurieren", + "typescript.configureJsconfigQuickPick": "jsconfig.json konfigurieren" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..3d20846a443 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Anzuwendende Codeaktion auswählen", + "acquiringTypingsLabel": "Eingaben werden abgerufen...", + "acquiringTypingsDetail": "Eingabedefinitionen für IntelliSense werden abgerufen." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..ab837c60f37 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Aktiviert die Semantiküberprüfung in einer JavaScript-Datei. Muss sich oben in einer Datei befinden.", + "ts-nocheck": "Deaktiviert die Semantiküberprüfung in einer JavaScript-Datei. Muss sich oben in einer Datei befinden.", + "ts-ignore": "Unterdrückt @ts-check-Fehler in der nächsten Zeile einer Datei." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..2dd478f8590 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 Implementierung", + "manyImplementationLabel": "{0}-Implementierungen", + "implementationsErrorLabel": "Implementierungen konnten nicht bestimmt werden" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..e5e06fc03c8 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "JSDoc-Kommentar" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..9df063abf44 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "Importe organisieren" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..e0e88f5e50e --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (Behebe alle in Datei)" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..73d84e6a380 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 Verweis", + "manyReferenceLabel": "{0} Verweise", + "referenceErrorLabel": "Verweise konnten nicht bestimmt werden" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..8d79b969dfa --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "Erstellen – {0}", + "buildAndWatchTscLabel": "Überwachen – {0}" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/deu/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..eb955bb9c06 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "Der Pfad \"{0}\" zeigt nicht auf eine gültige tsserver-Installation. Fallback auf gebündelte TypeScript-Version wird durchgeführt.", + "serverCouldNotBeStarted": "Der TypeScript-Sprachserver konnte nicht gestartet werden. Fehlermeldung: {0}", + "typescript.openTsServerLog.notSupported": "Die TS Server-Protokollierung erfordert TS 2.2.2+.", + "typescript.openTsServerLog.loggingNotEnabled": "Die TS Server-Protokollierung ist deaktiviert. Legen Sie \"typescript.tsserver.log\" fest, und laden Sie VS Code erneut, um die Protokollierung zu aktivieren.", + "typescript.openTsServerLog.enableAndReloadOption": "Aktiviert die Protokollierung und startet den TS-Server neu.", + "typescript.openTsServerLog.noLogFile": "TS Server hat noch nicht mit der Protokollierung begonnen.", + "openTsServerLog.openFileFailedFailed": "Die TS-Server-Protokolldatei konnte nicht geöffnet werden.", + "serverDiedAfterStart": "Der TypeScript-Sprachdienst wurde direkt nach seinem Start fünfmal beendet. Der Dienst wird nicht neu gestartet.", + "serverDiedReportIssue": "Problem melden", + "serverDied": "Der TypeScript-Sprachdienst wurde während der letzten fünf Minuten fünfmal unerwartet beendet." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/deu/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..e381d6d3b73 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "Ungültige Version" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/deu/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/deu/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..b36d5e0aec6 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "Um die JavaScript/TypeScript-Sprachfunktionen für das gesamte Projekt zu aktivieren, schließen Sie Ordner mit vielen Dateien aus. Beispiel: {0}", + "hintExclude.generic": "Um JavaScript/TypeScript-Sprachfunktionen für das gesamte Projekt zu aktivieren, schließen Sie große Ordner mit Quelldateien aus, an denen Sie nicht arbeiten.", + "large.label": "Auszuschließende Elemente konfigurieren", + "hintExclude.tooltip": "Um JavaScript/TypeScript-Sprachfunktionen für das gesamte Projekt zu aktivieren, schließen Sie große Ordner mit Quelldateien aus, an denen Sie nicht arbeiten." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/deu/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..797c586cb35 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Daten werden zum Optimieren von TypeScript IntelliSense abgerufen", + "typesInstallerInitializationFailed.title": "Typisierungsdateien für JavaScript-Sprachfunktionen konnten nicht installiert werden. Stellen Sie sicher, das NPM installiert ist, oder konfigurieren Sie \"typescript.npm\" in Ihren Benutzereinstellungen. Klicken Sie [hier]({0}), um mehr zu erfahren.", + "typesInstallerInitializationFailed.doNotCheckAgain": "Nicht mehr anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/deu/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..9414ff7601e --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "Version von VS Code verwenden", + "useWorkspaceVersionOption": "Arbeitsbereichsversion verwenden", + "learnMore": "Weitere Informationen", + "selectTsVersion": "Wählen Sie die für die JavaScript- und TypeScript-Sprachfunktionen verwendete TypeScript-Version aus." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/deu/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..4d94a01dc62 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "Die TypeScript-Version konnte unter diesem Pfad nicht geladen werden.", + "noBundledServerFound": "Der tsserver von VS Code wurde von einer anderen Anwendung wie etwa einem fehlerhaften Tool zur Viruserkennung gelöscht. Führen Sie eine Neuinstallation von VS Code durch." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript-language-features/package.i18n.json b/i18n/deu/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..8aa361d46a1 --- /dev/null +++ b/i18n/deu/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,58 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "TypeScript- und JavaScript-Sprachfeatures", + "description": "Bietet umfangreiche Sprachunterstützung für JavaScript und TypeScript.", + "typescript.reloadProjects.title": "Projekt erneut laden", + "javascript.reloadProjects.title": "Projekt erneut laden", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Vervollständigen Sie Funktionen mit deren Parametersignatur.", + "typescript.tsdk.desc": "Gibt den Ordnerpfad mit den zu verwendenden tsserver- und lib*.d.ts-Dateien an.", + "typescript.disableAutomaticTypeAcquisition": "Deaktiviert die automatische Typerfassung. Erfordert TypeScript >= 2.0.6.", + "typescript.tsserver.log": "Aktiviert die Protokollierung des TS-Servers in eine Datei. Mithilfe der Protokolldatei lassen sich Probleme beim TS-Server diagnostizieren. Die Protokolldatei kann Dateipfade, Quellcode und weitere potenziell sensible Informationen aus Ihrem Projekt enthalten.", + "typescript.tsserver.trace": "Aktiviert die Ablaufverfolgung von an den TS-Server gesendeten Nachrichten. Mithilfe der Ablaufverfolgung lassen sich Probleme beim TS-Server diagnostizieren. Die Ablaufverfolgung kann Dateipfade, Quellcode und weitere potenziell sensible Informationen aus Ihrem Projekt enthalten.", + "typescript.validate.enable": "TypeScript-Überprüfung aktivieren/deaktivieren.", + "typescript.format.enable": "Standardmäßigen TypeScript-Formatierer aktivieren/deaktivieren.", + "javascript.format.enable": "Standardmäßigen JavaScript-Formatierer aktivieren/deaktivieren.", + "format.insertSpaceAfterCommaDelimiter": "Definiert die Verarbeitung von Leerzeichen nach einem Kommatrennzeichen.", + "format.insertSpaceAfterConstructor": "Definiert die Verarbeitung von Leerzeichen nach dem Konstruktor-Schlüsselwort. Erfordert TypeScript 2.3.0 oder höher.", + "format.insertSpaceAfterSemicolonInForStatements": " Definiert die Verarbeitung von Leerzeichen nach einem Semikolon in einer for-Anweisung.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Definiert die Verarbeitung von Leerzeichen nach einem binären Operator.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Definiert die Verarbeitung von Leerzeichen nach Schlüsselwörtern in einer Flusssteuerungsanweisung.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Definiert die Verarbeitung von Leerzeichen nach einem Funktionsschlüsselwort für anonyme Funktionen.", + "format.insertSpaceBeforeFunctionParenthesis": "Definiert die Verarbeitung von Leerzeichen vor Funktionsargumentklammern. Erfordert TypeScript >= 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Definiert die Verarbeitung von Leerzeichen nach öffnenden und vor schließenden geschweiften Klammern für Vorlagenzeichenfolgen. Erfordert TypeScript >= 2.0.6.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Definiert die Verarbeitung von Leerzeichen nach öffnenden und vor schließenden geschweiften Klammern für JSX-Ausdrücke. Erfordert TypeScript >= 2.0.6.", + "format.insertSpaceAfterTypeAssertion": "Definiert die Verarbeitung von Leerzeichen nach Typassertionen in TypeScript. Erfordert TypeScript >= 2.4.", + "format.placeOpenBraceOnNewLineForFunctions": "Definiert, ob eine öffnende geschweifte Klammer für Funktionen in eine neue Zeile eingefügt wird.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Definiert, ob eine öffnende geschweifte Klammer für Kontrollblöcke in eine neue Zeile eingefügt wird.", + "javascript.validate.enable": "JavaScript-Überprüfung aktivieren/deaktivieren.", + "typescript.goToProjectConfig.title": "Zur Projektkonfiguration wechseln", + "javascript.goToProjectConfig.title": "Zur Projektkonfiguration wechseln", + "javascript.referencesCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Verweise in JavaScript Dateien. Erfordert TypeScript 2.0.6 oder höher.", + "typescript.referencesCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Verweise in TypeScript Dateien. Erfordert TypeScript 2.0.6 oder höher.", + "typescript.implementationsCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Implementierungen. Erfordert TypeScript 2.2.0 oder höher.", + "typescript.openTsServerLog.title": "TS Server-Protokolldatei öffnen", + "typescript.restartTsServer": "TS Server neu starten", + "typescript.selectTypeScriptVersion.title": "TypeScript-Version wählen", + "typescript.reportStyleChecksAsWarnings": "Formatvorlagenprüfungen als Warnungen melden", + "jsDocCompletion.enabled": "Automatische JSDoc-Kommentare aktivieren/deaktivieren", + "javascript.implicitProjectConfig.checkJs": "Aktiviert/deaktiviert die Semantikprüfung bei JavaScript-Dateien. Diese Einstellung wird von vorhandenen \"jsconfig.json\"- oder \"tsconfig.json\"-Dateien außer Kraft gesetzt. Erfordert TypeScript 2.3.1 oder höher.", + "typescript.npm": "Gibt den Pfad zur ausführbaren NPM-Datei an, die für die automatische Typerfassung verwendet wird. Hierfür ist TypeScript 2.3.4 oder höher erforderlich.", + "typescript.check.npmIsInstalled": "Überprüfen Sie, ob NPM für die automatische Typerfassung installiert ist.", + "javascript.nameSuggestions": "Das Einbeziehen eindeutiger Namen von der Datei in der JavaScript-Vorschlagsliste aktivieren/deaktivieren.", + "typescript.tsc.autoDetect": "Steuert die automatische Erkennung von TSC-Aufgaben. \"Aus\" deaktiviert diese Funktion. \"Build\" erstellt nur Kompilierungsaufgaben mit einer Ausführung. \"Überwachen\" erstellt nur Kompilierungs- und Überwachungsaufgaben. \"Ein\" erstellt sowohl Build- als auch Überwachungsaufgaben. Der Standardwert ist \"Ein\".", + "typescript.problemMatchers.tsc.label": "TypeScript-Probleme", + "typescript.problemMatchers.tscWatch.label": "TypeScript-Probleme (Überwachungsmodus)", + "typescript.quickSuggestionsForPaths": "Aktiviert oder deaktiviert Schnellvorschläge, wenn Sie einen Importpfad ausschreiben.", + "typescript.locale": "Legt das zum Melden von TypeScript-Fehlern verwendete Gebietsschema fest. Erfordert TypeScript 2.6.0 oder höher. Der Standardwert \"null\" verwendet für TypeScript-Fehler das Gebietsschema von VS Code.", + "javascript.implicitProjectConfig.experimentalDecorators": "Aktiviert oder deaktiviert \"experimentalDecorators\" für JavaScript-Dateien, die nicht Teil eines Projekts sind. Vorhandene jsconfig.json- oder tsconfig.json-Dateien setzen diese Einstellung außer Kraft. Erfordert TypeScript 2.3.1 oder höher.", + "typescript.autoImportSuggestions.enabled": "Aktiviert oder deaktiviert Vorschläge für den automatischen Import. Erfordert TypeScript 2.6.1 oder höher.", + "typescript.experimental.syntaxFolding": "Aktiviert bzw. deaktiviert die syntaxabhängigen Faltungsmarkierungen.", + "taskDefinition.tsconfig.description": "Die \"tsconfig\"-Datei, die den TS-Build definiert." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/base/node/processes.i18n.json b/i18n/deu/src/vs/base/node/processes.i18n.json index 04fbcbe033d..35229bd6699 100644 --- a/i18n/deu/src/vs/base/node/processes.i18n.json +++ b/i18n/deu/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "Ein Shell-Befehl kann nicht auf einem UNC-Laufwerk ausgeführt werden." + ] } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 4ae1e88e8f2..3d0b8a3e84d 100644 --- a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -11,7 +11,6 @@ "similarIssues": "Ähnliche Probleme", "open": "Öffnen", "closed": "Geschlossen", - "noResults": "Es wurden keine Ergebnisse gefunden.", "settingsSearchIssue": "Fehler in Einstellungssuche ", "bugReporter": "Fehlerbericht", "featureRequest": "Featureanforderung", diff --git a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index f74316af1b5..5318cd985e4 100644 --- a/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/deu/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,9 @@ ], "completeInEnglish": "Füllen Sie das Formular auf Englisch aus.", "issueTypeLabel": "Dies ist", + "vscode": "Visual Studio Code", + "disableExtensions": "Alle Erweiterungen werden deaktiviert, und das Fenster wird neu geladen", + "chooseExtension": "Erweiterung", "issueTitleLabel": "Titel", "issueTitleRequired": "Geben Sie einen Titel ein.", "titleLengthValidation": "Der Titel ist zu lang.", @@ -18,13 +21,6 @@ "extensions": "Eigene Erweiterungen", "searchedExtensions": "Gesuchte Erweiterungen", "settingsSearchDetails": "Details der Einstellungssuche", - "tryDisablingExtensions": "Kann das Problem reproduziert werden, wenn Erweiterungen deaktiviert sind?", - "yes": "Ja", - "no": "Nein", - "disableExtensionsLabelText": "Versuchen Sie, das Problem nach {0} zu reproduzieren.", - "disableExtensions": "Alle Erweiterungen werden deaktiviert, und das Fenster wird neu geladen", - "showRunningExtensionsLabelText": "Wenn Sie ein Erweiterungsproblem vermuten, melden Sie dieses Problem durch {0}.", - "showRunningExtensions": "Alle ausgeführten Erweiterungen anzeigen", "details": "Geben Sie Details ein.", "loadingData": "Daten werden geladen …" } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..aa725d508b2 --- /dev/null +++ b/i18n/deu/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Name" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json index 16555984126..78765c76363 100644 --- a/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/deu/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Schließen", - "header": "Unterschied von {0} zu {1}: Original {2}, {3} Zeilen, Geändert {4}, {5} Zeilen", "blankLine": "leer", "equalLine": "Original {0}, geändert {1}: {2}", "insertLine": "+ geändert {0}: {1}", diff --git a/i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json index cbc53f2c2a6..fc7ba3f58b4 100644 --- a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -28,6 +28,9 @@ "warningBorder": "Rahmenfarbe von Warnungsunterstreichungen im Editor.", "infoForeground": "Vordergrundfarbe von Informationsunterstreichungen im Editor.", "infoBorder": "Rahmenfarbe von Informationsunterstreichungen im Editor.", + "hintForeground": "Vordergrundfarbe der Hinweisunterstreichungen im Editor.", + "hintBorder": "Rahmenfarbe der Hinweisunterstreichungen im Editor.", + "overviewRulerRangeHighlight": "Übersichtslineal-Markierungsfarbe für Bereichshervorhebungen. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", "overviewRuleError": "Übersichtslineal-Markierungsfarbe für Fehler.", "overviewRuleWarning": "Übersichtslineal-Markierungsfarbe für Warnungen.", "overviewRuleInfo": "Übersichtslineal-Markierungsfarbe für Informationen." diff --git a/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..cd90a9fdc29 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Korrekturen anzeigen ({0})", + "quickFix": "Korrekturen anzeigen", + "organizeImports.label": "Importe organisieren" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/deu/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index 35229bd6699..bc7ae23d394 100644 --- a/i18n/deu/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -5,5 +5,43 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "Sunday": "Sonntag", + "Monday": "Montag", + "Tuesday": "Dienstag", + "Wednesday": "Mittwoch", + "Thursday": "Donnerstag", + "Friday": "Freitag", + "Saturday": "Samstag", + "SundayShort": "So", + "MondayShort": "Mo", + "TuesdayShort": "Di", + "WednesdayShort": "Mi", + "ThursdayShort": "Do", + "FridayShort": "Fr", + "SaturdayShort": "Sa", + "January": "Januar", + "February": "Februar", + "March": "März", + "April": "April", + "May": "Mai", + "June": "Juni", + "July": "Juli", + "August": "August", + "September": "September", + "October": "Oktober", + "November": "November", + "December": "Dezember", + "JanuaryShort": "Jan", + "FebruaryShort": "Feb", + "MarchShort": "Mar", + "AprilShort": "Apr", + "MayShort": "Mai", + "JuneShort": "Jun", + "JulyShort": "Jul", + "AugustShort": "Aug", + "SeptemberShort": "Sep", + "OctoberShort": "Okt", + "NovemberShort": "Nov", + "DecemberShort": "Dez" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json index f72633a93df..d79e05a3c24 100644 --- a/i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -10,6 +10,8 @@ "wordHighlightStrong": "Hintergrundfarbe eines Symbols bei Schreibzugriff, beispielsweise dem Schreiben einer Variable. Die Farbe muss durchsichtig sein, um nicht dahinterliegende Dekorationen zu verbergen.", "wordHighlightBorder": "Randfarbe eines Symbols beim Lesezugriff, wie etwa beim Lesen einer Variablen.", "wordHighlightStrongBorder": "Randfarbe eines Symbols beim Schreibzugriff, wie etwa beim Schreiben einer Variablen.", + "overviewRulerWordHighlightForeground": "Übersichtslineal-Markierungsfarbe für Symbolhervorhebungen. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", + "overviewRulerWordHighlightStrongForeground": "Übersichtslineal-Markierungsfarbe für Schreibzugriffs-Symbolhervorhebungen. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", "wordHighlight.next.label": "Gehe zur nächsten Symbolhervorhebungen", "wordHighlight.previous.label": "Gehe zur vorherigen Symbolhervorhebungen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json index 8001da9cf01..e0ac23f5587 100644 --- a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "Startet mit aktiviertem Befehl \"Developer: Startup Performance\".", "prof-startup": "CPU-Profiler beim Start ausführen", "disableExtensions": "Deaktiviert alle installierten Extensions.", - "inspect-extensions": "Erlaubt Debugging und Profiling für Erweiterungen. Überprüfen Sie die Entwicklertools für die Verbindungs-URI.", - "inspect-brk-extensions": "Erlaubt Debugging und Profiling für Erweiterungen, wobei der Erweiterungs-Host nach dem Starten pausiert wird. Überprüfen Sie die Entwicklertools für die Verbindungs-URI.", "disableGPU": "Deaktiviert die GPU-Hardwarebeschleunigung.", "uploadLogs": "Lädt die Logs der aktuellen Sitzung an einem sicheren Endpunkt hoch.", "maxMemory": "Maximale Speichergröße für ein Fenster (in Mbyte).", diff --git a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 8eaf7a54f37..fe6e6c0c316 100644 --- a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -21,6 +21,8 @@ "quitCode": "Fehler bei der Installation der Erweiterung. Beenden und starten Sie VS Code vor der erneuten Installation neu.", "exitCode": "Fehler bei der Installation der Erweiterung. Beenden und starten Sie VS Code vor der erneuten Installation neu.", "uninstallDependeciesConfirmation": "Möchten Sie nur \"{0}\" oder auch die zugehörigen Abhängigkeiten deinstallieren?", + "uninstallOnly": "Nur Erweiterung", + "uninstallAll": "Alle deinstallieren", "uninstallConfirmation": "Möchten Sie \"{0}\" deinstallieren?", "ok": "OK", "singleDependentError": "Die Erweiterung \"{0}\" kann nicht deinstalliert werden. Die Erweiterung \"{1}\" hängt von dieser Erweiterung ab.", diff --git a/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json index 04eec7993f4..0ef3a16d232 100644 --- a/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/deu/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "Der engines.vscode-Wert {0} konnte nicht analysiert werden. Verwenden Sie z. B. ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x usw.", "versionSpecificity1": "Die in \"engines.vscode\" ({0}) angegebene Version ist nicht spezifisch genug. Definieren Sie für VS Code-Versionen vor Version 1.0.0 bitte mindestens die gewünschte Haupt- und Nebenversion, z. B. ^0.10.0, 0.10.x, 0.11.0 usw.", "versionSpecificity2": "Die in \"engines.vscode\" ({0}) angegebene Version ist nicht spezifisch genug. Definieren Sie für VS Code-Versionen nach Version 1.0.0 bitte mindestens die gewünschte Hauptversion, z. B. ^1.10.0, 1.10.x, 1.x.x, 2.x.x usw.", "versionMismatch": "Die Extension ist nicht mit dem Code {0} kompatibel. Die Extension erfordert {1}." diff --git a/i18n/deu/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/deu/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index 108b0df58d7..2a32b38a4e3 100644 --- a/i18n/deu/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/deu/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "Ihre {0}-Installation ist offenbar beschädigt. Führen Sie eine Neuinstallation durch.", "integrity.moreInformation": "Weitere Informationen", - "integrity.dontShowAgain": "Nicht mehr anzeigen", - "integrity.prompt": "Ihre {0}-Installation ist offenbar beschädigt. Führen Sie eine Neuinstallation durch." + "integrity.dontShowAgain": "Nicht mehr anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index 2e98d7310d1..d703cc6af77 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -92,5 +92,7 @@ "mergeBorder": "Rahmenfarbe für Kopfzeilen und die Aufteilung in Inline-Mergingkonflikten.", "overviewRulerCurrentContentForeground": "Aktueller Übersichtslineal-Vordergrund für Inline-Mergingkonflikte.", "overviewRulerIncomingContentForeground": "Eingehender Übersichtslineal-Vordergrund für Inline-Mergingkonflikte. ", - "overviewRulerCommonContentForeground": "Hintergrund des Übersichtslineals des gemeinsamen übergeordneten Elements bei Inlinezusammenführungskonflikten." + "overviewRulerCommonContentForeground": "Hintergrund des Übersichtslineals des gemeinsamen übergeordneten Elements bei Inlinezusammenführungskonflikten.", + "overviewRulerFindMatchForeground": "Übersichtslineal-Markierungsfarbe für Suchübereinstimmungen. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen.", + "overviewRulerSelectionHighlightForeground": "Übersichtslineal-Markierungsfarbe für Auswahlhervorhebungen. Die Farbe muss durchsichtig sein, um dahinterliegende Dekorationen nicht zu verbergen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..729878b1595 --- /dev/null +++ b/i18n/deu/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "Die Eigenschaft \"{0}\" ist erforderlich. Sie muss vom Typ \"string\" sein.", + "showViewlet": "{0} anzeigen", + "view": "Anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index c3de36954de..10d819ab539 100644 --- a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Trägt Ansichten zum Editor bei.", "views.explorer": "Explorer-Ansicht", "views.debug": "Debugansicht", - "locationId.invalid": "{0}\" ist kein gültiger Ansichtenspeicherort", "duplicateView1": "Mehrere Ansichten können nicht mit derselben ID \"{0}\" am Speicherort \"{1}\" registriert werden.", "duplicateView2": "Eine Ansicht mit der ID \"{0}\" ist am Speicherort \"{1}\" bereits registriert." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 4290f5cc693..1f1499c09e6 100644 --- a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "Formatieren beim Speichern nach {0} ms abgebrochen", + "timeout.onWillSave": "Bei onWillSaveTextDocument-Ereignis nach 1750 ms abgebrochen", "saveParticipants": "Speichern von Teilnehmern wird ausgeführt …" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 0a2dcb8a2c9..35229bd6699 100644 --- a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "webview.editor.label": "Webview-Editor" + ] } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/node/extHostProgress.i18n.json b/i18n/deu/src/vs/workbench/api/node/extHostProgress.i18n.json index 35229bd6699..a933ea1e428 100644 --- a/i18n/deu/src/vs/workbench/api/node/extHostProgress.i18n.json +++ b/i18n/deu/src/vs/workbench/api/node/extHostProgress.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "extensionSource": "{0} (Erweiterung)" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 4ee819d71fa..8355c93e305 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,6 @@ "screenReaderDetectedExtra": "Wenn Sie keine Sprachausgabe verwenden, ändern Sie die Einstellung \"editor.accessibilitySupport\" in \"Aus\".", "disableTabMode": "Barrierefreiheitsmodus deaktivieren", "gotoLine": "Gehe zu Zeile", - "indentation": "Einzug", "selectEncoding": "Codierung auswählen", "selectEOL": "Zeilenendesequenz auswählen", "selectLanguageMode": "Sprachmodus auswählen", diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 21a390445da..72f24a7c13e 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,7 @@ "sizeMB": "{0} MB", "sizeGB": "{0} GB", "sizeTB": "{0} TB", - "largeImageError": "Die Dateigröße des Bilds ist zu groß (über 1 MB), um im Editor angezeigt zu werden.", "resourceOpenExternalButton": "Bild mit externem Programm öffnen?", - "nativeBinaryError": "Die Datei wird nicht im Editor angezeigt, weil sie binär oder sehr groß ist oder eine nicht unterstützte Textcodierung verwendet.", "zoom.action.fit.label": "Ganzes Bild", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json index cabab414f2d..25fb0b63c30 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "notificationsEmpty": "Keine neuen Benachrichtigungen", "notifications": "Benachrichtigungen", "notificationsToolbar": "Aktionen der Benachrichtigungszentrale", "notificationsList": "Benachrichtigungsliste" diff --git a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..bcdf56e4849 --- /dev/null +++ b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index 21a380f1297..52379955308 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,10 +45,17 @@ "windowConfigurationTitle": "Fenster", "window.openFilesInNewWindow.on": "Dateien werden in einem neuen Fenster geöffnet.", "window.openFilesInNewWindow.off": "Dateien werden im Fenster mit dem geöffneten Dateiordner oder im letzten aktiven Fenster geöffnet.", + "window.openFilesInNewWindow.defaultMac": "Dateien werden im Fenster mit dem geöffneten Dateiordner oder im letzten aktiven Fenster geöffnet, sofern sie nicht über das Dock oder den Finder geöffnet werden.", + "window.openFilesInNewWindow.default": "Dateien werden in einem neuen Fenster geöffnet, sofern sie nicht innerhalb der Anwendung ausgewählt werden (z. B. über das Dateimenü).", + "openFilesInNewWindowMac": "Steuert, ob Dateien in einem neuen Fenster geöffnet werden.\n- default: Die Dateien werden im Fenster mit dem geöffneten Dateiordner oder im letzten aktiven Fenster geöffnet, sofern sie nicht über das Dock oder den Finder geöffnet werden.\n- on: Die Dateien werden in einem neuen Fenster geöffnet.\n- off: Die Dateien werden im Fenster mit dem geöffneten Dateiordner oder im letzten aktiven Fenster geöffnet.\nIn einigen Fällen wird diese Einstellung unter Umständen ignoriert (z. B. bei der Befehlszeilenoption \"-new-window\" oder \"-reuse-window\").", + "openFilesInNewWindow": "Steuert, ob Dateien in einem neuen Fenster geöffnet werden.\n- default: Die Dateien werden in einem neuen Fenster geöffnet, sofern sie nicht innerhalb der Anwendung ausgewählt werden (z. B. über das Dateimenü).\n- on: Die Dateien werden in einem neuen Fenster geöffnet.\n- off: Die Dateien werden im Fenster mit dem geöffneten Dateiordner oder im letzten aktiven Fenster geöffnet.\nIn einigen Fällen wird diese Einstellung unter Umständen ignoriert (z. B. bei der Befehlszeilenoption \"-new-window\" oder \"-reuse-window\").", "window.openFoldersInNewWindow.on": "Ordner werden in einem neuen Fenster geöffnet.", "window.openFoldersInNewWindow.off": "Ordner ersetzen das letzte aktive Fenster.", "window.openFoldersInNewWindow.default": "Ordner werden in einem neuen Fenster geöffnet, sofern kein Ordner innerhalb der Anwendung ausgewählt wird (z. B. über das Dateimenü).", "openFoldersInNewWindow": "Steuert, ob Ordner in einem neuen Fenster geöffnet werden oder das letzte aktive Fenster ersetzen.\n- default: Die Ordner werden in einem neuen Fenster geöffnet, sofern kein Ordner innerhalb der Anwendung ausgewählt wird (z. B. über das Dateimenü).\n- on: Die Ordner werden in einem neuen Fenster geöffnet.\n- off: Die Ordner ersetzen das letzte aktive Fenster.\nIn einigen Fällen wird diese Einstellung unter Umständen ignoriert (z. B. bei der Befehlszeilenoption \"-new-window\" oder \"-reuse-window\").", + "window.openWithoutArgumentsInNewWindow.on": "Neues leeres Fenster öffnen", + "window.openWithoutArgumentsInNewWindow.off": "Fokus auf die zuletzt aktive ausgeführte Instanz", + "openWithoutArgumentsInNewWindow": "Steuert, ob ein neues leeres Fenster geöffnet wird, wenn eine zweite Instanz ohne Argumente gestartet wird oder wenn für die zuletzt ausgeführt Instanz ein Fokus erforderlich ist.\n- on: Öffnet ein neues leeres Fenster.\n- off: Die zuletzt aktive ausgeführte Instanz erhält den Fokus.\nIn einigen Fällen wird diese Einstellung unter Umständen ignoriert (z. B. bei der Befehlszeilenoption \"-new-window\" oder \"-reuse-window\").", "window.reopenFolders.all": "Alle Fenster erneut öffnen.", "window.reopenFolders.folders": "Alle Ordner erneut öffnen. Leere Arbeitsbereiche werden nicht wiederhergestellt.", "window.reopenFolders.one": "Das letzte aktive Fenster erneut öffnen. ", @@ -56,6 +63,7 @@ "restoreWindows": "Steuert, wie Fenster nach einem Neustart erneut geöffnet werden. Wählen Sie \"none\", um immer mit einem leeren Arbeitsbereich zu beginnen, \"one\", um das zuletzt verwendete Fenster erneut zu öffnen, \"folders\", um alle Fenster, in denen Ordner geöffnet waren, erneut zu öffnen, oder \"all\", um alle Fenster der letzten Sitzung erneut zu öffnen.", "restoreFullscreen": "Steuert, ob ein Fenster im Vollbildmodus wiederhergestellt wird, wenn es im Vollbildmodus beendet wurde.", "zoomLevel": "Passen Sie den Zoomfaktor des Fensters an. Die ursprüngliche Größe ist 0. Jede Inkrementierung nach oben (z. B. 1) oder unten (z. B. -1) stellt eine Vergrößerung bzw. Verkleinerung um 20 % dar. Sie können auch Dezimalwerte eingeben, um den Zoomfaktor genauer anzupassen.", + "title": "Steuert den Fenstertitel basierend auf dem aktiven Editor. Variablen werden abhängig vom Kontext ersetzt:\n${activeEditorShort}: der Dateiname (z. B. myFile.txt)\n${activeEditorMedium}: der Pfad der Datei, relativ zum Arbeitsbereichsordner (z. B. myFolder/myFile.txt)\n${activeEditorLong}: der vollständige Pfad der Datei (z. B. /Users/Development/myProject/myFolder/myFile.txt)\n${folderName}: Name des Arbeitsbereichsordners, der die Datei enthält (z. B. myFolder) \n${folderPath}: Dateipfad des Arbeitsbereichsordners, der die Datei enthält (z. B. /Users/Development/myFolder)\n${rootName}: Name des Arbeitsbereichs (z. B. myFolder oder myWorkspace)\n${rootPath}: Dateipfad des Arbeitsbereichs (z. B. /Users/Development/myWorkspace)\n${appName}: z. B. VS Code\n${dirty}: ein Änderungsindikator, wenn der aktive Editor geändert wurde\n${separator}: ein bedingtes Trennzeichen (\" - \"), das nur angezeigt wird, wenn es zwischen Variablen mit Werten steht", "window.newWindowDimensions.default": "Öffnet neue Fenster in der Mitte des Bildschirms.", "window.newWindowDimensions.inherit": "Öffnet neue Fenster mit den gleichen Abmessungen wie das letzte aktive Fenster.", "window.newWindowDimensions.maximized": "Öffnet neue Fenster maximiert.", @@ -71,6 +79,7 @@ "autoDetectHighContrast": "Ist diese Option aktiviert, erfolgt automatisch ein Wechsel zu einem Design mit hohem Kontrast, wenn Windows ein Design mit hohem Kontrast verwendet, und zu einem dunklen Design, wenn Sie für Windows kein Design mit hohem Kontrast mehr verwenden.", "titleBarStyle": "Passt das Aussehen der Titelleiste des Fensters an. Zum Anwenden der Änderungen ist ein vollständiger Neustart erforderlich.", "window.nativeTabs": "Aktiviert MacOS Sierra-Fensterregisterkarten. Beachten Sie, dass zum Übernehmen von Änderungen ein vollständiger Neustart erforderlich ist und durch ggf. konfigurierte native Registerkarten ein benutzerdefinierter Titelleistenstil deaktiviert wird.", + "window.smoothScrollingWorkaround": "Aktivieren Sie diese Problemumgehung, wenn der Bildlauf nach der Wiederherstellung eines minimierten VS Code-Fensters nicht mehr reibungslos funktioniert. Dies ist eine Problemumgehung für ein Problem (https://github.com/Microsoft/vscode/issues/13612), bei dem der Bildlauf auf Geräten mit präzisen Trackpads wie etwa den Surface-Geräten von Microsoft verzögert ist. Wenn Sie diese Problemumgehung aktivieren, flackert die Anzeige nach dem Wiederherstellen eines Fensters aus dem minimierten Zustand unter Umständen ein wenig, ansonsten treten jedoch keine Probleme auf.", "zenModeConfigurationTitle": "Zen-Modus", "zenMode.fullScreen": "Steuert, ob die Workbench durch das Aktivieren des Zen-Modus in den Vollbildmodus wechselt.", "zenMode.centerLayout": "Steuert, ob das Layout durch Aktivieren des Zen-Modus ebenfalls zentriert wird.", diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 6a4e04d332e..ddd2d3abd5a 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Haltepunkt bearbeiten...", + "breakpoint": "Haltepunkt", "functionBreakpointsNotSupported": "Funktionshaltepunkte werden von diesem Debugtyp nicht unterstützt.", "functionBreakpointPlaceholder": "Funktion mit Haltepunkt", "functionBreakPointInputAriaLabel": "Geben Sie den Funktionshaltepunkt ein.", @@ -14,6 +14,7 @@ "breakpointUnverifieddHover": "Nicht überprüfter Haltepunkt", "functionBreakpointUnsupported": "Funktionshaltepunkte werden von diesem Debugtyp nicht unterstützt.", "breakpointDirtydHover": "Nicht überprüfter Haltepunkt. Die Datei wurde geändert. Bitte starten Sie die Debugsitzung neu.", + "logBreakpointUnsupported": "Protokollpunkte werden für diesen Debugtyp nicht unterstützt.", "conditionalBreakpointUnsupported": "Bedingte Haltepunkte werden für diesen Debugtyp nicht unterstützt.", "hitBreakpointUnsupported": "Bedingte Trefferhaltepunkte werden für diesen Debugtyp nicht unterstützt." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index d105d95f39c..7540c5e0ca9 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "Debuggen: Haltepunkt umschalten", "conditionalBreakpointEditorAction": "Debuggen: Bedingten Haltepunkt hinzufügen...", + "logPointEditorAction": "Debuggen: Protokollpunkt hinzufügen …", "runToCursor": "Ausführen bis Cursor", "debugEvaluate": "Debuggen: Auswerten", "debugAddToWatch": "Debuggen: Zur Überwachung hinzufügen", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 93b4d514d00..d82e734ead9 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,7 @@ ], "breakpointWidgetHitCountPlaceholder": "Unterbrechen, wenn die Bedingung für die Trefferanzahl erfüllt ist. EINGABETASTE zum Akzeptieren, ESC-TASTE zum Abbrechen.", "breakpointWidgetExpressionPlaceholder": "Unterbrechen, wenn der Ausdruck als TRUE ausgewertet wird. EINGABETASTE zum Akzeptieren, ESC-TASTE zum Abbrechen.", - "breakpointWidgetHitCountAriaLabel": "Das Programm wird nur angehalten, wenn die Bedingung für die Trefferanzahl erfüllt ist. Drücken Sie zum Akzeptieren die EINGABETASTE oder ESC, um den Vorgang abzubrechen.", - "breakpointWidgetAriaLabel": "Das Programm wird nur angehalten, wenn diese Bedingung erfüllt ist. Drücken Sie zum Akzeptieren die EINGABETASTE oder ESC, um den Vorgang abzubrechen.", "expression": "Ausdruck", - "hitCount": "Trefferanzahl" + "hitCount": "Trefferanzahl", + "logMessage": "Protokollmeldung" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index d64bb26e64f..0ab881816f8 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "Verwenden Sie eindeutige Konfigurationsnamen.", "app.launch.json.compound.folder": "Name des Ordners, in dem sich der Verbund befindet.", "app.launch.json.compounds.configurations": "Namen von Konfigurationen, die als Bestandteil dieses Verbunds gestartet werden.", - "debugNoType": "Der \"type\" des Debugadapters kann nicht ausgelassen werden und muss vom Typ \"string\" sein.", "selectDebug": "Umgebung auswählen", "DebugConfig.failed": "Die Datei \"launch.json\" kann nicht im Ordner \".vscode\" erstellt werden ({0}).", "workspace": "Arbeitsbereich", diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index ddf54889d34..fa33a362fd9 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Haltepunkt bearbeiten...", - "disableBreakpoint": "Haltepunkt deaktivieren", - "enableBreakpoint": "Haltepunkt aktivieren", + "breakpoint": "Haltepunkt", "removeBreakpoints": "Haltepunkte entfernen", "removeBreakpointOnColumn": "Haltepunkt in Spalte {0} entfernen", "removeLineBreakpoint": "Zeilenhaltepunkt entfernen", @@ -21,6 +19,8 @@ "enableBreakpoints": "Haltepunkt in Spalte {0} aktivieren", "enableBreakpointOnLine": "Zeilenhaltepunkt aktivieren", "addBreakpoint": "Haltepunkt hinzufügen", - "conditionalBreakpoint": "Bedingten Haltepunkt hinzufügen...", + "addConditionalBreakpoint": "Bedingten Haltepunkt hinzufügen...", + "addLogPoint": "Protokollpunkt hinzufügen …", + "cancel": "Abbrechen", "addConfiguration": "Konfiguration hinzufügen..." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index e0c41c377e0..d6cc1170dbf 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -28,5 +28,7 @@ "preLaunchTaskExitCode": "Der preLaunchTask \"{0}\" wurde mit dem Exitcode {1} beendet.", "showErrors": "Fehler anzeigen", "noFolderWorkspaceDebugError": "Debuggen der aktiven Datei ist nicht möglich. Stellen Sie sicher, dass sie auf einem Datenträger gespeichert ist und dass Sie die Debugerweiterung für diesen Dateityp installiert haben.", - "cancel": "Abbrechen" + "cancel": "Abbrechen", + "DebugTaskNotFound": "Der Task \"{0}\" konnte nicht gefunden werden.", + "taskNotTracked": "Der Task \"{0}\" kann nicht nachverfolgt werden." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 7c14cdd4ed3..153ffe94777 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "Weitere Informationen", - "unableToLaunchDebugAdapter": "Der Debugadapter kann nicht aus {0} gestartet werden.", - "unableToLaunchDebugAdapterNoArgs": "Debugadapter kann nicht gestartet werden.", - "stoppingDebugAdapter": "{0}. Der Debugadapter wird beendet.", "debugAdapterCrash": "Der Debugadapterprozess wurde unerwartet beendet." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index d9c6aec8ad3..9b039afb7e7 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "Die ausführbare Datei \"{0}\" des Debugadapters ist nicht vorhanden.", "debugAdapterCannotDetermineExecutable": "Die ausführbare Datei \"{0}\" des Debugadapters kann nicht bestimmt werden.", - "launch.config.comment1": "Verwendet IntelliSense zum Ermitteln möglicher Attribute.", - "launch.config.comment2": "Zeigen Sie auf vorhandene Attribute, um die zugehörigen Beschreibungen anzuzeigen.", - "launch.config.comment3": "Weitere Informationen finden Sie unter {0}", - "debugType": "Der Typ der Konfiguration.", - "debugTypeNotRecognised": "Dieser Debugging-Typ wurde nicht erkannt. Bitte installieren und aktivieren Sie die dazugehörige Debugging-Erweiterung.", - "node2NotSupported": "\"node2\" wird nicht mehr unterstützt, verwenden Sie stattdessen \"node\", und legen Sie das Attribut \"protocol\" auf \"inspector\" fest.", - "debugName": "Der Name der Konfiguration. Er wird im Dropdownmenü der Startkonfiguration angezeigt.", - "debugRequest": "Der Anforderungstyp der Konfiguration. Der Wert kann \"launch\" oder \"attach\" sein.", - "debugServer": "Nur für die Entwicklung von Debugerweiterungen: Wenn ein Port angegeben ist, versucht der VS-Code, eine Verbindung mit einem Debugadapter herzustellen, der im Servermodus ausgeführt wird.", - "debugPrelaunchTask": "Ein Task, der ausgeführt werden soll, bevor die Debugsitzung beginnt.", - "debugWindowsConfiguration": "Windows-spezifische Startkonfigurationsattribute.", - "debugOSXConfiguration": "OS X-spezifische Startkonfigurationsattribute.", - "debugLinuxConfiguration": "Linux-spezifische Startkonfigurationsattribute.", - "deprecatedVariables": "\"env.\", \"config.\" und \"command.\" sind veraltet, verwenden Sie stattdessen \"env:\", \"config:\" und \"command:\"." + "unableToLaunchDebugAdapter": "Der Debugadapter kann nicht aus {0} gestartet werden.", + "unableToLaunchDebugAdapterNoArgs": "Debugadapter kann nicht gestartet werden." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..1bdbec328ab --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "Verwendet IntelliSense zum Ermitteln möglicher Attribute.", + "launch.config.comment2": "Zeigen Sie auf vorhandene Attribute, um die zugehörigen Beschreibungen anzuzeigen.", + "launch.config.comment3": "Weitere Informationen finden Sie unter {0}", + "debugType": "Der Typ der Konfiguration.", + "debugTypeNotRecognised": "Dieser Debugging-Typ wurde nicht erkannt. Bitte installieren und aktivieren Sie die dazugehörige Debugging-Erweiterung.", + "node2NotSupported": "\"node2\" wird nicht mehr unterstützt, verwenden Sie stattdessen \"node\", und legen Sie das Attribut \"protocol\" auf \"inspector\" fest.", + "debugName": "Der Name der Konfiguration. Er wird im Dropdownmenü der Startkonfiguration angezeigt.", + "debugRequest": "Der Anforderungstyp der Konfiguration. Der Wert kann \"launch\" oder \"attach\" sein.", + "debugServer": "Nur für die Entwicklung von Debugerweiterungen: Wenn ein Port angegeben ist, versucht der VS-Code, eine Verbindung mit einem Debugadapter herzustellen, der im Servermodus ausgeführt wird.", + "debugPrelaunchTask": "Ein Task, der ausgeführt werden soll, bevor die Debugsitzung beginnt.", + "debugPostDebugTask": "Ein Task, der ausgeführt werden soll, nachdem die Debugsitzung endet.", + "debugWindowsConfiguration": "Windows-spezifische Startkonfigurationsattribute.", + "debugOSXConfiguration": "OS X-spezifische Startkonfigurationsattribute.", + "debugLinuxConfiguration": "Linux-spezifische Startkonfigurationsattribute.", + "deprecatedVariables": "\"env.\", \"config.\" und \"command.\" sind veraltet, verwenden Sie stattdessen \"env:\", \"config:\" und \"command:\"." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..eb3d8920646 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "VS Code-Konsole", + "mac.terminal.script.failed": "Fehler bei Skript \"{0}\" mit Exitcode {1}.", + "mac.terminal.type.not.supported": "\"{0}\" wird nicht unterstützt.", + "press.any.key": "Drücken Sie eine beliebige Taste, um fortzufahren...", + "linux.term.failed": "Fehler bei \"{0}\" mit Exitcode {1}." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 7b308ecd6d4..a2f215a756f 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -60,6 +60,7 @@ "malicious": "Böswillig", "disabled": "Deaktiviert", "disabled globally": "Deaktiviert", + "disabled workspace": "Für diesen Arbeitsbereich deaktiviert", "disableAll": "Alle installierten Erweiterungen löschen", "disableAllWorkspace": "Alle installierten Erweiterungen für diesen Arbeitsbereich deaktivieren", "enableAll": "Alle Erweiterungen aktivieren", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 179eb06b234..6789227ba76 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -8,10 +8,12 @@ ], "name": "Erweiterungsname", "extension id": "Erweiterungsbezeichner", + "preview": "Vorschau", "builtin": "Integriert", "publisher": "Name des Herausgebers", "install count": "Installationsanzahl", "rating": "Bewertung", + "repository": "Repositorium", "license": "Lizenz", "details": "Details", "contributions": "Beiträge", @@ -34,15 +36,16 @@ "view location": "Wo", "localizations": "Lokalisierungen ({0})", "localizations language id": "Sprach-ID", - "localizations language name": "Sprachname", - "localizations localized language name": "Sprachname (lokalisiert)", "colorThemes": "Farbdesigns ({0})", "iconThemes": "Symboldesigns ({0})", "colors": "Farben ({0})", + "colorId": "ID", "defaultDark": "Standard, dunkel", "defaultLight": "Standard, hell", "defaultHC": "Standard, hoher Kontrast", "JSON Validation": "JSON-Validierung ({0})", + "fileMatch": "Dateiübereinstimmung", + "schema": "Schema", "commands": "Befehle ({0})", "command name": "Name", "keyboard shortcuts": "Tastenkombinationen", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 161dda932e8..ad43edf49b9 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "Diese Erweiterung wird von Benutzern des aktuellen Arbeitsbereichs empfohlen.", "reallyRecommended2": "Für diesen Dateityp wird die Erweiterung \"{0}\" empfohlen.", "reallyRecommendedExtensionPack": "Für diesen Dateityp wird das Erweiterungspaket \"{0}\" empfohlen.", - "showRecommendations": "Empfehlungen anzeigen", "install": "Installieren", + "showRecommendations": "Empfehlungen anzeigen", "showLanguageExtensions": "Der Marketplace enthält Erweiterungen, die bei \".{0}\"-Dateien behilflich sind.", "workspaceRecommended": "Für diesen Arbeitsbereich sind Erweiterungsempfehlungen verfügbar.", "installAll": "Alle installieren", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index e3e245a637c..b0cd80e83a4 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "Deaktivere Tastenzuordnungen ({0}) um Konfilkte mit anderen zu vermeiden?", "yes": "Ja", - "no": "Nein", - "betterMergeDisabled": "Die \"Better Merge\" Erweiterung ist jetzt integriert, die alte Erweiterung wurde deaktiviert und kann deinstalliert werden.", - "uninstall": "Deinstallieren" + "no": "Nein" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index a3725fa64c5..7cca8764763 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,8 @@ "recommendedExtensions": "Empfohlen", "otherRecommendedExtensions": "Weitere Empfehlungen", "workspaceRecommendedExtensions": "Arbeitsbereich-Empfehlungen", + "builtInExtensions": "Features", + "builtInThemesExtensions": "Designs", "searchExtensions": "Nach Erweiterungen im Marketplace suchen", "sort by installs": "Sortieren nach: Installationsanzahl", "sort by rating": "Sortieren nach: Bewertung", diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 4ba0d0b4fea..2736ae43b6c 100644 --- a/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -27,12 +27,17 @@ "confirmMoveTrashMessageMultiple": "Möchten Sie die folgenden {0} Dateien löschen?", "confirmMoveTrashMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich löschen?", "confirmMoveTrashMessageFile": "Möchten Sie \"{0}\" wirklich löschen?", + "undoBin": "Die Wiederherstellung kann aus dem Papierkorb erfolgen.", + "undoTrash": "Die Wiederherstellung kann aus dem Papierkorb erfolgen.", "doNotAskAgain": "Nicht erneut fragen", "confirmDeleteMessageMultiple": "Möchten Sie die folgenden {0} Dateien endgültig löschen?", "confirmDeleteMessageFolder": "Möchten Sie \"{0}\" samt Inhalt wirklich endgültig löschen?", "confirmDeleteMessageFile": "Möchten Sie \"{0}\" wirklich endgültig löschen?", "irreversible": "Diese Aktion kann nicht rückgängig gemacht werden.", - "importFiles": "Dateien importieren", + "binFailed": "Fehler beim Löschen über den Papierkorb. Möchten Sie den Löschvorgang stattdessen dauerhaft ausführen?", + "trashFailed": "Fehler beim Löschen über den Papierkorb. Möchten Sie den Löschvorgang stattdessen dauerhaft ausführen?", + "deletePermanentlyButtonLabel": "En&&dgültig löschen", + "retryButtonLabel": "Wiede&&rholen", "confirmOverwrite": "Im Zielordner ist bereits eine Datei oder ein Ordner mit dem gleichen Namen vorhanden. Möchten Sie sie bzw. ihn ersetzen?", "replaceButtonLabel": "&&Ersetzen", "fileIsAncestor": "Die einzufügende Datei ist ein Vorgänger des Zielordners", diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 3a121e07e4e..8a4578792a4 100644 --- a/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -37,6 +37,7 @@ "defaultLanguage": "Der Standardsprachmodus, der neuen Dateien zugewiesen wird.", "editorConfigurationTitle": "Editor", "formatOnSave": "Hiermit wird eine Datei beim Speichern formatiert. Es muss ein Formatierer vorhanden sein, die Datei darf nicht automatisch gespeichert werden, und der Editor darf nicht geschlossen werden.", + "formatOnSaveTimeout": "Zeitüberschreitung beim Formatieren während des Speicherns. Legt eine Zeitbegrenzung in Millisekunden für formatOnSave-Befehle fest. Befehle, die länger dauern als die festgelegte Zeitüberschreitung, werden abgebrochen. ", "explorerConfigurationTitle": "Datei-Explorer", "openEditorsVisible": "Die Anzahl der Editoren, die im Bereich \"Geöffnete Editoren\" angezeigt werden.", "autoReveal": "Steuert, ob der Explorer Dateien beim Öffnen automatisch anzeigen und auswählen soll.", diff --git a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 10464e3a656..93c8167356a 100644 --- a/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,13 +7,14 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Geben Sie den Dateinamen ein. Drücken Sie zur Bestätigung die EINGABETASTE oder ESC, um den Vorgang abzubrechen.", - "constructedPath": "{0} in **{1}** erstellen", "filesExplorerViewerAriaLabel": "{0}, Datei-Explorer", "dropFolders": "Möchten Sie die Ordner zum Arbeitsbereich hinzufügen?", "dropFolder": "Möchten Sie den Ordner zum Arbeitsbereich hinzufügen?", "addFolders": "&&Ordner hinzufügen", "addFolder": "&&Ordner hinzufügen", + "confirmRootsMove": "Möchten Sie die Reihenfolge mehrerer Stammordner in Ihrem Arbeitsbereich ändern?", "confirmMultiMove": "Möchten Sie die folgenden {0} Dateien verschieben?", + "confirmRootMove": "Möchten Sie die Reihenfolge des Stammordners \"{0}\" in Ihrem Arbeitsbereich ändern?", "confirmMove": "Möchten Sie \"{0}\" wirklich verschieben?", "doNotAskAgain": "Nicht erneut fragen", "moveButtonLabel": "&&Verschieben", diff --git a/i18n/deu/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index b1ad2f843d9..6f978d7eda1 100644 --- a/i18n/deu/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "Möchten Sie die Sprache der Benutzeroberfläche von VS Code in {0} ändern und einen Neustart durchführen?", "yes": "Ja", "no": "Nein", - "doNotAskAgain": "Nicht erneut fragen", + "neverAgain": "Nicht mehr anzeigen", "JsonSchema.locale": "Die zu verwendende Sprache der Benutzeroberfläche.", "vscode.extension.contributes.localizations": "Trägt Lokalisierungen zum Editor bei", "vscode.extension.contributes.localizations.languageId": "ID der Sprache, in die Anzeigezeichenfolgen übersetzt werden.", diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 3926e145e99..68d40f09248 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Insgesamt {0} Probleme", - "filteredProblems": "Zeigt {0} von {1} Problemen an" + "totalProblems": "Insgesamt {0} Probleme" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json index 58d6f84f140..8a10d218183 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "label": "Probleme", + "tooltip.1": "1 Problem in dieser Datei", + "tooltip.N": "{0} Probleme in dieser Datei", "markers.showOnFile": "Fehler & Warnungen auf Dateien und Ordnern anzeigen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 6b3a52e72b9..1dd4edae3e5 100644 --- a/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "Probleme", "markers.panel.aria.label.problems.tree": "Probleme nach Dateien gruppiert", "markers.panel.no.problems.build": "Es wurden bisher keine Probleme im Arbeitsbereich erkannt.", - "markers.panel.no.problems.filters": "Es wurden keine Ergebnisse mit den angegebenen Filterkriterien gefunden.", "markers.panel.action.filter": "Probleme filtern", - "markers.panel.filter.placeholder": "Nach Typ oder Text filtern", + "markers.panel.filter.ariaLabel": "Probleme filtern", "markers.panel.filter.errors": "Fehler", "markers.panel.filter.warnings": "Warnungen", "markers.panel.filter.infos": "Informationen", @@ -30,5 +29,15 @@ "markers.panel.multiple.unknowns.label": "{0} Unbekannte", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "{0} mit {1} Problemen", + "problems.tree.aria.label.marker.relatedInformation": "Dieses Problem verweist auf {0} Speicherorte.", + "problems.tree.aria.label.error.marker": "Von {0} generierter Fehler: {1} in Zeile {2} bei Zeichen {3}.{4}", + "problems.tree.aria.label.error.marker.nosource": "Fehler: {0} in Zeile {1} bei Zeichen {2}.{3}", + "problems.tree.aria.label.warning.marker": "Von {0} generierte Warnung: {1} in Zeile {2} bei Zeichen {3}.{4}", + "problems.tree.aria.label.warning.marker.nosource": "Warnung: {0} in Zeile {1} bei Zeichen {2}.{3}", + "problems.tree.aria.label.info.marker": "Von {0} generierte Informationen: {1} in Zeile {2} bei Zeichen {3}.{4}", + "problems.tree.aria.label.info.marker.nosource": "Informationen: {0} in Zeile {1} bei Zeichen {2}.{3}", + "problems.tree.aria.label.marker": "Von {0} generiertes Problem: {1} in Zeile {2} bei Zeichen {3}.{4}", + "problems.tree.aria.label.marker.nosource": "Problem: {0} in Zeile {1} bei Zeichen {2}.{3}", + "problems.tree.aria.label.relatedinfo.message": "{0} in Zeile {1} bei Zeichen {2} in {3}", "errors.warnings.show.label": "Fehler und Warnungen anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/deu/src/vs/workbench/parts/output/browser/outputActions.i18n.json index 8a331f71f6e..d5aa2275e15 100644 --- a/i18n/deu/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "Ausgabe umschalten", "clearOutput": "Ausgabe löschen", "toggleOutputScrollLock": "Ausgabe-Bildlaufsperre umschalten", - "switchToOutput.label": "Zur Ausgabe wechseln" + "switchToOutput.label": "Zur Ausgabe wechseln", + "openInLogViewer": "Protokolldatei öffnen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index 88ed08aa1d5..900a7f7ac3b 100644 --- a/i18n/deu/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "Ausgabe", "logViewer": "Protokollanzeige", "viewCategory": "Anzeigen", - "clearOutput.label": "Ausgabe löschen" + "clearOutput.label": "Ausgabe löschen", + "openActiveLogOutputFile": "Ansicht: Aktive Protokollausgabedatei öffnen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index d9089d4fc04..737a3d57cf8 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Tastenkombinationen", + "showDefaultKeybindings": "Standard-Tastaturbelegungen anzeigen", + "showUserKeybindings": "Benutzer-Tastaturbelegungen anzeigen", "SearchKeybindings.AriaLabel": "Tastenzuordnungen suchen", "SearchKeybindings.Placeholder": "Tastenzuordnungen suchen", "sortByPrecedene": "Nach Priorität sortieren", diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index c30d63e57e9..43033cd08a7 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Raw-Standardeinstellungen öffnen", + "openSettings": "Einstellungen öffnen", "openGlobalSettings": "Benutzereinstellungen öffnen", "openGlobalKeybindings": "Tastaturkurzbefehle öffnen", "openGlobalKeybindingsFile": "Datei mit Tastaturkurzbefehlen öffnen", diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 6baba95d0bf..1fe4a79f5f0 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Standardeinstellungen", "SearchSettingsWidget.AriaLabel": "Einstellungen suchen", "SearchSettingsWidget.Placeholder": "Einstellungen suchen", "noSettingsFound": "Keine Ergebnisse", diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 2940088146f..93e401bd692 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "Erweiterung \"{0}\" anzeigen", "editTtile": "Bearbeiten", "replaceDefaultValue": "In Einstellungen ersetzen", - "copyDefaultValue": "In Einstellungen kopieren", - "unsupportedPHPExecutablePathSetting": "Diese Einstellung muss eine Benutzereinstellung sein. Öffnen Sie zum Konfigurieren von PHP für den Arbeitsbereich eine PHP-Datei, und klicken Sie in der Statusleiste auf \"PHP-Pfad\".", - "unsupportedWorkspaceSetting": "Diese Einstellung muss eine Benutzereinstellung sein.", - "unsupportedWorkbenchSetting": "Diese Einstellung kann jetzt nicht angewendet werden. Sie wird angewendet, wenn Sie den Ordner direkt öffnen.", - "unsupportedWorkbenchSettingDevMode": "Diese Einstellung kann jetzt nicht angewendet werden. Sie wird angewendet, wenn Sie ihren Bereich beim Registrieren als \"Ressource\" definieren oder den Ordner direkt öffnen." + "copyDefaultValue": "In Einstellungen kopieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json index f36a3d9c95f..ac92df5f79c 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Nächstes Sucheinschlussmuster anzeigen", "previousSearchIncludePattern": "Vorheriges Sucheinschlussmuster anzeigen", + "nextSearchExcludePattern": "Nächstes Suchausschlussmuster anzeigen", + "previousSearchExcludePattern": "Vorheriges Suchausschlussmuster anzeigen", "nextSearchTerm": "Nächsten Suchbegriff anzeigen", "previousSearchTerm": "Vorherigen Suchbegriff anzeigen", - "showSearchViewlet": "Suche anzeigen", "findInFiles": "In Dateien suchen", "replaceInFiles": "In Dateien ersetzen", "RefreshAction.label": "Aktualisieren", diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/searchView.i18n.json index 97d605ad472..f2f216a0a04 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Suchdetails umschalten", + "searchScope.includes": "Einzuschließende Dateien", + "label.includes": "Sucheinschlussmuster", + "searchScope.excludes": "Auszuschließende Dateien", + "label.excludes": "Suchausschlussmuster", "replaceAll.confirmation.title": "Alle ersetzen", "replaceAll.confirm.button": "&&Ersetzen", "replaceAll.occurrence.file.message": "{0} Vorkommen in {1} Datei durch \"{2}\" ersetzt.", diff --git a/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 1dbbf27f3f1..23fd972a5ff 100644 --- a/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Suchen", + "copyMatchLabel": "Kopieren", + "copyPathLabel": "Pfad kopieren", + "copyAllLabel": "Alles kopieren", "findInFolder": "In Ordner suchen...", "findInWorkspace": "In Arbeitsbereich suchen...", "showTriggerActions": "Zu Symbol im Arbeitsbereich wechseln...", "name": "Suchen", - "search": "Suchen", "showSearchViewl": "Suche anzeigen", "view": "Anzeigen", "findInFiles": "In Dateien suchen", @@ -25,6 +28,5 @@ "search.quickOpen.includeSymbols": "Konfigurieren Sie diese Option, um Ergebnisse aus einer globalen Symbolsuche in die Dateiergebnisse für Quick Open einzuschließen.", "search.followSymlinks": "Steuert, ob Symlinks während der Suche gefolgt werden.", "search.smartCase": "Sucht ohne Berücksichtigung von Groß-/Kleinschreibung, wenn das Muster kleingeschrieben ist, andernfalls wird mit Berücksichtigung von Groß-/Kleinschreibung gesucht.", - "search.globalFindClipboard": "Steuert, ob die Suchansicht die freigegebene Suchzwischenablage auf macOS lesen oder verändern soll", - "search.location": "Vorschau: Steuert, ob die Suche als Ansicht in der Seitenleiste oder als Bedienfeld im Bereich des Bedienfelds für horizontales Layout angezeigt wird. In der nächsten Version wird das horizontale Layout im Bedienfeld verbessert und dies keine Vorschau mehr sein." + "search.globalFindClipboard": "Steuert, ob die Suchansicht die freigegebene Suchzwischenablage auf macOS lesen oder verändern soll" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 3c93dff57c4..4f5c93b0864 100644 --- a/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "Helfen Sie uns die Unterstützung für {0} zu verbessern", "takeShortSurvey": "An kurzer Umfrage teilnehmen", "remindLater": "Später erinnern", - "neverAgain": "Nicht mehr anzeigen", - "helpUs": "Helfen Sie uns die Unterstützung für {0} zu verbessern" + "neverAgain": "Nicht mehr anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 8a2cf7269c2..3acd207c608 100644 --- a/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "Wir würden uns freuen, wenn Sie an einer schnellen Umfrage teilnehmen.", "takeSurvey": "An Umfrage teilnehmen", "remindLater": "Später erinnern", - "neverAgain": "Nicht mehr anzeigen", - "surveyQuestion": "Wir würden uns freuen, wenn Sie an einer schnellen Umfrage teilnehmen." + "neverAgain": "Nicht mehr anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index cf9da95afab..4bee31d66e2 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "Ein Problemmuster oder der Name eines beigetragenen oder vordefinierten Problemmusters. Kann ausgelassen werden, wenn die Basis angegeben ist.", "ProblemMatcherSchema.base": "Der Name eines zu verwendenden Basisproblemabgleichers.", "ProblemMatcherSchema.owner": "Der Besitzer des Problems im Code. Kann ausgelassen werden, wenn \"base\" angegeben wird. Der Standardwert ist \"external\", wenn keine Angabe erfolgt und \"base\" nicht angegeben wird.", + "ProblemMatcherSchema.source": "Eine visuell lesbare Zeichenfolge, die die Quelle dieser Diagnose beschreibt, z. B. \"typescript\" oder \"super lint\".", "ProblemMatcherSchema.severity": "Der Standardschweregrad für Erfassungsprobleme. Dieser wird verwendet, wenn das Muster keine Übereinstimmungsgruppe für den Schweregrad definiert.", "ProblemMatcherSchema.applyTo": "Steuert, ob ein für ein Textdokument gemeldetes Problem nur auf geöffnete, geschlossene oder alle Dokumente angewendet wird.", "ProblemMatcherSchema.fileLocation": "Definiert, wie Dateinamen interpretiert werden sollen, die in einem Problemmuster gemeldet werden.", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 37a1bba4e0c..fcf1a9b5913 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,7 +28,14 @@ "JsonSchema.tasks.group.none": "Weist die Aufgabe keiner Gruppe zu.", "JsonSchema.tasks.group": "Definiert die Ausführungsgruppe, zu der diese Aufgabe gehört. Zum Hinzufügen der Aufgabe zur Buildgruppe wird \"build\" unterstützt und zum Hinzufügen zur Testgruppe \"test\".", "JsonSchema.tasks.type": "Definiert, ob die Aufgabe als Prozess oder als Befehl innerhalb einer Shell ausgeführt wird.", + "JsonSchema.command.quotedString.value": "Der tatsächliche Sollwert", + "JsonSchema.tasks.quoting.escape": "Fügt mithilfe des Escapezeichens der Shell vor Zeichen Escapezeichen ein (z. B. `  bei PowerShell und \\ bei Bash).", + "JsonSchema.tasks.quoting.strong": "Setzt das Argument mithilfe des starken Anführungszeichens der Shell in Anführungszeichen (z. B. \" bei PowerShell und Bash).", + "JsonSchema.tasks.quoting.weak": "Setzt das Argument mithilfe des schwachen Anführungszeichens der Shell in Anführungszeichen (z. B. ' bei PowerShell und Bash).", + "JsonSchema.command.quotesString.quote": "In welche Anführungszeichen der Befehlswert gesetzt wird.", "JsonSchema.command": "Der auszuführende Befehl. Es kann sich um ein externes Programm oder einen Shellbefehl handeln.", + "JsonSchema.args.quotedString.value": "Der tatsächliche Argumentwert", + "JsonSchema.args.quotesString.quote": "In welche Anführungszeichen der Argumentwert gesetzt wird.", "JsonSchema.tasks.args": "Argumente, die an den Befehl übergeben werden, wenn diese Aufgabe aufgerufen wird.", "JsonSchema.tasks.label": "Die Bezeichnung der Aufgabe der Benutzerschnittstelle", "JsonSchema.version": "Die Versionsnummer der Konfiguration.", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index b20a17cd7a7..a7490d669b4 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,7 +11,9 @@ "totalErrors": "{0} Fehler", "totalWarnings": "{0} Warnungen", "totalInfos": "{0}-Informationen", + "problems": "Probleme", "building": "Wird gebaut...", + "manyProblems": "Über 10.000", "runningTasks": "Aktive Aufgaben anzeigen", "tasks": "Aufgaben", "TaskSystem.noHotSwap": "Zum Ändern des Aufgabenausführungsmoduls mit einem aktiven Task muss das Fenster erneut geladen werden.", @@ -29,8 +31,8 @@ "selectProblemMatcher": "Fehler- und Warnungsarten auswählen, auf die die Aufgabenausgabe überprüft werden soll", "customizeParseErrors": "Die aktuelle Aufgabenkonfiguration weist Fehler auf. Beheben Sie die Fehler, bevor Sie eine Aufgabe anpassen.", "moreThanOneBuildTask": "In \"tasks.json\" sind mehrere Buildaufgaben definiert. Die erste wird ausgeführt.\n", - "TaskSystem.activeSame.background": "Die Aufgabe \"{0}\" ist bereits im Hintergrundmodus aktiv. Klicken Sie zum Beenden der Aufgabe im Menü \"Aufgaben\" auf \"Aufgabe beenden…\".", - "TaskSystem.activeSame.noBackground": "Die Aufgabe \"{0}\" ist bereits aktiv. Klicken Sie zum Beenden der Aufgabe im Menü \"Aufgaben\" auf \"Aufgabe beenden\".", + "terminateTask": "Aufgabe beenden", + "restartTask": "Aufgabe neu starten", "TaskSystem.active": "Eine aktive Aufgabe wird bereits ausgeführt. Beenden Sie diese, bevor Sie eine andere Aufgabe ausführen.", "TaskSystem.restartFailed": "Fehler beim Beenden und Neustarten der Aufgabe \"{0}\".", "TaskService.noConfiguration": "Fehler: Die Aufgabenerkennung {0} hat für die folgende Konfiguration keine Aufgabe beigetragen:\n {1}\nDie Aufgabe wird ignoriert.\n", @@ -47,8 +49,8 @@ "recentlyUsed": "zuletzt verwendete Aufgaben", "configured": "konfigurierte Aufgaben", "detected": "erkannte Aufgaben", - "TaskService.notAgain": "Nicht mehr anzeigen", "TaskService.ignoredFolder": "Die folgenden Arbeitsbereichsordner werden ignoriert, da sie Aufgabenversion 0.1.0 verwenden: {0}", + "TaskService.notAgain": "Nicht mehr anzeigen", "TaskService.pickRunTask": "Auszuführende Aufgabe auswählen", "TaslService.noEntryToRun": "Es wurde keine auszuführende Aufgabe gefunden. Aufgaben konfigurieren...", "TaskService.fetchingBuildTasks": "Buildaufgaben werden abgerufen...", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 2dfda5e5aca..4f46618a812 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "Warnung: \"options.cwd\" muss vom Typ \"string\" sein. Der Wert {0} wird ignoriert.\n", + "ConfigurationParser.inValidArg": "Fehler: Befehlsargumente müssen Zeichenfolgen oder Zeichenfolgen in Anführungszeichen sein. Der angegebene Wert ist:\n{0}", "ConfigurationParser.noargs": "Fehler: Befehlsargumente müssen ein Array aus Zeichenfolgen sein. Angegebener Wert:\n{0}", "ConfigurationParser.noShell": "Warnung: Die Shell-Konfiguration wird nur beim Ausführen von Tasks im Terminal unterstützt.", "ConfigurationParser.noName": "Fehler: Der Problemabgleich im Deklarationsbereich muss einen Namen besitzen:\n{0}\n", diff --git a/i18n/deu/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..84fc7fe0d67 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "Die Hintergrundfarbe des Terminals, dies ermöglicht eine unterschiedliche Färbung des Terminals im Panel.", + "terminal.foreground": "Die Vordergrundfarbe des Terminal.", + "terminalCursor.foreground": "Die Vordergrundfarbe des Terminalcursors.", + "terminalCursor.background": "Die Hintergrundfarbe des Terminalcursors. Ermöglicht das Anpassen der Farbe eines Zeichens, das von einem Blockcursor überdeckt wird.", + "terminal.selectionBackground": "Die Auswahlvordergrundfarbe des Terminals.", + "terminal.border": "Die Farbe des Rahmens, der Bereiche innerhalb des Terminals teilt. Der Standardwert ist panel.border.", + "terminal.ansiColor": "\"{0}\" ANSI-Farbe im Terminal" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index b47e2f347c0..c66ad2bebf8 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -51,5 +51,7 @@ "workbench.action.terminal.hideFindWidget": "Widget zum Ausblenden der Suche", "nextTerminalFindTerm": "Nächsten Suchbegriff anzeigen", "previousTerminalFindTerm": "Vorherigen Suchbegriff anzeigen", - "quickOpenTerm": "Aktives Terminal wechseln" + "quickOpenTerm": "Aktives Terminal wechseln", + "workbench.action.terminal.selectToPreviousCommand": "Auswählen bis zu vorherigem Befehl", + "workbench.action.terminal.selectToNextCommand": "Auswählen bis zu nächstem Befehl" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index fd696a9b61a..531c9fb5189 100644 --- a/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "Dieser Arbeitsbereich enthält Einstellungen, die nur in den Benutzereinstellungen festgelegt werden können ({0}). Klicken Sie [hier]({1}), um mehr zu erfahren.", "openWorkspaceSettings": "Arbeitsbereichseinstellungen öffnen", - "dontShowAgain": "Nicht mehr anzeigen", - "unsupportedWorkspaceSettings": "Dieser Arbeitsbereich enthält Einstellungen, die nur in den Benutzereinstellungen festgelegt werden können ({0}). Klicken Sie [hier]({1}), um mehr zu erfahren." + "dontShowAgain": "Nicht mehr anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json index e77ab265d42..dbd9faf3c7e 100644 --- a/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "Später", "releaseNotes": "Anmerkungen zu dieser Version", "showReleaseNotes": "Anmerkungen zu dieser Version anzeigen", "read the release notes": "Willkommen bei {0} v{1}! Möchten Sie die Hinweise zu dieser Version lesen?", @@ -16,13 +15,12 @@ "updateIsReady": "Neues {0}-Update verfügbar.", "noUpdatesAvailable": "Zurzeit sind keine Updates verfügbar.", "ok": "OK", - "download now": "Jetzt herunterladen", "thereIsUpdateAvailable": "Ein Update ist verfügbar.", + "download now": "Jetzt herunterladen", + "later": "Später", "installUpdate": "Update installieren", - "updateAvailable": "Ein Update ist verfügbar: {0} {1}", "updateInstalling": "{0} {1} wird im Hintergrund installiert. Wir informieren Sie, wenn dies abgeschlossen ist.", "updateNow": "Jetzt aktualisieren", - "updateAvailableAfterRestart": "{0} wird nach dem Neustart aktualisiert.", "commandPalette": "Befehlspalette...", "settings": "Einstellungen", "keyboardShortcuts": "Tastenkombinationen", diff --git a/i18n/deu/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 0a2dcb8a2c9..129a60d789e 100644 --- a/i18n/deu/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "Webview-Editor" + "webview.editor.label": "Webview-Editor", + "developer": "Entwickler" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/deu/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..1492a37abd0 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Webview-Entwicklertools öffnen", + "refreshWebviewLabel": "Webviews erneut laden" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index eab41295e8a..343d4b1d7ec 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Tragen Sie zur Verbesserung von VS Code bei, und lassen Sie zu, dass Microsoft Nutzungsdaten erfasst. Lesen Sie unsere [Datenschutzvereinbarung]({0}), und erfahren Sie, wie Sie dies [deaktivieren]({1}).", + "telemetryOptOut.optInNotice": "Tragen Sie zur Verbesserung von VS Code bei, und lassen Sie zu, dass Microsoft Nutzungsdaten erfasst. Lesen Sie unsere [Datenschutzvereinbarung]({0}), und erfahren Sie, wie Sie dies [aktivieren]({1}).", "telemetryOptOut.readMore": "Weitere Informationen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 406000b5b3e..de0f13bcb07 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "Tools und Sprachen", "welcomePage.installExtensionPacksDescription": "Unterstützung für {0} und {1} installieren", "welcomePage.moreExtensions": "mehr", - "welcomePage.installKeymapDescription": "Tastenkombinationen installieren", - "welcomePage.installKeymapExtension": "Installieren Sie die Tastenkombinationen von {0} und {1}.", "welcomePage.others": "Andere", "welcomePage.colorTheme": "Farbdesign", "welcomePage.colorThemeDescription": "Passen Sie das Aussehen des Editors und Ihres Codes an Ihre Wünsche an.", diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..0905d3e2f24 --- /dev/null +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedWindowSetting": "Diese Einstellung kann jetzt nicht angewendet werden. Sie wird angewendet, wenn Sie den Ordner direkt öffnen." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 88c843bf458..5887d7611b4 100644 --- a/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "Der Erweiterungshost wurde unerwartet beendet.", "extensionHostProcess.unresponsiveCrash": "Der Erweiterungshost wurde beendet, weil er nicht reagiert hat.", - "devTools": "Entwicklertools", "restart": "Erweiterungshost neu starten", "overwritingExtension": "Die Erweiterung \"{0}\" wird mit \"{1}\" überschrieben.", "extensionUnderDevelopment": "Die Entwicklungserweiterung unter \"{0}\" wird geladen.", diff --git a/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index d1ad985a6bd..25ed118e0c1 100644 --- a/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,10 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Microsoft .NET Framework 4.5 ist erforderlich. Klicken Sie auf den Link, um die Anwendung zu installieren.", "installNet": ".NET Framework 4.5 herunterladen", "neverShowAgain": "Nicht mehr anzeigen", - "netVersionError": "Microsoft .NET Framework 4.5 ist erforderlich. Klicken Sie auf den Link, um die Anwendung zu installieren.", + "enospcError": "{0} kann keine Dateiänderungen in diesem großen Workspace überwachen. Folgen Sie dem Anwendungslink, um das Problem zu beheben.", "learnMore": "Anweisungen", + "fileInvalidPath": "Ungültige Dateiressource ({0})", + "fileIsDirectoryError": "Die Datei ist ein Verzeichnis", + "fileNotModifiedError": "Datei nicht geändert seit", + "fileTooLargeError": "Die Datei ist zu groß, um sie zu öffnen.", + "fileNotFoundError": "Die Datei wurde nicht gefunden ({0}).", + "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", + "filePermission": "Schreibzugriff auf Datei ({0}) verweigert", + "fileExists": "Die zu erstellende Datei ist bereits vorhanden ({0}). ", + "fileModifiedError": "Datei geändert seit", + "fileReadOnlyError": "Die Datei ist schreibgeschützt.", + "fileMoveConflict": "Verschieben/Kopieren kann nicht ausgeführt werden. Die Datei ist am Ziel bereits vorhanden.", + "unableToMoveCopyError": "Der Verschiebe-/Kopiervorgang kann nicht ausgeführt werden. Die Datei würde den Ordner ersetzen, in dem sie enthalten ist.", "binFailed": "Fehler beim Verschieben von \"{0}\" in den Papierkorb.", "trashFailed": "Fehler beim Verschieben von \"{0}\" in den Papierkorb." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index ae94f99053a..c75ef9a2b35 100644 --- a/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Die Datei wurde nicht gefunden ({0}).", "fileIsDirectoryError": "Die Datei ist ein Verzeichnis", "fileNotModifiedError": "Datei nicht geändert seit", "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden." diff --git a/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index f8184dd0601..c9b03adcbae 100644 --- a/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "Der TextMate-Bereichsname, der von der tmLanguage-Datei verwendet wird.", "vscode.extension.contributes.grammars.path": "Der Pfad der tmLanguage-Datei. Der Pfad ist relativ zum Extensionordner und beginnt normalerweise mit \". /syntaxes/\".", "vscode.extension.contributes.grammars.embeddedLanguages": "Eine Zuordnung zwischen Bereichsname und Sprach-ID, wenn diese Grammatik eingebettete Sprachen enthält.", + "vscode.extension.contributes.grammars.tokenTypes": "Eine Zuordnung von Bereichsnamen zu Tokentypen.", "vscode.extension.contributes.grammars.injectTo": "Die Liste der Sprachbereichsnamen, in die diese Grammatik injiziert wird." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index 64b51d1c603..033bdbfd918 100644 --- a/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/deu/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "Expected string in `contributes.{0}.path`. Provided value: {1}", "invalid.injectTo": "Ungültiger Wert in \"contributes.{0}.injectTo\". Es muss sich um ein Array von Sprachbereichsnamen handeln. Bereitgestellter Wert: {1}", "invalid.embeddedLanguages": "Ungültiger Wert in \"contributes.{0}.embeddedLanguages\". Muss eine Objektzuordnung von Bereichsname zu Sprache sein. Angegebener Wert: {1}", + "invalid.tokenTypes": "Ungültiger Wert in \"contributes.{0}.tokenTypes\". Muss eine Objektzuordnung von Bereichsname zu Tokentyp sein. Angegebener Wert: {1}", "invalid.path.1": "Es wurde erwartet, dass \"contributes.{0}.path\" ({1}) im Ordner ({2}) der Erweiterung enthalten ist. Dies führt ggf. dazu, dass die Erweiterung nicht portierbar ist.", "no-tm-grammar": "Keine TM-Grammatik für diese Sprache registriert." } \ No newline at end of file diff --git a/i18n/esn/extensions/css-language-features/package.i18n.json b/i18n/esn/extensions/css-language-features/package.i18n.json index 5b2576647c5..91d31339c05 100644 --- a/i18n/esn/extensions/css-language-features/package.i18n.json +++ b/i18n/esn/extensions/css-language-features/package.i18n.json @@ -8,6 +8,7 @@ ], "displayName": "Características del lenguaje CSS", "description": "Proporciona un potente soporte de lenguaje para archivos CSS, LESS y SCSS.", + "css.title": "CSS", "css.lint.argumentsInColorFunction.desc": "Número de parámetros no válido", "css.lint.boxModel.desc": "No use ancho o alto con el relleno o los bordes.", "css.lint.compatibleVendorPrefixes.desc": "Cuando use un prefijo específico del proveedor, compruebe que también haya incluido el resto de propiedades específicas del proveedor.", @@ -50,6 +51,7 @@ "less.lint.zeroUnits.desc": "No se necesita una unidad para cero", "less.validate.title": "Controla la validación de LESS y la gravedad de los problemas.", "less.validate.desc": "Habilita o deshabilita todas las validaciones", + "scss.title": "SCSS (Sass)", "scss.lint.argumentsInColorFunction.desc": "Número de parámetros no válido", "scss.lint.boxModel.desc": "No use ancho o alto con el relleno o los bordes.", "scss.lint.compatibleVendorPrefixes.desc": "Cuando use un prefijo específico del proveedor, compruebe que también haya incluido el resto de propiedades específicas del proveedor.", diff --git a/i18n/esn/extensions/css/package.i18n.json b/i18n/esn/extensions/css/package.i18n.json index a0ca458b69d..8b817c2ddd4 100644 --- a/i18n/esn/extensions/css/package.i18n.json +++ b/i18n/esn/extensions/css/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "Básicos de CSS", "description": "Proporciona resaltado de sintaxis y correspondencia de corchetes en archivos CSS, LESS y SCSS." } \ No newline at end of file diff --git a/i18n/esn/extensions/emmet/package.i18n.json b/i18n/esn/extensions/emmet/package.i18n.json index 852d92d405c..d6c05800c1e 100644 --- a/i18n/esn/extensions/emmet/package.i18n.json +++ b/i18n/esn/extensions/emmet/package.i18n.json @@ -35,7 +35,7 @@ "emmetExtensionsPath": "Ruta de acceso a una carpeta que contiene los perfiles y fragmentos de Emmet.", "emmetShowExpandedAbbreviation": "Muestra abreviaciones Emmet expandidas como sugerencias. La opción \"inMarkupAndStylesheetFilesOnly\" se aplica a HTML, HAML, Jade, Slim, XML, XSL, CSS, SCSS, SASS, LESS y Stylus. La opción \"always\" se aplica a todas las partes del archivo, independientemente de que sea de marcado o CSS. ", "emmetShowAbbreviationSuggestions": "Muestra posibles abreviaciones Emmet como sugerencias. No se aplica a hojas de estilos ni cuando emmet.showExpandedAbbreviation está establecido en \"never\". ", - "emmetIncludeLanguages": "Habilita abreviaciones Emmet en lenguajes que no se admiten de forma predeterminada. Agregue una asignación aquí entre el lenguaje y el lenguaje que admite Emmet. Ejemplo: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"} ", + "emmetIncludeLanguages": "Habilite las abreviaturas de Emmet en idiomas que no sean compatibles de forma predeterminada. Añada una asignación aquí entre el idioma y el idioma admitido por Emmet.\n Ej.: { \"Vue-HTML \": \"HTML \", \"JavaScript \": \"javascriptreact \"}", "emmetVariables": "Variables para ser utilizadas en fragmentos de código de Emmet", "emmetTriggerExpansionOnTab": "Cuando se habilita, se expande la abreviación Emmet al presionar la tecla TAB. ", "emmetPreferences": "Preferencias usadas para modificar el comportamiento de algunas acciones y resoluciones de Emmet.", @@ -59,5 +59,7 @@ "emmetPreferencesCssWebkitProperties": "Propiedades CSS separadas por comas que obtienen el prefijo de proveedor 'webkit' cuando se utilizan en la abreviatura Emmet que comienza con '-'. Establecer en la cadena vacía para evitar siempre el prefijo 'webkit'.", "emmetPreferencesCssMozProperties": "Propiedades CSS separadas por comas que obtienen el prefijo de proveedor 'moz' cuando se utilizan en la abreviatura Emmet que comienza con '-'. Establecer en la cadena vacía para evitar siempre el prefijo 'moz'.", "emmetPreferencesCssOProperties": "Propiedades CSS separadas por comas que obtienen el prefijo de proveedor 'o' cuando se utilizan en la abreviatura Emmet que comienza con '-'. Establecer en la cadena vacía para evitar siempre el prefijo 'o'.", - "emmetPreferencesCssMsProperties": "Propiedades CSS separadas por comas que obtienen el prefijo de proveedor 'ms' cuando se utilizan en la abreviatura Emmet que comienza con '-'. Establecer en la cadena vacía para evitar siempre el prefijo 'ms'." + "emmetPreferencesCssMsProperties": "Propiedades CSS separadas por comas que obtienen el prefijo de proveedor 'ms' cuando se utilizan en la abreviatura Emmet que comienza con '-'. Establecer en la cadena vacía para evitar siempre el prefijo 'ms'.", + "emmetPreferencesCssFuzzySearchMinScore": "La mínima puntuación (de 0 a 1) que se debe alcanzar en la comparación difusa de abreviación. Los valores más bajos pueden producir muchos resultados falsos positivos, los valores más altos pueden reducir posibles coincidencias.", + "emmetOptimizeStylesheetParsing": "Cuando se establece en falso, se analiza el archivo entero para determinar si la posición actual es válida para la expansión de abreviaturas de Emmet. Cuando se establece en verdadero, sólo el contenido alrededor de la posición actual en archivos css, scss/less es analizado." } \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index 53ebb086ddb..6f668444142 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "Aceptar", "push with tags success": "Insertado con etiquetas correctamente.", "pick remote": "Seleccionar un elemento remoto para publicar la rama '{0}':", + "sync is unpredictable": "Esta acción insertará e incorporará cambios en y desde '{0}/{1}'.", "never again": "No volver a mostrar ", "no remotes to publish": "El repositorio no tiene remotos configurados en los que publicar.", "no changes stash": "No existen cambios para el guardado provisional.", diff --git a/i18n/esn/extensions/html/package.i18n.json b/i18n/esn/extensions/html/package.i18n.json index 114d2d72125..3a6ffcc4e4e 100644 --- a/i18n/esn/extensions/html/package.i18n.json +++ b/i18n/esn/extensions/html/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Conceptos básicos de lenguaje HTML" + "displayName": "Conceptos básicos de lenguaje HTML", + "description": "Proporciona resaltado de sintaxis, correspondencia de corchetes y fragmentos de código en archivos HTML." } \ No newline at end of file diff --git a/i18n/esn/extensions/markdown-language-features/out/security.i18n.json b/i18n/esn/extensions/markdown-language-features/out/security.i18n.json index 09a54bc2ce3..6d04884c962 100644 --- a/i18n/esn/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/esn/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "Strict", "strict.description": "Cargar solo el contenido seguro", + "insecureLocalContent.title": "Permitir contenido local inseguro ", + "insecureLocalContent.description": "Habilitar la carga del contenido sobre http desde localhost", "insecureContent.title": "Permitir contenido no seguro", "insecureContent.description": "Habilitar el contenido de carga sobre http", "disable.title": "Deshabilitar", @@ -15,5 +17,6 @@ "moreInfo.title": "Más información", "enableSecurityWarning.title": "Habilitar advertencias de seguridad de vista previa en este espacio de trabajo", "disableSecurityWarning.title": "Deshabilitar advertencias de seguridad de vista previa en este espacio de trabajo", + "toggleSecurityWarning.description": "No afecta al nivel de seguridad de contenido", "preview.showPreviewSecuritySelector.title": "Seleccione configuración de seguridad para las previsualizaciones de Markdown en esta área de trabajo" } \ No newline at end of file diff --git a/i18n/esn/extensions/php-language-features/package.i18n.json b/i18n/esn/extensions/php-language-features/package.i18n.json index dd2f1e37fd8..0b5e90ed32d 100644 --- a/i18n/esn/extensions/php-language-features/package.i18n.json +++ b/i18n/esn/extensions/php-language-features/package.i18n.json @@ -12,5 +12,7 @@ "configuration.validate.run": "Indica si linter se ejecuta al guardar o al escribir.", "configuration.title": "PHP", "commands.categroy.php": "PHP", - "command.untrustValidationExecutable": "No permitir el ejecutable de validación de PHP (como configuración de área de trabajo)" + "command.untrustValidationExecutable": "No permitir el ejecutable de validación de PHP (como configuración de área de trabajo)", + "displayName": "Características del lenguaje PHP", + "description": "Proporciona un potente soporte de lenguaje para archivos PHP." } \ No newline at end of file diff --git a/i18n/esn/extensions/php/package.i18n.json b/i18n/esn/extensions/php/package.i18n.json index e7b6423f2b6..edf1d540da8 100644 --- a/i18n/esn/extensions/php/package.i18n.json +++ b/i18n/esn/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Características del lenguaje PHP" + "displayName": "Conceptos básicos del lenguaje PHP", + "description": "Proporciona resaltado de sintaxis y correspondencia de corchetes en archivos PHP." } \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/commands.i18n.json b/i18n/esn/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..0406f029ae5 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Abra una carpeta en VS Code para usar un proyecto de TypeScript o JavaScript", + "typescript.projectConfigUnsupportedFile": "No se pudo determinar el proyecto de TypeScript o JavaScript. Tipo de archivo no compatible", + "typescript.projectConfigCouldNotGetInfo": "No se pudo determinar el proyecto de TypeScript o JavaScript", + "typescript.noTypeScriptProjectConfig": "El archivo no forma parte de un proyecto de TypeScript. Haga clic [aquí]({0}) para obtener más información.", + "typescript.noJavaScriptProjectConfig": "El archivo no forma parte de un proyecto de JavaScript. Haga clic [aquí]({0}) para obtener más información.", + "typescript.configureTsconfigQuickPick": "Configurar tsconfig.json", + "typescript.configureJsconfigQuickPick": "Configurar jsconfig.json" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..20f05236719 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Seleccione acción de código para aplicar", + "acquiringTypingsLabel": "Adquiriendo typings...", + "acquiringTypingsDetail": "Adquiriendo definiciones de typings para IntelliSense.", + "autoImportLabel": "Importar automáticamente desde {0}" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..c51828607c1 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Habilita la verificación semántica en un archivo de JavaScript. Debe estar al principio del archivo.", + "ts-nocheck": "Deshabilita la verificación semántica en un archivo de JavaScript. Debe estar al principio del archivo.", + "ts-ignore": "Suprime los errores @ts-check en la siguiente línea de un archivo. " +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..5cab0f0f878 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 implementación", + "manyImplementationLabel": "{0} implementaciones", + "implementationsErrorLabel": "No se pueden determinar las implementaciones" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..7579ba46bb3 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "Comentario de JSDoc" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..226cfad1182 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "Organizar las importaciones" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..a3699d251e4 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (Corregir todo en el archivo)" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..028c2af8de2 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 referencia", + "manyReferenceLabel": "{0} referencias", + "referenceErrorLabel": "No se pudieron determinar las referencias" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..2737725617d --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "construir - {0}", + "buildAndWatchTscLabel": "seguir - {0}" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/esn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..12d95cb7073 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "La ruta de acceso {0} no apunta a una instalación válida de tsserver. Se usará la versión de TypeScript del paquete.", + "serverCouldNotBeStarted": "El servidor de lenguaje TypeScript no se pudo iniciar. El mensaje de error es: {0}", + "typescript.openTsServerLog.notSupported": "El registro del servidor de TS requiere TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "Los registros del servidor TS están desconectados. Establezca \"typescript.tsserver.log\" y reinicie el servidor TS para activar los registros.", + "typescript.openTsServerLog.enableAndReloadOption": "Habilite el registro y reinicie el servidor TS", + "typescript.openTsServerLog.noLogFile": "El servidor de TS no ha iniciado el registro.", + "openTsServerLog.openFileFailedFailed": "No se puede abrir el archivo de registro del servidor de TS", + "serverDiedAfterStart": "El servicio de lenguaje TypeScript finalizó de forma inesperada cinco veces después de haberse iniciado y no se reiniciará.", + "serverDiedReportIssue": "Notificar problema", + "serverDied": "El servicio de lenguaje Typescript finalizó de forma inesperada cinco veces en los últimos cinco minutos." +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/esn/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..ea0f0a445e5 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "versión inválida" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/esn/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/esn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..6b1caf7be01 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "Para habilitar las características de lenguaje de JavaScript/TypeScript en todo el proyecto, excluya las carpetas con muchos archivos, como: {0}", + "hintExclude.generic": "Para habilitar las características de idioma de JavaScript/TypeScript IntelliSense en todo el proyecto, excluya las carpetas de tamaño grande con archivos de origen en los que no trabaje.", + "large.label": "Configurar exclusiones", + "hintExclude.tooltip": "Para habilitar las características de idioma de JavaScript/TypeScript IntelliSense en todo el proyecto, excluya las carpetas de tamaño grande con archivos de origen en los que no trabaje." +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/esn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..290207978aa --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Recuperando cambios en los datos para un mejor rendimiento de TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "No se pudieron instalar archivos de términos para las características de lenguaje de JavaScript. Asegúrese de que NPM está instalado o configure \"typescript.npm\" en la configuración de usuario. Haga clic [aquí]({0}) para obtener más información.", + "typesInstallerInitializationFailed.doNotCheckAgain": "No volver a mostrar" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/esn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..2cac579a218 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "Utilizar la versión de VS Code", + "useWorkspaceVersionOption": "Usar versión del área de trabajo", + "learnMore": "Más información", + "selectTsVersion": "Seleccionar la versión de TypeScript usada para las características del lenguaje de JavaScript y TypeScript" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/esn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..2fa648a3e7e --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "No se pudo cargar la versión de TypeScript en esta ruta", + "noBundledServerFound": "Otra aplicación (por ejemplo, una herramienta de detección de virus con un comportamiento erróneo) eliminó el tsserver de VSCode. Debe reinstalar el VS Code." +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript-language-features/package.i18n.json b/i18n/esn/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..60682458562 --- /dev/null +++ b/i18n/esn/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,64 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Características del lenguaje JavaScript y TypeScript", + "description": "Proporciona soporte de lenguaje enriquecido para JavaScript y TypeScript.", + "typescript.reloadProjects.title": "Volver a cargar el proyecto", + "javascript.reloadProjects.title": "Volver a cargar el proyecto", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Complete las funciones con la signatura de parámetro.", + "typescript.tsdk.desc": "Especifica la ruta de acceso de carpeta que contiene los archivos lib*.d.ts y tsserver que se van a usar.", + "typescript.disableAutomaticTypeAcquisition": "Desactiva la adquisición automática de tipos. Requiere TypeScript >= 2.0.6.", + "typescript.tsserver.log": "votes Habilita los registros del servidor TS a un archivo. Este registro se puede utilizar para diagnosticar problemas en el servidor TS. Este registro puede contener rutas de acceso, código fuente y posiblemente otra información sensitiva acerca del proyecto.", + "typescript.tsserver.pluginPaths": "Rutas adicionales para descubrir plugins de servicio del lenguaje Typescript. Requiere TypeScript >= 2.3.0.", + "typescript.tsserver.pluginPaths.item": "Ruta relativa o absoluta. La ruta de acceso relativa se resolverá contra las carpetas del espacio de trabajo.", + "typescript.tsserver.trace": "Habilita el seguimiento de mensajes al servidor TS. Este seguimiento se puede utilizar para diagnosticar problemas en el servidor TS. Este seguimiento puede contener rutas de acceso, código fuente y posiblemente otra información sensitiva acerca del proyecto.", + "typescript.validate.enable": "Habilita o deshabilita la validación de TypeScript.", + "typescript.format.enable": "Habilita o deshabilita el formateador predeterminado de TypeScript.", + "javascript.format.enable": "Habilita o deshabilita el formateador predeterminado de JavaScript.", + "format.insertSpaceAfterCommaDelimiter": "Define el tratamiento del espacio después de un delimitador de coma.", + "format.insertSpaceAfterConstructor": "Define el manejo del espacio después de la palabra clave constructor. Requiere TypeScript >= 2.3.0", + "format.insertSpaceAfterSemicolonInForStatements": " Define el tratamiento del espacio después de punto y coma en una instrucción for.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Define el tratamiento del espacio después de un operador binario.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Define el tratamiento del espacio después de las palabras clave en una instrucción de flujo de control.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Define el tratamiento del espacio después de la palabra clave function para las funciones anónimas.", + "format.insertSpaceBeforeFunctionParenthesis": "Define el tratamiento del espacio delante de los paréntesis de los argumentos de las funciones. Requiere TypeScript >= 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Define el manejo del espacio después de abrir y antes de cerrar paréntesis no vacíos.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Define el manejo del espacio después de abrir y antes de cerrar los soportes no vacíos.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Define el manejo del espacio después de abrir y antes de cerrar llaves no vacías. Requiere TypeScript > = 2.3.0.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Define el tratamiento del espacio después de la llave de apertura y antes de la llave de cierre de cadenas de plantilla. Requiere TypeScript >= 2.0.6.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Define el tratamiento del espacio después de la llave de apertura y antes de la llave de cierre de las expresiones JSX. Requiere TypeScript >= 2.0.6.", + "format.insertSpaceAfterTypeAssertion": "Define el control del espacio después de las aserciones de tipos en TypeScript. Requiere TypeScript >= 2.4", + "format.placeOpenBraceOnNewLineForFunctions": "Define si una llave de apertura se incluye en una nueva línea para las funciones o no.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Define si una llave de apertura se incluye en una nueva línea para los bloques de control o no.", + "javascript.validate.enable": "Habilita o deshabilita la validación de JavaScript.", + "typescript.goToProjectConfig.title": "Ir a configuración del proyecto", + "javascript.goToProjectConfig.title": "Ir a configuración del proyecto", + "javascript.referencesCodeLens.enabled": "Habilitar/deshabilitar las referencias de CodeLens en los archivos de JavaScript.", + "typescript.referencesCodeLens.enabled": "Habilitar/deshabilitar las referencias de CodeLens en los archivos de TypeScript. Requiere TypeScript >= 2.0.6.", + "typescript.implementationsCodeLens.enabled": "Habilita o deshabilita implementaciones de CodeLens. Requiere TypeScript >= 2.2.0.", + "typescript.openTsServerLog.title": "Abrir registro del servidor de TS", + "typescript.restartTsServer": "Reiniciar servidor TS", + "typescript.selectTypeScriptVersion.title": "Seleccionar versión de TypeScript", + "typescript.reportStyleChecksAsWarnings": "Notificar comprobaciones de estilo como advertencias", + "jsDocCompletion.enabled": "Habilita o deshabilita comentarios automaticos de JSDoc", + "javascript.implicitProjectConfig.checkJs": "Habilita/deshabilita la comprobación semántica de los archivos JavaScript. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Se requiere TypeScript >=2.3.1.", + "typescript.npm": "Especifica la ruta de acceso al archivo ejecutable de NPM usada para la adquisición automática de tipos. Requiere TypeScript >= 2.3.4.", + "typescript.check.npmIsInstalled": "Compruebe si NPM está instalado para la adquisición automática de tipos.", + "javascript.nameSuggestions": "Habilitar/deshabilitar nombres únicos de la lista de sugerencias en los archivos de JavaScript. ", + "typescript.tsc.autoDetect": "Controla la auto detección de tareas del CAC. 'off' inhabilita esta función. 'build' crea una ejecución de compilación de tareas. 'watch' sólo crea compilación y 'watch tasks' 'on' crea tanto construir y ver tareas. Por defecto = 'on'. ", + "typescript.problemMatchers.tsc.label": "Problemas de TypeScript", + "typescript.problemMatchers.tscWatch.label": "Problemas de TypeScript (modo de inspección)", + "typescript.quickSuggestionsForPaths": "Activar o desactiva las sugerencias rápidas al escribir una ruta de importación.", + "typescript.locale": "Establece la configuración regional para reportar errores de TypeScript. Requiere TypeScript > = 2.6.0. Por defecto, utiliza el valor 'null' de VS Code para errores de TypeScript.", + "javascript.implicitProjectConfig.experimentalDecorators": "Activar/desactivar 'experimentalDecorators' para los archivos JavaScript que no son parte de un proyecto. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Requiere inicio > = 2.3.1. ", + "typescript.autoImportSuggestions.enabled": "Habilita o deshabilita sugerencias de importación automática.  Requiere TypeScript >= 2.6.1.", + "typescript.experimental.syntaxFolding": "Habilita/deshabilita los marcadores de plegado sensibles a la sintaxis.", + "taskDefinition.tsconfig.description": "Archivo tsconfig que define la compilación de TS.", + "javascript.suggestionActions.enabled": "Habilitar/deshabilitar sugerencias de diagnóstico para los archivos JavaScript en el editor. Requiere TypeScript > = 2.8 " +} \ No newline at end of file diff --git a/i18n/esn/src/vs/base/node/processes.i18n.json b/i18n/esn/src/vs/base/node/processes.i18n.json index ca0c97371a5..35229bd6699 100644 --- a/i18n/esn/src/vs/base/node/processes.i18n.json +++ b/i18n/esn/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "No se puede ejecutar un comando shell en una unidad UNC." + ] } \ No newline at end of file diff --git a/i18n/esn/src/vs/base/node/zip.i18n.json b/i18n/esn/src/vs/base/node/zip.i18n.json index 545249f03c4..fff6f71f4a8 100644 --- a/i18n/esn/src/vs/base/node/zip.i18n.json +++ b/i18n/esn/src/vs/base/node/zip.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "incompleteExtract": "Incompleta. Extraído {0} de {1} entradas", "notFound": "{0} no se encontró dentro del archivo zip." } \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index bdde741219f..efeedf70590 100644 --- a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,10 +8,11 @@ ], "previewOnGitHub": "Visualizar en GitHub", "loadingData": "Cargando datos...", + "rateLimited": "Límite de consulta de GitHub excedido. Espera.", "similarIssues": "Problemas similares", "open": "Abrir", "closed": "Cerrado", - "noResults": "No se encontraron resultados", + "noSimilarIssues": "No hay problemas similares encontrados", "settingsSearchIssue": "Problema de búsqueda de configuración", "bugReporter": "Informe de errores", "featureRequest": "Solicitud de característica", diff --git a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 5e6ecd766bd..ad772087dc1 100644 --- a/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/esn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,12 @@ ], "completeInEnglish": "Por favor complete el formulario en inglés.", "issueTypeLabel": "Esto es un", + "issueSourceLabel": "Archivo en", + "vscode": "Visual Studio Code", + "extension": "Una extensión", + "disableExtensionsLabelText": "Intente reproducir el problema después de {0}. Si el problema sólo se reproduce cuando las extensiones están activas, puede que haya un problema con una extensión.", + "disableExtensions": "Deshabilitar todas las extensiones y volver a cargar la ventana", + "chooseExtension": "Extensión", "issueTitleLabel": "Título", "issueTitleRequired": "Por favor, introduzca un título.", "titleLengthValidation": "El título es demasiado largo.", @@ -18,13 +24,6 @@ "extensions": "Mis extensiones", "searchedExtensions": "Extensiones que se han buscado", "settingsSearchDetails": "Detalles de la búsqueda de configuración", - "tryDisablingExtensions": "¿Se reproduce el problema cuando están deshabilitadas las extensiones?", - "yes": "Sí", - "no": "No", - "disableExtensionsLabelText": "Intente reproducir el problema después de {0}.", - "disableExtensions": "Deshabilitar todas las extensiones y volver a cargar la ventana", - "showRunningExtensionsLabelText": "Si sospecha que se trata de un problema con una extensión, {0} para notificarlo.", - "showRunningExtensions": "Ver todas las extensiones que están en ejecución", "details": "Especifique los detalles.", "loadingData": "Cargando datos..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..c10a769e352 --- /dev/null +++ b/i18n/esn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cpu": "CPU %", + "memory": "Memoria (MB)", + "pid": "pid", + "name": "Nombre", + "killProcess": "Matar proceso", + "forceKillProcess": "Forzar matar proceso" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-main/menus.i18n.json b/i18n/esn/src/vs/code/electron-main/menus.i18n.json index 5286de3ed56..4fa8264443e 100644 --- a/i18n/esn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/menus.i18n.json @@ -146,6 +146,7 @@ "miConditionalBreakpoint": "Punto de interrupción &&condicional...", "miColumnBreakpoint": "Punto de interrupción de c&&olumna", "miFunctionBreakpoint": "Punto de interrupción de &&función...", + "miLogPoint": "&& Punto de registro de...", "miNewBreakpoint": "&&Nuevo punto de interrupción", "miEnableAllBreakpoints": "Habilitar todos los puntos de interrupción", "miDisableAllBreakpoints": "&&Deshabilitar todos los puntos de interrupción", @@ -161,6 +162,7 @@ "mMergeAllWindows": "Fusionar todas las ventanas", "miToggleDevTools": "&&Alternar herramientas de desarrollo", "miAccessibilityOptions": "&&Opciones de accesibilidad", + "miOpenProcessExplorerer": "Abrir Explorador de &&Procesos", "miReportIssue": "&&Notificar problema", "miWelcome": "&&Bienvenido", "miInteractivePlayground": "Área de juegos &&interactiva", diff --git a/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json index 6fac622936b..44586570582 100644 --- a/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/esn/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Cerrar", - "header": "Diferencia {0} de {1}: original {2}, {3} líneas, modificado {4}, {5} líneas", "blankLine": "vacío", "equalLine": "original {0}, modificado {1}: {2}", "insertLine": "+ modificado {0}: {1}", diff --git a/i18n/esn/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/esn/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..d60d995d489 --- /dev/null +++ b/i18n/esn/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cursors.maximum": "El número de cursores se ha limitado a {0}." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 966708573a3..385993cc48e 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "Se asigna a \"Control\" en Windows y Linux y a \"Comando\" en macOS.", "multiCursorModifier.alt": "Se asigna a \"Alt\" en Windows y Linux y a \"Opción\" en macOS.", "multiCursorModifier": "El modificador que se usará para agregar varios cursores con el mouse. \"ctrlCmd\" se asigna a \"Control\" en Windows y Linux y a \"Comando\" en macOS. Los gestos del mouse \"Ir a la definición\" y \"Abrir vínculo\" se adaptarán de modo que no entren en conflicto con el modificador multicurso", + "multiCursorMergeOverlapping": "Combinar varios cursores cuando se solapan.", "quickSuggestions.strings": "Habilita sugerencias rápidas en las cadenas.", "quickSuggestions.comments": "Habilita sugerencias rápidas en los comentarios.", "quickSuggestions.other": "Habilita sugerencias rápidas fuera de las cadenas y los comentarios.", @@ -88,6 +89,9 @@ "renderLineHighlight": "Controla cómo el editor debe presentar el resaltado de línea. Las posibilidades son \"ninguno\", \"margen\", \"línea\" y \"todo\".", "codeLens": "Controla si el editor muestra lentes de código", "folding": "Controla si el editor tiene habilitado el plegado de código.", + "foldingStrategyAuto": "Si está disponible, utilice una estrategia de plegado específica del idioma, de lo contrario volverá a la estrategia basada en sangría.", + "foldingStrategyIndentation": "Utilice siempre la estrategia de plegado basado en sangría.", + "foldingStrategy": "Controla la forma en que se calculan las gamas plegables. Las selecciones ' auto' utilizan una estrategia de plegado específica del idioma, si está disponible. 'Sangría' obliga a utilizar la estrategia de plegado con sangría.", "showFoldingControls": "Controla cuándo los controles de plegado del margen son ocultados automáticamente.", "matchBrackets": "Resaltar corchetes coincidentes cuando se seleccione uno de ellos.", "glyphMargin": "Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuración.", @@ -105,5 +109,7 @@ "selectionClipboard": "Controla si el portapapeles principal de Linux debe admitirse.", "sideBySide": "Controla si el editor de diferencias muestra las diferencias en paralelo o alineadas.", "ignoreTrimWhitespace": "Controla si el editor de diferencias muestra los cambios de espacio inicial o espacio final como diferencias.", + "largeFileSize": "Controla el umbral de tamaño de archivo en bytes más allá de los cuales se aplican reglas de optimización especiales", + "largeFileLineCount": "Controla el umbral de tamaño de archivo en términos de cuenta de línea más allá de las cuales se aplican reglas de optimización especiales", "renderIndicators": "Controla si el editor de diff muestra indicadores +/- para cambios agregados/quitados" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json index 131e96b837a..1da3081cf27 100644 --- a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "Color de las guías de sangría del editor.", "editorLineNumbers": "Color de números de línea del editor.", "editorActiveLineNumber": "Color del número de línea activa en el editor", + "deprecatedEditorActiveLineNumber": "ID es obsoleto. Usar en lugar 'editorLineNumber.activeForeground'. ", "editorRuler": "Color de las reglas del editor", "editorCodeLensForeground": "Color principal de lentes de código en el editor", "editorBracketMatchBackground": "Color de fondo tras corchetes coincidentes", @@ -28,6 +29,9 @@ "warningBorder": "Color de borde de squigglies de advertencia en el editor.", "infoForeground": "Color de primer plano de los subrayados ondulados informativos en el editor.", "infoBorder": "Color del borde de los subrayados ondulados informativos en el editor.", + "hintForeground": "Color de primer plano de pista squigglies en el editor.", + "hintBorder": "Color de borde de pista squigglies en el editor.", + "overviewRulerRangeHighlight": "Resumen de color de marcador para destacar rangos. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "overviewRuleError": "Color de marcador de regla de información general para errores. ", "overviewRuleWarning": "Color de marcador de regla de información general para advertencias.", "overviewRuleInfo": "Color de marcador de regla de información general para mensajes informativos. " diff --git a/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..8a8848e3498 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,17 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Mostrar correcciones ({0})", + "quickFix": "Mostrar correcciones", + "quickfix.trigger.label": "Solución rápida...", + "editor.action.quickFix.noneMessage": "No hay acciones de código disponibles", + "refactor.label": "Refactorizar...", + "editor.action.refactor.noneMessage": "No hay refactorizaciones disponibles", + "source.label": "Acción de la fuente...", + "editor.action.source.noneMessage": "No hay acciones de fuente disponibles" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/find/findController.i18n.json b/i18n/esn/src/vs/editor/contrib/find/findController.i18n.json index 98e450e770f..0a2f41c1bae 100644 --- a/i18n/esn/src/vs/editor/contrib/find/findController.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/find/findController.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "startFindAction": "Buscar", + "startFindWithSelectionAction": "Buscar con selección", "findNextMatchAction": "Buscar siguiente", "findPreviousMatchAction": "Buscar anterior", "nextSelectionMatchFindAction": "Buscar selección siguiente", diff --git a/i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json index f54e722387a..d811487bd46 100644 --- a/i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,7 @@ "hintnn": "{0} ediciones de formato entre las líneas {1} y {2}", "no.provider": "No hay formateador para los archivos ' {0} ' instalados.", "formatDocument.label": "Dar formato al documento", - "formatSelection.label": "Dar formato a la selección" + "no.documentprovider": "No hay formateador de documentos para los archivos ' {0} ' instalados.", + "formatSelection.label": "Dar formato a la selección", + "no.selectionprovider": "No hay formateador de selección para los archivos ' {0} ' instalados." } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/links/links.i18n.json b/i18n/esn/src/vs/editor/contrib/links/links.i18n.json index cd880de830b..a7200dfc8a2 100644 --- a/i18n/esn/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "Ctrl + clic para abrir el vínculo", "links.command.mac": "Cmd + click para ejecutar el comando", "links.command": "Ctrl + click para ejecutar el comando", + "links.navigate.al.mac": "Opción + clic para seguir el enlace", "links.navigate.al": "Alt + clic para seguir el vínculo", + "links.command.al.mac": "Opción + click para ejecutar el comando", "links.command.al": "Alt + clic para ejecutar el comando", "invalid.url": "No se pudo abrir este vínculo porque no tiene un formato correcto: {0}", "missing.url": "No se pudo abrir este vínculo porque falta el destino.", diff --git a/i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..bc97e24608a --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "editor.readonly": "No se puede editar en editor de sólo lectura" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/esn/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index f494743a105..22631072b43 100644 --- a/i18n/esn/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -6,7 +6,42 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "Sunday": "Domingo", + "Monday": "Lunes", + "Tuesday": "Martes", + "Wednesday": "Miércoles", + "Thursday": "Jueves", + "Friday": "Viernes", + "Saturday": "Sábado", + "SundayShort": "Dom", + "MondayShort": "Lun", + "TuesdayShort": "Mar", + "WednesdayShort": "Mié", + "ThursdayShort": "Jue", + "FridayShort": "Vie", + "SaturdayShort": "Sáb", + "January": "Enero", + "February": "Febrero", + "March": "Marzo", + "April": "Abril", + "May": "Mayo", + "June": "Junio", + "July": "Julio", + "August": "Agosto", + "September": "Septiembre", + "October": "Octubre", "November": "Noviembre", + "December": "Diciembre", + "JanuaryShort": "Ene", + "FebruaryShort": "Feb", + "MarchShort": "Mar", + "AprilShort": "Abr", + "MayShort": "May", + "JuneShort": "Jun", "JulyShort": "Jul", + "AugustShort": "Ago", + "SeptemberShort": "Sep", + "OctoberShort": "Oct", + "NovemberShort": "Noviembre", "DecemberShort": "Dic" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json index d7c592b45d8..502886a6ec8 100644 --- a/i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -10,6 +10,8 @@ "wordHighlightStrong": "Color de fondo de un símbolo durante el acceso de escritura, como escribir en una variable. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "wordHighlightBorder": "Color de fondo de un símbolo durante el acceso de lectura; por ejemplo, cuando se lee una variable.", "wordHighlightStrongBorder": "Color de fondo de un símbolo durante el acceso de escritura; por ejemplo, cuando se escribe una variable.", + "overviewRulerWordHighlightForeground": "Destaca el color del marcador para los puntos del símbolo. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", + "overviewRulerWordHighlightStrongForeground": "Destaca el color del marcador de acceso de escritura. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", "wordHighlight.next.label": "Ir al siguiente símbolo destacado", "wordHighlight.previous.label": "Ir al símbolo destacado anterior" } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json index 6011d3c42ac..386d85b039d 100644 --- a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "Comience con el comando 'Developer: Startup Performance' habilitado.", "prof-startup": "Ejecutar generador de perfiles de CPU durante el inicio", "disableExtensions": "Deshabilite todas las extensiones instaladas.", - "inspect-extensions": "Permitir la depuración y el perfil de las extensiones. Revisar las herramientas de desarrollador para la conexión uri.", - "inspect-brk-extensions": "Permitir la depuración y el perfil de las extensiones con el host de la extensión pausado después del inicio. Revisar las herramientas de desarrollador para la conexión uri.", "disableGPU": "Deshabilita la aceleración de hardware de GPU.", "uploadLogs": "Carga los registros de la sesión actual a un extremo.", "maxMemory": "Tamaño máximo de memoria para una ventana (en Mbytes).", diff --git a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 87bd0fe318c..5e55b7d238c 100644 --- a/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/esn/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalidManifest": "Extensión no válida: package.json no es un archivo JSON.", + "incompatible": "No se puede instalar la extensión ' {0} ', ya que no es compatible con el código ' {1} '.", "restartCode": "Reinicie Code antes de volver a instalar {0}.", "installingOutdatedExtension": "Una versión más nueva de esta extensión ya está instalada. ¿Desea anular esto con la versión anterior?", "override": "Anular", @@ -14,12 +15,16 @@ "errorInstallingDependencies": "Error instalando dependencias. {0}", "MarketPlaceDisabled": "Marketplace no está habilitado", "removeError": "Error al quitar la extensión: {0}. Salga e inicie VS Code antes de intentarlo de nuevo.", + "Not a Marketplace extension": "Sólo se pueden reinstalar Extensiones del Marketplace", "notFoundCompatible": "No se pueden instalar '{0}'; no hay ninguna versión disponible compatible con VS Code '{1}'. ", "malicious extension": "No se puede instalar la extensión ya que se informó que era problemático.", "notFoundCompatibleDependency": "No se puede instalar porque no se encuentra la extensión dependiente '{0}' compatible con la versión actual '{1}' del VS Code.", "quitCode": "No se puede instalar la extensión. Por favor, salga e inicie VS Code antes de reinstalarlo. ", "exitCode": "No se puede instalar la extensión. Por favor, salga e inicie VS Code antes de reinstalarlo. ", + "renameError": "Error desconocido al cambiar el nombre de {0} a {1}", "uninstallDependeciesConfirmation": "¿Quiere desinstalar solo '{0}' o también sus dependencias?", + "uninstallOnly": "Sólo extensión", + "uninstallAll": "Desinstalar todo", "uninstallConfirmation": "¿Seguro que quiere desinstalar '{0}'?", "ok": "Aceptar", "singleDependentError": "No se puede desinstalar la extensión '{0}'. La extensión '{1}' depende de esta.", diff --git a/i18n/esn/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/esn/src/vs/platform/extensions/node/extensionValidator.i18n.json index 049daba800c..c38e957e55c 100644 --- a/i18n/esn/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/esn/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "No se pudo analizar el valor {0} de \"engines.vscode\". Por ejemplo, use: ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x, etc.", + "versionSyntax": "No se pudo analizar el valor de ' engines.vscode ' {0}. Utilice, por ejemplo: ^ 1.22.0, ^ 1.22. x, etc.", "versionSpecificity1": "La versión indicada en \"engines.vscode\" ({0}) no es suficientemente específica. Para las versiones de vscode anteriores a la 1.0.0, defina como mínimo la versión principal y secundaria deseadas. Por ejemplo: ^0.10.0, 0.10.x, 0.11.0, etc.", "versionSpecificity2": "La versión indicada en \"engines.vscode\" ({0}) no es suficientemente específica. Para las versiones de vscode posteriores a la 1.0.0, defina como mínimo la versión principal deseada. Por ejemplo: ^1.10.0, 1.10.x, 1.x.x, 2.x.x, etc.", "versionMismatch": "La extensión no es compatible con {0} de Code y requiere: {1}." diff --git a/i18n/esn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/esn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index e067f1c4e31..97c37f2a269 100644 --- a/i18n/esn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/esn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "La instalación de {0} parece estar dañada. Vuelva a instalar.", "integrity.moreInformation": "Más información", - "integrity.dontShowAgain": "No volver a mostrar", - "integrity.prompt": "La instalación de {0} parece estar dañada. Vuelva a instalar." + "integrity.dontShowAgain": "No volver a mostrar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json index 7ed60aab299..2386e8f046d 100644 --- a/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/esn/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "Reportero de tema" + "issueReporter": "Reportero de tema", + "processExplorer": "Process Explorer" } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/list/browser/listService.i18n.json b/i18n/esn/src/vs/platform/list/browser/listService.i18n.json index 3c5d4431859..fd8a2daed6a 100644 --- a/i18n/esn/src/vs/platform/list/browser/listService.i18n.json +++ b/i18n/esn/src/vs/platform/list/browser/listService.i18n.json @@ -12,5 +12,6 @@ "multiSelectModifier": "El modificador que se usará para agregar un elemento en árboles y listas a una selección múltiple con el mouse (por ejemplo en el explorador, los editores abiertos y la vista SCM). ' ctrlCmd ' se asigna a ' control ' en Windows y Linux y a ' Command ' en macOS. Los gestos de ratón \"abrir a lado\", si se admiten, se adaptarán de tal manera que no estén en conflicto con el modificador multiselección.", "openMode.singleClick": "Abre elementos en solo clic de ratón.", "openMode.doubleClick": "Abre elementos en doble clic del ratón. ", - "openModeModifier": "Controla cómo abrir elementos en árboles y listas con el ratón (si está soportado). Establecer en ' singleClick ' para abrir elementos con un solo clic del ratón y ' DoubleClick ' para abrir sólo a través del doble clic del ratón. Para los elementos padres con hijos en los árboles, este ajuste controlará si un solo clic expande el padre o un doble clic. Tenga en cuenta que algunos árboles y listas pueden optar por ignorar esta configuración si no es aplicable" + "openModeModifier": "Controla cómo abrir elementos en árboles y listas con el ratón (si está soportado). Establecer en ' singleClick ' para abrir elementos con un solo clic del ratón y ' DoubleClick ' para abrir sólo a través del doble clic del ratón. Para los elementos padres con hijos en los árboles, este ajuste controlará si un solo clic expande el padre o un doble clic. Tenga en cuenta que algunos árboles y listas pueden optar por ignorar esta configuración si no es aplicable", + "horizontalScrolling setting": "Controla el esplazamiento horizontal de los árboles en la mesa de trabajo." } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 075049e313b..39139e04743 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -92,5 +92,7 @@ "mergeBorder": "Color del borde en los encabezados y el divisor en conflictos de combinación alineados.", "overviewRulerCurrentContentForeground": "Primer plano de la regla de visión general actual para conflictos de combinación alineados.", "overviewRulerIncomingContentForeground": "Primer plano de regla de visión general de entrada para conflictos de combinación alineados.", - "overviewRulerCommonContentForeground": "Primer plano de la regla de visión general de ancestros comunes para conflictos de combinación alineados." + "overviewRulerCommonContentForeground": "Primer plano de la regla de visión general de ancestros comunes para conflictos de combinación alineados.", + "overviewRulerFindMatchForeground": "Destaca el color del marcador de regla para las coincidencias de búsqueda. El color no debe ser opaco para no ocultar las decoraciones subyacentes.", + "overviewRulerSelectionHighlightForeground": "Destaca el color del marcador de regla para los puntos de selección . El color no debe ser opaco para no ocultar las decoraciones subyacentes." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..1dcbde980fd --- /dev/null +++ b/i18n/esn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "la propiedad `{0}` es obligatoria y debe ser de tipo \"string\"", + "showViewlet": "Mostrar {0}", + "view": "Ver" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 78e8984a534..fed60fe1bf0 100644 --- a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Aporta vistas al editor", "views.explorer": "Vista del explorador", "views.debug": "Vista de depuración", - "locationId.invalid": "`{0}` no es una ubicación de vista válida", "duplicateView1": "No se pueden registrar múltiples vistas con el mismo identificador '{0}' en la ubicación '{1}'", "duplicateView2": "Una vista con el identificador '{0}' ya está registrada en la ubicación '{1}'" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 34f590266a9..754cfd39b02 100644 --- a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "Anular la aplicación de formato al guardar después de {0} ms", + "timeout.onWillSave": "Se anuló onWillSaveTextDocument-event después de 1750 ms", "saveParticipants": "Ejecutando Guardar Participantes..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 7957a5748f1..c6974979361 100644 --- a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "Editor de vistas web" + "errorMessage": "Ha ocurrido un error mientras se restauraba la vista: {0}" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/node/extHostProgress.i18n.json b/i18n/esn/src/vs/workbench/api/node/extHostProgress.i18n.json index 35229bd6699..651918c67b7 100644 --- a/i18n/esn/src/vs/workbench/api/node/extHostProgress.i18n.json +++ b/i18n/esn/src/vs/workbench/api/node/extHostProgress.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "extensionSource": "{0} (extensión)" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 1295b45f8c6..29cf10b5371 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,7 @@ "screenReaderDetectedExtra": "Si no va a usar un lector de pantalla, cambie el valor de configuración \"editor.accessibilitySupport\" a \"desactivado\".", "disableTabMode": "Deshabilitar modo de accesibilidad", "gotoLine": "Ir a la línea", - "indentation": "Sangría", + "selectIndentation": "Seleccione la sangría", "selectEncoding": "Seleccionar Encoding", "selectEOL": "Seleccionar secuencia de fin de línea", "selectLanguageMode": "Seleccionar modo de lenguaje", diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 400b2707b25..0ca704a5b8d 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,11 @@ "sizeMB": "{0} MB", "sizeGB": "{0} GB", "sizeTB": "{0} TB", - "largeImageError": "El tamaño del archivo de la imagen es demasiado grande (> 1MB) para mostrarlo en el editor.", + "largeImageError": "La imagen no se muestra en el editor porque es demasiado grande ({0}). ", "resourceOpenExternalButton": "¿Abrir la imagen mediante un programa externo?", - "nativeBinaryError": "El archivo no se mostrará en el editor porque es binario, muy grande o usa una codificación de texto no compatible.", + "nativeFileTooLargeError": "El archivo no se muestra en el editor porque es demasiado grande ({0}). ", + "nativeBinaryError": "El archivo no se muestra en el editor porque es binario o utiliza una codificación de texto no soportada. ", + "openAsText": "¿Desea abrirlo de todas formas?", "zoom.action.fit.label": "Imagen completa", "imgMeta": "{0} x {1} {2}" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json index 369309aa7cb..94aeba068ee 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "notificationsEmpty": "No hay notificaciones nuevas", "notifications": "Notificaciones", "notificationsToolbar": "Acciones del centro de notificaciones", "notificationsList": "Lista de notificaciones" diff --git a/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..232be4ece69 --- /dev/null +++ b/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInput.countSelected": "{0} seleccionadas", + "ok": "Aceptar" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..c9120e6b4eb --- /dev/null +++ b/i18n/esn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInputBox.ariaLabel": "Escriba para restringir los resultados." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json index 8c8e17dfa93..89fe344b57b 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "Abrir Reciente...", "quickOpenRecent": "Abrir Reciente Rapidamente...", "reportIssueInEnglish": "Notificar problema", + "openProcessExplorer": "Abrir Explorador de Procesos", "reportPerformanceIssue": "Notificar problema de rendimiento", "keybindingsReference": "Referencia de métodos abreviados de teclado", "openDocumentationUrl": "Documentación", diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 62d7de2c6f0..57d447a0a0b 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,10 +45,17 @@ "windowConfigurationTitle": "Ventana", "window.openFilesInNewWindow.on": "Los archivos se abrirán en una nueva ventana", "window.openFilesInNewWindow.off": "Los archivos se abrirán en la ventana con la carpeta de archivos abierta o en la última ventana activa", + "window.openFilesInNewWindow.defaultMac": "Los archivos se abrirán en la ventana con la carpeta de archivos abierta o en la última ventana activa, a menos que se abran con Dock o desde Finder.", + "window.openFilesInNewWindow.default": "Los archivos se abrirán en una nueva ventana hasta que sean llamados dentro de la aplicación (ej.: via menú Archivo)", + "openFilesInNewWindowMac": "Controla si los archivos deben abrirse en una ventana nueva.\n- default: los archivos se abrirán en la ventana con la carpeta de archivos abierta o en la última ventana activa, a menos que se abran con Dock o desde Finder.\n- on: los archivos se abrirán en una ventana nueva.\n- off: los archivos se abrirán en la ventana con la carpeta de archivos abierta o en la última ventana activa.\nTenga en cuenta que puede haber casos en los que se omita esta configuración (por ejemplo, cuando se utilizan las opciones de la línea de comandos -new-window o -reuse-window). ", + "openFilesInNewWindow": "Controla si los archivos deben abrirse en una ventana nueva.\n- default: los archivos se abrirán en una ventana nueva a menos que se seleccionen desde la aplicación (por ejemplo, desde el menú Archivo).\n- on: los archivos se abrirán en una ventana nueva.\n- off: los archivos se abrirán en la ventana con la carpeta de archivos abierta o en la última ventana activa.\nTenga en cuenta que puede haber casos en los que se omita esta configuración (por ejemplo, cuando se utilizan las opciones de la línea de comandos -new-window o -reuse-window).", "window.openFoldersInNewWindow.on": "Las carpetas se abrirán en una nueva ventana", "window.openFoldersInNewWindow.off": "Las carpetas reemplazarán la ventana activa más reciente", "window.openFoldersInNewWindow.default": "Las carpetas se abrirán en una nueva ventana a menos que se seleccione una carpeta desde la aplicación (p. ej. mediante el menú Archivo)", "openFoldersInNewWindow": "Controla si las carpetas deben abrirse en una ventana nueva o reemplazar la última ventana activa.\n- default: las carpetas se abrirán en una ventana nueva, a menos que se seleccione una carpeta desde la aplicación (por ejemplo, desde el menú Archivo)\n- on: las carpetas se abrirán en una ventana nueva\n- off: las carpetas reemplazarán la última ventana activa\nTenga en cuenta que aún puede haber casos en los que este parámetro se ignore (por ejemplo, al usar la opción de la línea de comandos -new-window o -reuse-window).", + "window.openWithoutArgumentsInNewWindow.on": "Abrir una nueva ventana vacía", + "window.openWithoutArgumentsInNewWindow.off": "Aplicar el foco a la última instancia en ejecución activa", + "openWithoutArgumentsInNewWindow": "Controla si debe abrirse una ventana nueva vacía cuando se inicia una segunda instancia sin argumentos o si la última instancia en ejecución debe obtener el foco.\n- on: se abre una ventana nueva vacía.\n- off: la última instancia en ejecución activa obtiene el foco.\nTenga en cuenta que puede haber casos en los que se omita esta configuración (por ejemplo, cuando se utilizan las opciones de la línea de comandos -new-window o -reuse-window).", "window.reopenFolders.all": "Reabrir todas las ventanas.", "window.reopenFolders.folders": "Reabrir todas las carpetas. Las áreas de trabajo vacías no se restaurarán.", "window.reopenFolders.one": "Reabrir la última ventana activa.", @@ -56,6 +63,7 @@ "restoreWindows": "Controla cómo se vuelven a abrir las ventanas tras un reinicio. Seleccione \"none\" para comenzar siempre con un área de trabajo vacía, \"one\" para volver a abrir la última ventana en la que trabajó, \"folders\" para volver a abrir todas las ventanas que tenían carpetas abiertas o \"all\" para volver a abrir todas las ventanas de la última sesión.", "restoreFullscreen": "Controla si una ventana se debe restaurar al modo de pantalla completa si se salió de ella en dicho modo.", "zoomLevel": "Ajuste el nivel de zoom de la ventana. El tamaño original es 0 y cada incremento (por ejemplo, 1) o disminución (por ejemplo, -1) representa una aplicación de zoom un 20 % más grande o más pequeño. También puede especificar decimales para ajustar el nivel de zoom con una granularidad más precisa.", + "title": "Controla el título de la ventana en función del editor activo. Las variables se reemplazan según el contexto:\n${activeEditorShort}: nombre del archivo (por ejemplo, miArchivo.txt).\n${activeEditorMedium}: ruta de acceso del archivo relativa a la carpeta del área de trabajo (por ejemplo, miCarpeta/miArchivo.txt).\n${activeEditorLong}: ruta de acceso completa del archivo (por ejemplo, /Usuarios/Desarrollo/miProyecto/miCarpeta/miArchivo.txt).\n${folderName}: nombre de la carpeta del área de trabajo que contiene el archivo (por ejemplo, miCarpeta).\n${folderPath}: ruta de acceso de la carpeta del área de trabajo que contiene el archivo (por ejemplo, /Usuarios/Desarrollo/miCarpeta).\n${rootName}: nombre del área de trabajo (por ejemplo, miCarpeta o miÁreaDeTrabajo).\n${rootPath}: ruta de acceso del área de trabajo (por ejemplo, /Usuarios/Desarrollo/miÁreaDeTrabajo).\n${appName}: nombre de la aplicación (por ejemplo, VS Code).\n${dirty}: indicador de modificaciones si se han realizado cambios en el editor activo.\n${separator}: separador condicional (\" - \") que solo se muestra cuando está rodeado de variables con valores o texto estático.", "window.newWindowDimensions.default": "Abrir las nuevas ventanas en el centro de la pantalla.", "window.newWindowDimensions.inherit": "Abrir las nuevas ventanas con la misma dimensión que la última activa.", "window.newWindowDimensions.maximized": "Abrir las nuevas ventanas maximizadas.", @@ -71,6 +79,8 @@ "autoDetectHighContrast": "Si está habilitado, se cambiará automáticamente al tema de contraste alto si Windows utiliza un tema de contraste alto, y al tema oscuro si cambia desde un tema de contraste alto de Windows.", "titleBarStyle": "Ajuste la apariencia de la barra de título de la ventana. Se debe realizar un reinicio completo para aplicar los cambios.", "window.nativeTabs": "Habilita las fichas de ventana en macOS Sierra. Note que los cambios requieren que reinicie el equipo y las fichas nativas deshabilitan cualquier estilo personalizado que haya configurado.", + "window.smoothScrollingWorkaround": "Habilite esta solución alternativa si el desplazamiento deja de ser homogéneo después de restaurar una ventana de VS Code minimizada. Esta es una solución para un problema (https://github.com/Microsoft/vscode/issues/13612) en el que el desplazamiento comienza a sufrir interrupciones en dispositivos con panel táctil de precisión, como los dispositivos Surface de Microsoft. Al habilitar esta solución alternativa, puede parpadear ligeramente la distribución después de restaurar la ventana minimizada, pero no afecta a nada más.", + "window.clickThroughInactive": "Si está habilitado, haciendo clic en una ventana inactiva, activará dicha ventana y disparará el elemento bajo el cursor del ratón si éste es clicable. Si está deshabilitado, haciendo clic en cualquier lugar en una ventana inactiva, solo activará la misma y será necesario un segundo clic en el elemento. ", "zenModeConfigurationTitle": "Modo zen", "zenMode.fullScreen": "Controla si activar el modo Zen pone también el trabajo en modo de pantalla completa.", "zenMode.centerLayout": "Controla si al encender el Modo Zen también se centra el diseño.", diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 19e1e0cc44d..bde7768bba1 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Editar punto de interrupción...", + "breakpoint": "Punto de interrupción", "functionBreakpointsNotSupported": "Este tipo de depuración no admite puntos de interrupción en funciones", "functionBreakpointPlaceholder": "Función donde interrumpir", "functionBreakPointInputAriaLabel": "Escribir punto de interrupción de función", @@ -14,6 +14,7 @@ "breakpointUnverifieddHover": "Punto de interrupción no comprobado", "functionBreakpointUnsupported": "Este tipo de depuración no admite puntos de interrupción en funciones", "breakpointDirtydHover": "Punto de interrupción no comprobado. El archivo se ha modificado, reinicie la sesión de depuración.", + "logBreakpointUnsupported": "Este tipo de depuración no admite puntos de registro", "conditionalBreakpointUnsupported": "Este tipo de depuración no es compatible con los puntos de interrupción condicionales.", "hitBreakpointUnsupported": "Este tipo de depuración no admite el uso de puntos de interrupción condicionales" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 77f54a5e29f..83395706f58 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "Depuración: Alternar punto de interrupción", "conditionalBreakpointEditorAction": "Depuración: agregar punto de interrupción condicional...", + "logPointEditorAction": "Depurar: agregar punto de registro...", "runToCursor": "Ejecutar hasta el cursor", "debugEvaluate": "Depuración: Evaluar", "debugAddToWatch": "Depuración: Agregar a inspección", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 72b3d080b9d..3da9af08237 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,7 @@ ], "breakpointWidgetHitCountPlaceholder": "Interrumpir cuando se alcance el número de llamadas. Presione \"ENTRAR\" para aceptar o \"Esc\" para cancelar.", "breakpointWidgetExpressionPlaceholder": "Interrumpir cuando la expresión se evalúa como true. Presione \"ENTRAR\" para aceptar o \"Esc\" para cancelar.", - "breakpointWidgetHitCountAriaLabel": "El programa solo se detendrá aquí si se alcanza el número de llamadas. Presione ENTRAR para aceptar o Esc para cancelar.", - "breakpointWidgetAriaLabel": "El programa solo se detendrá aquí si esta condición es true. Presione ENTRAR para aceptar o Esc para cancelar.", "expression": "Expresión", - "hitCount": "Número de llamadas" + "hitCount": "Número de llamadas", + "logMessage": "Mensaje de registro" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 64d4f38579f..779210b4ba7 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "Por favor utilice nombres de configuración exclusivos.", "app.launch.json.compound.folder": "Nombre de la carpeta en la que se encuentra el compuesto.", "app.launch.json.compounds.configurations": "Nombres de las configuraciones que se iniciarán como parte de este elemento compuesto.", - "debugNoType": "El valor \"type\" del adaptador de depuración no se puede omitir y debe ser de tipo \"string\".", "selectDebug": "Seleccionar entorno", "DebugConfig.failed": "No se puede crear el archivo \"launch.json\" dentro de la carpeta \".vscode\" ({0}).", "workspace": "espacio de trabajo", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 1c8d3ad1e17..3ff917571be 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Editar punto de interrupción...", - "disableBreakpoint": "Deshabilitar punto de interrupción", - "enableBreakpoint": "Habilitar punto de interrupción", + "breakpoint": "Punto de interrupción", "removeBreakpoints": "Quitar puntos de interrupción", "removeBreakpointOnColumn": "Quitar punto de interrupción en la columna {0}", "removeLineBreakpoint": "Quitar punto de interrupción de línea", @@ -21,6 +19,8 @@ "enableBreakpoints": "Habilitar punto de interrupción en la columna {0}", "enableBreakpointOnLine": "Habilitar punto de interrupción de línea", "addBreakpoint": "Agregar punto de interrupción", - "conditionalBreakpoint": "Agregar punto de interrupción condicional...", + "addConditionalBreakpoint": "Agregar punto de interrupción condicional...", + "addLogPoint": "Agregar punto de registro...", + "cancel": "Cancelar", "addConfiguration": "Agregar configuración..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 98205ab953f..d28e2c7b8c0 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -29,5 +29,6 @@ "showErrors": "Mostrar errores", "noFolderWorkspaceDebugError": "El archivo activo no se puede depurar. Compruebe que se ha guardado en el disco y que tiene una extensión de depuración instalada para ese tipo de archivo.", "cancel": "Cancelar", - "DebugTaskNotFound": "No se pudo encontrar la tarea '{0}'." + "DebugTaskNotFound": "No se pudo encontrar la tarea '{0}'.", + "taskNotTracked": "La tarea '{0}' no puede rastrearse." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 48c3d79a0dd..f5edde234b9 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "Más información", - "unableToLaunchDebugAdapter": "No se puede iniciar el adaptador de depuración desde '{0}'.", - "unableToLaunchDebugAdapterNoArgs": "No se puede iniciar el adaptador de depuración.", - "stoppingDebugAdapter": "{0}. Deteniendo el adaptador de depuración.", "debugAdapterCrash": "El proceso de adaptación del depurador finalizó inesperadamente" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 2bceb504035..3055932755f 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "El ejecutable del adaptador de depuración \"{0}\" no existe.", "debugAdapterCannotDetermineExecutable": "No se puede determinar el ejecutable para el adaptador de depuración \"{0}\".", - "launch.config.comment1": "Utilizar IntelliSense para aprender acerca de los posibles atributos.", - "launch.config.comment2": "Mantenga el puntero para ver las descripciones de los existentes atributos ", - "launch.config.comment3": "Para más información, visite: {0}", - "debugType": "Tipo de configuración.", - "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Compruebe que tiene instalada la correspondiente extensión de depuración y que está habilitada.", - "node2NotSupported": "\"node2\" ya no se admite; use \"node\" en su lugar y establezca el atributo \"protocol\" en \"inspector\".", - "debugName": "Nombre de la configuración. Aparece en el menú desplegable de la configuración de inicio.", - "debugRequest": "Tipo de solicitud de la configuración. Puede ser \"launch\" o \"attach\".", - "debugServer": "Solo para el desarrollo de extensiones de depuración: si se especifica un puerto, VS Code intenta conectarse a un adaptador de depuración que se ejecuta en modo servidor", - "debugPrelaunchTask": "Tarea que se va a ejecutar antes de iniciarse la sesión de depuración.", - "debugWindowsConfiguration": "Atributos de configuración de inicio específicos de Windows.", - "debugOSXConfiguration": "Atributos de configuración de inicio específicos de OS X.", - "debugLinuxConfiguration": "Atributos de configuración de inicio específicos de Linux.", - "deprecatedVariables": "\"env.\", \"config.\" y \"command.\" están en desuso, utilice en su lugar \"env:\", \"config:\" y \"command:\"." + "unableToLaunchDebugAdapter": "No se puede iniciar el adaptador de depuración desde '{0}'.", + "unableToLaunchDebugAdapterNoArgs": "No se puede iniciar el adaptador de depuración." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..b916d2192fa --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "Utilizar IntelliSense para aprender acerca de los posibles atributos.", + "launch.config.comment2": "Mantenga el puntero para ver las descripciones de los existentes atributos ", + "launch.config.comment3": "Para más información, visite: {0}", + "debugType": "Tipo de configuración.", + "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Compruebe que tiene instalada la correspondiente extensión de depuración y que está habilitada.", + "node2NotSupported": "\"node2\" ya no se admite; use \"node\" en su lugar y establezca el atributo \"protocol\" en \"inspector\".", + "debugName": "Nombre de la configuración. Aparece en el menú desplegable de la configuración de inicio.", + "debugRequest": "Tipo de solicitud de la configuración. Puede ser \"launch\" o \"attach\".", + "debugServer": "Solo para el desarrollo de extensiones de depuración: si se especifica un puerto, VS Code intenta conectarse a un adaptador de depuración que se ejecuta en modo servidor", + "debugPrelaunchTask": "Tarea que se va a ejecutar antes de iniciarse la sesión de depuración.", + "debugPostDebugTask": "Tarea que se ejecutará después de terminar la sesión de depuración.", + "debugWindowsConfiguration": "Atributos de configuración de inicio específicos de Windows.", + "debugOSXConfiguration": "Atributos de configuración de inicio específicos de OS X.", + "debugLinuxConfiguration": "Atributos de configuración de inicio específicos de Linux.", + "deprecatedVariables": "\"env.\", \"config.\" y \"command.\" están en desuso, utilice en su lugar \"env:\", \"config:\" y \"command:\"." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..ec6803b438e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "Consola de VS Code", + "mac.terminal.script.failed": "No se pudo ejecutar el script '{0}'. Código de salida: {1}.", + "mac.terminal.type.not.supported": "No se admite '{0}'", + "press.any.key": "Presione cualquier tecla para continuar...", + "linux.term.failed": "Error de '{0}' con el código de salida {1}" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index d1cf9483c41..695af76fade 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -58,6 +58,9 @@ "configureWorkspaceFolderRecommendedExtensions": "Configurar extensiones recomendadas (Carpeta del área de trabajo)", "malicious tooltip": "Se informó de que esta extensión era problemática.", "malicious": "Malintencionado", + "disabled": "Deshabilitado", + "disabled globally": "Deshabilitado", + "disabled workspace": "Deshabilitado para esta área de trabajo", "disableAll": "Deshabilitar todas las extensiones instaladas", "disableAllWorkspace": "Deshabilitar todas las extensiones instaladas para esta área de trabajo", "enableAll": "Habilitar todas las extensiones", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 21701a2c2dd..9945b32ea23 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -36,13 +36,16 @@ "view location": "Donde", "localizations": "Localizaciones ({0}) ", "localizations language id": "ID. de idioma", - "localizations language name": "Nombre de idioma", - "localizations localized language name": "Nombre de idioma (localizado)", + "colorThemes": "Temas de color ({0})", + "iconThemes": "Temas de icono ({0})", + "colors": "Colores ({0})", + "colorId": "Id", "defaultDark": "Oscuro por defecto", "defaultLight": "Claro por defecto", "defaultHC": "Contraste alto por defecto", "JSON Validation": "Validación JSON ({0})", "fileMatch": "Coincidencia de archivo", + "schema": "Esquema", "commands": "Comandos ({0})", "command name": "Nombre", "keyboard shortcuts": "Métodos abreviados de teclado", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 7a8e29d1760..1bc6e380146 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "Esta extensión es recomendada por los usuarios del espacio de trabajo actual.", "reallyRecommended2": "La extension recomendada para este tipo de archivo es {0}", "reallyRecommendedExtensionPack": "Para este tipo de fichero, se recomienda el paquete de extensión '{0}'.", - "showRecommendations": "Mostrar recomendaciones", "install": "Instalar", + "showRecommendations": "Mostrar recomendaciones", "showLanguageExtensions": "El Marketplace tiene extensiones que pueden ayudar con '. {0} ' archivos ", "workspaceRecommended": "Esta área de trabajo tiene recomendaciones de extensión.", "installAll": "Instalar todo", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 598580cdc04..a14a5510a07 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "¿Quiere deshabilitar otras asignaciones de teclas ({0}) para evitar conflictos entre enlaces de teclado?", "yes": "Sí", - "no": "No", - "betterMergeDisabled": "La extensión Mejor combinación está ahora integrada, la extensión instalada se deshabilitó y no se puede desinstalar.", - "uninstall": "Desinstalación" + "no": "No" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 896424f6a2c..a44cd55d9ca 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,9 @@ "recommendedExtensions": "Recomendado", "otherRecommendedExtensions": "Otras recomendaciones", "workspaceRecommendedExtensions": "Recomendaciones de espacio de trabajo", + "builtInExtensions": "Características", + "builtInThemesExtensions": "Temas", + "builtInBasicsExtensions": "Lenguajes de programación", "searchExtensions": "Buscar extensiones en Marketplace", "sort by installs": "Criterio de ordenación: Número de instalaciones", "sort by rating": "Criterio de ordenación: Clasificación", diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index e7856c7726a..1a94d955a1e 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,6 +8,8 @@ ], "textFileEditor": "Editor de archivos de texto", "createFile": "Crear archivo", + "relaunchWithIncreasedMemoryLimit": "Reiniciar con {0} MB", + "configureMemoryLimit": "Configurar el límite de memoria", "fileEditorWithInputAriaLabel": "{0}. Editor de archivos de texto.", "fileEditorAriaLabel": "Editor de archivos de texto." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index b540790d3f3..9cb57c08e43 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -27,12 +27,17 @@ "confirmMoveTrashMessageMultiple": "¿Está seguro de que desea eliminar los siguientes archivos {0}?", "confirmMoveTrashMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido?", "confirmMoveTrashMessageFile": "¿Está seguro de que desea eliminar '{0}'?", + "undoBin": "Se puede restaurar de la papelera de reciclaje.", + "undoTrash": "Se puede restaurar de la papelera.", "doNotAskAgain": "No volver a preguntarme", "confirmDeleteMessageMultiple": "¿Está seguro de que desea eliminar de forma permanente los siguientes archivos {0}?", "confirmDeleteMessageFolder": "¿Está seguro de que desea eliminar '{0}' y su contenido de forma permanente?", "confirmDeleteMessageFile": "¿Está seguro de que desea eliminar '{0}' de forma permanente?", "irreversible": "Esta acción es irreversible.", - "importFiles": "Importar archivos", + "binFailed": "Error al eliminar usando la papelera de reciclaje. ¿Desea eliminar de forma permanente en su lugar?", + "trashFailed": "No se pudo eliminar usando la papelera. ¿Desea eliminar de forma permanente?", + "deletePermanentlyButtonLabel": "&&Eliminar de forma permanente", + "retryButtonLabel": "&&Reintentar", "confirmOverwrite": "Ya existe un archivo o carpeta con el mismo nombre en la carpeta de destino. ¿Quiere reemplazarlo?", "replaceButtonLabel": "&&Reemplazar", "fileIsAncestor": "El archivo que se va a pegar es un antecesor de la carpeta de destino", diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 93ee0518a0b..6a280847cb6 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -37,6 +37,7 @@ "defaultLanguage": "El modo de lenguaje predeterminado que se asigna a nuevos archivos.", "editorConfigurationTitle": "Editor", "formatOnSave": "Formatea un archivo al guardarlo. Debe haber un formateador disponible, el archivo no debe guardarse automáticamente y el editor no debe estar cerrándose.", + "formatOnSaveTimeout": "Tiempo de espera de aplicación de formato al guardar. Especifica un límite de tiempo en milisegundos para los comandos formatOnSave. Los comandos que tarden más del tiempo de espera especificado se cancelarán.", "explorerConfigurationTitle": "Explorador de archivos", "openEditorsVisible": "Número de editores mostrados en el panel de editores abiertos.", "autoReveal": "Controla si el explorador debe mostrar y seleccionar automáticamente los archivos al abrirlos.", diff --git a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 1bcad541fa7..2a357906cfb 100644 --- a/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,13 +7,14 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Escriba el nombre de archivo. Presione ENTRAR para confirmar o Esc para cancelar", - "constructedPath": "Crear {0} en **{1}**", "filesExplorerViewerAriaLabel": "{0}, Explorador de archivos", "dropFolders": "¿Quiere agregar las carpetas al área de trabajo?", "dropFolder": "¿Quiere agregar la carpeta al área de trabajo?", "addFolders": "&&Agregar carpetas", "addFolder": "&&Agregar carpeta", + "confirmRootsMove": "¿Está seguro de que quiere cambiar el orden de varias carpetas raíz en el área de trabajo?", "confirmMultiMove": "¿Está seguro de que desea mover los siguientes archivos {0}?", + "confirmRootMove": "¿Está seguro de que quiere cambiar el orden de la carpeta raíz \"{0}\" en el área de trabajo?", "confirmMove": "¿Está seguro de que desea mover '{0}'?", "doNotAskAgain": "No volver a preguntarme", "moveButtonLabel": "&&Mover", diff --git a/i18n/esn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index 8d320c3e36d..6fd49793b66 100644 --- a/i18n/esn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "¿Desea cambiar el idioma de la interfaz de usuario de VS Code a {0} y reiniciar la aplicación?", "yes": "Sí", "no": "No", - "doNotAskAgain": "No volver a preguntarme", + "neverAgain": "No volver a mostrar", "JsonSchema.locale": "Idioma de la interfaz de usuario que debe usarse.", "vscode.extension.contributes.localizations": "Contribuye a la localización del editor", "vscode.extension.contributes.localizations.languageId": "Identificador del idioma en el que se traducen las cadenas de visualización.", diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index 710a643d6e8..57024a086ac 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "Copiar", - "copyMarkerMessage": "Copiar mensaje" + "copyMessage": "Copiar mensaje" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 4e534a88b7c..8323facb36a 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Total {0} Problemas", - "filteredProblems": "Mostrando {0} de {1} problemas" + "totalProblems": "Total {0} Problemas" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index eab6272315a..e7f7ed6b7d1 100644 --- a/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "Problemas", "markers.panel.aria.label.problems.tree": "Problemas agrupados por archivos", "markers.panel.no.problems.build": "Hasta el momento, no se encontraron problemas en el área de trabajo.", - "markers.panel.no.problems.filters": "No se encontraron resultados con los criterios de filtro proporcionados", "markers.panel.action.filter": "Filtrar problemas", - "markers.panel.filter.placeholder": "Filtrar por tipo o texto", + "markers.panel.filter.ariaLabel": "Filtrar problemas", "markers.panel.filter.errors": "errores", "markers.panel.filter.warnings": "advertencias", "markers.panel.filter.infos": "informaciones", @@ -30,5 +29,15 @@ "markers.panel.multiple.unknowns.label": "{0} desconocidos", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "{0} con {1} problemas", + "problems.tree.aria.label.marker.relatedInformation": " Este problema tiene referencias a ubicaciones de {0}.", + "problems.tree.aria.label.error.marker": "Error generado por {0}: {1} en la línea {2} y el carácter {3}.{4}", + "problems.tree.aria.label.error.marker.nosource": "Error: {0} en la línea {1} y el carácter {2}.{3}", + "problems.tree.aria.label.warning.marker": "Advertencia generada por {0}: {1} en la línea {2} y el carácter {3}.{4}", + "problems.tree.aria.label.warning.marker.nosource": "Advertencia: {0} en la línea {1} y el carácter {2}.{3}", + "problems.tree.aria.label.info.marker": "Información generada por {0}: {1} en la línea {2} y el carácter {3}.{4}", + "problems.tree.aria.label.info.marker.nosource": "Información: {0} en la línea {1} y el carácter {2}.{3}", + "problems.tree.aria.label.marker": "Problema generado por {0}: {1} en la línea {2} y el carácter {3}.{4}", + "problems.tree.aria.label.marker.nosource": "Problema: {0} en la línea {1} y el carácter {2}.{3}", + "problems.tree.aria.label.relatedinfo.message": "{0} en la línea {1} y el carácter {2} en {3}", "errors.warnings.show.label": "Mostrar errores y advertencias" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/esn/src/vs/workbench/parts/output/browser/outputActions.i18n.json index d799d3d1934..0c741775e1f 100644 --- a/i18n/esn/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "Alternar salida", "clearOutput": "Borrar salida", "toggleOutputScrollLock": "Alternar Bloq Despl salida", - "switchToOutput.label": "Cambiar a salida" + "switchToOutput.label": "Cambiar a salida", + "openInLogViewer": "Abrir archivo de registro" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index d0ee7119bb7..1ce77e76c3f 100644 --- a/i18n/esn/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "Salida", "logViewer": "Visor de registros", "viewCategory": "Ver", - "clearOutput.label": "Borrar salida" + "clearOutput.label": "Borrar salida", + "openActiveLogOutputFile": "Ver: abrir el archivo de salida del registro activo" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index b0f61204eeb..634545e1c6f 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Métodos abreviados de teclado", + "showDefaultKeybindings": "Mostrar enlaces de teclado predeterminados", + "showUserKeybindings": "Mostrar enlaces de teclado del usuario", "SearchKeybindings.AriaLabel": "Buscar enlaces de teclado", "SearchKeybindings.Placeholder": "Buscar enlaces de teclado", "sortByPrecedene": "Ordenar por procedimiento", diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 61b308ae32d..33e1d8a94d2 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Abrir Configuración Predeterminada Raw", + "openSettings": "Abrir configuración", "openGlobalSettings": "Abrir configuración de usuario", "openGlobalKeybindings": "Abrir métodos abreviados de teclado", "openGlobalKeybindingsFile": "Abrir el archivo de métodos abreviados de teclado", diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index af8a30c82d9..2c40cb00195 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Configuración predeterminada", "SearchSettingsWidget.AriaLabel": "Buscar configuración", "SearchSettingsWidget.Placeholder": "Buscar configuración", "noSettingsFound": "Sin resultados", @@ -16,6 +15,8 @@ "nlpResult": "Resultados en lenguaje natural", "filterResult": "Resultados filtrados", "defaultSettings": "Configuración predeterminada", + "defaultUserSettings": "Configuración predeterminada de usuario", + "defaultWorkspaceSettings": "Configuración de espacio de trabajo predeterminado", "defaultFolderSettings": "Configuración de carpeta predeterminada", "defaultEditorReadonly": "Editar en el editor de lado de mano derecha para reemplazar valores predeterminados.", "preferencesAriaLabel": "Preferencias predeterminadas. Editor de texto de solo lectura." diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index e70951fbef4..98610852f74 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "Mostrar extensión \"{0}\"", "editTtile": "Editar", "replaceDefaultValue": "Reemplazar en Configuración", - "copyDefaultValue": "Copiar en Configuración", - "unsupportedPHPExecutablePathSetting": "Este valor debe estar en la configuración de usuario. Si quiere configurar PHP para el área de trabajo, abra un archivo PHP y haga clic en \"Ruta de acceso PHP\" en la barra de estado.", - "unsupportedWorkspaceSetting": "Este valor debe estar en Configuración de usuario.", - "unsupportedWorkbenchSetting": "Esta configuración no se puede aplicar ahora. Se aplicará al abrir esta carpeta directamente.", - "unsupportedWorkbenchSettingDevMode": "Esta configuración no se puede aplicar ahora. Se aplicará si se define su alcance como 'recurso' o al abrir esta carpeta directamente. " + "copyDefaultValue": "Copiar en Configuración" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 4f4ee6b527a..67ddbe8f8cd 100644 --- a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "Instalar proveedores adicionales de SCM...", "no open repo": "No hay proveedores de control de código fuente activos.", "source control": "Control de código fuente", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "Ocultar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json index e69218c998b..c7dc8145a23 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Mostrar siguiente búsqueda de patrón include", "previousSearchIncludePattern": "Mostrar búsqueda anterior de patrón include ", + "nextSearchExcludePattern": "Mostrar siguiente búsqueda de patrón exclude ", + "previousSearchExcludePattern": "Mostrar búsqueda anterior de patrón exclude ", "nextSearchTerm": "Mostrar siguiente término de búsqueda", "previousSearchTerm": "Mostrar anterior término de búsqueda", - "showSearchViewlet": "Mostrar búsqueda", "findInFiles": "Buscar en archivos", "replaceInFiles": "Reemplazar en archivos", "RefreshAction.label": "Actualizar", diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/searchView.i18n.json index be513ebe447..0c3d29ae593 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Alternar detalles de la búsqueda", + "searchScope.includes": "archivos para incluir", + "label.includes": "Buscar patrones de inclusión", + "searchScope.excludes": "archivos para excluir", + "label.excludes": "Buscar patrones de exclusión", "replaceAll.confirmation.title": "Reemplazar todo", "replaceAll.confirm.button": "&&Reemplazar", "replaceAll.occurrence.file.message": "{0} aparición reemplazada en {1} archivo por \"{2}\".", diff --git a/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 1cb9f6c349e..fc682127315 100644 --- a/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Buscar", + "copyMatchLabel": "Copiar", + "copyPathLabel": "Copiar ruta de acceso", + "copyAllLabel": "Copiar todo", "findInFolder": "Buscar en carpeta...", "findInWorkspace": "Buscar en área de trabajo...", "showTriggerActions": "Ir al símbolo en el área de trabajo...", "name": "Buscar", - "search": "Buscar", "showSearchViewl": "Mostrar búsqueda", "view": "Ver", "findInFiles": "Buscar en archivos", @@ -25,6 +28,5 @@ "search.quickOpen.includeSymbols": "Configurar para incluir los resultados de una búsqueda global de símbolos en los resultados de archivos de Quick Open.", "search.followSymlinks": "Controla si debe seguir enlaces simbólicos durante la búsqueda.", "search.smartCase": "Proporciona busquedas de mayúsculas y minúsculas si el patrón es todo en minúsculas, de lo contrario, busca en mayúsculas y minúsculas", - "search.globalFindClipboard": "Controla si la vista de búsqueda debe leer o modificar el portapapeles de búsqueda compartido en macOS", - "search.location": "Vista previa: controla si se muestra la búsqueda como una vista en la barra lateral o como un panel en el área de paneles para tener más espacio horizontal. En la próxima versión, la búsqueda en panel tendrá una distribución horizontal mejorada y dejará de ser una vista previa." + "search.globalFindClipboard": "Controla si la vista de búsqueda debe leer o modificar el portapapeles de búsqueda compartido en macOS" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 4022b41aaf8..e9c92ac0b0e 100644 --- a/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "Ayúdenos a mejorar nuestro soporte para {0}", "takeShortSurvey": "Realizar una breve encuesta", "remindLater": "Recordármelo más tarde", - "neverAgain": "No volver a mostrar", - "helpUs": "Ayúdenos a mejorar nuestro soporte para {0}" + "neverAgain": "No volver a mostrar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 91318e8e66f..33ec507b93f 100644 --- a/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "¿Le importaría realizar una breve encuesta de opinión?", "takeSurvey": "Realizar encuesta", "remindLater": "Recordármelo más tarde", - "neverAgain": "No volver a mostrar", - "surveyQuestion": "¿Le importaría realizar una breve encuesta de opinión?" + "neverAgain": "No volver a mostrar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index 485b6c325bf..c4a0654df75 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "Patrón de problema o nombre de un patrón de problema que se ha aportado o predefinido. Se puede omitir si se especifica la base.", "ProblemMatcherSchema.base": "Nombre de un buscador de coincidencias de problemas base que se va a usar.", "ProblemMatcherSchema.owner": "Propietario del problema dentro de Code. Se puede omitir si se especifica \"base\". Si se omite y no se especifica \"base\", el valor predeterminado es \"external\".", + "ProblemMatcherSchema.source": "Una cadena legible que describe la fuente de este diagnóstico, por ejemplo 'Inicio' o 'super pelusa'.", "ProblemMatcherSchema.severity": "Gravedad predeterminada para los problemas de capturas. Se usa si el patrón no define un grupo de coincidencias para \"severity\".", "ProblemMatcherSchema.applyTo": "Controla si un problema notificado en un documento de texto se aplica solamente a los documentos abiertos, cerrados o a todos los documentos.", "ProblemMatcherSchema.fileLocation": "Define cómo deben interpretarse los nombres de archivo notificados en un patrón de problema.", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 41e40ef4d29..4f1f33161a7 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,7 +28,14 @@ "JsonSchema.tasks.group.none": "No asigna la tarea a ningún grupo", "JsonSchema.tasks.group": "Define a qué grupo de ejecución pertenece esta tarea. Admite \"compilación\" para agregarla al grupo de compilación y \"prueba\" para agregarla al grupo de prueba.", "JsonSchema.tasks.type": "Define si la tarea se ejecuta como un proceso o como un comando dentro de in shell. ", + "JsonSchema.command.quotedString.value": "El valor actual del comando", + "JsonSchema.tasks.quoting.escape": "Carácteres de escape usan el carácter de escape de la linea de comandos (ej.: ' en PowerShell y \\ en Bash)", + "JsonSchema.tasks.quoting.strong": "Cita el argumento usando el carácter de citación doble de la linea de comandos (ej.: \" en PowerShell y Bash) ", + "JsonSchema.tasks.quoting.weak": "Cita el argumento usando el carácter de citación simple de la linea de comandos (ej.: ' en PowerShell y Bash) ", + "JsonSchema.command.quotesString.quote": "Cómo el valor del comando debería ser citado", "JsonSchema.command": "El comando que se va a ejecutar. Puede ser un programa externo o un comando shell.", + "JsonSchema.args.quotedString.value": "El valor actual del argumento", + "JsonSchema.args.quotesString.quote": "Cómo el valor del argumento debería ser citado ", "JsonSchema.tasks.args": "Argumentos que se pasan al comando cuando se invoca esta tarea.", "JsonSchema.tasks.label": "Etiqueta de interfaz de usuario de la tarea", "JsonSchema.version": "El número de versión de la configuración.", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index fb8b41d8a5e..870798c942c 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,7 +11,9 @@ "totalErrors": "{0} errores", "totalWarnings": "{0} advertencias", "totalInfos": "{0} informaciones", + "problems": "Problemas", "building": "Compilando...", + "manyProblems": "+10Mil", "runningTasks": "Mostrar tareas en ejecución", "tasks": "Tareas", "TaskSystem.noHotSwap": "Cambiar el motor de ejecución de tareas con una tarea activa ejecutandose, requiere recargar la ventana", @@ -29,8 +31,8 @@ "selectProblemMatcher": "Seleccione qué tipo de errores y advertencias deben buscarse durante el examen de la salida de la tarea", "customizeParseErrors": "La configuración actual de tareas contiene errores. Antes de personalizar una tarea, corrija los errores.", "moreThanOneBuildTask": "Hay muchas tareas de compilación definidas en el archivo tasks.json. Se ejecutará la primera.\n", - "TaskSystem.activeSame.background": "La tarea \"{0}\" ya está activa en segundo plano. Para terminarla, use la opción \"Terminar tarea\" del menú Tareas.", - "TaskSystem.activeSame.noBackground": "La tarea \"{0}\" ya está activa. Para terminarla, use la opción \"Terminar tarea\" del menú Tareas.", + "terminateTask": "Finalizar tarea", + "restartTask": "Reiniciar tarea", "TaskSystem.active": "Ya hay una tarea en ejecución. Finalícela antes de ejecutar otra tarea.", "TaskSystem.restartFailed": "No se pudo terminar y reiniciar la tarea {0}", "TaskService.noConfiguration": "Error: La detección de tarea {0} no encontró una tarea para la siguiente configuración:\n{1}\nLa tarea será omitida.\n", @@ -47,8 +49,8 @@ "recentlyUsed": "Tareas usadas recientemente", "configured": "tareas configuradas", "detected": "tareas detectadas", - "TaskService.notAgain": "No volver a mostrar", "TaskService.ignoredFolder": "Las siguientes carpetas del área de trabajo se omitirán porque utilizan la versión 0.1.0 de la tarea: {0}", + "TaskService.notAgain": "No volver a mostrar", "TaskService.pickRunTask": "Seleccione la tarea a ejecutar", "TaslService.noEntryToRun": "No se encontraron tareas para ejecutar. Configurar tareas...", "TaskService.fetchingBuildTasks": "Obteniendo tareas de compilación...", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 6769f7d66e8..c53edb70544 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "Advertencia: options.cwd debe ser de tipo cadena. Se ignora el valor {0}.", + "ConfigurationParser.inValidArg": "Error: el argumento del comando debe ser una cadena de texto o una cadena de texto citada. El valor provisto es: [0]", "ConfigurationParser.noargs": "Error: Los argumentos de comando deben ser una matriz de cadenas. El valor proporcionado es: {0}", "ConfigurationParser.noShell": "Advertencia: La configuración del shell solo se admite al ejecutar tareas en el terminal.", "ConfigurationParser.noName": "Error: El buscador de coincidencias de problemas del ámbito de declaración debe tener un nombre: {0}", diff --git a/i18n/esn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..452c57e6943 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "El color de fondo del terminal, esto permite colorear el terminal de forma diferente al panel.", + "terminal.foreground": "El color de primer plano del terminal.", + "terminalCursor.foreground": "Color de primer plano del cursor del terminal.", + "terminalCursor.background": "Color de fondo del cursor del terminal. Permite personalizar el color de un carácter solapado por un cursor de bloque.", + "terminal.selectionBackground": "Color de fondo de selección del terminal.", + "terminal.border": "Color del borde que separa paneles divididos en el terminal. El valor predeterminado es panel.border.", + "terminal.ansiColor": "color ANSI ' {0} ' en el terminal." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 1c13a74b033..9861595bf78 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -21,6 +21,7 @@ "workbench.action.terminal.newWorkspacePlaceholder": "Seleccione el directorio de trabajo actual para el nuevo terminal", "workbench.action.terminal.newInActiveWorkspace": "Crear nuevo terminal integrado (en el espacio de trabajo activo)", "workbench.action.terminal.split": "Dividir terminal", + "workbench.action.terminal.splitInActiveWorkspace": "Dividir Terminal (En el espacio de trabajo activo)", "workbench.action.terminal.focusPreviousPane": "Aplicar el foco al panel anterior", "workbench.action.terminal.focusNextPane": "Aplicar el foco al panel siguiente", "workbench.action.terminal.resizePaneLeft": "Cambiar el tamaño del panel por la izquierda", @@ -43,6 +44,7 @@ "workbench.action.terminal.scrollUpPage": "Desplazar hacia arriba (página)", "workbench.action.terminal.scrollToTop": "Desplazar al principio", "workbench.action.terminal.clear": "Borrar", + "workbench.action.terminal.clearSelection": "Borrar selección", "workbench.action.terminal.allowWorkspaceShell": "Permitir la configuración del área de trabajo Shell", "workbench.action.terminal.disallowWorkspaceShell": "No permitir la configuración del área de trabajo Shell", "workbench.action.terminal.rename": "Cambiar nombre", @@ -51,5 +53,9 @@ "workbench.action.terminal.hideFindWidget": "Ocultar Encontrar Widget", "nextTerminalFindTerm": "Mostrar siguiente término de búsqueda", "previousTerminalFindTerm": "Mostrar término de búsqueda anterior", - "quickOpenTerm": "Cambiar terminal activo" + "quickOpenTerm": "Cambiar terminal activo", + "workbench.action.terminal.scrollToPreviousCommand": "Desplácese al comando anterior", + "workbench.action.terminal.scrollToNextCommand": "Desplácese al siguiente comando", + "workbench.action.terminal.selectToPreviousCommand": "Seleccionar hasta el comando anterior", + "workbench.action.terminal.selectToNextCommand": "Seleccionar hasta el comando siguiente" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 330fde9328b..0b35aeabe88 100644 --- a/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "Esta área de trabajo contiene valores de configuración que solo se pueden establecer en Configuración de usuario ({0}). Haga clic [aquí]({1}) para obtener más información.", "openWorkspaceSettings": "Abrir configuración del área de trabajo", - "dontShowAgain": "No volver a mostrar", - "unsupportedWorkspaceSettings": "Esta área de trabajo contiene valores de configuración que solo se pueden establecer en Configuración de usuario ({0}). Haga clic [aquí]({1}) para obtener más información." + "dontShowAgain": "No volver a mostrar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json index b9e27a328d5..2c980e5c8fe 100644 --- a/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "Más tarde", "releaseNotes": "Notas de la versión", "showReleaseNotes": "Mostrar las notas de la versión", "read the release notes": "{0} v{1}. ¿Quiere leer las notas de la versión?", @@ -16,13 +15,14 @@ "updateIsReady": "Nueva actualización de {0} disponible.", "noUpdatesAvailable": "Actualmente, no hay actualizaciones disponibles.", "ok": "Aceptar", - "download now": "Descargar ahora", "thereIsUpdateAvailable": "Hay una actualización disponible.", - "installUpdate": "Instalar la actualización ", + "download now": "Descargar ahora", + "later": "Más tarde", "updateAvailable": "Hay una actualización disponible: {0} {1}", + "installUpdate": "Instalar la actualización ", "updateInstalling": "{0} {1} se está instalando en segundo plano, le avisaremos cuando sea completada", + "updateAvailableAfterRestart": "Reiniciar {0} para aplicar la última actualización.", "updateNow": "Actualizar ahora", - "updateAvailableAfterRestart": "{0} se actualizará después de reiniciarse.", "commandPalette": "Paleta de comandos...", "settings": "Configuración", "keyboardShortcuts": "Métodos abreviados de teclado", diff --git a/i18n/esn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 7957a5748f1..cfb3d21c72a 100644 --- a/i18n/esn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "Editor de vistas web" + "webview.editor.label": "Editor de vistas web", + "developer": "Desarrollador" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/esn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..760d6b600cd --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Abrir herramientas de desarrollo de vistas web", + "refreshWebviewLabel": "Recargar vistas web" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index d3fc42e3ea0..41dc2fce9fc 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Ayúdenos a mejorar VS Code permitiendo a Microsoft recopilar datos de uso. Lea nuestra [declaración de privacidad]({0}) y vea qué debe hacer para [no participar]({1}).", + "telemetryOptOut.optInNotice": "Ayúdenos a mejorar VS Code permitiendo a Microsoft recopilar datos de uso. Lea nuestra [declaración de privacidad]({0}) y vea qué debe hacer para [no participar]({1}).", "telemetryOptOut.readMore": "Leer más" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index 4cca5673d67..9df96460d57 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "Administrar extensiones", "welcomeOverlay.problems": "Ver errores y advertencias", "welcomeOverlay.commandPalette": "Buscar y ejecutar todos los comandos", + "welcomeOverlay.notifications": "Mostrar notificaciones", "welcomeOverlay": "Información general de la interfaz de usuario", "hideWelcomeOverlay": "Ocultar información general de la interfaz", "help": "Ayuda" diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index eec6537884d..dfe6cefe425 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "Herramientas y lenguajes", "welcomePage.installExtensionPacksDescription": "Instalar soporte para {0} y {1}", "welcomePage.moreExtensions": "más", - "welcomePage.installKeymapDescription": "Instalar los métodos abreviados de teclado", - "welcomePage.installKeymapExtension": "Instalar los métodos abreviados de teclado de {0} y {1}", "welcomePage.others": "otros", "welcomePage.colorTheme": "Tema de color", "welcomePage.colorThemeDescription": "Modifique a su gusto la apariencia del editor y el código", diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 890db5376d9..41c9ed2d77b 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "Abrir configuración", "saveAndRetry": "Guardar y reintentar", "errorUnknownKey": "No se puede escribir en {0} porque {1} no es una configuración registrada.", + "errorInvalidWorkspaceConfigurationApplication": "No se puede escribir {0} en configuración de área de trabajo. Esta opción puede escribirse solamente en configuración de usuario.", "errorInvalidFolderConfiguration": "No se puede escribir en Configuración de carpeta porque {0} no admite el ámbito del recurso de carpeta.", "errorInvalidUserTarget": "No se puede escribir en Configuración de usuario porque {0} no admite el ámbito global.", "errorInvalidWorkspaceTarget": "No se puede escribir a la configuración del espacio de trabajo porque {0} no soporta a un espacio de trabajo con multi carpetas.", diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..53a465b71f5 --- /dev/null +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedApplicationSetting": "Esta configuración puede aplicarse sólo en configuración de usuario", + "unsupportedWindowSetting": "Esta configuración no se puede aplicar ahora. Se aplicará al abrir esta carpeta directamente." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index e71ac660c5f..0a5131780c1 100644 --- a/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,13 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolder": "${workspaceFolder} no se puede resolver. Por favor, abra una carpeta.", - "canNotResolveFolderBasenameMultiRoot": "${workspaceFolderBasename} no se puede resolver en una área de trabajo de varias carpetas. Establezca el alcance de estas variables usando : y un nombre de carpeta.", - "canNotResolveFolderBasename": "${workspaceFolderBasename} no se puede resolver. Por favor, abra una carpeta.", - "canNotResolveLineNumber": "${lineNumber} no se puede resolver, por favor, abra un editor.", - "canNotResolveSelectedText": "${selectedText} no se puede resolver, por favor, abra un editor.", - "canNotResolveFileDirname": "${fileDirname} no se puede resolver, por favor, abra un editor.", - "canNotResolveFileExtname": "${fileExtname} no se puede resolver, por favor, abra un editor.", - "canNotResolveFileBasename": "${fileBasename} no se puede resolver, por favor, abra un editor.", - "canNotResolveFileBasenameNoExtension": "${fileBasenameNoExtension} no se puede resolver, por favor, abra un editor." + "canNotResolveWorkspaceFolder": "'${workspaceFolder}' no puede ser resuelto. Por favor, abra una carpeta.", + "canNotResolveFolderBasename": "'${workspaceFolderBasename}' no puede ser resuelto. Por favor, abra una carpeta." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index 29f353047f0..dd5c8e077c6 100644 --- a/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/esn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "Compatibilidad del motor.", "vscode.extension.engines.vscode": "Para las extensiones de VS Code, especifica la versión de VS Code con la que la extensión es compatible. No puede ser *. Por ejemplo: ^0.10.5 indica compatibilidad con una versión de VS Code mínima de 0.10.5.", "vscode.extension.publisher": "El publicador de la extensión VS Code.", "vscode.extension.displayName": "Nombre para mostrar de la extensión que se usa en la galería de VS Code.", "vscode.extension.categories": "Categorías que usa la galería de VS Code para clasificar la extensión.", + "vscode.extension.category.languages.deprecated": "Utilice 'Lenguajes de programación' en su lugar ", "vscode.extension.galleryBanner": "Banner usado en VS Code Marketplace.", "vscode.extension.galleryBanner.color": "Color del banner en el encabezado de página de VS Code Marketplace.", "vscode.extension.galleryBanner.theme": "Tema de color de la fuente que se usa en el banner.", @@ -28,6 +30,8 @@ "vscode.extension.badges.url": "URL de la imagen del distintivo.", "vscode.extension.badges.href": "Vínculo del distintivo.", "vscode.extension.badges.description": "Descripción del distintivo.", + "vscode.extension.markdown": "Controla el motor de renderizado de Markdown utilizado en el Marketplace. Github (por defecto) o estándar.", + "vscode.extension.qna": "Controla el enlace Q&A en el Marketplace. Establézcalo a marketplace para habilitar el sitio web Q&A de Marketplace. Establézcalo a una cadena para proporcionar la dirección URL de un sitio web Q&A personalizado. Establézcalo en falso para deshabilitar el Q&A totalmente. ", "vscode.extension.extensionDependencies": "Dependencias a otras extensiones. El identificador de una extensión siempre es ${publisher}.${name}. Por ejemplo: vscode.csharp.", "vscode.extension.scripts.prepublish": "Script que se ejecuta antes de publicar el paquete como extensión VS Code.", "vscode.extension.scripts.uninstall": "Enlace de desinstalación para la extensión de VS Code. Script que se ejecuta cuando la extensión se ha desinstalado por completo de VS Code, que es cuando VS Code se reinicia (se cierra y se inicia) después de haberse desinstalado la extensión. Solo se admiten scripts de Node.", diff --git a/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 9012f97a2f8..fc53e989dd6 100644 --- a/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "Todas las extensiones están deshabilitadas.", "extensionHostProcess.crash": "El host de extensiones finalizó inesperadamente.", "extensionHostProcess.unresponsiveCrash": "Se terminó el host de extensiones porque no respondía.", - "devTools": "Herramientas de desarrollo", + "devTools": "Herramientas de desarrollo abiertas", "restart": "Reiniciar el host de extensiones", "overwritingExtension": "Sobrescribiendo la extensión {0} con {1}.", "extensionUnderDevelopment": "Cargando la extensión de desarrollo en {0}", diff --git a/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index aa407167dba..ecc3269c8a1 100644 --- a/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,11 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Requiere Microsoft .NET Framework 4.5. Siga el vínculo para instalarlo.", "installNet": "Descargar .NET Framework 4.5", "neverShowAgain": "No volver a mostrar", - "netVersionError": "Requiere Microsoft .NET Framework 4.5. Siga el vínculo para instalarlo.", - "learnMore": "Instrucciones", "enospcError": "{0} es incapaz de observar los cambios de los archivos en este espacio de trabajo tan grande. Por favor siga las instrucciones en el link para resolver este problema.", + "learnMore": "Instrucciones", + "fileInvalidPath": "Recurso de archivo no válido ({0})", + "fileIsDirectoryError": "El archivo es un directorio", + "fileNotModifiedError": "Archivo no modificado desde", + "fileTooLargeError": "Archivo demasiado grande para abrirlo", + "fileNotFoundError": "Archivo no encontrado ({0})", + "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto", + "filePermission": "Permiso denegado al escribir en el archivo ({0})", + "fileExists": "El archivo a crear ya existe ({0})", + "fileModifiedError": "Archivo Modificado Desde", + "fileReadOnlyError": "El archivo es de solo lectura", + "fileMoveConflict": "No se puede mover o copiar. El archivo ya existe en la ubicación de destino. ", + "unableToMoveCopyError": "No se puede mover o copiar. El archivo reemplazaría a la carpeta que lo contiene.", "binFailed": "No se pudo mover \"{0}\" a la papelera de reciclaje", "trashFailed": "No se pudo mover '{0}' a la papelera" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 577ce27c3b8..33d664310eb 100644 --- a/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Archivo no encontrado ({0})", "fileIsDirectoryError": "El archivo es un directorio", "fileNotModifiedError": "Archivo no modificado desde", "fileBinaryError": "El archivo parece ser binario y no se puede abrir como texto" diff --git a/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index 54bbf3f0874..bc5ecccc178 100644 --- a/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "Nombre del ámbito de TextMate que usa el archivo tmLanguage.", "vscode.extension.contributes.grammars.path": "Ruta de acceso del archivo tmLanguage. La ruta es relativa a la carpeta de extensión y normalmente empieza por \"./syntaxes/\".", "vscode.extension.contributes.grammars.embeddedLanguages": "Asignación de un nombre de ámbito al identificador de lenguaje si esta gramática contiene lenguajes incrustados.", + "vscode.extension.contributes.grammars.tokenTypes": "Asignación de nombre de ámbito a tipos de token.", "vscode.extension.contributes.grammars.injectTo": "Lista de nombres de ámbito de lenguaje al que se inyecta esta gramática." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index c947b1e5b52..52477cab338 100644 --- a/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/esn/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "Se esperaba una cadena en \"contributes.{0}.path\". Valor proporcionado: {1}", "invalid.injectTo": "Valor no válido en `contributes.{0}.injectTo`. Debe ser una matriz de nombres de ámbito de lenguaje. Valor proporcionado: {1}", "invalid.embeddedLanguages": "Valor no válido en \"contributes.{0}.embeddedLanguages\". Debe ser una asignación de objeto del nombre del ámbito al lenguaje. Valor proporcionado: {1}", + "invalid.tokenTypes": "Valor no válido en \"contributes.{0}.tokenTypes\". Debe ser una asignación de objeto del nombre del ámbito al tipo de token. Valor proporcionado: {1}", "invalid.path.1": "Se esperaba que \"contributes.{0}.path\" ({1}) se incluyera en la carpeta de la extensión ({2}). Esto puede hacer que la extensión no sea portátil.", "no-tm-grammar": "No hay ninguna gramática de TM registrada para este lenguaje." } \ No newline at end of file diff --git a/i18n/fra/extensions/css/package.i18n.json b/i18n/fra/extensions/css/package.i18n.json index 35229bd6699..f80d3cb8bfc 100644 --- a/i18n/fra/extensions/css/package.i18n.json +++ b/i18n/fra/extensions/css/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Bases du langage CSS", + "description": "Fournit la coloration syntaxique et la correspondance des parenthèses dans les fichiers CSS, LESS et SCSS." } \ No newline at end of file diff --git a/i18n/fra/extensions/emmet/package.i18n.json b/i18n/fra/extensions/emmet/package.i18n.json index f4abe170d6a..2b38d968d64 100644 --- a/i18n/fra/extensions/emmet/package.i18n.json +++ b/i18n/fra/extensions/emmet/package.i18n.json @@ -35,7 +35,7 @@ "emmetExtensionsPath": "Chemin d’accès au dossier contenant les profils Emmet et les extraits.", "emmetShowExpandedAbbreviation": "Affiche les abréviations Emmet développées sous forme de suggestions.\nL’option \"inMarkupAndStylesheetFilesOnly\" s’applique à haml, jade, slim, xml, xsl, css, html, scss, sass, less et stylus.\nL’option\"always\" s’applique à toutes les parties du fichier indépendamment du balisage/css.", "emmetShowAbbreviationSuggestions": "Affiche les abréviations Emmet possibles sous forme de suggestions. Non applicable dans les feuilles de style ou lorsque emmet.showExpandedAbbreviation est défini à \"never\".", - "emmetIncludeLanguages": "Activer les abréviations Emmet dans les langages qui ne sont pas pris en charge par défaut. Ajouter ici un mappage entre le langage et le langage Emmet pris en charge.\n Par exemple : {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", + "emmetIncludeLanguages": "Activer les abréviations Emmet dans les langages qui ne sont pas pris en charge par défaut. Ajoutez un mappage ici entre la langue et le langage supporté par emmet.\n Par exemple : {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "Variables à utiliser dans les extraits de Emmet", "emmetTriggerExpansionOnTab": "Lorsqu’activé, les abréviations Emmet sont développées lorsque vous appuyez sur TAB.", "emmetPreferences": "Préférences utilisées pour modifier le comportement de certaines actions et résolveurs d'Emmet.", @@ -60,5 +60,6 @@ "emmetPreferencesCssMozProperties": "Les propriétés css séparées par des virgules qui ont un préfixe 'moz' vendor lorsqu’elles sont utilisées dans une abréviation emmet qui commence par '-'. Mettre une chaîne vide pour éviter le préfixe 'moz'.", "emmetPreferencesCssOProperties": "Les propriétés css séparées par des virgules qui ont un préfixe 'o' vendor lorsqu’elles sont utilisées dans une abréviation emmet qui commence par '-'. Mettre une chaîne vide pour éviter le préfixe 'o'.", "emmetPreferencesCssMsProperties": "Les propriétés css séparées par des virgules qui ont un préfixe 'ms' vendor lorsqu’elles sont utilisées dans une abréviation emmet qui commence par '-'. Mettre une chaîne vide pour éviter le préfixe 'ms'.", - "emmetPreferencesCssFuzzySearchMinScore": "La note minimale (de 0 à 1) que la correspondance de l'abréviation (fuzzy-matched) devrait atteindre. Des valeurs plus faibles peuvent produire de nombreuses correspondances de faux-positifs, des valeurs plus élevées peuvent réduire les correspondances possibles." + "emmetPreferencesCssFuzzySearchMinScore": "La note minimale (de 0 à 1) que la correspondance de l'abréviation (fuzzy-matched) devrait atteindre. Des valeurs plus faibles peuvent produire de nombreuses correspondances de faux-positifs, des valeurs plus élevées peuvent réduire les correspondances possibles.", + "emmetOptimizeStylesheetParsing": "Si défini à false, la fichier entier est analysé pour déterminer si la position courante est valide pour l’expansion des abréviations Emmet. Si défini à true, seul le contenu autour de la position actuelle dans les fichiers css/scss/less est analysé." } \ No newline at end of file diff --git a/i18n/fra/extensions/git/out/commands.i18n.json b/i18n/fra/extensions/git/out/commands.i18n.json index bc93fe05e88..1fe6735dc5d 100644 --- a/i18n/fra/extensions/git/out/commands.i18n.json +++ b/i18n/fra/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "OK", "push with tags success": "Envoyé (push) avec des balises.", "pick remote": "Choisissez un dépôt distant où publier la branche '{0}' :", + "sync is unpredictable": "Cette action va effectuer un transfert (Push) et une récupération (Pull) des commits à destination et en provenance de '{0}/{1}'.", "never again": "OK, Ne plus afficher", "no remotes to publish": "Votre dépôt n'a aucun dépôt distant configuré pour une publication.", "no changes stash": "Aucune modification à remiser (stash).", diff --git a/i18n/fra/extensions/git/package.i18n.json b/i18n/fra/extensions/git/package.i18n.json index 560d4f6bf6e..6b9b77f8287 100644 --- a/i18n/fra/extensions/git/package.i18n.json +++ b/i18n/fra/extensions/git/package.i18n.json @@ -77,6 +77,7 @@ "config.showInlineOpenFileAction": "Contrôle s’il faut afficher une action Ouvrir le fichier dans l’affichage des modifications de Git.", "config.inputValidation": "Contrôle quand afficher la validation de la saisie du message de commit.", "config.detectSubmodules": "Contrôle s’il faut détecter automatiquement les sous-modules git.", + "config.detectSubmodulesLimit": "Contrôle la limite de sous-modules git détectés.", "colors.modified": "Couleur pour les ressources modifiées.", "colors.deleted": "Couleur pour les ressources supprimées.", "colors.untracked": "Couleur pour les ressources non tracées.", diff --git a/i18n/fra/extensions/markdown-language-features/out/security.i18n.json b/i18n/fra/extensions/markdown-language-features/out/security.i18n.json index 29ca6d0b4cb..a6eb76789ac 100644 --- a/i18n/fra/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/fra/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "Strict", "strict.description": "Charger uniquement le contenu sécurisé.", + "insecureLocalContent.title": "Autoriser le contenu local non sécurisé", + "insecureLocalContent.description": "Activer le chargement de contenu http servi par localhost", "insecureContent.title": "Autoriser le contenu non sécurisé", "insecureContent.description": "Activer le chargement de contenu sur http", "disable.title": "Désactiver", diff --git a/i18n/fra/extensions/php-language-features/package.i18n.json b/i18n/fra/extensions/php-language-features/package.i18n.json index f69ece2bdd4..60709998959 100644 --- a/i18n/fra/extensions/php-language-features/package.i18n.json +++ b/i18n/fra/extensions/php-language-features/package.i18n.json @@ -13,5 +13,6 @@ "configuration.title": "PHP", "commands.categroy.php": "PHP", "command.untrustValidationExecutable": "Interdire l'exécutable de validation PHP (défini comme paramètre d'espace de travail)", - "displayName": "Fonctionnalités de langage PHP" + "displayName": "Fonctionnalités de langage PHP", + "description": "Fournit une prise en charge de langage riche pour les fichiers PHP." } \ No newline at end of file diff --git a/i18n/fra/extensions/php/package.i18n.json b/i18n/fra/extensions/php/package.i18n.json index 20a77bf9902..2b1f86c1232 100644 --- a/i18n/fra/extensions/php/package.i18n.json +++ b/i18n/fra/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Fonctionnalités du langage PHP" + "displayName": "Bases du langage PHP", + "description": "Fournit la coloration syntaxique et la correspondance des parenthèses dans les fichiers PHP." } \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/commands.i18n.json b/i18n/fra/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..1738a01dc86 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Ouvrez un dossier dans VS Code pour utiliser un projet TypeScript ou JavaScript", + "typescript.projectConfigUnsupportedFile": "Impossible de déterminer le projet TypeScript ou JavaScript. Type de fichier non pris en charge", + "typescript.projectConfigCouldNotGetInfo": "Impossible de déterminer le projet TypeScript ou JavaScript", + "typescript.noTypeScriptProjectConfig": "Le fichier ne fait pas partie d'un projet TypeScript. Cliquer [ici]({0}) pour en savoir plus.", + "typescript.noJavaScriptProjectConfig": "Le fichier ne fait pas partie d'un projet JavaScript. Cliquer [ici]({0}) pour en savoir plus.", + "typescript.configureTsconfigQuickPick": "Configurer tsconfig.json", + "typescript.configureJsconfigQuickPick": "Configurer jsconfig.json" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..a9b06927dc3 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Sélectionner l'action de code à appliquer", + "acquiringTypingsLabel": "Acquisition des typings...", + "acquiringTypingsDetail": "Acquisition des définitions typings pour IntelliSense.", + "autoImportLabel": "Importation automatique depuis {0}" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8096453313a --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Active la vérification sémantique dans un fichier JavaScript. Doit se trouver au début d'un fichier.", + "ts-nocheck": "Désactive la vérification sémantique dans un fichier JavaScript. Doit se trouver au début d'un fichier.", + "ts-ignore": "Supprime les erreurs @ts-check sur la ligne suivante d'un fichier." +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..2e7856eb1be --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 implémentation", + "manyImplementationLabel": "{0} implémentations", + "implementationsErrorLabel": "Impossible de déterminer les implémentations" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..7915d99dbd8 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "Commentaire JSDoc" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..064e933aa67 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "Organiser les Imports" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..f10b35e9e5b --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (Corriger tout dans le fichier)" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..927ba6cdb77 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 référence", + "manyReferenceLabel": "{0} références", + "referenceErrorLabel": "Impossible de déterminer les références" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..451f7029bac --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "build - {0}", + "buildAndWatchTscLabel": "watch - {0}" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/fra/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..f31ff437ec4 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "Le chemin {0} ne pointe pas vers une installation tsserver valide. Utilisation par défaut de la version TypeScript groupée.", + "serverCouldNotBeStarted": "Impossible de démarrer le serveur de langage TypeScript. Message d'erreur : {0}", + "typescript.openTsServerLog.notSupported": "La journalisation du serveur TS nécessite TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "La journalisation du serveur TS est désactivée. Définissez 'typescript.tsserver.log' et redémarrez le serveur TS pour activer la journalisation", + "typescript.openTsServerLog.enableAndReloadOption": "Activer la journalisation et redémarrer le serveur TS", + "typescript.openTsServerLog.noLogFile": "Le serveur TS n'a pas démarré la journalisation.", + "openTsServerLog.openFileFailedFailed": "Impossible d'ouvrir le fichier journal du serveur TS", + "serverDiedAfterStart": "Le service de langage TypeScript s'est subitement arrêté 5 fois juste après avoir démarré. Il n'y aura pas d'autres redémarrages.", + "serverDiedReportIssue": "Signaler un problème", + "serverDied": "Le service de langage TypeScript s'est subitement arrêté 5 fois au cours des 5 dernières minutes." +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/fra/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..61ed0b60124 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "version non valide" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/fra/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/fra/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..b39c51e947e --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "Pour activer les fonctionnalités de langage JavaScript/TypeScript à l'échelle du projet, excluez les dossiers contenant de nombreux fichiers, par exemple : {0}", + "hintExclude.generic": "Pour activer les fonctionnalités de langage JavaScript/TypeScript à l'échelle du projet, excluez les dossiers volumineux contenant des fichiers sources inutilisés.", + "large.label": "Configurer les exclusions", + "hintExclude.tooltip": "Pour activer les fonctionnalités de langage JavaScript/TypeScript à l'échelle du projet, excluez les dossiers volumineux contenant des fichiers sources inutilisés." +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/fra/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..108ea8e9d3c --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Récupération (fetch) des données pour l'amélioration de TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "Impossible d'installer des fichiers de typages pour les fonctionnalités de langage JavaScript. Vérifiez que NPM est installé ou configurez 'typescript.npm' dans vos paramètres utilisateur. Cliquer [ici]({0}) pour en savoir plus.", + "typesInstallerInitializationFailed.doNotCheckAgain": "Ne plus afficher" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/fra/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..c6da9b3843f --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "Utiliser la version de VS Code", + "useWorkspaceVersionOption": "Utiliser la version de l'espace de travail", + "learnMore": "En savoir plus", + "selectTsVersion": "Sélectionner la version TypeScript utilisée pour les fonctionnalités de langage JavaScript et TypeScript" +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/fra/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..5c32ecfe106 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "Impossible de charger la version TypeScript dans ce chemin", + "noBundledServerFound": "Le tsserver de VSCode a été supprimé par une autre application, par exemple, un outil de détection de virus mal configuré. Réinstallez VS Code." +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript-language-features/package.i18n.json b/i18n/fra/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..a84454b66c5 --- /dev/null +++ b/i18n/fra/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,65 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Fonctionnalités de langage TypeScript et JavaScript", + "description": "Fournit une prise en charge riche de langage pour JavaScript et TypeScript.", + "typescript.reloadProjects.title": "Recharger le projet", + "javascript.reloadProjects.title": "Recharger le projet", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Fonctions complètes avec leur signature de paramètre.", + "typescript.tsdk.desc": "Spécifie le chemin de dossier contenant les fichiers tsserver et lib*.d.ts à utiliser.", + "typescript.disableAutomaticTypeAcquisition": "Désactive l'acquisition de type automatique. Nécessite TypeScript >= 2.0.6.", + "typescript.tsserver.log": "Active la journalisation du serveur TS dans un fichier. Ce journal peut être utilisé pour diagnostiquer les problèmes du serveur TS. Il peut contenir des chemins de fichier, du code source et d'autres informations potentiellement sensibles de votre projet.", + "typescript.tsserver.pluginPaths": "Chemins d’accès supplémentaires pour découvrir les plugins de Service de langage Typescript. Nécessite TypeScript > = 2.3.0.", + "typescript.tsserver.pluginPaths.item": "Un chemin absolu ou un chemin relatif. Le chemin d’accès relatif sera résolu en fonction des dossiers de l’espace de travail.", + "typescript.tsserver.trace": "Active le traçage des messages envoyés au serveur TS. Cette trace peut être utilisée pour diagnostiquer les problèmes du serveur TS. Elle peut contenir des chemins de fichier, du code source et d'autres informations potentiellement sensibles de votre projet.", + "typescript.validate.enable": "Activez/désactivez la validation TypeScript.", + "typescript.format.enable": "Activez/désactivez le formateur TypeScript par défaut.", + "javascript.format.enable": "Activez/désactivez le formateur JavaScript par défaut.", + "format.insertSpaceAfterCommaDelimiter": "Définit le traitement des espaces après une virgule de délimitation.", + "format.insertSpaceAfterConstructor": "Définit le traitement des espaces après le mot clé constructor. Nécessite TypeScript >= 2.3.0.", + "format.insertSpaceAfterSemicolonInForStatements": " Définit le traitement des espaces après un point-virgule dans une instruction for.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Définit le traitement des espaces après un opérateur binaire.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Définit la gestion des espaces après les mots clés dans une instruction de flux de contrôle.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Définit le traitement des espaces après le mot clé function pour les fonctions anonymes.", + "format.insertSpaceBeforeFunctionParenthesis": "Définit la gestion des espaces avant les parenthèses des arguments d'une fonction. Nécessite TypeScript >= 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Définit l’espace après ouverture et avant la fermeture de parenthèses non vides.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Définit l’espace après ouverture et avant la fermeture de crochets non vides.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Définit l’espace après ouverture et avant la fermeture d'accolades non vides. Nécessite le TypeScript >= 2.3.0.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Définit la gestion de l'espace après l'ouverture et avant la fermeture des accolades de la chaîne de modèle. Nécessite TypeScript >= 2.0.6.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Définit la gestion de l'espace après l'ouverture et avant la fermeture des accolades de l'expression JSX. Nécessite TypeScript >= 2.0.6.", + "format.insertSpaceAfterTypeAssertion": "Définit le traitement des espaces après les assertions de type dans TypeScript. Nécessite TypeScript >= 2.4.", + "format.placeOpenBraceOnNewLineForFunctions": "Définit si une accolade ouvrante dans une fonction est placée ou non sur une nouvelle ligne.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Définit si une accolade ouvrante dans un bloc de contrôle est placée ou non sur une nouvelle ligne.", + "javascript.validate.enable": "Activez/désactivez la validation JavaScript.", + "typescript.goToProjectConfig.title": "Accéder à la configuration du projet", + "javascript.goToProjectConfig.title": "Accéder à la configuration du projet", + "javascript.referencesCodeLens.enabled": "Activez/désactivez les références CodeLens dans les fichiers JavaScript.", + "typescript.referencesCodeLens.enabled": "Activez/désactivez les références CodeLens dans les fichiers TypeScript. Nécessite TypeScript >= 2.0.6.", + "typescript.implementationsCodeLens.enabled": "Activer/désactiver CodeLens dans les implémentations. Nécessite TypeScript >= 2.2.0.", + "typescript.openTsServerLog.title": "Ouvrir le journal du serveur TS", + "typescript.restartTsServer": "Redémarrer le serveur TS", + "typescript.selectTypeScriptVersion.title": "Sélectionner la version de TypeScript", + "typescript.reportStyleChecksAsWarnings": "Rapporter les vérifications de style comme des avertissements", + "jsDocCompletion.enabled": "Activer/désactiver les commentaires JSDoc automatiques", + "javascript.implicitProjectConfig.checkJs": "Activer/désactiver la vérification sémantique des fichiers JavaScript. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >=2.3.1.", + "typescript.npm": "Spécifie le chemin de l'exécutable NPM utilisé pour l'acquisition de type automatique. Nécessite TypeScript >= 2.3.4.", + "typescript.check.npmIsInstalled": "Vérifie si NPM est installé pour l'acquisition de type automatique.", + "javascript.nameSuggestions": "Activez/désactivez l'inclusion de noms uniques à partir du fichier dans les listes de suggestions JavaScript.", + "typescript.tsc.autoDetect": "Contrôle la détection automatique des tâches tsc. 'off' désactive cette fonctionnalité. 'build' crée uniquement des tâches de compilation à exécution unique. 'watch' crée uniquement des tâches de compilation et de watch. 'on' crée les deux les tâches build et watch. La valeur par défaut est 'on'.", + "typescript.problemMatchers.tsc.label": "Problèmes liés à TypeScript", + "typescript.problemMatchers.tscWatch.label": "Problèmes liés à TypeScript (mode espion)", + "typescript.quickSuggestionsForPaths": "Activer/désactiver les suggestions rapides lorsque vous saisissez un chemin d’import.", + "typescript.locale": "Définit les paramètres locaux utilisés pour signaler les erreurs TypeScript . Nécessite TypeScript >= 2.6.0. Par défaut 'null' utilise les paramètres locaux de VS Code pour les erreurs TypeScript.", + "javascript.implicitProjectConfig.experimentalDecorators": "Activer/désactiver 'experimentalDecorators' pour les fichiers JavaScript qui ne font pas partie d'un projet. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >=2.3.1.", + "typescript.autoImportSuggestions.enabled": "Activer/désactiver les suggestions d'import automatiques. Nécessite TypeScript >= 2.6.1.", + "typescript.experimental.syntaxFolding": "Active/désactive les marqueurs de réduction en fonction de la syntaxe.", + "taskDefinition.tsconfig.description": "Fichier tsconfig qui définit la build TS.", + "javascript.suggestionActions.enabled": "Activer/désactiver le diagnostic de suggestion des fichiers JavaScript dans l’éditeur. Nécessite TypeScript > = 2.8", + "typescript.suggestionActions.enabled": "Activer/désactiver les diagnostics de suggestion pour les fichiers TypeScript dans l’éditeur de texte. Nécessite TypeScript > = 2.8." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/base/node/processes.i18n.json b/i18n/fra/src/vs/base/node/processes.i18n.json index ffb5b40ba74..35229bd6699 100644 --- a/i18n/fra/src/vs/base/node/processes.i18n.json +++ b/i18n/fra/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "Impossible d'exécuter une commande d'interpréteur de commandes sur un lecteur UNC." + ] } \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index a1fd534cd5e..010c8f12ac4 100644 --- a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,10 +8,11 @@ ], "previewOnGitHub": "Prévisualiser sur GitHub", "loadingData": "Chargement des données en cours...", + "rateLimited": "Limite de requête GitHub dépassée. Veuillez patienter.", "similarIssues": "Problèmes similaires", "open": "Ouvrir", "closed": "Fermé", - "noResults": "Résultats introuvables", + "noSimilarIssues": "Aucun problème similaire trouvé", "settingsSearchIssue": "Problème de paramètres de recherche", "bugReporter": "Rapporteur de bogue", "featureRequest": "Demande de fonctionnalité", diff --git a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index b903d97313a..f18659a614b 100644 --- a/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/fra/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,12 @@ ], "completeInEnglish": "Veuillez remplir le formulaire en anglais.", "issueTypeLabel": "Ceci est un ", + "issueSourceLabel": "Fichier sur", + "vscode": "Visual Studio Code", + "extension": "Une Extension", + "disableExtensionsLabelText": "Essayez de reproduire le problème après {0}. Si le problème se reproduit uniquement lorsque les extensions sont actives, c’est probablement un problème avec une extension.", + "disableExtensions": "en désactivant toutes les extensions et en rechargeant la fenêtre", + "chooseExtension": "Extension", "issueTitleLabel": "Titre", "issueTitleRequired": "Veuillez s’il vous plaît entrer un titre.", "titleLengthValidation": "Le titre est trop long.", @@ -18,13 +24,6 @@ "extensions": "Mes Extensions", "searchedExtensions": "Extensions recherchées", "settingsSearchDetails": "Détails de paramètres de recherche", - "tryDisablingExtensions": "Le problème est-il reproductible lorsque les extensions sont désactivées?", - "yes": "Oui", - "no": "Non", - "disableExtensionsLabelText": "Essayez de reproduire le problème après {0}.", - "disableExtensions": "en désactivant toutes les extensions et en rechargeant la fenêtre", - "showRunningExtensionsLabelText": "Si vous pensez que c'est un problème d'extension, {0} pour reporter le problème de l'extension.", - "showRunningExtensions": "Afficher toutes les extensions en cours d'exécution", "details": "Veuillez saisir les détails ", "loadingData": "Chargement des données..." } \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..9eedc8116f8 --- /dev/null +++ b/i18n/fra/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cpu": "% PROCESSEUR", + "memory": "Mémoire (Mo)", + "pid": "pid", + "name": "Nom", + "killProcess": "Tuer le processus", + "forceKillProcess": "Forcer la suppression du processus" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-main/menus.i18n.json b/i18n/fra/src/vs/code/electron-main/menus.i18n.json index 8285cde130f..021a8b5c68b 100644 --- a/i18n/fra/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/fra/src/vs/code/electron-main/menus.i18n.json @@ -161,6 +161,7 @@ "mMergeAllWindows": "Fusionner toutes les fenêtres", "miToggleDevTools": "Activer/désactiver les ou&&tils de développement", "miAccessibilityOptions": "&&Options d'accessibilité", + "miOpenProcessExplorerer": "Ouvrir l'Explorateur de &&Processus", "miReportIssue": "Signaler un problème", "miWelcome": "&&Bienvenue", "miInteractivePlayground": "Terrain de jeu &&interactif", diff --git a/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json index 5bf8a5a69db..cb044b0dca6 100644 --- a/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/fra/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Fermer", - "header": "Différence {0} sur {1} : {2} d'origine, {3} lignes, {4} modifiées, {5} lignes", "blankLine": "vide", "equalLine": "{0} d'origine, {1} modifiées : {2}", "insertLine": "+ {0} modifiées : {1}", diff --git a/i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/fra/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index c59fa7756c3..ef46fe72220 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "Mappe vers 'Contrôle' dans Windows et Linux, et vers 'Commande' dans macOS.", "multiCursorModifier.alt": "Mappe vers 'Alt' dans Windows et Linux, et vers 'Option' dans macOS.", "multiCursorModifier": "Le modificateur à utiliser pour ajouter plusieurs curseurs avec la souris. 'ctrlCmd' mappe vers 'Contrôle' dans Windows et Linux, et vers 'Commande' dans macOS. Les mouvements de souris Accéder à la définition et Ouvrir le lien s'adaptent pour ne pas entrer en conflit avec le modificateur multicurseur.", + "multiCursorMergeOverlapping": "Fusionnez plusieurs curseurs quand ils se chevauchent.", "quickSuggestions.strings": "Activez les suggestions rapides dans les chaînes.", "quickSuggestions.comments": "Activez les suggestions rapides dans les commentaires.", "quickSuggestions.other": "Activez les suggestions rapides en dehors des chaînes et des commentaires.", @@ -88,6 +89,9 @@ "renderLineHighlight": "Contrôle la façon dont l'éditeur doit afficher la surbrillance de la ligne active. Les différentes possibilités sont 'none', 'gutter', 'line' et 'all'.", "codeLens": "Contrôle si l'éditeur affiche les indicateurs CodeLens", "folding": "Contrôle si le pliage de code est activé dans l'éditeur", + "foldingStrategyAuto": "Si disponible, utilisez une stratégie de présentation langage-spécifique, sinon la stratégie d'indentation s'applique.", + "foldingStrategyIndentation": "Utilisez toujours l'indentation basée sur la stratégie de présentation", + "foldingStrategy": "Contrôle la façon dont les repliages sont calculées. 'auto' utilise une stratégie repliage spécifique au langage, si disponible. 'indentation' force à ce que la stratégie de repliage basée sur l'indentation soit utilisée.", "showFoldingControls": "Définit si les contrôles de réduction sur la bordure sont cachés automatiquement", "matchBrackets": "Met en surbrillance les crochets correspondants quand l'un d'eux est sélectionné.", "glyphMargin": "Contrôle si l'éditeur doit afficher la marge de glyphes verticale. La marge de glyphes sert principalement au débogage.", @@ -105,5 +109,7 @@ "selectionClipboard": "Contrôle si le presse-papiers primaire Linux doit être pris en charge.", "sideBySide": "Contrôle si l'éditeur de différences affiche les différences en mode côte à côte ou inline", "ignoreTrimWhitespace": "Contrôle si l'éditeur de différences affiche les changements liés aux espaces blancs de début ou de fin comme des différences", + "largeFileSize": "Contrôles le seuil de la taille de fichier en octets au-delà de laquelle les règles d’optimisation spéciale sont appliquées", + "largeFileLineCount": "Contrôle le seuil de taille de fichier en terme de nombre de lignes au-delà de laquelle les règles d’optimisation spéciale sont appliquées", "renderIndicators": "Contrôle si l'éditeur de différences affiche les indicateurs +/- pour les modifications ajoutées/supprimées" } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json index 3b0bc493515..d368519c5fb 100644 --- a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "Couleur des repères de retrait de l'éditeur.", "editorLineNumbers": "Couleur des numéros de ligne de l'éditeur.", "editorActiveLineNumber": "Couleur des numéros de lignes actives de l'éditeur", + "deprecatedEditorActiveLineNumber": "Id est obsolète. Utilisez à la place 'editorLineNumber.activeForeground'. ", "editorRuler": "Couleur des règles de l'éditeur", "editorCodeLensForeground": "Couleur pour les indicateurs CodeLens", "editorBracketMatchBackground": "Couleur d'arrière-plan pour les accolades associées", @@ -28,6 +29,8 @@ "warningBorder": "Couleur de bordure de la ligne ondulée marquant les avertissements dans l'éditeur.", "infoForeground": "Couleur de premier plan de la ligne ondulée marquant les informations dans l'éditeur.", "infoBorder": "Couleur de bordure de la ligne ondulée marquant les informations dans l'éditeur.", + "hintForeground": "Couleur de premier plan de la ligne ondulée d'indication dans l'éditeur.", + "hintBorder": "Couleur de bordure de la ligne ondulée d'indication dans l'éditeur.", "overviewRulerRangeHighlight": "Couleur du marqueur de la règle d'aperçu pour des plages mises en surbrillance. La couleur doit ne pas être opaque pour ne pas masquer les décorations du dessous.", "overviewRuleError": "Couleur du marqueur de la règle d'aperçu pour les erreurs.", "overviewRuleWarning": "Couleur du marqueur de la règle d'aperçu pour les avertissements.", diff --git a/i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..9e350d183dc --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Afficher les correctifs ({0})", + "quickFix": "Afficher les correctifs", + "quickfix.trigger.label": "Correction rapide...", + "editor.action.quickFix.noneMessage": "Aucune action de code disponible", + "refactor.label": "Remanier...", + "editor.action.refactor.noneMessage": "Aucune refactorisation disponible", + "source.label": "Action de la source", + "editor.action.source.noneMessage": "Aucune action n'est disponible", + "organizeImports.label": "Organiser les Imports" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/links/links.i18n.json b/i18n/fra/src/vs/editor/contrib/links/links.i18n.json index 765ec6309f7..2837414f765 100644 --- a/i18n/fra/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "Ctrl + clic pour suivre le lien", "links.command.mac": "Cmd + clic pour exécuter la commande", "links.command": "Ctrl + clic pour exécuter la commande", + "links.navigate.al.mac": "Option + clic pour suivre le lien", "links.navigate.al": "Alt + clic pour suivre le lien", + "links.command.al.mac": "Option + clic pour exécuter la commande", "links.command.al": "Alt + clic pour exécuter la commande", "invalid.url": "Échec de l'ouverture de ce lien, car il n'est pas bien formé : {0}", "missing.url": "Échec de l'ouverture de ce lien, car sa cible est manquante.", diff --git a/i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/fra/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index eda9d2905d6..5b27a515c99 100644 --- a/i18n/fra/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -13,6 +13,33 @@ "Thursday": "Jeudi", "Friday": "Vendredi", "Saturday": "Samedi", + "SundayShort": "Dim", + "MondayShort": "Lun", + "TuesdayShort": "Mar", + "WednesdayShort": "Mer", + "ThursdayShort": "Jeu", + "FridayShort": "Ven", + "SaturdayShort": "Sam", + "January": "Janvier", + "February": "Février", + "March": "Mars", + "April": "Avril", + "May": "Mai", + "June": "Juin", + "July": "Juillet", + "August": "Août", + "September": "Septembre", + "October": "Octobre", + "November": "Novembre", + "December": "Décembre", + "JanuaryShort": "Jan", + "FebruaryShort": "Fév", + "MarchShort": "Mar", + "AprilShort": "Avr", + "MayShort": "Mai", + "JuneShort": "Jun", + "JulyShort": "Jul", + "AugustShort": "Aoû", "SeptemberShort": "Sep", "OctoberShort": "Oct", "NovemberShort": "Nov", diff --git a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json index b078a360d5c..a68fecd7d97 100644 --- a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "Démarrez avec la commande 'Développeur : performance de démarrage' activée.", "prof-startup": "Exécuter le profileur d'UC au démarrage", "disableExtensions": "Désactivez toutes les extensions installées.", - "inspect-extensions": "Autorise le débogage et le profilage des extensions. Vérifier les outils de développements pour l'uri de connexion.", - "inspect-brk-extensions": "Autorise le débogage et le profilage des extensions avec l'hôte d'extensions en pause après le démarrage. Vérifier les outils de développement pour l'uri de connexion.", "disableGPU": "Désactivez l'accélération matérielle du GPU.", "uploadLogs": "Upload les logs depuis la session actuelle vers le endpoint sécurisé.", "maxMemory": "Taille mémoire maximale pour une fenêtre (En Megaoctêts)", diff --git a/i18n/fra/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/fra/src/vs/platform/extensions/node/extensionValidator.i18n.json index 14df62a8555..164aece343f 100644 --- a/i18n/fra/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/fra/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "Impossible d'analyser la valeur {0} de 'engines.vscode'. Utilisez, par exemple, ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x, etc.", + "versionSyntax": "Impossible d'analyser la valeur {0} de `engines.vscode`. Veuillez utiliser, par exemple : ^1.22.0, ^1.22.x, ...", "versionSpecificity1": "La version spécifiée dans 'engines.vscode' ({0}) n'est pas assez précise. Pour les versions de vscode antérieures à 1.0.0, définissez au minimum les versions majeure et mineure souhaitées. Par exemple : ^0.10.0, 0.10.x, 0.11.0, etc.", "versionSpecificity2": "La version spécifiée dans 'engines.vscode' ({0}) n'est pas assez précise. Pour les versions de vscode ultérieures à 1.0.0, définissez au minimum la version majeure souhaitée. Par exemple : ^1.10.0, 1.10.x, 1.x.x, 2.x.x, etc.", "versionMismatch": "L'extension n'est pas compatible avec le code {0}. L'extension nécessite {1}." diff --git a/i18n/fra/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/fra/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index 8ea54148dad..63284727ee8 100644 --- a/i18n/fra/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/fra/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "Votre installation de {0} semble être endommagée. Effectuez une réinstallation.", "integrity.moreInformation": "Informations", - "integrity.dontShowAgain": "Ne plus afficher", - "integrity.prompt": "Votre installation de {0} semble être endommagée. Effectuez une réinstallation." + "integrity.dontShowAgain": "Ne plus afficher" } \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/fra/src/vs/platform/issue/electron-main/issueService.i18n.json index cfbd6f443b7..615db052738 100644 --- a/i18n/fra/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/fra/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "Rapporteur du problème" + "issueReporter": "Rapporteur du problème", + "processExplorer": "Explorateur de processus" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..7dd67c3300c --- /dev/null +++ b/i18n/fra/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "la propriété '{0}' est obligatoire et doit être de type 'string'", + "showViewlet": "Afficher {0}", + "view": "Affichage" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index ff1868fc667..ed3d04c14e5 100644 --- a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Ajoute des vues à l'éditeur", "views.explorer": "Mode Explorateur", "views.debug": "Debug View", - "locationId.invalid": "'{0}' n'est pas un emplacement de vue valide", "duplicateView1": "Impossible d’enregistrer des vues multiples avec le même id '{0}'» dans l’emplacement '{1}'", "duplicateView2": "Une vue avec l’id `{0}` est déjà enregistrée à l’emplacement `{1}`" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 6b8c2481d1f..6ad0b22d7ed 100644 --- a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "Format avorté lors de l'enregistrement après {0} ms", + "timeout.onWillSave": "OnWillSaveTextDocument-event avorté après 1750 ms", "saveParticipants": "Exécution de la sauvegarde des participants..." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index de7accdb519..38f0760c227 100644 --- a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "éditeur webview" + "errorMessage": "Une erreur s’est produite lors de restauration de a vue : {0}" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 7f3b1e3e8f9..d86bbe531c6 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,7 @@ "screenReaderDetectedExtra": "Si vous n'utilisez pas de lecteur d'écran, définissez le paramètre 'editor.accessibilitySupport' sur \"désactivé\".", "disableTabMode": "Désactiver le mode d'accessibilité", "gotoLine": "Atteindre la ligne", - "indentation": "Retrait", + "selectIndentation": "Sélectionner le retrait", "selectEncoding": "Sélectionner l'encodage", "selectEOL": "Sélectionner la séquence de fin de ligne", "selectLanguageMode": "Sélectionner le mode de langage", diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index e91a76e9b43..a9163f8c71e 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,11 @@ "sizeMB": "{0} Mo", "sizeGB": "{0} Go", "sizeTB": "{0} To", - "largeImageError": "La taille du fichier de l’image est trop grande (> à 1Mo) pour afficher dans l’éditeur.", + "largeImageError": "L’image n’est pas affichée dans l’éditeur parce qu’elle est trop grande ({0}).", "resourceOpenExternalButton": " Ouvrir l'image en utilisant un programme externe ?", - "nativeBinaryError": "Impossible d'afficher le fichier dans l'éditeur : soit il est binaire, soit il est très volumineux, soit il utilise un encodage de texte non pris en charge.", + "nativeFileTooLargeError": "Le fichier n’est pas affiché dans l’éditeur, parce qu’il est trop volumineux ({0}).", + "nativeBinaryError": "Le fichier n’est pas affiché dans l’éditeur parce que c’est un fichier binaire ou qu'il utilise un encodage de texte non pris en charge.", + "openAsText": "Vous voulez l'ouvrir quand même ?", "zoom.action.fit.label": "Toute l’Image", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json index 2a55390fff5..491f3b3f2fc 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "notificationsEmpty": "Aucune nouvelle notification", "notifications": "Notifications", "notificationsToolbar": "Actions du centre de notifications", "notificationsList": "Liste des notifications" diff --git a/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..3eb1fd9f03c --- /dev/null +++ b/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInput.countSelected": "{0} Sélectionnés", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..e961aa1b883 --- /dev/null +++ b/i18n/fra/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInputBox.ariaLabel": "Taper pour affiner les résultats." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json index 96d9fe6601d..8f9f7eb339d 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "Ouvrir les éléments récents...", "quickOpenRecent": "Ouverture rapide des éléments récents...", "reportIssueInEnglish": "Signaler un problème", + "openProcessExplorer": "Ouvrir l'explorateur de processus", "reportPerformanceIssue": "Signaler un problème de performance", "keybindingsReference": "Référence des raccourcis clavier", "openDocumentationUrl": "Documentation", diff --git a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json index ef97b82ec54..1a663cb4405 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -47,11 +47,15 @@ "window.openFilesInNewWindow.off": "Les fichiers s'ouvrent dans la fenêtre du dossier conteneur ouvert ou dans la dernière fenêtre active", "window.openFilesInNewWindow.defaultMac": "Les fichiers s'ouvriront dans la fenêtre avec le dossier des fichiers ouvert ou la dernière fenêtre active, à moins qu'ils ne soient ouverts via le Dock ou depuis Finder.", "window.openFilesInNewWindow.default": "Les fichiers s'ouvriront dans une nouvelle fenêtre, à moins qu'ils ne soient sélectionnés dans l'application (par ex. via le menu Fichier)", + "openFilesInNewWindowMac": "Contrôle si les fichiers doivent s'ouvrir dans une nouvelle fenêtre.\n- default : les fichiers s'ouvriront dans la fenêtre avec le dossier des fichiers ouvert ou la dernière fenêtre active à moins qu'ils ne soient ouverts via le Dock ou depuis le Finder\n- on : les fichiers s'ouvriront dans une nouvelle fenêtre\n- off : les fichiers s'ouvriront dans la fenêtre avec le dossier des fichiers ouvert ou la dernière fenêtre active\nNotez qu'il peut encore y avoir des cas où ce paramètre est ignoré (par exemple lorsque vous utilisez l'option de ligne de commande -new-window ou -reuse-window).", + "openFilesInNewWindow": "Contrôle si les fichiers doivent s'ouvrir dans une nouvelle fenêtre.\n- default : les fichiers s'ouvriront dans une nouvelle fenêtre à moins qu'ils ne soient sélectionnés dans l'application (par ex. via le menu Fichier)\n- on : les fichiers s'ouvriront dans une nouvelle fenêtre\n- off : les fichiers s'ouvriront dans la fenêtre avec le dossier des fichiers ouvert ou la dernière fenêtre active\nNotez qu'il peut encore y avoir des cas où ce paramètre est ignoré (par exemple lorsque vous utilisez l'option de ligne de commande -new-window ou -reuse-window).", "window.openFoldersInNewWindow.on": "Les dossiers s'ouvrent dans une nouvelle fenêtre", "window.openFoldersInNewWindow.off": "Les dossiers remplacent la dernière fenêtre active", "window.openFoldersInNewWindow.default": "Les dossiers s'ouvrent dans une nouvelle fenêtre, sauf si un dossier est sélectionné depuis l'application (par exemple, via le menu Fichier)", "openFoldersInNewWindow": "Contrôle si les dossiers doivent s'ouvrir dans une nouvelle fenêtre ou remplacer la dernière fenêtre active.\n- default : les dossiers s'ouvrent dans une nouvelle fenêtre, sauf si un dossier est sélectionné depuis l'application (par exemple, via le menu Fichier)\n- on : les dossiers s'ouvrent dans une nouvelle fenêtre\n- off : les dossiers remplacent la dernière fenêtre active\nNotez que dans certains cas, ce paramètre est ignoré (par exemple, quand vous utilisez l'option de ligne de commande -new-window ou -reuse-window).", "window.openWithoutArgumentsInNewWindow.on": "Ouvrir une nouvelle fenêtre vide", + "window.openWithoutArgumentsInNewWindow.off": "Mettre le focus sur la dernière instance active du terminal", + "openWithoutArgumentsInNewWindow": "Contrôle si une nouvelle fenêtre vide doit s’ouvrir lors du démarrage d’une seconde instance sans argument, ou si la dernière instance en cours d’exécution doit obtenir le focus.\n- on : ouvrir une nouvelle fenêtre vide\n- off : la dernière instance en cours d’exécution active obtiendra le focus\nNote qu’il peut encore exister des cas où ce paramètre est ignoré (par exemple lorsque vous utilisez l'option de ligne de commande -new-window ou -reuse-window).", "window.reopenFolders.all": "Rouvre toutes les fenêtres.", "window.reopenFolders.folders": "Rouvrir tous les dossiers. Les espaces de travail vides ne seront pas restaurées.", "window.reopenFolders.one": "Rouvre la dernière fenêtre active.", @@ -59,6 +63,7 @@ "restoreWindows": "Contrôle comment les fenêtres seront rouvertes après un redémarrage. Sélectionner 'none' pour toujours démarrer avec un espace de travail vide, 'one' pour rouvrir la dernière fenêtre avec laquelle vous avez travaillé, 'folders' pour rouvrir toutes les fenêtres qui avaient des dossiers ouverts ou 'all' pour rouvrir toutes les fenêtres de votre dernière session.", "restoreFullscreen": "Contrôle si une fenêtre doit être restaurée en mode plein écran si elle a été fermée dans ce mode.", "zoomLevel": "Modifiez le niveau de zoom de la fenêtre. La taille d'origine est 0. Chaque incrément supérieur (exemple : 1) ou inférieur (exemple : -1) représente un zoom 20 % plus gros ou plus petit. Vous pouvez également entrer des décimales pour changer le niveau de zoom avec une granularité plus fine.", + "title": "Contrôle le titre de la fenêtre basé sur l’éditeur actif. Les variables sont remplacées selon le contexte : \n${activeEditorShort} : le nom de fichier (p. ex. monfichier.txt)\n${activeEditorMedium} : le chemin d’accès du fichier par rapport au dossier de l’espace de travail (par exemple, myFolder/myFile.txt) \n${activeEditorLong} : le chemin d’accès complet du fichier (par exemple / Users/Development/myProject/myFolder/myFile.txt) \n${folderName} : le nom du dossier de l'espace de travail dans lequel le fichier est contenu (p. ex. mondossier) \n${folderPath} : le chemin d’accès au dossier de l'espace de travail dans lequel le fichier est contenu (par exemple /Users/Development/myFolder) \n{$ rootName} : le nom de l’espace de travail (p. ex. myFolder ou myWorkspace) \n${rootPath} : le chemin d’accès de l’espace de travail (par exemple, /Users/Development/myWorkspace) \n${appName} : p. ex. VS Code\n${dirty} : un indicateur si l’éditeur actif est modifié\n${separator} : un séparateur conditionnel (\" - \") qui ne s'affiche que quand ils sont entourés par des variables avec des valeurs ou du texte statique", "window.newWindowDimensions.default": "Permet d'ouvrir les nouvelles fenêtres au centre de l'écran.", "window.newWindowDimensions.inherit": "Permet d'ouvrir les nouvelles fenêtres avec la même dimension que la dernière fenêtre active.", "window.newWindowDimensions.maximized": "Permet d'ouvrir les nouvelles fenêtres de manière agrandie.", @@ -74,6 +79,8 @@ "autoDetectHighContrast": "Si cette option est activée, le thème à contraste élevé est automatiquement choisi quand Windows utilise un thème à contraste élevé. À l'inverse, le thème sombre est automatiquement choisi quand Windows n'utilise plus le thème à contraste élevé.", "titleBarStyle": "Ajustez l'apparence de la barre de titre de la fenêtre. Vous devez effectuer un redémarrage complet pour que les changements soient appliqués.", "window.nativeTabs": "Active les onglets macOS Sierra. Notez que vous devez redémarrer l'ordinateur pour appliquer les modifications et que les onglets natifs désactivent tout style de barre de titre personnalisé configuré, le cas échéant.", + "window.smoothScrollingWorkaround": "Activez cette solution de contournement si le défilement n’est plus lissé après la restauration d’une fenêtre de VS Code réduite. Il s’agit d’une solution de contournement pour un problème (https://github.com/Microsoft/vscode/issues/13612) où le défilement commence à laguer sur les périphériques dotés de pavés de précision comme les appareils Surface de Microsoft. Activer cette solution de contournement peut provoquer un peu de scintillement de mise en page après la restauration de la fenêtre depuis l’état minimisé mais est sans danger.", + "window.clickThroughInactive": "Si activée, cliquer sur une fenêtre inactive activera la fenêtre et déclenchera l’élément sous la souris, si elle est cliquable. Si désactivé, cliquer n’importe où sur une fenêtre inactive va seulement l'activer et un second clic sur l’élément sera nécessaire.", "zenModeConfigurationTitle": "Mode Zen", "zenMode.fullScreen": "Contrôle si l'activation de Zen Mode met également le banc d'essai en mode plein écran.", "zenMode.centerLayout": "Contrôle si l'activation du mode Zen centre également la disposition.", diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index f3007ffa419..41453556314 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Modifier un point d'arrêt...", + "breakpoint": "Point d'arrêt", "functionBreakpointsNotSupported": "Les points d'arrêt de fonction ne sont pas pris en charge par ce type de débogage", "functionBreakpointPlaceholder": "Fonction où effectuer un point d'arrêt", "functionBreakPointInputAriaLabel": "Point d'arrêt sur fonction de type", @@ -14,6 +14,7 @@ "breakpointUnverifieddHover": "Point d'arrêt non vérifié", "functionBreakpointUnsupported": "Les points d'arrêt de fonction ne sont pas pris en charge par ce type de débogage", "breakpointDirtydHover": "Point d'arrêt non vérifié. Fichier modifié. Redémarrez la session de débogage.", + "logBreakpointUnsupported": "Log points non pris en charge par ce type de débogage", "conditionalBreakpointUnsupported": "Les points d'arrêt conditionnels ne sont pas pris en charge par ce type de débogage", "hitBreakpointUnsupported": "Les points d'arrêt conditionnels ne sont pas pris en charge par ce type de débogage" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 518d71cfb8f..b9f58b85393 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "Déboguer : activer/désactiver un point d'arrêt", "conditionalBreakpointEditorAction": "Déboguer : ajouter un point d'arrêt conditionnel...", + "logPointEditorAction": "Déboguer : ajouter un Log point...", "runToCursor": "Exécuter jusqu'au curseur", "debugEvaluate": "Déboguer : évaluer", "debugAddToWatch": "Déboguer : ajouter à la fenêtre Espion", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index bd3746f483c..44f7ce035b6 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,10 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "breakpointWidgetLogMessagePlaceholder": "Message à loguer lorsque le point d’arrêt est atteint. Les expressions entre {} sont interpolées. 'Entrée' pour accepter,'Echap' pour annuler.", "breakpointWidgetHitCountPlaceholder": "Arrêt quand le nombre d'accès est atteint. 'Entrée' pour accepter ou 'Échap' pour annuler.", "breakpointWidgetExpressionPlaceholder": "Arrêt quand l'expression prend la valeur true. 'Entrée' pour accepter ou 'Échap' pour annuler.", - "breakpointWidgetHitCountAriaLabel": "Le programme s'arrête ici uniquement si le nombre d'accès est atteint. Appuyez sur Entrée pour accepter, ou sur Échap pour annuler.", - "breakpointWidgetAriaLabel": "Le programme s'arrête ici uniquement si cette condition a la valeur true. Appuyez sur Entrée pour accepter, ou sur Échap pour annuler.", "expression": "Expression", - "hitCount": "Nombre d'accès" + "hitCount": "Nombre d'accès", + "logMessage": "Message de log" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 899866a157c..f960d2726e7 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,5 +27,6 @@ "onFirstSessionStart": "Afficher debug dans seule la barre d’état après que le débogage a été lancé pour la première fois", "showInStatusBar": "Contrôle quand la barre d’état de débogage doit être visible", "openDebug": "Contrôle si la vue de débogage doit être ouverte au démarrage de la session de débogage.", - "launch": "Configuration du lancement du débogage global. Doit être utilisée comme alternative à 'launch.json' qui est partagé entre les espaces de travail" + "launch": "Configuration du lancement du débogage global. Doit être utilisée comme alternative à 'launch.json' qui est partagé entre les espaces de travail", + "extensionHostDebugAdapter": "Exécuter l'adaptateur de débogage dans l'hôte d'extension" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 4839400b9f6..8f1025680dd 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,7 @@ "useUniqueNames": "Veuillez utiliser des noms de configuration uniques.", "app.launch.json.compound.folder": "Nom du dossier dans lequel le composé se trouve.", "app.launch.json.compounds.configurations": "Noms des configurations qui sont lancées dans le cadre de ce composé.", - "debugNoType": "Le 'type' de l'adaptateur de débogage ne peut pas être omis. Il doit s'agir du type 'string'.", + "debugNoType": "Le 'type' de débogueur ne peut pas être omis et doit être de type 'string'.", "selectDebug": "Sélectionner l'environnement", "DebugConfig.failed": "Impossible de créer le fichier 'launch.json' dans le dossier '.vscode' ({0}).", "workspace": "espace de travail", diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 2cdcf5ae1aa..7ba8fc67a9e 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Modifier un point d'arrêt...", - "disableBreakpoint": "Désactiver le point d'arrêt", - "enableBreakpoint": "Activer le point d'arrêt", + "breakpoint": "Point d'arrêt", "removeBreakpoints": "Supprimer les points d'arrêt", "removeBreakpointOnColumn": "Supprimer le point d'arrêt de la colonne {0}", "removeLineBreakpoint": "Supprimer le point d'arrêt de la ligne", @@ -21,6 +19,8 @@ "enableBreakpoints": "Activer le point d'arrêt de la colonne {0}", "enableBreakpointOnLine": "Activer le point d'arrêt de la ligne", "addBreakpoint": "Ajouter un point d'arrêt", - "conditionalBreakpoint": "Ajouter un point d'arrêt conditionnel...", + "addConditionalBreakpoint": "Ajouter un point d'arrêt conditionnel...", + "addLogPoint": "Ajouter un Log Point", + "cancel": "Annuler", "addConfiguration": "Ajouter une configuration..." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index d6c47b100cd..dc9d0f20d0f 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -29,5 +29,6 @@ "showErrors": "Afficher les erreurs", "noFolderWorkspaceDebugError": "Impossible de déboguer le fichier actif. Vérifiez qu'il est enregistré sur le disque et qu'une extension de débogage est installée pour ce type de fichier.", "cancel": "Annuler", - "DebugTaskNotFound": "Tâche '{0}' introuvable." + "DebugTaskNotFound": "Tâche '{0}' introuvable.", + "taskNotTracked": "La tâche '{0}' ne peut pas être tracée." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 8689f3cf375..c3efb42b047 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "Informations", - "unableToLaunchDebugAdapter": "Impossible de lancer l'adaptateur de débogage à partir de '{0}'.", - "unableToLaunchDebugAdapterNoArgs": "Impossible de lancer l'adaptateur de débogage.", - "stoppingDebugAdapter": "{0}. Arrêt de l'adaptateur de débogage.", "debugAdapterCrash": "Le processus de l'adaptateur de débogage s'est terminé de manière inattendue" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 9a38baf2456..11c71d149dc 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "L'exécutable d'adaptateur de débogage '{0}' n'existe pas.", "debugAdapterCannotDetermineExecutable": "Impossible de déterminer l'exécutable pour l'adaptateur de débogage '{0}'.", - "launch.config.comment1": "Utilisez IntelliSense pour en savoir plus sur les attributs possibles.", - "launch.config.comment2": "Pointez pour afficher la description des attributs existants.", - "launch.config.comment3": "Pour plus d'informations, visitez : {0}", - "debugType": "Type de configuration.", - "debugTypeNotRecognised": "Le type de débogage n'est pas reconnu. Vérifiez que vous avez installé l'extension de débogage correspondante et qu'elle est activée.", - "node2NotSupported": "\"node2\" n'est plus pris en charge. Utilisez \"node\" à la place, et affectez la valeur \"inspector\" à l'attribut \"protocol\".", - "debugName": "Le nom de la configuration s'affiche dans le menu déroulant de la configuration de lancement.", - "debugRequest": "Type de requête de configuration. Il peut s'agir de \"launch\" ou \"attach\".", - "debugServer": "Pour le développement d'une extension de débogage uniquement : si un port est spécifié, VS Code tente de se connecter à un adaptateur de débogage s'exécutant en mode serveur", - "debugPrelaunchTask": "Tâche à exécuter avant le démarrage de la session de débogage.", - "debugWindowsConfiguration": "Attributs de configuration de lancement spécifiques à Windows.", - "debugOSXConfiguration": "Attributs de configuration de lancement spécifiques à OS X.", - "debugLinuxConfiguration": "Attributs de configuration de lancement spécifiques à Linux.", - "deprecatedVariables": "env.', 'config.' et 'command.' sont déconseillés. Utilisez 'env:', 'config:' et 'command:' à la place." + "unableToLaunchDebugAdapter": "Impossible de lancer l'adaptateur de débogage à partir de '{0}'.", + "unableToLaunchDebugAdapterNoArgs": "Impossible de lancer l'adaptateur de débogage." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..6d5a247318d --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "Utilisez IntelliSense pour en savoir plus sur les attributs possibles.", + "launch.config.comment2": "Pointez pour afficher la description des attributs existants.", + "launch.config.comment3": "Pour plus d'informations, visitez : {0}", + "debugType": "Type de configuration.", + "debugTypeNotRecognised": "Le type de débogage n'est pas reconnu. Vérifiez que vous avez installé l'extension de débogage correspondante et qu'elle est activée.", + "node2NotSupported": "\"node2\" n'est plus pris en charge. Utilisez \"node\" à la place, et affectez la valeur \"inspector\" à l'attribut \"protocol\".", + "debugName": "Le nom de la configuration s'affiche dans le menu déroulant de la configuration de lancement.", + "debugRequest": "Type de requête de configuration. Il peut s'agir de \"launch\" ou \"attach\".", + "debugServer": "Pour le développement d'une extension de débogage uniquement : si un port est spécifié, VS Code tente de se connecter à un adaptateur de débogage s'exécutant en mode serveur", + "debugPrelaunchTask": "Tâche à exécuter avant le démarrage de la session de débogage.", + "debugPostDebugTask": "Tâche à exécuter après que le débogage se termine.", + "debugWindowsConfiguration": "Attributs de configuration de lancement spécifiques à Windows.", + "debugOSXConfiguration": "Attributs de configuration de lancement spécifiques à OS X.", + "debugLinuxConfiguration": "Attributs de configuration de lancement spécifiques à Linux.", + "deprecatedVariables": "env.', 'config.' et 'command.' sont déconseillés. Utilisez 'env:', 'config:' et 'command:' à la place." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..d7245a4f2e5 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "Console VS Code", + "mac.terminal.script.failed": "Échec du script '{0}'. Code de sortie : {1}", + "mac.terminal.type.not.supported": "'{0}' non pris en charge", + "press.any.key": "Appuyez sur une touche pour continuer...", + "linux.term.failed": "Échec de '{0}'. Code de sortie : {1}" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 8414cc420ad..0057e22b4a8 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -58,6 +58,9 @@ "configureWorkspaceFolderRecommendedExtensions": "Configurer les extensions recommandées (Dossier d'espace de travail)", "malicious tooltip": "Cette extension a été signalée comme problématique.", "malicious": "Malveillant", + "disabled": "Désactivé", + "disabled globally": "Désactivé", + "disabled workspace": "Désactivé pour cet espace de travail", "disableAll": "Désactiver toutes les extensions installées", "disableAllWorkspace": "Désactiver toutes les extensions installées pour cet espace de travail", "enableAll": "Activer toutes les extension", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index c68f4a91092..ecc9b7ee903 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -8,6 +8,7 @@ ], "name": "Nom de l'extension", "extension id": "Identificateur d'extension", + "preview": "Aperçu", "builtin": "Intégrée", "publisher": "Nom de l'éditeur", "install count": "Nombre d'installations", @@ -34,14 +35,19 @@ "view name": "Nom", "view location": "Emplacement", "localizations": "Localisations ({0})", - "localizations language name": "Nom de langue", - "localizations localized language name": "Nom de langue (localisé)", + "localizations language id": "Id de langue", + "localizations language name": "Nom de la langue", + "localizations localized language name": "Nom de la langue (localisé)", + "colorThemes": "Thèmes de couleurs ({0})", + "iconThemes": "Thèmes d’icônes ({0})", + "colors": "Couleurs ({0})", "colorId": "Id", "defaultDark": "Défaut pour le thème sombre", "defaultLight": "Défaut pour le thème clair", "defaultHC": "Défaut pour le thème de contraste élevé", "JSON Validation": "Validation JSON ({0})", "fileMatch": "Correspondance de fichier", + "schema": "Schéma", "commands": "Commandes ({0})", "command name": "Nom", "keyboard shortcuts": "Raccourcis clavier", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 143075b6592..103a8cee967 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "Cette extension est recommandée par les utilisateurs de l’espace de travail actuel.", "reallyRecommended2": "L'extension '{0}' est recommandée pour ce type de fichier.", "reallyRecommendedExtensionPack": "Le pack d’extensions '{0}' est recommandé pour ce type de fichier.", - "showRecommendations": "Afficher les recommandations", "install": "Installer", + "showRecommendations": "Afficher les recommandations", "showLanguageExtensions": "Le Marketplace a des extensions qui peuvent aider avec les fichiers '.{0}'", "workspaceRecommended": "Cet espace de travail a des recommandations d'extension.", "installAll": "Tout installer", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 60a8451e008..f36787aa87c 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "Désactiver les autres mappages de touches ({0}) pour éviter les conflits de combinaisons de touches ?", "yes": "Oui", - "no": "Non", - "betterMergeDisabled": "L'extension Better Merge est désormais intégrée, l'extension installée est désactivée et peut être désinstallée.", - "uninstall": "Désinstaller" + "no": "Non" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 557f45e5910..f395ede0a04 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,9 @@ "recommendedExtensions": "Recommandées", "otherRecommendedExtensions": "Autres recommandations", "workspaceRecommendedExtensions": "Recommandations de l’espace de travail", + "builtInExtensions": "Fonctionnalités", + "builtInThemesExtensions": "Thèmes", + "builtInBasicsExtensions": "Langages de programmation", "searchExtensions": "Rechercher des extensions dans Marketplace", "sort by installs": "Trier par : nombre d'installations", "sort by rating": "Trier par : évaluation", diff --git a/i18n/fra/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index 412d69fb5bf..3d2c988d730 100644 --- a/i18n/fra/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,6 +8,8 @@ ], "textFileEditor": "Éditeur de fichier texte", "createFile": "Créer un fichier", + "relaunchWithIncreasedMemoryLimit": "Redémarrer avec {0} Mo", + "configureMemoryLimit": "Configurer la limite de mémoire", "fileEditorWithInputAriaLabel": "{0}. Éditeur de fichier texte.", "fileEditorAriaLabel": "Éditeur de fichier texte." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index a31359c7486..0e64e0d6d54 100644 --- a/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -27,12 +27,18 @@ "confirmMoveTrashMessageMultiple": "Êtes-vous sûr de vouloir supprimer les fichiers {0} suivants ?", "confirmMoveTrashMessageFolder": "Voulez-vous vraiment supprimer '{0}' et son contenu ?", "confirmMoveTrashMessageFile": "Voulez-vous vraiment supprimer '{0}' ?", + "undoBin": "Vous pouvez restaurer à partir de la Corbeille.", + "undoTrash": "Vous pouvez restaurer à partir de la Poubelle.", "doNotAskAgain": "Ne plus me demander", "confirmDeleteMessageMultiple": "Êtes-vous sûr de vouloir supprimer définitivement les fichiers {0} suivants ?", "confirmDeleteMessageFolder": "Voulez-vous vraiment supprimer définitivement '{0}' et son contenu ?", "confirmDeleteMessageFile": "Voulez-vous vraiment supprimer définitivement '{0}' ?", "irreversible": "Cette action est irréversible !", - "importFiles": "Importer des fichiers", + "binFailed": "Impossible de supprimer en utilisant la corbeille. Voulez-vous supprimer définitivement à la place ?", + "trashFailed": "Impossible de supprimer en utilisant la corbeille. Voulez-vous supprimer définitivement à la place?", + "deletePermanentlyButtonLabel": "Supprimer &&définitivement", + "retryButtonLabel": "&&Réessayer", + "addFiles": "Ajouter des fichiers", "confirmOverwrite": "Un fichier ou dossier portant le même nom existe déjà dans le dossier de destination. Voulez-vous le remplacer ?", "replaceButtonLabel": "&&Remplacer", "fileIsAncestor": "Le fichier à copier est un ancêtre du dossier de destination", diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index e5b80a13c44..a75d38efac1 100644 --- a/i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,8 +35,10 @@ "hotExit": "Contrôle si les fichiers non enregistrés sont mémorisés entre les sessions, ce qui permet d'ignorer la demande d'enregistrement à la sortie de l'éditeur.", "useExperimentalFileWatcher": "Utilisez le nouvel observateur de fichiers expérimental.", "defaultLanguage": "Mode de langage par défaut affecté aux nouveaux fichiers.", + "maxMemoryForLargeFilesMB": "Contrôle la mémoire disponible pour VS Code après redémarrage en essayant d’ouvrir les fichiers volumineux. Cela a le même effet que de spécifier --max-memory=NEWSIZE sur la ligne de commande.", "editorConfigurationTitle": "Éditeur", "formatOnSave": "Met en forme un fichier au moment de l'enregistrement. Un formateur doit être disponible, le fichier ne doit pas être enregistré automatiquement, et l'éditeur ne doit pas être en cours d'arrêt.", + "formatOnSaveTimeout": "Délai d’attente pour formater lors de l'enregistrement. Spécifie le délai en millisecondes pour les commandes formatOnSave. Les commandes prenant plus de temps que le délai d’attente spécifié seront annulées.", "explorerConfigurationTitle": "Explorateur de fichiers", "openEditorsVisible": "Nombre d'éditeurs affichés dans le volet Éditeurs ouverts.", "autoReveal": "Contrôle si l'Explorateur doit automatiquement afficher et sélectionner les fichiers à l'ouverture.", diff --git a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index a5adcd52e79..c86f735842b 100644 --- a/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,13 +7,14 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Tapez le nom du fichier. Appuyez sur Entrée pour confirmer ou sur Échap pour annuler.", - "constructedPath": "Créer {0} dans **{1}**", "filesExplorerViewerAriaLabel": "{0}, Explorateur de fichiers", "dropFolders": "Voulez-vous ajouter les dossiers à l’espace de travail ?", "dropFolder": "Voulez-vous ajouter le dossier à l’espace de travail ?", "addFolders": "&&Ajouter les dossiers", "addFolder": "&&Ajouter le dossier", + "confirmRootsMove": "Êtes-vous sûr de vouloir modifier l’ordre de plusieurs dossiers de la racine dans votre espace de travail ?", "confirmMultiMove": "Êtes-vous sûr de vouloir déplacer les fichiers '{0}' suivants ?", + "confirmRootMove": "Êtes-vous sûr de vouloir modifier l’ordre de dossier racine '{0}' dans votre espace de travail ?", "confirmMove": "Êtes-vous certain de vouloir déplacer '{0}' ?", "doNotAskAgain": "Ne plus me demander", "moveButtonLabel": "&&Déplacer", diff --git a/i18n/fra/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index 76289731369..9139ee20000 100644 --- a/i18n/fra/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "Souhaitez-vous changer la langue de l’interface de VS Code en {0} et redémarrer ?", "yes": "Oui", "no": "Non", - "doNotAskAgain": "Ne plus me demander", + "neverAgain": "Ne plus afficher", "JsonSchema.locale": "Langue d'interface utilisateur (IU) à utiliser.", "vscode.extension.contributes.localizations": "Contribuer aux localisations de l’éditeur", "vscode.extension.contributes.localizations.languageId": "Id de la langue dans laquelle les chaînes d’affichage sont traduites.", diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index 7e415dbd6de..a615adefb9e 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "copyMarker": "Copier" + "copyMarker": "Copier", + "copyMessage": "Copier le Message" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 556e096a283..6540dc70d56 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Total de {0} problèmes", - "filteredProblems": "Affichage de {0} sur {1} problèmes" + "totalProblems": "Total de {0} problèmes" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json index 0f826a200bb..37f685827c2 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "label": "Problèmes", + "tooltip.1": "1 problème dans ce fichier", "tooltip.N": "{0} problèmes dans ce fichier", "markers.showOnFile": "Afficher les erreurs & les avertissements sur les fichiers et dossiers." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..ab82f7468d7 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "disableFilesExclude": "Désactiver l'exclusion de fichiers.", + "clearFilter": "Effacer le filtre." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..60ed6998077 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showing filtered problems": "Affichage de {0} de {1}" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index ced53cc49d4..9b347a7669b 100644 --- a/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,13 @@ "markers.panel.title.problems": "Problèmes", "markers.panel.aria.label.problems.tree": "Problèmes regroupés par fichiers", "markers.panel.no.problems.build": "Aucun problème n'a été détecté dans l'espace de travail jusqu'à présent.", - "markers.panel.no.problems.filters": "Résultats introuvables avec les critères de filtre fournis", + "markers.panel.no.problems.filters": "Aucun résultat trouvé avec les critères de filtre fourni.", + "markers.panel.no.problems.file.exclusions": "Tous les problèmes sont masqués car le filtre d'exclusion de fichiers est activé.", + "markers.panel.action.useFilesExclude": "Filtrer en utilisant le paramètre d’exclusion de fichiers", + "markers.panel.action.donotUseFilesExclude": "Ne pas utiliser le paramètre d’exclusion de fichiers", "markers.panel.action.filter": "Filtrer les problèmes", - "markers.panel.filter.placeholder": "Filtrer par type ou texte", + "markers.panel.filter.ariaLabel": "Filtrer les problèmes", + "markers.panel.filter.placeholder": "Filtre. Par exemple : texte, **/*.ts, !**/node_modules/**", "markers.panel.filter.errors": "erreurs", "markers.panel.filter.warnings": "avertissements", "markers.panel.filter.infos": "infos", @@ -30,5 +34,15 @@ "markers.panel.multiple.unknowns.label": "{0} inconnus", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "{0} avec {1} problèmes", + "problems.tree.aria.label.marker.relatedInformation": " Ce problème a des références à {0} emplacements.", + "problems.tree.aria.label.error.marker": "Erreur générée par {0} : {1} à la ligne {2} et au caractère {3}. {4}", + "problems.tree.aria.label.error.marker.nosource": "Erreur : {0} à la ligne {1} et au caractère {2}.{3}", + "problems.tree.aria.label.warning.marker": "Avertissement généré par {0} : {1} à la ligne {2} et au caractère {3}.{4}", + "problems.tree.aria.label.warning.marker.nosource": "Avertissement : {0} à la ligne {1} et au caractère {2}.{3}", + "problems.tree.aria.label.info.marker": "Information générée par {0} : {1} à la ligne {2} et au caractère {3}.{4}", + "problems.tree.aria.label.info.marker.nosource": "Information : {0} à la ligne {1} et au caractère {2}.{3}", + "problems.tree.aria.label.marker": "Problème généré par {0} : {1} à la ligne {2} et au caractère {3}.{4}", + "problems.tree.aria.label.marker.nosource": "Problème : {0} à la ligne {1} et au caractère {2}.{3}", + "problems.tree.aria.label.relatedinfo.message": "{0} à la ligne {1} et caractère {2} dans {3}", "errors.warnings.show.label": "Afficher les erreurs et les avertissements" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/fra/src/vs/workbench/parts/output/browser/outputActions.i18n.json index d3e62ab1acb..e15ca824e07 100644 --- a/i18n/fra/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "Activer/désactiver la sortie", "clearOutput": "Effacer la sortie", "toggleOutputScrollLock": "Activer/désactiver l'arrêt du défilement de la sortie", - "switchToOutput.label": "Passer à la sortie" + "switchToOutput.label": "Passer à la sortie", + "openInLogViewer": "Ouvrir le fichier de log" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index 1453eaa812b..25674d1f305 100644 --- a/i18n/fra/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "Sortie", "logViewer": "Visualiseur de journal", "viewCategory": "Affichage", - "clearOutput.label": "Effacer la sortie" + "clearOutput.label": "Effacer la sortie", + "openActiveLogOutputFile": "Affichage: Ouvrir le fichier de log de sortie actif" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 10b4d1f5b73..675ad6e2d50 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Raccourcis clavier", + "showDefaultKeybindings": "Afficher les raccourcis clavier par défaut", + "showUserKeybindings": "Afficher les raccourcis clavier utilisateur", "SearchKeybindings.AriaLabel": "Rechercher dans les combinaisons de touches", "SearchKeybindings.Placeholder": "Rechercher dans les combinaisons de touches", "sortByPrecedene": "Trier par priorité", diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index c0015434d3f..a5e37bb7365 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Ouvrir les paramètres bruts par défaut", + "openSettings": "Ouvrir les paramètres", "openGlobalSettings": "Ouvrir les paramètres utilisateur", "openGlobalKeybindings": "Ouvrir les raccourcis clavier", "openGlobalKeybindingsFile": "Ouvrir le fichier des raccourcis clavier", diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 9576e2a4552..6dca29c55a8 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Paramètres par défaut", "SearchSettingsWidget.AriaLabel": "Paramètres de recherche", "SearchSettingsWidget.Placeholder": "Paramètres de recherche", "noSettingsFound": "Aucun résultat", @@ -16,6 +15,8 @@ "nlpResult": "Résultats en langage naturel", "filterResult": "Résultats filtrés", "defaultSettings": "Paramètres par défaut", + "defaultUserSettings": "Paramètres utilisateur par défaut", + "defaultWorkspaceSettings": "Paramètres de l'espace de travail par défaut", "defaultFolderSettings": "Paramètres de dossier par défaut", "defaultEditorReadonly": "Modifier dans l’éditeur du côté droit pour substituer les valeurs par défaut.", "preferencesAriaLabel": "Préférences par défaut. Éditeur de texte en lecture seule." diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 657d3d560d4..def18c92de6 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "Afficher l’Extension \"{0}\"", "editTtile": "Modifier", "replaceDefaultValue": "Remplacer dans les paramètres", - "copyDefaultValue": "Copier dans Paramètres", - "unsupportedPHPExecutablePathSetting": "Ce paramètre doit être un paramètre utilisateur. Pour configurer PHP pour l'espace de travail, ouvrez un fichier PHP, puis cliquez sur 'Chemin PHP' dans la barre d'état.", - "unsupportedWorkspaceSetting": "Ce paramètre doit être un paramètre utilisateur.", - "unsupportedWorkbenchSetting": "Ce paramètre ne peut pas être appliqué maintenant. Il est appliqué quand vous ouvrez ce dossier directement.", - "unsupportedWorkbenchSettingDevMode": "Ce paramètre ne peut pas s’appliquer maintenant. Il s’appliquera si vous définissez la portée à 'ressource' lors de son inscription, ou lorsque vous ouvrez ce dossier directement." + "copyDefaultValue": "Copier dans Paramètres" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 47465e0f5cf..4bae27c08c3 100644 --- a/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "Installer des fournisseurs SCM supplémentaires...", "no open repo": "Il n’y a aucun fournisseur de contrôle de code source actif.", "source control": "Contrôle de code source", - "viewletTitle": "{0} : {1}" + "viewletTitle": "{0} : {1}", + "hideView": "Masquer" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json index e355577f0f7..2598b4942bd 100644 --- a/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Afficher le prochain Include Pattern de recherche", "previousSearchIncludePattern": "Afficher le précédent Include Pattern de recherche", + "nextSearchExcludePattern": "Afficher le prochain Exclude Pattern de recherche", + "previousSearchExcludePattern": "Afficher le précédent Exclude Pattern de recherche", "nextSearchTerm": "Afficher le terme de recherche suivant", "previousSearchTerm": "Afficher le terme de recherche précédent", - "showSearchViewlet": "Afficher la zone de recherche", "findInFiles": "Chercher dans les fichiers", "replaceInFiles": "Remplacer dans les fichiers", "RefreshAction.label": "Actualiser", diff --git a/i18n/fra/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/fra/src/vs/workbench/parts/search/browser/searchView.i18n.json index 89db9e01119..4cd20eea1e6 100644 --- a/i18n/fra/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Activer/désactiver les détails de la recherche", + "searchScope.includes": "fichiers à inclure", + "label.includes": "Modèles d'inclusion de recherche", + "searchScope.excludes": "fichiers à exclure", + "label.excludes": "Modèles d'exclusion de recherche", "replaceAll.confirmation.title": "Tout remplacer", "replaceAll.confirm.button": "&&Remplacer", "replaceAll.occurrence.file.message": "{0} occurrence remplacée dans {1} fichier par '{2}'.", diff --git a/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index dbb8b385ac4..d563780176c 100644 --- a/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Rechercher", + "copyMatchLabel": "Copier", + "copyPathLabel": "Copier le chemin", + "copyAllLabel": "Copier tout", + "toggleSearchViewPositionLabel": "Basculer la position de la vue de Recherche", "findInFolder": "Rechercher dans le dossier...", "findInWorkspace": "Trouver dans l’espace de travail...", "showTriggerActions": "Atteindre le symbole dans l'espace de travail...", "name": "Rechercher", - "search": "Rechercher", "showSearchViewl": "Afficher la zone de recherche", "view": "Affichage", "findInFiles": "Chercher dans les fichiers", @@ -26,5 +30,5 @@ "search.followSymlinks": "Contrôle s'il faut suivre les symlinks pendant la recherche.", "search.smartCase": "Recherches de manière non case-sensitive si le modèle est entièrement en minuscules, dans le cas contraire, recherche de manière case-sensitive", "search.globalFindClipboard": "Contrôle si la vue de recherche doit lire ou modifier le presse-papiers partagé sur macOS", - "search.location": "Aperçu : contrôle si la recherche est affichée comme une vue dans la barre latérale ou comme un panneau dans la zone correspondante pour libérer de l'espace horizontal. La prochaine version de la recherche dans le panneau prévoit une amélioration de la disposition horizontale qui ne sera plus un aperçu." + "search.location": "Contrôle si la recherche s’affichera comme une vue dans la barre latérale ou comme un panneau dans la zone de panneau pour plus d'espace horizontal. La prochaine version de la Recherche dans le panneau aura une meilleure présentation horizontale et cela ne sera plus une preview." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 89d6a7d5a6e..19e27f8073a 100644 --- a/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "Aidez-nous à améliorer le support de {0}", "takeShortSurvey": "Répondre à une enquête rapide", "remindLater": "Me le rappeler plus tard", - "neverAgain": "Ne plus afficher", - "helpUs": "Aidez-nous à améliorer le support de {0}" + "neverAgain": "Ne plus afficher" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 41963e2a8e9..6f71b2a1bba 100644 --- a/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "Acceptez-vous de répondre à une enquête rapide ?", "takeSurvey": "Répondre à l'enquête", "remindLater": "Me le rappeler plus tard", - "neverAgain": "Ne plus afficher", - "surveyQuestion": "Acceptez-vous de répondre à une enquête rapide ?" + "neverAgain": "Ne plus afficher" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index c58795e9606..cb12fed4c55 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "Modèle de problème ou bien nom d'un modèle de problème faisant l'objet d'une contribution ou prédéfini. Peut être omis si base est spécifié.", "ProblemMatcherSchema.base": "Nom d'un détecteur de problèmes de correspondance de base à utiliser.", "ProblemMatcherSchema.owner": "Propriétaire du problème dans Code. Peut être omis si base est spécifié. Prend la valeur 'external' par défaut en cas d'omission et si base n'est pas spécifié.", + "ProblemMatcherSchema.source": "Une chaîne lisible par humain qui décrit la source de ce diagnostic, par exemple 'typescript' ou 'super lint'.", "ProblemMatcherSchema.severity": "Gravité par défaut des problèmes de capture. Est utilisé si le modèle ne définit aucun groupe de correspondance pour la gravité.", "ProblemMatcherSchema.applyTo": "Contrôle si un problème signalé pour un document texte s'applique uniquement aux documents ouverts ou fermés, ou bien à l'ensemble des documents.", "ProblemMatcherSchema.fileLocation": "Définit la façon dont les noms de fichiers signalés dans un modèle de problème doivent être interprétés.", diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index c560e29a2d5..9e767348573 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,7 +28,14 @@ "JsonSchema.tasks.group.none": "N'assigne la tâche à aucun groupe", "JsonSchema.tasks.group": "Définit le groupe d'exécution auquel la tâche appartient. Prend en charge \"build\" pour l'ajouter au groupe de génération et \"test\" pour l'ajouter au groupe de test.", "JsonSchema.tasks.type": "Définit si la tâche est exécutée comme un processus ou comme une commande à l’intérieur d’un shell.", + "JsonSchema.command.quotedString.value": "La valeur réelle de la commande", + "JsonSchema.tasks.quoting.escape": "Echappe les caractères à l’aide du caractère d’échappement du shell (par exemple: ` sous PowerShell et \\ sous bash).", + "JsonSchema.tasks.quoting.strong": "Entoure l’argument en utilisant le caractère guillemet du shell (par exemple: \" sous PowerShell et bash).", + "JsonSchema.tasks.quoting.weak": "Entoure l’argument en utilisant le caractère apostrophe du shell (par exemple: ' sous PowerShell et bash).", + "JsonSchema.command.quotesString.quote": "Comment la valeur de la commande devrait être donnée.", "JsonSchema.command": "Commande à exécuter. Il peut s'agir d'un programme externe ou d'une commande d'interpréteur de commandes.", + "JsonSchema.args.quotedString.value": "La valeur réelle de l’argument", + "JsonSchema.args.quotesString.quote": "Comment la valeur de l’argument devrait être donnée.", "JsonSchema.tasks.args": "Arguments passés à la commande quand cette tâche est appelée.", "JsonSchema.tasks.label": "L'étiquette de l’interface utilisateur de la tâche", "JsonSchema.version": "Numéro de version de la configuration.", diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 61c4bc5cb90..87d639c304b 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,7 +11,9 @@ "totalErrors": "{0} erreurs", "totalWarnings": "{0} avertissements", "totalInfos": "{0} infos", + "problems": "Problèmes", "building": "Génération...", + "manyProblems": "10K+", "runningTasks": "Afficher les tâches en cours d'exécution", "tasks": "Tâches", "TaskSystem.noHotSwap": "Changer le moteur d’exécution de tâches avec une tâche active en cours d’exécution nécessite de recharger la fenêtre", @@ -29,8 +31,10 @@ "selectProblemMatcher": "Sélectionner pour quel type d’erreurs et d’avertissements analyser la sortie de la tâche", "customizeParseErrors": "La configuration de tâche actuelle contient des erreurs. Corrigez-les avant de personnaliser une tâche. ", "moreThanOneBuildTask": "De nombreuses tâches de génération sont définies dans le fichier tasks.json. Exécution de la première.\n", - "TaskSystem.activeSame.background": "La tâche '{0}' est déjà active et en mode arrière-plan. Pour la terminer, utiliser `Terminer la Tâche...` dans le menu Tâches.", - "TaskSystem.activeSame.noBackground": "La tâche '{0}' est déjà active. Pour la terminer, utiliser `Terminer la Tâche...` dans le menu Tâches.", + "TaskSystem.activeSame.background": "La tâche '{0}\" est déjà active et en mode arrière-plan.", + "TaskSystem.activeSame.noBackground": "La tâche '{0}' est déjà active.", + "terminateTask": "Terminer la tâche", + "restartTask": "Redémarrer la tâche", "TaskSystem.active": "Une tâche est déjà en cours d'exécution. Terminez-la avant d'exécuter une autre tâche.", "TaskSystem.restartFailed": "Échec de la fin de l'exécution de la tâche {0}", "TaskService.noConfiguration": "Erreur : La détection de la tâche {0} n’a pas contribué à une tâche pour la configuration suivante : {1}, la tâche sera ignorée.\n", @@ -47,8 +51,8 @@ "recentlyUsed": "tâches récemment utilisées", "configured": "tâches configurées", "detected": "tâches détectées", - "TaskService.notAgain": "Ne plus afficher", "TaskService.ignoredFolder": "Les dossiers d’espace de travail suivants sont ignorés car ils utilisent task version 0.1.0 : ", + "TaskService.notAgain": "Ne plus afficher", "TaskService.pickRunTask": "Sélectionner la tâche à exécuter", "TaslService.noEntryToRun": "Aucune tâche à exécuter n'a été trouvée. Configurer les tâches...", "TaskService.fetchingBuildTasks": "Récupération des tâches de génération...", diff --git a/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index d4389797bef..6d14510f43b 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "Warning: options.cwd must be of type string. Ignoring value {0}\n", + "ConfigurationParser.inValidArg": "Erreur : l'argument de commande doit être une chaîne ou une chaîne entre apostrophes. La valeur fournie est : \n{0}", "ConfigurationParser.noargs": "Erreur : les arguments de commande doivent correspondre à un tableau de chaînes. La valeur fournie est :\n{0}", "ConfigurationParser.noShell": "Avertissement : La configuration de l'interpréteur de commandes n'est prise en charge que durant l'exécution des tâches dans le terminal.", "ConfigurationParser.noName": "Erreur : le détecteur de problèmes de correspondance dans la portée de déclaration doit avoir un nom :\n{0}\n", diff --git a/i18n/fra/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..e89604d8194 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "Couleur d'arrière-plan du terminal, permet d'appliquer au terminal une couleur différente de celle du panneau.", + "terminal.foreground": "Couleur de premier plan du terminal.", + "terminalCursor.foreground": "La couleur de premier plan du curseur du terminal.", + "terminalCursor.background": "La couleur d’arrière-plan du curseur terminal. Permet de personnaliser la couleur d’un caractère recouvert par un curseur de bloc.", + "terminal.selectionBackground": "La couleur d’arrière-plan de sélection du terminal.", + "terminal.border": "Couleur de bordure qui sépare les volets de fractionnement dans le terminal. La valeur par défaut est panel.border.", + "terminal.ansiColor": "Couleur ansi '{0}' dans le terminal." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 6b1951d0758..827b3155e46 100644 --- a/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -21,6 +21,7 @@ "workbench.action.terminal.newWorkspacePlaceholder": "Sélectionner le répertoire de travail actuel pour le nouveau terminal", "workbench.action.terminal.newInActiveWorkspace": "Créer un nouveau Terminal intégré (dans l'espace de travail actif)", "workbench.action.terminal.split": "Diviser le terminal", + "workbench.action.terminal.splitInActiveWorkspace": "Diviser le Terminal (dans l'espace de travail actif)", "workbench.action.terminal.focusPreviousPane": "Focus sur le panneau précédent", "workbench.action.terminal.focusNextPane": "Focus sur le panneau suivant", "workbench.action.terminal.resizePaneLeft": "Redimensionner le panneau vers la gauche", @@ -43,6 +44,7 @@ "workbench.action.terminal.scrollUpPage": "Faire défiler vers le haut (page)", "workbench.action.terminal.scrollToTop": "Faire défiler jusqu'en haut", "workbench.action.terminal.clear": "Effacer", + "workbench.action.terminal.clearSelection": "Effacer la sélection", "workbench.action.terminal.allowWorkspaceShell": "Autoriser la configuration de l'interpréteur de commandes de l'espace de travail", "workbench.action.terminal.disallowWorkspaceShell": "Interdire la configuration de l'interpréteur de commandes de l'espace de travail", "workbench.action.terminal.rename": "Renommer", @@ -51,5 +53,9 @@ "workbench.action.terminal.hideFindWidget": "Masquer le widget de recherche", "nextTerminalFindTerm": "Afficher le terme de recherche suivant", "previousTerminalFindTerm": "Afficher le terme de recherche précédent", - "quickOpenTerm": "Changer de terminal actif" + "quickOpenTerm": "Changer de terminal actif", + "workbench.action.terminal.scrollToPreviousCommand": "Faire défiler jusqu'à la commande précédente", + "workbench.action.terminal.scrollToNextCommand": "Faire défiler jusqu'à la prochaine commande", + "workbench.action.terminal.selectToPreviousCommand": "Sélectionnez pour la commande précédente", + "workbench.action.terminal.selectToNextCommand": "Sélectionnez pour la commande suivante" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index a4dbf23f4f2..ebee0e36848 100644 --- a/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "Cet espace de travail contient des paramètres qui ne peuvent être définis que dans les paramètres utilisateur ({0}). Cliquez [ici]({1}) pour en savoir plus.", "openWorkspaceSettings": "Ouvrir les paramètres d'espace de travail", - "dontShowAgain": "Ne plus afficher", - "unsupportedWorkspaceSettings": "Cet espace de travail contient des paramètres qui ne peuvent être définis que dans les paramètres utilisateur ({0}). Cliquez [ici]({1}) pour en savoir plus." + "dontShowAgain": "Ne plus afficher" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json index cdcec8f9581..1c0f5e94e48 100644 --- a/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "Plus tard", "releaseNotes": "Notes de publication", "showReleaseNotes": "Afficher les notes de publication", "read the release notes": "Bienvenue dans {0} v{1} ! Voulez-vous lire les notes de publication ?", @@ -16,13 +15,14 @@ "updateIsReady": "Nouvelle mise à jour de {0} disponible.", "noUpdatesAvailable": "Aucune mise à jour n'est disponible actuellement.", "ok": "OK", - "download now": "Télécharger maintenant", "thereIsUpdateAvailable": "Une mise à jour est disponible.", - "installUpdate": "Installer la mise à jour", + "download now": "Télécharger maintenant", + "later": "Plus tard", "updateAvailable": "Il y a une mise à jour disponible : {0} {1}", + "installUpdate": "Installer la mise à jour", "updateInstalling": "{0} {1} est en train d'être installé en arrière-plan, nous vous ferons savoir quand c’est fini.", + "updateAvailableAfterRestart": "Redémarrer {0} pour appliquer la dernière mise à jour.", "updateNow": "Mettre à jour maintenant", - "updateAvailableAfterRestart": "{0} sera mis à jour après avoir redémarré.", "commandPalette": "Palette de commandes...", "settings": "Paramètres", "keyboardShortcuts": "Raccourcis clavier", diff --git a/i18n/fra/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index de7accdb519..da5ba7cccbd 100644 --- a/i18n/fra/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "éditeur webview" + "webview.editor.label": "éditeur webview", + "developer": "Développeur" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/fra/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..09dc4357050 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Ouvrir les outils de développement Webview", + "refreshWebviewLabel": "Recharger les Webviews" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index 0b9766fe701..f34ed7abe61 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Aidez-nous à améliorer VS Code en permettant à Microsoft de recueillir des données d’utilisation. Lisez notre [déclaration sur la vie privée]({0}) et apprenez comment [se désengager]({1}).", + "telemetryOptOut.optInNotice": "Aidez-nous à améliorer VS Code en permettant à Microsoft de recueillir des données d’utilisation. Lisez notre [déclaration sur la vie privée]({0}) et apprenez comment [se désengager]({1}).", "telemetryOptOut.readMore": "Lire la suite" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index a6000329037..6a31ba50230 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "Gérer les extensions", "welcomeOverlay.problems": "Afficher les erreurs et avertissements", "welcomeOverlay.commandPalette": "Rechercher et exécuter toutes les commandes", + "welcomeOverlay.notifications": "Afficher les notifications", "welcomeOverlay": "Vue d'ensemble de l'interface utilisateur", "hideWelcomeOverlay": "Masquer la vue d'ensemble de l'interface", "help": "Aide" diff --git a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 2e114c616c5..25e95767831 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,8 @@ "welcomePage.installExtensionPacks": "Outils et langages", "welcomePage.installExtensionPacksDescription": "Installer un support pour {0} et {1}", "welcomePage.moreExtensions": "plus", - "welcomePage.installKeymapDescription": "Installer les raccourcis clavier", - "welcomePage.installKeymapExtension": "Installer les raccourcis clavier de {0} et {1}", + "welcomePage.installKeymapDescription": "Paramètres et combinaisons de touches", + "welcomePage.installKeymapExtension": "Installer les paramètres et les raccourcis clavier de {0} et {1}", "welcomePage.others": "autres", "welcomePage.colorTheme": "Thème de couleur", "welcomePage.colorThemeDescription": "Personnalisez l'apparence de l'éditeur et de votre code", diff --git a/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index bce1f4235aa..dc4ae0dbd9a 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "Résumé des paramètres. Cette étiquette va être utilisée dans le fichier de paramètres en tant que commentaire de séparation.", "vscode.extension.contributes.configuration.properties": "Description des propriétés de configuration.", + "scope.application.description": "Configuration spécifique de l'application, qui peut être configurée uniquement dans les paramètres utilisateur.", "scope.window.description": "Configuration spécifique de la fenêtre, qui peut être configurée dans les paramètres utilisateur ou de l'espace de travail.", "scope.resource.description": "Configuration spécifique de la ressource, qui peut être configurée dans les paramètres utilisateur, de l'espace de travail ou du dossier.", "scope.description": "Portée dans laquelle la configuration s’applique. Les portées disponibles sont `window` et `resource`.", diff --git a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 0c4ab4d6564..9b731129c27 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "Ouvrir les paramètres", "saveAndRetry": "Enregistrer et Réessayer", "errorUnknownKey": "Impossible d’écrire dans {0} car {1} n’est pas une configuration recommandée.", + "errorInvalidWorkspaceConfigurationApplication": "Impossible d’écrire {0} dans paramètres de l’espace de travail. Ce paramètre peut être écrit uniquement dans les paramètres de l’utilisateur.", "errorInvalidFolderConfiguration": "Impossible d’écrire dans les paramètres de dossier parce que {0} ne supporte pas la portée de ressource de dossier.", "errorInvalidUserTarget": "Impossible d’écrire dans les paramètres utilisateur parce que {0} ne supporte pas de portée globale.", "errorInvalidWorkspaceTarget": "Impossible d’écrire dans les paramètres de l’espace de travail car {0} ne supporte pas de portée d’espace de travail dans un espace de travail multi dossiers.", diff --git a/i18n/fra/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..c28d44842af --- /dev/null +++ b/i18n/fra/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedApplicationSetting": "Ce paramètre ne peut être appliqué que dans les paramètres utilisateur", + "unsupportedWindowSetting": "Ce paramètre ne peut pas être appliqué maintenant. Il est appliqué quand vous ouvrez ce dossier directement." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 53b77e34248..e5809c2c66f 100644 --- a/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,16 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolderMultiRoot": "${workspaceFolder} ne peut pas être résolu dans un espace de travail de dossiers multiples. Contrôlez la portée de ces variables en utilisant : et un nom de dossier.", - "canNotResolveWorkspaceFolder": "${workspaceFolder} ne peut pas être résolu. Veuillez ouvrir un dossier.", - "canNotResolveFolderBasenameMultiRoot": "${workspaceFolderBasename} ne peut pas être résolu dans un espace de travail de dossiers multiples. Contrôlez la portée de ces variables en utilisant : et un nom de dossier.", - "canNotResolveFolderBasename": "${workspaceFolderBasename} ne peut pas être résolu. Veuillez ouvrir un dossier.", - "canNotResolveLineNumber": "${lineNumber} ne peut pas être résolu, veuillez ouvrir un éditeur.", - "canNotResolveSelectedText": "${selectedText} ne peut pas être résolu, veuillez ouvrir un éditeur.", - "canNotResolveFile": "${file} ne peut pas être résolu, veuillez ouvrir un éditeur.", - "canNotResolveRelativeFile": "${relativeFile} ne peut pas être résolu, veuillez ouvrir un éditeur.", - "canNotResolveFileDirname": "${fileDirname} ne peut pas être résolu, veuillez ouvrir un éditeur.", - "canNotResolveFileExtname": "${fileExtname} ne peut pas être résolu, veuillez ouvrir un éditeur.", - "canNotResolveFileBasename": "${fileBasename} ne peut pas être résolu, veuillez ouvrir un éditeur.", - "canNotResolveFileBasenameNoExtension": "${fileBasenameNoExtension} ne peut pas être résolu, veuillez ouvrir un éditeur." + "canNotResolveWorkspaceFolderMultiRoot": "'${workspaceFolder}' ne peut pas être résolu dans un espace de travail de dossiers multiples. Gérer la portée de cette variable en utilisant ':' et un nom de dossier d’espace de travail.", + "canNotResolveWorkspaceFolder": "'${workspaceFolder}' ne peut pas être résolu. Veuillez ouvrir un dossier.", + "canNotResolveFolderBasenameMultiRoot": "'${workspaceFolderBasename}' ne peut pas être résolu dans un espace de travail de dossiers multiples. Gérer la portée de cette variable en utilisant ':' et un nom de dossier d’espace de travail.", + "canNotResolveFolderBasename": "'${workspaceFolderBasename}' ne peut pas être résolu. Veuillez ouvrir un dossier.", + "canNotResolveLineNumber": "'${lineNumber}' ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", + "canNotResolveSelectedText": "'${selectedText}' ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", + "canNotResolveFile": "${file} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", + "canNotResolveRelativeFile": "${relativeFile} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", + "canNotResolveFileDirname": "${fileDirname} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", + "canNotResolveFileExtname": "${fileExtname} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", + "canNotResolveFileBasename": "${fileBasename} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur.", + "canNotResolveFileBasenameNoExtension": "${fileBasenameNoExtension} ne peut pas être résolu. Veuillez s’il vous plaît ouvrir un éditeur." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index 0e26b3fa0ff..f79185e93b2 100644 --- a/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/fra/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "Compatibilité de moteur.", "vscode.extension.engines.vscode": "Pour les extensions VS Code, spécifie la version de VS Code avec laquelle l'extension est compatible. Ne peut pas être *. Exemple : ^0.10.5 indique une compatibilité avec la version minimale 0.10.5 de VS Code.", "vscode.extension.publisher": "Éditeur de l'extension VS Code.", "vscode.extension.displayName": "Nom d'affichage de l'extension utilisée dans la galerie VS Code.", "vscode.extension.categories": "Catégories utilisées par la galerie VS Code pour catégoriser l'extension.", + "vscode.extension.category.languages.deprecated": "Utiliser 'Langages de programmation' à la place", "vscode.extension.galleryBanner": "Bannière utilisée dans le marketplace VS Code.", "vscode.extension.galleryBanner.color": "Couleur de la bannière de l'en-tête de page du marketplace VS Code.", "vscode.extension.galleryBanner.theme": "Thème de couleur de la police utilisée dans la bannière.", @@ -28,6 +30,8 @@ "vscode.extension.badges.url": "URL de l'image du badge.", "vscode.extension.badges.href": "Lien du badge.", "vscode.extension.badges.description": "Description du badge.", + "vscode.extension.markdown": "Contrôle le moteur de rendu de Markdown utilisé sur le marché. Github (par défaut) ou standard.", + "vscode.extension.qna": "Contrôle le lien Q&A sur le marché. Mettre à marketplace pour activer le site de Q&A du Marketplace par défaut. Mettre une chaîne pour fournir l’URL d’un site personnalisé de Q&A. Mettre à false pour désactiver complètement les Q&A.", "vscode.extension.extensionDependencies": "Dépendances envers d'autres extensions. L'identificateur d'une extension est toujours ${publisher}.${name}. Exemple : vscode.csharp.", "vscode.extension.scripts.prepublish": "Le script exécuté avant le package est publié en tant qu'extension VS Code.", "vscode.extension.scripts.uninstall": "Désinstallez le crochet pour l'extension VS Code. Script exécuté quand l'extension est complètement désinstallée dans VS Code et au redémarrage de VS Code (arrêt, puis démarrage). Seuls les scripts Node sont pris en charge.", diff --git a/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 2a4ba8f78bb..7604f9ffac7 100644 --- a/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "Toutes les extensions sont désactivées.", "extensionHostProcess.crash": "L'hôte d’extension s'est arrêté de manière inattendue.", "extensionHostProcess.unresponsiveCrash": "L'hôte d'extension s'est arrêté, car il ne répondait pas.", - "devTools": "Outils de développement", + "devTools": "Ouvrir les outils de développement", "restart": "Redémarrer l’hôte d'extension", "overwritingExtension": "Remplacement de l'extension {0} par {1}.", "extensionUnderDevelopment": "Chargement de l'extension de développement sur {0}", diff --git a/i18n/fra/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/fra/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 2c081ca984a..bd1e8163634 100644 --- a/i18n/fra/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,10 +6,24 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Microsoft .NET Framework 4.5 est obligatoire. Suivez le lien pour l'installer.", "installNet": "Télécharger .NET Framework 4.5", "neverShowAgain": "Ne plus afficher", - "netVersionError": "Microsoft .NET Framework 4.5 est obligatoire. Suivez le lien pour l'installer.", + "enospcError": "{0} n’est pas en mesure de surveiller les modifications de fichiers dans ce grand espace de travail. Veuillez suivre le lien d'instructions pour résoudre ce problème.", "learnMore": "Instructions", + "fileInvalidPath": "Ressource de fichier non valide ({0})", + "fileIsDirectoryError": "Le fichier est un répertoire", + "fileNotModifiedError": "Fichier non modifié depuis", + "fileTooLargeForHeapError": "Pour ouvrir un fichier de cette taille, vous devez redémarrer VS Code et lui permettre d’utiliser plus de mémoire", + "fileTooLargeError": "Fichier trop volumineux pour être ouvert", + "fileNotFoundError": "Fichier introuvable ({0})", + "fileBinaryError": "Il semble que le fichier soit binaire. Impossible de l'ouvrir en tant que texte", + "filePermission": "Autorisation refusée en écrivant dans le fichier ({0})", + "fileExists": "Le fichier à créer existe déjà ({0})", + "fileModifiedError": "Fichier modifié depuis", + "fileReadOnlyError": "Fichier en lecture seule", + "fileMoveConflict": "Déplacement/copie impossible. Le fichier existe déjà dans la destination.", + "unableToMoveCopyError": "Impossible de déplacer/copier. Le fichier remplace le dossier qui le contient.", "binFailed": "Échec du déplacement de '{0}' vers la corbeille", "trashFailed": "Échec du déplacement de '{0}' vers la corbeille" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 2908555a1fa..d783ab341de 100644 --- a/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Fichier introuvable ({0})", "fileIsDirectoryError": "Le fichier est un répertoire", "fileNotModifiedError": "Fichier non modifié depuis", "fileBinaryError": "Il semble que le fichier soit binaire. Impossible de l'ouvrir en tant que texte" diff --git a/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index abfb642e45b..e3c83da3c2d 100644 --- a/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "Nom de portée TextMate utilisé par le fichier tmLanguage.", "vscode.extension.contributes.grammars.path": "Chemin du fichier tmLanguage. Le chemin est relatif au dossier d'extensions et commence généralement par './syntaxes/'.", "vscode.extension.contributes.grammars.embeddedLanguages": "Mappage du nom de portée à l'ID de langage si cette grammaire contient des langages incorporés.", + "vscode.extension.contributes.grammars.tokenTypes": "Un mappage entre un nom d'étendue et des types de token.", "vscode.extension.contributes.grammars.injectTo": "Liste de noms des portées de langage auxquelles cette grammaire est injectée." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index 9cabecf7e05..006e800804b 100644 --- a/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/fra/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "Chaîne attendue dans 'contributes.{0}.path'. Valeur fournie : {1}", "invalid.injectTo": "Valeur non valide dans 'contributes.{0}.injectTo'. Il doit s'agir d'un tableau de noms de portées de langage. Valeur fournie : {1}", "invalid.embeddedLanguages": "Valeur non valide dans 'contributes.{0}.embeddedLanguages'. Il doit s'agir d'un mappage d'objets entre le nom de portée et le langage. Valeur fournie : {1}", + "invalid.tokenTypes": "Valeur non valide dans 'contribue.{0}.tokenTypes'. Il doit s'agir d'un mappage d’objets entre un nom d’étendue et un type de jeton. Valeur fournie : {1}", "invalid.path.1": "'contributes.{0}.path' ({1}) est censé être inclus dans le dossier ({2}) de l'extension. Cela risque de rendre l'extension non portable.", "no-tm-grammar": "Aucune grammaire TM n'est inscrite pour ce langage." } \ No newline at end of file diff --git a/i18n/hun/extensions/emmet/package.i18n.json b/i18n/hun/extensions/emmet/package.i18n.json index 8d55c3feff5..0445f7ccce3 100644 --- a/i18n/hun/extensions/emmet/package.i18n.json +++ b/i18n/hun/extensions/emmet/package.i18n.json @@ -35,7 +35,6 @@ "emmetExtensionsPath": "Emmet-profilokat és -kódtöredékeket tartalmazó mappa elérési útja.", "emmetShowExpandedAbbreviation": "Kibontott Emmet-rövidítések megjelenítése javaslatként. Az \"inMarkupAndStylesheetFilesOnly\" beállítás csak a html, haml, jade, slim, xml, xsl, css, scss, sass, less és stylus típusú tartalmat jelenti. Az \"always\" beállítás a fájl összes részére vonatkozik a jelölőnyelvtől/css-től függetlenül.", "emmetShowAbbreviationSuggestions": "Lehetséges Emmet-rövidítések megjelenítése javaslatként. Nem használható a stíluslapokon vagy ha az emmet.showExpandedAbbreviation értéke \"never\".", - "emmetIncludeLanguages": "Emmet-rövidítések engedélyezése olyan nyelvek esetében, amelyek alapértelmezés szerint nem támogatottak. Egy megfeleltetést kell felvenni a nyelv és egy emmet által támogatott nyelv között.\nPl.: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "Az Emmet-kódrészletekben használt változók", "emmetTriggerExpansionOnTab": "Ha engedélyezve van, akkor az Emmet-rövidítések a Tab billentyű lenyomásával bonthatók ki.", "emmetPreferences": "Beállítások, melyek módosítják az Emmet műveleteinek és feloldó algoritmusainak viselkedését.", diff --git a/i18n/hun/extensions/markdown-language-features/out/security.i18n.json b/i18n/hun/extensions/markdown-language-features/out/security.i18n.json index def0928c3a2..19ebd5b969e 100644 --- a/i18n/hun/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/hun/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,7 @@ ], "strict.title": "Szigorú", "strict.description": "Csak biztonságos tartalmak betöltése", + "insecureLocalContent.title": "Nem biztonságos helyi tartalom engedélyezése", "insecureContent.title": "Nem biztonságos tartalom engedélyezése", "insecureContent.description": "Tartalom betöltésének engedélyezése HTTP-n keresztül.", "disable.title": "Letiltás", diff --git a/i18n/hun/extensions/php/package.i18n.json b/i18n/hun/extensions/php/package.i18n.json index 41a3d3f94af..30301605646 100644 --- a/i18n/hun/extensions/php/package.i18n.json +++ b/i18n/hun/extensions/php/package.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "PHP nyelvi funkciók", "description": "Szintaktikai kiemelést szolgáltat, valamint kezeli az összetartozó zárójeleket a PHP-fájlokban." } \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/commands.i18n.json b/i18n/hun/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..2d667c10166 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Nyisson meg egy mappát a VS Code-ban typescriptes vagy javascriptes projekt használatához!", + "typescript.projectConfigUnsupportedFile": "Nem sikerült meghatározni a TypeScript- vagy JavaScript-projektet. Nem támogatott fájltípus", + "typescript.projectConfigCouldNotGetInfo": "Nem sikerült meghatározni a TypeScript- vagy JavaScript-projektet", + "typescript.noTypeScriptProjectConfig": "A fájl nem egy TypeScript-projekt része. További információkat [ide]({0}) kattintva tudhat meg.", + "typescript.noJavaScriptProjectConfig": "A fájl nem egy JavaScript-projekt része. További információkat [ide]({0}) kattintva tudhat meg.", + "typescript.configureTsconfigQuickPick": "tsconfig.json konfigurálása", + "typescript.configureJsconfigQuickPick": "jsconfig.json konfigurálása" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..30437c7682c --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Válasszon végrehajtandó kódműveletet!", + "acquiringTypingsLabel": "Típusdefiníciók letöltése...", + "acquiringTypingsDetail": "Típusdefiníciók letöltése az IntelliSense-hez.", + "autoImportLabel": "Automatikus importálás a következő helyről: {0}" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..c7d2746fdb4 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Engedélyezi a JavaScript-fájlok szemantikai ellenőrzését. A fájl tetején kell szerepelnie.", + "ts-nocheck": "Letiltja a JavaScript-fájlok szemantikai ellenőrzését. A fájl tetején kell szerepelnie.", + "ts-ignore": "Elfedi a fájl következő sorában található @ts-check-hibákat." +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..7207bf3b210 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 implementáció", + "manyImplementationLabel": "{0} implementáció", + "implementationsErrorLabel": "Nem sikerült meghatározni az implementációkat" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..d6bb7d7c26e --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "JSDoc-megjegyzés" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..4573e2028b6 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "Importálások rendezése" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..e76bf145eff --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (összes javítása a fájlban)" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..ac0763b55e4 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 referencia", + "manyReferenceLabel": "{0} referencia", + "referenceErrorLabel": "Nem sikerült meghatározni a referenciákat" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..d7ad58409e7 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "buildelés – {0}", + "buildAndWatchTscLabel": "figyelés – {0}" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/hun/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..5c3b49a6031 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "A(z) {0} elérési út nem egy érvényes tsserver-telepítésre mutat. A beépített TypeScript-verzió lesz használva.", + "serverCouldNotBeStarted": "Nem sikerült elindítani a TypeScript nyelvi szervert. Hibaüzenet: {0}", + "typescript.openTsServerLog.notSupported": "A TS-szerver naplózáshoz TS 2.2.2+ szükséges", + "typescript.openTsServerLog.loggingNotEnabled": "A TS-szervernaplózás ki van kapcsolva. Állítsa be a `typescript.tsserver.log` beállítást, majd indítsa újra a TS-szervert a naplózás engedélyezéséhez!", + "typescript.openTsServerLog.enableAndReloadOption": "Naplózás engedélyezése és TS-szerver újraindítása", + "typescript.openTsServerLog.noLogFile": "A TS-szerver nem kezdett el naplózni", + "openTsServerLog.openFileFailedFailed": "A TS-szervernapló nem nyitható meg", + "serverDiedAfterStart": "A TypeScript nyelvi szolgáltatás öt alkalommal omlott össze rögtön azután, hogy el lett indítva. A szolgáltatás nem lesz újraindítva.", + "serverDiedReportIssue": "Probléma jelentése", + "serverDied": "A TypeScript nyelvi szolgáltatás öt alkalommal omlott össze az elmúlt öt percben." +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/hun/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..93f5c9220fa --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "érvénytelen verzió" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/hun/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/hun/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..3e5d8de4e07 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "A JavaScript/TypeScript funkciók teljes projektre való engedélyezéséhez zárja ki a sok fájlt tartalmazó mappákat. Például: {0}", + "hintExclude.generic": "A JavaScript/TypeScript funkciók teljes projektre való engedélyezéséhez zárja ki azokat a mappákat, amelyben olyan forrásfájlok találhatók, melyen nem dolgozik. ", + "large.label": "Kivételek konfigurálása", + "hintExclude.tooltip": "A JavaScript/TypeScript funkciók teljes projektre való engedélyezéséhez zárja ki azokat a mappákat, amelyben olyan forrásfájlok találhatók, melyen nem dolgozik. " +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/hun/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..4e9549aeb04 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Adatok lekérése a jobb typescriptes IntelliSense-hez", + "typesInstallerInitializationFailed.title": "Nem sikerült telepíteni a típusdefiníciós fájlokat a javascriptes nyelvi funkciókhoz. Győződjön meg róla, hogy az NPM telepítve van vagy módosítsa a 'typescript.npm' beállítás értékét a felhasználói beállításokban. További információkat [ide]({0}) kattintva tudhat meg.", + "typesInstallerInitializationFailed.doNotCheckAgain": "Ne jelenítse meg újra" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/hun/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..919b1678312 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "A VSCode verziójának használata", + "useWorkspaceVersionOption": "A munkaterület verziójának használata", + "learnMore": "További információ", + "selectTsVersion": "Válassza ki a javascriptes és typescriptes nyelvi funkciókhoz használt TypeScript-verziót" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/hun/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..4e8b25cde58 --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "Nem sikerült meghatározni a TypeScript-verziót ezen az elérési úton", + "noBundledServerFound": "A VSCode beépített tsserverét törölte egy másik alkalmazás, például egy hibásan viselkedő víruskereső eszköz. Telepítse újra a VSCode-ot!" +} \ No newline at end of file diff --git a/i18n/hun/extensions/typescript-language-features/package.i18n.json b/i18n/hun/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..59e6eed00dc --- /dev/null +++ b/i18n/hun/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,58 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "TypeScript és JavaScript nyelvi funkciók", + "description": "Széleskörű nyelvi támogatás JavaScripthez és TypeScripthez.", + "typescript.reloadProjects.title": "Projekt újratöltése", + "javascript.reloadProjects.title": "Projekt újratöltése", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Függvények kiegészítése paraméterdefiníciójukkal.", + "typescript.tsdk.desc": "A tsservert és a lib*.d.ts fájlokat tartalmazó mappa elérési útja.", + "typescript.disableAutomaticTypeAcquisition": "Automatikus típusdefiníció-letöltés letiltása. Legalább 2.0.6-os TypeScriptet igényel.", + "typescript.tsserver.log": "Engedélyezi a TS-szerver naplózását egy fájlba. Ez a napló a TS-szerverrel kapcsolatos problémák diagnosztizálására használható. A napló tartalmazhat elérési utakat, forráskódot és más potenciálisan érzékeny, projekttel kapcsolatos adatot.", + "typescript.tsserver.trace": "Engedélyezi a TS-szervernek küldött üzenetek naplózását. Ez a napló a TS-szerverrel kapcsolatos problémák diagnosztizálására használható. A napló tartalmazhat elérési utakat, forráskódot és más potenciálisan érzékeny, projekttel kapcsolatos adatot. ", + "typescript.validate.enable": "TypeScript-validálás engedélyezése vagy letiltása.", + "typescript.format.enable": "Alapértelmezett TypeScript-formázó engedélyezése vagy letiltása.", + "javascript.format.enable": "Alapértelmezett JavaScript-formázó engedélyezése vagy letiltása.", + "format.insertSpaceAfterCommaDelimiter": "Meghatározza a szóközök kezelését vessző elválasztókarakter után.", + "format.insertSpaceAfterConstructor": "Meghatározza a szóközök kezelését a constructor kulcsszó után. TypeScript >= 2.3.0-t igényel.", + "format.insertSpaceAfterSemicolonInForStatements": "Meghatározza a szóközök kezelését pontosvessző után a for ciklusban.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Meghatározza a szóközök kezelését bináris operátorok után.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Meghatározza a szóközök kezelését vezérlési szerkezetek kulcsszavai után.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Meghatározza a szóközök kezelését a névtelen függvényekben található function kulcsszó után.", + "format.insertSpaceBeforeFunctionParenthesis": "Meghatározza a szóközök kezelését a függvényargumentumokat tartalmazó zárójel előtt. TypeScript >= 2.1.5-öt igényel.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Meghatározza a szóközök kezelését a sablonkarakterláncok (template stringek) kapcsos zárójeleinek nyitása után és zárása előtt. TypeScript >= 2.0.6-ot igényel.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Meghatározza a szóközök kezelését JSX-kifejezések kapcsos zárójeleinek nyitása után és zárása előtt. TypeScript >= 2.0.6-ot igényel.", + "format.insertSpaceAfterTypeAssertion": "Meghatározza a szóközök kezelését a típuskényszerítések utn. TypeScript >= 2.4-t igényel.", + "format.placeOpenBraceOnNewLineForFunctions": "Meghatározza, hogy a függvények nyitó kapcsos zárójelei új sorba kerüljenek-e vagy sem.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Meghatározza, hogy a vezérlőblokkok nyitó kapcsos zárójelei új sorba kerüljenek-e vagy sem.", + "javascript.validate.enable": "JavaScript-validálás engedélyezése vagy letiltása.", + "typescript.goToProjectConfig.title": "Projektkonfiguráció megkeresése", + "javascript.goToProjectConfig.title": "Projektkonfiguráció megkeresése", + "javascript.referencesCodeLens.enabled": "Referencia kódlencsék engedélyezése vagy letiltása a JavaScript-fájlokban.", + "typescript.referencesCodeLens.enabled": "Referencia kódlencsék engedélyezése vagy letiltása a TypeScript-fájlokban. TypeScript >= 2.0.6-ot igényel.", + "typescript.implementationsCodeLens.enabled": "Implementációs kódlencsék engedélyezése vagy letiltása. TypeScript >= 2.2.0-t igényel.", + "typescript.openTsServerLog.title": "TS-szervernapló megnyitása", + "typescript.restartTsServer": "TS-szerver újraindítása", + "typescript.selectTypeScriptVersion.title": "TypeScript-verzió kiválasztása", + "typescript.reportStyleChecksAsWarnings": "Stílusellenőrzés során talált esetek figyelmeztetésként legyenek jelentve", + "jsDocCompletion.enabled": "Automatikus JSDoc-megjegyzések engedélyezése vagy letiltása", + "javascript.implicitProjectConfig.checkJs": "JavaScript-fájlok szemantikai ellenőrzésének engedélyezése vagy letiltása. A meglévő jsconfig.json vagy tsconfig.json fájlok felülírják ezt a beállítást. TypeScript >= 2.3.1-et igényel.", + "typescript.npm": "Az automatikus típusdefiníció-letöltéshez használt NPM végrehajtható fájl elérési útja. TypeScript 2.3.4-et igényel.", + "typescript.check.npmIsInstalled": "Ellenőrizze, hogy az NPM telepítve van-e az automatikus típusdefiníció-letöltéshez.", + "javascript.nameSuggestions": "Egyedi nevek listázásának engedélyezése a javascriptes javaslati listákban.", + "typescript.tsc.autoDetect": "Meghatározza a tsc-s feladatok automatikus felderítésének működését. 'off' érték esetén a funkció ki van kapcsolva. 'build' esetén egyszer lefutó, fordítást végző feladatok jönnek létre. 'watch' esetén csak fordítást és figyelést végző feladatok jönnek létre. 'on' esetén buildelési és figyelési feladatok is keletkeznek. Az alapértelmezett érték: 'on'.", + "typescript.problemMatchers.tsc.label": "TypeScript-problémák", + "typescript.problemMatchers.tscWatch.label": "TypeScript-problémák (figyelő módban)", + "typescript.quickSuggestionsForPaths": "Kiegészítési javaslatok engedélyezése importált elérési utak beírásakor.", + "typescript.locale": "Meghatározza a TypeScript-hibák jelentésénél használt lokalizációt. TypeScript >= 2.6.0-t igényel. Az alapértelmezett 'null' érték esetén a VS Code-ban beállított nyelven jelennek meg a TypeScript-hibák.", + "javascript.implicitProjectConfig.experimentalDecorators": " 'experimentalDecorators' beállítás engedélyezése azon JavaScript-fájlok esetében, amelyek nem részei a projektnek. A meglévő jsconfig.json vagy tsconfig.json fájlok felülírják ezt a beállítást. TypeScript >= 2.3.1-et igényel.", + "typescript.autoImportSuggestions.enabled": "Automatikus importálási ajánlatok engedélyezése vagy letiltása. TypeScript >= 2.6.1-t igényel.", + "typescript.experimental.syntaxFolding": "Szintaxisalapú becsukható kódrészletek engedélyezése vagy letiltása.", + "taskDefinition.tsconfig.description": "A tsconfig-fájl, ami meghatározza a TS-buildet." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/base/node/processes.i18n.json b/i18n/hun/src/vs/base/node/processes.i18n.json index 0dff4be115a..35229bd6699 100644 --- a/i18n/hun/src/vs/base/node/processes.i18n.json +++ b/i18n/hun/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "Rendszerparancsok UNC-meghajtókon nem hajthatók végre." + ] } \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 92689292f4f..7be3fc5b86f 100644 --- a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,10 +8,11 @@ ], "previewOnGitHub": "Előnézet GitHubon", "loadingData": "Adatok betöltése...", + "rateLimited": "GitHub lekérdezési korlát túllépve. Kérem, várjon!", "similarIssues": "Hasonló problémák", "open": "Megnyitás", "closed": "Bezárva", - "noResults": "Nincs találat", + "noSimilarIssues": "Nincs hasonló probléma", "settingsSearchIssue": "Hiba a beállítások keresőjében", "bugReporter": "hibát", "featureRequest": "funkcióigényt", diff --git a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index a53b4129ee2..886cb41d49d 100644 --- a/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/hun/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,12 @@ ], "completeInEnglish": "Kérjük, hogy angolul töltse ki az űrlapot!", "issueTypeLabel": "Ez egy", + "issueSourceLabel": "Komponens", + "vscode": "Visual Studio Code", + "extension": "Egy kiegészítő", + "disableExtensionsLabelText": "Próbálja meg előidézni a hibát {0}! Ha a hiba csak aktív kiegészítőkkel idézhető elő, akkor nagy valószínűséggel a kiegészítőben van a hiba.", + "disableExtensions": "az összes kiegészítő letiltása és az ablak újratöltése után", + "chooseExtension": "Kiegészítő", "issueTitleLabel": "Cím", "issueTitleRequired": "Kérjük, adja meg a címet!", "titleLengthValidation": "A cím túl hosszú.", @@ -18,13 +24,6 @@ "extensions": "Kiegészítők", "searchedExtensions": "Keresett kiegészítők", "settingsSearchDetails": "Beállításokban való keresés részletei", - "tryDisablingExtensions": "A probléma letiltott kiegészítőkkel is előidézhető?", - "yes": "Igen", - "no": "Nem", - "disableExtensionsLabelText": "Próbálja meg előidézni a hibát {0}!", - "disableExtensions": "az összes kiegészítő letiltása és az ablak újratöltése után", - "showRunningExtensionsLabelText": "Ha azt gyanítja, hogy a hiba egy kiegészítőben van, {0} a kiegészítővel kapcsolatos hiba jelentéséhez!", - "showRunningExtensions": "tekintse meg a futó kiegészítők listáját", "details": "Írja le a részleteket!", "loadingData": "Adatok betöltése..." } \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..27c0f1d3fcf --- /dev/null +++ b/i18n/hun/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cpu": "Processzor %", + "memory": "Memória (MB)", + "pid": "folyamatazonosító", + "name": "Név", + "killProcess": "Folyamat leállítása", + "forceKillProcess": "Folyamat kényszerített leállítása" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/code/electron-main/menus.i18n.json b/i18n/hun/src/vs/code/electron-main/menus.i18n.json index e63be27f735..5b81e432f54 100644 --- a/i18n/hun/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/hun/src/vs/code/electron-main/menus.i18n.json @@ -161,6 +161,7 @@ "mMergeAllWindows": "Összes ablak összeolvasztása", "miToggleDevTools": "&&Fejlesztői eszközök be- és kikapcsolása", "miAccessibilityOptions": "&&Kisegítő lehetőségek", + "miOpenProcessExplorerer": "&&Feladatkezelő megnyitása", "miReportIssue": "H&&iba jelentése", "miWelcome": "Üdvözlő&&oldal", "miInteractivePlayground": "&&Interaktív játszótér", diff --git a/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json index 9ff041f3697..61a892df8cb 100644 --- a/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/hun/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Bezárás", - "header": "{0}. eltérés, összesen: {1}. Eredeti: {2}., {3}. sorok, módosított: {4}., {5}. sorok", "blankLine": "üres", "equalLine": "eredeti {0}., módosított {1}.: {2}", "insertLine": "+ módosított {0}.: {1}", diff --git a/i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/hun/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json index 21532a3464d..0dfc2d84ed4 100644 --- a/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/hun/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "Windows és Linux alatt a `Control`, macOS alatt a `Command` billentyűt jelenti.", "multiCursorModifier.alt": "Windows és Linux alatt az `Alt`, macOS alatt az `Option` billentyűt jelenti.", "multiCursorModifier": "Több kurzor hozzáadásához használt módosítóbillentyű. A `ctrlCmd` Windows és Linux alatt a `Control`, macOS alatt a `Command` billentyűt jelenti. A Definíció megkeresése és Hivatkozás megnyitása egérgesztusok automatikusan úgy lesznek beállítva, hogy ne ütközzenek a többkurzorhoz tartozó módosítóval.", + "multiCursorMergeOverlapping": "Több kurzor összeolvasztása, ha azok fedik egymást.", "quickSuggestions.strings": "Kiegészítési javaslatok engedélyezése karakterláncokban (stringekben)", "quickSuggestions.comments": "Kiegészítési javaslatok engedélyezése megjegyzésekben", "quickSuggestions.other": "Kiegészítési javaslatok engedélyezése karakterláncokon (stringeken) és megjegyzéseken kívül", @@ -88,6 +89,9 @@ "renderLineHighlight": "Meghatározza, hogy a szerkesztőablakban hogyan legyen kirajzolva az aktuális sor kiemelése. Lehetséges értékek: 'none', 'gutter', 'line', vagy 'all'.", "codeLens": "Meghatározza, hogy megjelenjenek-e a kódlencsék", "folding": "Meghatározza, hogy engedélyezve van-e a kódrészletek bezárása a szerkesztőablakban.", + "foldingStrategyAuto": "Nyelvspecifikus kódrész-bezárási stratégia használata, ha az rendelkezésre áll. Ha nem, akkor tartalékmegoldásként az indentálásalapú kódrész-bezárási stratégia használata.", + "foldingStrategyIndentation": "A kódrészek bezárása mindig az indentálásalapú kódrész-bezárási stratégia alapján történjen.", + "foldingStrategy": "Meghatározza, hogyan vannak meghatározva a bezárható kódrészek. Az 'auto' esetén a nyelvspecifikus kódbezárási stratégia van használva, ha az rendelkezésre áll. Az 'indentation' esetén minden esetben az indentálásalapú bezárási stratégia van használva.", "showFoldingControls": "Meghatározza, hogy a kódrészletek bezárásához tartozó vezérlőelemek automatikusan el legyenek-e rejtve.", "matchBrackets": "Zárójel kiválasztása esetén a hozzátartozó zárójel kiemelése.", "glyphMargin": "Meghatározza, hogy legyen-e vertikális szimbólummargó a szerkesztőablakban. A szimbólummargó elsősorban hibakeresésnél van használva.", @@ -105,5 +109,7 @@ "selectionClipboard": "Meghatározza-e, hogy támogatva van-e az elsődleges vágólap Linux alatt", "sideBySide": "Meghatározza, hogy a differenciaszerkesztő ablakban egymás mellett vagy a sorban jelenjenek meg az eltérések", "ignoreTrimWhitespace": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a sor elején vagy végén a szóközökben talált különbségek", + "largeFileSize": "Meghatározza azt a fájlméretet, ami fölött speciális optimalizálási szabályok lépnek érvénybe.", + "largeFileLineCount": "Meghatározza azt a sorszámot, ami fölött speciális optimalizálási szabályok lépnek érvénybe. ", "renderIndicators": "Meghatározza, hogy a differenciaszerkesztő ablakban megjelenjenek-e a +/- jelzők az hozzáadott/eltávolított változásoknál" } \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json index a81eff02751..05e0c0c13f7 100644 --- a/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/hun/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "A szerkesztőablak segédvonalainak színe.", "editorLineNumbers": "A szerkesztőablak sorszámainak színe.", "editorActiveLineNumber": "A szerkesztőablak aktív sorához tartozó sorszám színe.", + "deprecatedEditorActiveLineNumber": "Az Id elavult. Használja helyette az 'editorLineNumber.activeForeground' beállítást!", "editorRuler": "A szerkesztőablak sávjainak színe.", "editorCodeLensForeground": "A szerkesztőablakban található kódlencsék előtérszíne", "editorBracketMatchBackground": "Hozzátartozó zárójelek háttérszíne", diff --git a/i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..ca792d8bea6 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Javítások megjelenítése ({0})", + "quickFix": "Javítások megjelenítése", + "quickfix.trigger.label": "Gyorsjavítás...", + "editor.action.quickFix.noneMessage": "Nem áll rendelkezésre kódművelet", + "refactor.label": "Refaktorálás...", + "editor.action.refactor.noneMessage": "Nem áll rendelkezésre refaktorálási lehetőség", + "source.label": "Forrásművelet...", + "editor.action.source.noneMessage": "Nem áll rendelkezésre forrásművelet", + "organizeImports.label": "Importálások rendezése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/editor/contrib/links/links.i18n.json b/i18n/hun/src/vs/editor/contrib/links/links.i18n.json index 6feb52b9cb7..9ca7de76bcf 100644 --- a/i18n/hun/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/hun/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "Hivatkozott oldal megnyitása Ctrl + kattintás paranccsal", "links.command.mac": "Cmd + kattintás a parancs végrehajtásához", "links.command": "Ctrl + kattintás a parancs végrehajtásához", + "links.navigate.al.mac": "Hivatkozás megnyitása az Option + kattintás paranccsal", "links.navigate.al": "Hivatkozás megnyitása Alt + kattintás paranccsal", + "links.command.al.mac": "Option + kattintás a parancs végrehajtásához", "links.command.al": "Alt + kattintás a parancs végrehajtásához", "invalid.url": "A hivatkozást nem sikerült megnyitni, mert nem jól formázott: {0}", "missing.url": "A hivatkozást nem sikerült megnyitni, hiányzik a célja.", diff --git a/i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/hun/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/environment/node/argv.i18n.json b/i18n/hun/src/vs/platform/environment/node/argv.i18n.json index f26bd4d55da..19039e5513a 100644 --- a/i18n/hun/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/hun/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "Indítás a 'Developer: Startup Performance' parancs engedélyezésével.", "prof-startup": "Processzorhasználat profilozása induláskor", "disableExtensions": "Összes telepített kiegészítő letiltása.", - "inspect-extensions": "Hibakeresés és profilozás engedélyezése a kiegészítőkben. Ellenőrizze a fejlesztői eszközöket a csatlakozási URI-hoz.", - "inspect-brk-extensions": "Hibakeresés és profilozás engedélyezése a kiegészítőkben, úgy, hogy a kiegészítő gazdafolyamata szüneteltetve lesz az indítás után. Ellenőrizze a fejlesztői eszközöket a csatlakozási URI-hoz. ", "disableGPU": "Hardveres gyorsítás letiltása.", "uploadLogs": "Az aktuális munkamenet naplóinak feltöltése egy biztonságos végpontra.", "maxMemory": "Egy ablak maximális memóriamérete (megabájtban).", diff --git a/i18n/hun/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/hun/src/vs/platform/extensions/node/extensionValidator.i18n.json index ebab6182648..2b680ac3f88 100644 --- a/i18n/hun/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/hun/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "Nem sikerült feldolgozni az `engines.vscode` beállítás értékét ({0}). Használja például a következők egyikét: ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x stb.", + "versionSyntax": "Nem sikerült feldolgozni az `engines.vscode` beállítás értékét ({0}). Használja például a következők egyikét: ^1.22.0, ^1.22.x stb.", "versionSpecificity1": "Az `engines.vscode` beállításban megadott érték ({0}) nem elég konkrét. A vscode 1.0.0 előtti verzióihoz legalább a kívánt fő- és alverziót is meg kell adni. Pl.: ^0.10.0, 0.10.x, 0.11.0 stb.", "versionSpecificity2": "Az `engines.vscode` beállításban megadott érték ({0}) nem elég konkrét. A vscode 1.0.0 utáni verzióihoz legalább a kívánt főverziót meg kell adni. Pl.: ^1.10.0, 1.10.x, 1.x.x, 2.x.x stb.", "versionMismatch": "A kiegészítő nem kompatibilis a Code {0} verziójával. A következő szükséges hozzá: {1}." diff --git a/i18n/hun/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/hun/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index e70aaa6271c..358f998df03 100644 --- a/i18n/hun/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/hun/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "A feltelepített {0} hibásnak tűnik. Telepítse újra!", "integrity.moreInformation": "További információ", - "integrity.dontShowAgain": "Ne jelenítse meg újra", - "integrity.prompt": "A feltelepített {0} hibásnak tűnik. Telepítse újra!" + "integrity.dontShowAgain": "Ne jelenítse meg újra" } \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/hun/src/vs/platform/issue/electron-main/issueService.i18n.json index 570645f055d..144cb0419cc 100644 --- a/i18n/hun/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/hun/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "Hibajelentő" + "issueReporter": "Hibajelentő", + "processExplorer": "Feladatkezelő" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..3046160ac08 --- /dev/null +++ b/i18n/hun/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "a(z) `{0}` tulajdonság kötelező és `string` típusúnak kell lennie", + "showViewlet": "{0} megjelenítése", + "view": "Nézet" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 2eee713076e..2c12ec27c2c 100644 --- a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Nézeteket szolgáltat a szerkesztőhöz", "views.explorer": "Fájlkezelő-nézet", "views.debug": "Hibakeresési nézet", - "locationId.invalid": "A(z) `{0}` nem érvényes nézethelyszín", "duplicateView1": "Nem regisztrálható több nézet `{0}` azonosítóval a következő helyen: `{1}`", "duplicateView2": "Már van `{0}` azonosítójú nézet regisztrálva a következő helyen: `{1}`" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 983527bcdae..92725a915cc 100644 --- a/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/hun/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview-szerkesztő" + "errorMessage": "Hiba történt a nézet visszaállítása közben: {0}" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 768906f89d7..e563dd6f450 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,7 @@ "screenReaderDetectedExtra": "Ha nem használ képernyőolvasót, állítsa az `editor.accessibilitySupport` értékét \"off\"-ra.", "disableTabMode": "Kisegítő mód letiltása", "gotoLine": "Sor megkeresése", - "indentation": "Indentálás", + "selectIndentation": "Indentálás kiválasztása", "selectEncoding": "Kódolás kiválasztása", "selectEOL": "Sorvégjel kiválasztása", "selectLanguageMode": "Nyelvmód kiválasztása", diff --git a/i18n/hun/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 3e1e7156096..4df3b505d36 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,11 @@ "sizeMB": "{0} MB", "sizeGB": "{0} GB", "sizeTB": "{0} TB", - "largeImageError": "A képfájl mérete túl nagy (>1 MB) a szerkesztőben való megjelenítéshez.", + "largeImageError": "A kép nincs megjelenítve, mert túl nagy ({0}).", "resourceOpenExternalButton": "Kép megnyitása külső program használatával?", - "nativeBinaryError": "A fájl nem jeleníthető meg a szerkesztőben, mert bináris adatokat tartalmaz, túl nagy vagy nem támogatott szövegkódolást használ.", + "nativeFileTooLargeError": "A fájl nem jeleníthető meg a szerkesztőben, mert túl nagy ({0}).", + "nativeBinaryError": "A fájl nem jeleníthető meg a szerkesztőben, mert bináris adatokat tartalmaz vagy nem támogatott szövegkódolást használ.", + "openAsText": "Mégis meg szeretné nyitni?", "zoom.action.fit.label": "Teljes kép", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..21a3c1fb10f --- /dev/null +++ b/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInput.countSelected": "{0} kiválasztva", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..f402e9c2fed --- /dev/null +++ b/i18n/hun/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInputBox.ariaLabel": "Kezdjen el gépelni a találati lista szűkítéséhez!" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json index 616bbb21a05..37d0d251906 100644 --- a/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/hun/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "Legutóbbi megnyitása...", "quickOpenRecent": "Legutóbbi gyors megnyitása...", "reportIssueInEnglish": "Probléma jelentése", + "openProcessExplorer": "Feladatkezelő megnyitása", "reportPerformanceIssue": "Teljesítményproblémák jelentése", "keybindingsReference": "Billentyűparancs-referencia", "openDocumentationUrl": "Dokumentáció", diff --git a/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json index 6bbb36e90ae..cc21f47e7a5 100644 --- a/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -80,6 +80,7 @@ "titleBarStyle": "Módosítja az ablak címsorának megjelenését. A változtatás teljes újraindítást igényel.", "window.nativeTabs": "Engedélyezi a macOS Sierra ablakfüleket. Megjegyzés: a változtatás teljes újraindítást igényel, és a natív fülek letiltják az egyedi címsorstílust, ha azok be vannak konfigurálva.", "window.smoothScrollingWorkaround": "Akkor engedélyezze ezt a kerülőmegoldást, ha a görgetés nem egyenletes egy kis méretre rakott VS Code-ablak helyreállítása után. Ez egy kerülőmegoldás arra a problémára (https://github.com/Microsoft/vscode/issues/13612), amely a trackpadokkal rendelkező eszközöket érinti, például a Microsoft Surface készülékeit. A kerülőmegoldás engedélyezése a felület elrendezésének ugrálásával járhat az ablak kis méretből való helyreállítása után, de egyébként nem okoz más problémát.", + "window.clickThroughInactive": "Ha engedélyezve van, akkor egy inaktív ablakra való kattintás aktiválja az ablakot, valamint kattintási esemény keletkezik az egér alatt lévő elemen is, ha az kattintható. Ha le van tiltva, akkor az inaktív ablakra való kattintás csak az ablak aktiválását eredményezi, és egy újabb kattintás szükséges az elemen.", "zenModeConfigurationTitle": "Zen-mód", "zenMode.fullScreen": "Meghatározza, hogy zen-módban a munakterület teljes képernyős módba vált-e.", "zenMode.centerLayout": "Meghatározza, hogy zen-módban középre igazított elrendezés van-e.", diff --git a/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 9682e0aa906..5c3b0b5f63e 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Töréspont szerkesztése...", "functionBreakpointsNotSupported": "Ez a hibakereső nem támogatja a függvénytöréspontokat", "functionBreakpointPlaceholder": "A függvény, amin meg kell állni", "functionBreakPointInputAriaLabel": "Adja meg a függvénytöréspontot", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 07aae479f50..b6de2b15184 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,12 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "breakpointWidgetLogMessagePlaceholder": "A töréspont érintése esetén naplózandó üzenet. 'Enter' a megerősítéshez vagy 'Escape' a megszakításhoz.", + "breakpointWidgetLogMessagePlaceholder": "A töréspont érintése esetén naplózandó üzenet. A {} karakterek közötti kifejezések interpolálva lesznek. 'Enter' a megerősítéshez vagy 'Escape' a megszakításhoz.", "breakpointWidgetHitCountPlaceholder": "Futás megállítása, ha adott alkalommal érintve lett. 'Enter' a megerősítéshez vagy 'Escape' a megszakításhoz.", "breakpointWidgetExpressionPlaceholder": "Futás megállítása, ha a kifejezés értéke igazra értékelődik ki. 'Enter' a megerősítéshez vagy 'Escape' a megszakításhoz.", - "breakpointWidgetLogMessageAriaLabel": "A program ezt üzenetet naplózza a töréspont minden egyes érintése során. A megerősítéshez nyomja meg az Enter billentyűt, a megszakításhoz az Escape-et!", - "breakpointWidgetHitCountAriaLabel": "A program akkor fog megállni itt, ha adott alkalommal érintette ezt a pontot. A megerősítéshez nyomja meg az Enter billentyűt, a megszakításhoz az Escape-et!", - "breakpointWidgetAriaLabel": "A program csak akkor áll meg itt, ha a feltétel igaz. A megerősítéshez nyomja meg az Enter billentyűt, a megszakításhoz az Escape-et!", "expression": "Kifejezés", "hitCount": "Érintések száma", "logMessage": "Üzenet naplózása" diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 8f5ebe5ec40..2654914b2b8 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,5 +27,6 @@ "onFirstSessionStart": "A hibakeresés csak akkor jelenjen meg az állapotsoron, miután először el lett indítva a hibakeresés", "showInStatusBar": "Meghatározza, hogy megjelenjen-e a hibakeresési állapotsáv", "openDebug": "Meghatározza, hogy megnyíljon-e a hibakeresési modul a hibakeresési munkamenet indulásakor.", - "launch": "Globális hibakeresés indítási konfiguráció. Használható a 'launch.json' alternatívájaként, ami meg van osztva több munkaterület között" + "launch": "Globális hibakeresés indítási konfiguráció. Használható a 'launch.json' alternatívájaként, ami meg van osztva több munkaterület között", + "extensionHostDebugAdapter": "Hibakeresési illesztő futtatása egy kiegészítős gazdafolyamatban" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index b07cb0ef2cd..d038dd9dd4a 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,7 @@ "useUniqueNames": "Használjon egyedi konfigurációs neveket!", "app.launch.json.compound.folder": "A mappa neve, ahol az összetett konfiguráció található.", "app.launch.json.compounds.configurations": "Azon konfigurációk neve, melyek elindulnak ezen kombináció részeként.", - "debugNoType": "A hibakeresési illesztő 'type' tulajdonsága kötelező, és 'string' típusúnak kell lennie.", + "debugNoType": "A hibakereső 'type' tulajdonsága kötelező, és 'string' típusúnak kell lennie.", "selectDebug": "Környezet kiválasztása", "DebugConfig.failed": "Nem sikerült létrehozni a 'launch.json' fájlt a '.vscode' mappánan ({0}).", "workspace": "munkaterület", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index ee50c51ea05..f8b204c30b7 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Töréspont szerkesztése...", - "disableBreakpoint": "Töréspont letiltása", - "enableBreakpoint": "Töréspont engedélyezése", "removeBreakpoints": "Töréspontok eltávolítása", "removeBreakpointOnColumn": "{0}. oszlopban található töréspont eltávolítása", "removeLineBreakpoint": "Sorra vonatkozó töréspont eltávolítása", @@ -21,7 +18,8 @@ "enableBreakpoints": "{0}. oszlopban található töréspont engedélyezése", "enableBreakpointOnLine": "Sorszintű töréspont engedélyezése", "addBreakpoint": "Töréspont hozzáadása", - "conditionalBreakpoint": "Feltételes töréspont hozzáadása...", + "addConditionalBreakpoint": "Feltételes töréspont hozzáadása...", "addLogPoint": "Naplózási pont hozzáadása...", + "cancel": "Mégse", "addConfiguration": "Konfiguráció hozzáadása..." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 944e14f9107..906f14a1739 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "További információ", - "unableToLaunchDebugAdapter": "Nem sikerült elindítani a hibakeresési illesztőt a következő helyről: '{0}'.", - "unableToLaunchDebugAdapterNoArgs": "Nem sikerült elindítani a hibakeresési illesztőt.", - "stoppingDebugAdapter": "{0}. Hibakeresési illesztő leállítása.", "debugAdapterCrash": "A hibakeresési illesztő folyamata váratlanul leállt" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index f20852131e1..27c4e8cd4a1 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,19 +8,6 @@ ], "debugAdapterBinNotFound": "A hibakeresési illesztő futtatható állománya ('{0}') nem létezik.", "debugAdapterCannotDetermineExecutable": "Nem határozható meg a(z) '{0}' hibakeresési illesztő futtatható állománya.", - "launch.config.comment1": "IntelliSense használata a lehetséges attribútumok listázásához", - "launch.config.comment2": "Húzza fölé az egeret a létező attribútumok leírásának megtekintéséhez!", - "launch.config.comment3": "További információért látogassa meg a következőt: {0}", - "debugType": "A konfiguráció típusa.", - "debugTypeNotRecognised": "Ez a hibakeresési típus nem ismert. Bizonyosodjon meg róla, hogy telepítve és engedélyezve van a megfelelő hibakeresési kiegészítő.", - "node2NotSupported": "A \"node2\" már nem támogatott. Használja helyette a \"node\"-ot, és állítsa a \"protocol\" attribútum értékét \"inspector\"-ra.", - "debugName": "A konfiguráció neve. Az indítási konfiguráció lenyíló menüjében jelenik meg.", - "debugRequest": "A konfiguráció kérési típusa. Lehet \"launch\" vagy \"attach\".", - "debugServer": "Csak hibakeresési kiegészítők fejlesztéséhez: ha a port meg van adva, akkor a VS Code egy szerver módban futó hibakeresési illesztőhöz próbál meg csatlakozni.", - "debugPrelaunchTask": "A hibakeresési folyamat előtt futtatandó feladat.", - "debugPostDebugTask": "A hibakeresési folyamat vége után futtatandó feladat.", - "debugWindowsConfiguration": "Windows-specifikus indítási konfigurációs attribútumok.", - "debugOSXConfiguration": "OS X-specifikus indítási konfigurációs attribútumok.", - "debugLinuxConfiguration": "Linux-specifikus indítási konfigurációs attribútumok.", - "deprecatedVariables": "Az 'env.', 'config.' és 'command.' tujdonságok elavultak, használja helyette az 'env:', 'config:' és 'command:' tulajdonságokat." + "unableToLaunchDebugAdapter": "Nem sikerült elindítani a hibakeresési illesztőt a következő helyről: '{0}'.", + "unableToLaunchDebugAdapterNoArgs": "Nem sikerült elindítani a hibakeresési illesztőt." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..b50ef5b76d2 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "IntelliSense használata a lehetséges attribútumok listázásához", + "launch.config.comment2": "Húzza fölé az egeret a létező attribútumok leírásának megtekintéséhez!", + "launch.config.comment3": "További információért látogassa meg a következőt: {0}", + "debugType": "A konfiguráció típusa.", + "debugTypeNotRecognised": "Ez a hibakeresési típus nem ismert. Bizonyosodjon meg róla, hogy telepítve és engedélyezve van a megfelelő hibakeresési kiegészítő.", + "node2NotSupported": "A \"node2\" már nem támogatott. Használja helyette a \"node\"-ot, és állítsa a \"protocol\" attribútum értékét \"inspector\"-ra.", + "debugName": "A konfiguráció neve. Az indítási konfiguráció lenyíló menüjében jelenik meg.", + "debugRequest": "A konfiguráció kérési típusa. Lehet \"launch\" vagy \"attach\".", + "debugServer": "Csak hibakeresési kiegészítők fejlesztéséhez: ha a port meg van adva, akkor a VS Code egy szerver módban futó hibakeresési illesztőhöz próbál meg csatlakozni.", + "debugPrelaunchTask": "A hibakeresési folyamat előtt futtatandó feladat.", + "debugPostDebugTask": "A hibakeresési folyamat vége után futtatandó feladat.", + "debugWindowsConfiguration": "Windows-specifikus indítási konfigurációs attribútumok.", + "debugOSXConfiguration": "OS X-specifikus indítási konfigurációs attribútumok.", + "debugLinuxConfiguration": "Linux-specifikus indítási konfigurációs attribútumok.", + "deprecatedVariables": "Az 'env.', 'config.' és 'command.' tujdonságok elavultak, használja helyette az 'env:', 'config:' és 'command:' tulajdonságokat." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..63c2dd4d544 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "VS Code-konzol", + "mac.terminal.script.failed": "A(z) '{0}' parancsfájl a következő hibakóddal lépett ki: {1}", + "mac.terminal.type.not.supported": "A(z) '{0}' nem támogatott", + "press.any.key": "A folytatáshoz nyomjon meg egy billentyűt...", + "linux.term.failed": "A(z) '{0}' a következő hibakóddal lépett ki: {1}" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index f355d1508ab..cc2d7bd950a 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "Ez a kiegészítő az aktuális munkaterület felhasználói által ajánlott.", "reallyRecommended2": "Ehhez a fájltípushoz a(z) '{0}' kiegészítő ajánlott.", "reallyRecommendedExtensionPack": "Ehhez a fájltípushoz a(z) '{0}' kiegészítőcsomag ajánlott.", - "showRecommendations": "Ajánlatok megjelenítése", "install": "Telepítés", + "showRecommendations": "Ajánlatok megjelenítése", "showLanguageExtensions": "A piactéren található olyan kiegészítő, ami segíthet a(z) '.{0}' fájloknál", "workspaceRecommended": "A munkaterülethez vannak javasolt kiegészítők", "installAll": "Összes telepítése", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 25fbc666463..716316b2449 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "Letiltja a többi billentyűkonfigurációt ({0}) a billentyűparancsok közötti konfliktusok megelőzése érdekében?", "yes": "Igen", - "no": "Nem", - "betterMergeDisabled": "A Better Merge kiegészítő most már be van építve. A telepített kiegészítő le lett tiltva és eltávolítható.", - "uninstall": "Eltávolítás" + "no": "Nem" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 5ef5e09669c..1c51e825f0a 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -14,7 +14,7 @@ "workspaceRecommendedExtensions": "Ajánlott a munkaterülethez", "builtInExtensions": "Funkciók", "builtInThemesExtensions": "Témák", - "builtInBasicsExtensions": "Nyelvek", + "builtInBasicsExtensions": "Programozási nyelvek", "searchExtensions": "Kiegészítők keresése a piactéren", "sort by installs": "Rendezés a telepítések száma szerint", "sort by rating": "Rendezés értékelés szerint", diff --git a/i18n/hun/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index 5aaad4bc1e6..4baf355021f 100644 --- a/i18n/hun/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,8 +8,8 @@ ], "textFileEditor": "Szövegfájlszerkesztő", "createFile": "Fájl létrehozása", - "relaunchWithIncreasedMemoryLimit": "Újraindítás", - "configureMemoryLimit": "Beállítás", + "relaunchWithIncreasedMemoryLimit": "Újraindítás {0} MB-tal", + "configureMemoryLimit": "Memóriakorlát beállítása", "fileEditorWithInputAriaLabel": "{0}. Szövegfájlszerkesztő.", "fileEditorAriaLabel": "Szövegfájlszerkesztő" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 95afc5f3a16..27080d41e6c 100644 --- a/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -38,7 +38,7 @@ "trashFailed": "Nem sikerült törölni a kuka használatával. Szeretné helyette véglegesen törölni?", "deletePermanentlyButtonLabel": "&&Törlés véglegesen", "retryButtonLabel": "Új&&rapróbálkozás", - "importFiles": "Fájlok importálása", + "addFiles": "Fájlok hozzáadása", "confirmOverwrite": "A célmappában már van ilyen nevű mappa vagy fájl. Le szeretné cserélni?", "replaceButtonLabel": "&&Csere", "fileIsAncestor": "A beillesztendő fájl a célmappa szülője", diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 3cbfd1d59d4..edaae86a63a 100644 --- a/i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,7 +35,7 @@ "hotExit": "Meghatározza, hogy a nem mentett fájlokra emlékezzen-e az alkalmazás a munkamenetek között, így ki lehet hagyni a mentéssel kapcsolatos felugró ablakokat kilépésnél.", "useExperimentalFileWatcher": "Új, kísérleti fájlfigyelő használata.", "defaultLanguage": "Az új fájlokhoz alapértelmezetten hozzárendelt nyelv.", - "maxMemoryForLargeFilesMB": "Az alkalmazás által nagy fájlok megnyitása során használható memória új korlátja megabájtban. Ha nagyobb korláttal szeretné indítani az alkalmazást, használja a --max-memory=ÚJMÉRET kapcsolót a parancssorban.", + "maxMemoryForLargeFilesMB": "Meghatározza a VS Code számára elérhető memória mennyiségét újraindítás után, nagy fájlok megnyitása esetén. Hatása ugyanaz, mint a --max-memory=ÚJMÉRET kapcsoló megadása parancssorból való indítás esetén.", "editorConfigurationTitle": "Szerkesztőablak", "formatOnSave": "Fájlok formázása mentéskor. Az adott nyelvhez rendelkezésre kell állni formázónak, nem lehet beállítva automatikus mentés, és a szerkesztő nem állhat éppen lefelé.", "formatOnSaveTimeout": "Időkorlát mentéskor végzett formázások esetén. Meghatároz egy időkorlátot ezredmásodpercben a formatOnSave-parancsok számára. Az ennél hosszabb ideig tartó parancsok meg lesznek szakítva.", diff --git a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index dcbc1b87cbf..9db90ff7ab2 100644 --- a/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Adja meg a fájl nevét. Nyomjon 'Enter'-t a megerősítéshez vagy 'Escape'-et a megszakításhoz.", - "constructedPath": "{0} létrehozása a következő helyen: **{1}**", "filesExplorerViewerAriaLabel": "{0}, Fájlkezelő", "dropFolders": "Szeretné hozzáadni a mappákat a munkaterülethez?", "dropFolder": "Szeretné hozzáadni a mappát a munkaterülethez?", diff --git a/i18n/hun/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index cb2d1444c69..626849ee9d1 100644 --- a/i18n/hun/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -9,7 +9,7 @@ "updateLocale": "Szeretné a VS Code felületét {0} nyelvűre állítani és újraindítani az alkalmazást?", "yes": "Igen", "no": "Nem", - "doNotAskAgain": "Ne kérdezze meg újra", + "neverAgain": "Ne jelenítse meg újra", "JsonSchema.locale": "A felhasználói felületen használt nyelv.", "vscode.extension.contributes.localizations": "Lokalizációkat szolgáltat a szerkesztőhöz", "vscode.extension.contributes.localizations.languageId": "Annak a nyelvnek az azonosítója, amelyre a megjelenített szövegek fordítva vannak.", diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index c1008a9652d..08d7b8601cf 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "Másolás", - "copyMarkerMessage": "Üzenet másolása" + "copyMessage": "Üzenet másolása" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 0eecc9c3575..9cc6717e0d4 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Összesen {0} probléma", - "filteredProblems": "{0} probléma megjelenítve (összesen: {1})" + "totalProblems": "Összesen {0} probléma" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 692df32c15d..04de19e7bab 100644 --- a/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "Problémák", "markers.panel.aria.label.problems.tree": "Problémák fájlonként csoportosítva", "markers.panel.no.problems.build": "A munkaterületen eddig egyetlen hiba sem lett érzékelve.", - "markers.panel.no.problems.filters": "A megadott szűrőfeltételnek egyetlen elem sem felel meg.", "markers.panel.action.filter": "Problémák szűrése", - "markers.panel.filter.placeholder": "Szűrés típus vagy szöveg alapján", + "markers.panel.filter.ariaLabel": "Problémák szűrése", "markers.panel.filter.errors": "hibák", "markers.panel.filter.warnings": "figyelmeztetések", "markers.panel.filter.infos": "információk", diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 76f9adaac9a..c6560556f50 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Billentyűparancsok", "showDefaultKeybindings": "Alapértelmezett billentyűparancsok megjelenítése", "showUserKeybindings": "Felhasználói billentyűparancsok megjelenítése", "SearchKeybindings.AriaLabel": "Billentyűparancsok keresése", diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index eafcce8d969..2a7ffa73a6d 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Nyers alapértelmezett beállítások megnyitása", + "openSettings": "Beállítások megnyitása", "openGlobalSettings": "Felhasználói beállítások megnyitása", "openGlobalKeybindings": "Billentyűparancsok megnyitása", "openGlobalKeybindingsFile": "Billentyűparancsfájl megnyitása", diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 3f82c002188..b1b8e310251 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Alapértelmezett beállítások", "SearchSettingsWidget.AriaLabel": "Beállítások keresése", "SearchSettingsWidget.Placeholder": "Beállítások keresése", "noSettingsFound": "Nincs eredmény", @@ -16,6 +15,8 @@ "nlpResult": "Természetes nyelvi keresés eredményei", "filterResult": "Szűrt találatok", "defaultSettings": "Alapértelmezett beállítások", + "defaultUserSettings": "Alapértelmezett felhasználói beállítások", + "defaultWorkspaceSettings": "Alapértelmezett munkaterületi beállítások", "defaultFolderSettings": "Alapértelmezett mappabeállítások", "defaultEditorReadonly": "A jobb oldalon lévő szerkesztőablak tartalmának módosításával írhatja felül az alapértelmezett beállításokat.", "preferencesAriaLabel": "Az alapértelmezett beállítások. Írásvédett szerkesztőablak." diff --git a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index bb7763d54a3..7fcd4f374ab 100644 --- a/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "\"{0}\" kiegészítő megjelenítése", "editTtile": "Szerkesztés", "replaceDefaultValue": "Csere a beállításokban", - "copyDefaultValue": "Másolás a beállításokba", - "unsupportedPHPExecutablePathSetting": "Ez a beállítás csak a felhasználói beállításokban szerepelhet. A PHP munkaterülethez történő konfigurálásához nyisson meg egy PHP-fájlt, majd kattintson a PHP-elérési útra az állapotsoron!", - "unsupportedWorkspaceSetting": "Ez a beállítás csak a felhasználói beállításokban szerepelhet.", - "unsupportedWorkbenchSetting": "Ez a beállítás jelenleg nem alkalmazható. Akkor van használatban, ha közvetlenül nyitja meg ezt a mappát.", - "unsupportedWorkbenchSettingDevMode": "Ez a beállítás jelenleg nem alkalmazható. Akkor van használatban, ha a hatóköre 'resource'-ként van megadva a regisztráció során vagy közvetlenül nyitja meg ezt a mappát." + "copyDefaultValue": "Másolás a beállításokba" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 62a27fb2806..eed65b480a8 100644 --- a/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "További verziókezelő rendszerek telepítése...", "no open repo": "Nincs aktív verziókezelő rendszer.", "source control": "Verziókezelő rendszer", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "Elrejtés" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 28936cbbe73..ff26fdc4402 100644 --- a/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Következő bele foglalt keresési minta megjelenítése", "previousSearchIncludePattern": "Előző bele foglalt keresési minta megjelenítése", + "nextSearchExcludePattern": "Következő kizáró keresési minta megjelenítése", + "previousSearchExcludePattern": "Előző kizáró keresési minta megjelenítése", "nextSearchTerm": "Következő keresőkifejezés megjelenítése", "previousSearchTerm": "Előző keresőkifejezés megjelenítése", - "showSearchViewlet": "Keresés megjelenítése", "findInFiles": "Keresés a fájlokban", "replaceInFiles": "Csere a fájlokban", "RefreshAction.label": "Frissítés", diff --git a/i18n/hun/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/hun/src/vs/workbench/parts/search/browser/searchView.i18n.json index 5e9fc946994..414222489bd 100644 --- a/i18n/hun/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,9 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Keresési részletek be- és kikapcsolása", - "searchIncludeExclude.label": "belefoglalt és kizárt fájlok", - "searchIncludeExclude.ariaLabel": "Keresésbe belefoglalási és kizárási minták", - "searchIncludeExclude.placeholder": "Példa: src,!*.ts, test/**/*.log", + "searchScope.includes": "bele foglalt fájlok", + "label.includes": "Keresésbe bele foglalt fájlok", + "searchScope.excludes": "kizárt fájlok", + "label.excludes": "Keresésből kizárt fájlok", "replaceAll.confirmation.title": "Összes cseréje", "replaceAll.confirm.button": "&&Csere", "replaceAll.occurrence.file.message": "{0} előfordulás cserélve {1} fájlban a következőre: '{2}'.", diff --git a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index ffaed50c03f..d229aa88582 100644 --- a/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Keresés", + "copyMatchLabel": "Másolás", + "copyPathLabel": "Elérési út másolása", + "copyAllLabel": "Összes másolása", + "toggleSearchViewPositionLabel": "Keresőnézet helyzetének váltása", "findInFolder": "Keresés mappában...", "findInWorkspace": "Keresés a munkaterületen...", "showTriggerActions": "Szimbólum megkeresése a munkaterületen...", "name": "Keresés", - "search": "Keresés", "showSearchViewl": "Keresés megjelenítése", "view": "Nézet", "findInFiles": "Keresés a fájlokban", @@ -26,5 +30,5 @@ "search.followSymlinks": "Meghatározza, hogy keresés során követve legyenek-e a szimbolikus linkek.", "search.smartCase": "Figyelmen kívül hagyja a kis- és nagybetűket, ha a minta csak kisbetűkből áll, ellenkező esetben kis- és nagybetűérzékenyen keres", "search.globalFindClipboard": "Meghatározza, hogy a keresőmodul olvassa és módosítsa-e a megosztott keresési vágólapot macOS-en.", - "search.location": "Előzetes funkció: meghatározza, hogy a keresés az oldalsávon jelenik meg vagy egy panelként a panelterületen, mely utóbbi esetén több hely van vízszintesen. A következő kiadásban a panel megjelenése optimalizálva lesz a vízszintes megjelenítéshez, és a funkció nem lesz előzetes." + "search.location": "Meghatározza, hogy a keresés az oldalsávon jelenik meg vagy egy panelként a panelterületen, mely utóbbi esetén több hely van vízszintesen. A következő kiadásban a panel megjelenése optimalizálva lesz a vízszintes megjelenítéshez, és a funkció nem lesz előzetes." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 401c2d990b5..77d4506f265 100644 --- a/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "Segítsen javítani a {0}-támogatásunkat", "takeShortSurvey": "Rövid felmérés kitöltése", "remindLater": "Emlékeztessen később", - "neverAgain": "Ne jelenítse meg újra", - "helpUs": "Segítsen javítani a {0}-támogatásunkat" + "neverAgain": "Ne jelenítse meg újra" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 045f052b919..114c9ebb551 100644 --- a/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "Lenne kedve egy gyors elégedettségi felméréshez?", "takeSurvey": "Felmérés kitöltése", "remindLater": "Emlékeztessen később", - "neverAgain": "Ne jelenítse meg újra", - "surveyQuestion": "Lenne kedve egy gyors elégedettségi felméréshez?" + "neverAgain": "Ne jelenítse meg újra" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index ab9830c1cef..f91b0b4ec32 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,6 +11,7 @@ "totalErrors": "{0} hiba", "totalWarnings": "{0} figyelmeztetés", "totalInfos": "{0} információ", + "problems": "Problémák", "building": "Buildelés...", "manyProblems": "10k+", "runningTasks": "Futó feladatok megjelenítése", @@ -30,8 +31,10 @@ "selectProblemMatcher": "Válassza ki, milyen típusú hibák és figyelmeztetések legyenek keresve a feladat kimenetében!", "customizeParseErrors": "A jelenlegi feladatkonfigurációban hibák vannak. Feladat egyedivé tétele előtt javítsa a hibákat!", "moreThanOneBuildTask": "Túl sok buildelési feladat van definiálva a tasks.json-ban. Az első lesz végrehajtva.\n", - "TaskSystem.activeSame.background": "A(z) '{0}' feladat már aktív és a háttérben fut. A feladat befejezéséhez használja az 'Feladat megszakítása...' parancsot a Feladatok menüből!", - "TaskSystem.activeSame.noBackground": "A(z) '{0}' feladat már aktív. A feladat befejezéséhez használja 'Feladat megszakítása' parancsot a Feladatok menüből!", + "TaskSystem.activeSame.background": "A(z) '{0}' azonosítójú feladat már aktiválva van és a háttérben fut.", + "TaskSystem.activeSame.noBackground": "A(z) '{0}' azonosítójú feladat már aktiválva van.", + "terminateTask": "Feladat megszakítása", + "restartTask": "Feladat újraindítása", "TaskSystem.active": "Már fut egy feladat. Szakítsa meg, mielőtt egy másik feladatot futtatna.", "TaskSystem.restartFailed": "Nem sikerült a(z) {0} feladat befejezése és újraindítása.", "TaskService.noConfiguration": "Hiba: a(z) {0} feladatok felderítése nem szolgáltatott feladatot a következő konfigurációhoz:\n{1}\nA feladat figyelmen kívül lesz hagyva.\n", @@ -48,8 +51,8 @@ "recentlyUsed": "legutóbb futtatott feladatok", "configured": "konfigurált feladatok", "detected": "talált feladatok", - "TaskService.notAgain": "Ne jelenítse meg újra", "TaskService.ignoredFolder": "A következő munkaterületi mappák figyelmen kívül vannak hagyva, mert 0.1.0-s verziójú feladatkonfigurációt használnak: {0}", + "TaskService.notAgain": "Ne jelenítse meg újra", "TaskService.pickRunTask": "Válassza ki a futtatandó feladatot!", "TaslService.noEntryToRun": "Nincs futtatandó feladat. Feladatok konfigurálása...", "TaskService.fetchingBuildTasks": "Buildelési feladatok lekérése...", diff --git a/i18n/hun/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..e68d7791167 --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "A terminál háttérszíne. Ez lehetővé teszi a terminál paneltől eltérő színezését.", + "terminal.foreground": "A terminál előtérszíne.", + "terminalCursor.foreground": "A terminál kurzorának előtérszíne.", + "terminalCursor.background": "A terminál kurzorának háttérszíne. Lehetővé teszik az olyan karakterek színének módosítását, amelyek fölött egy blokk-típusú kurzor áll.", + "terminal.selectionBackground": "A terminálban kijelölt tartalom háttérszíne.", + "terminal.border": "A terminálokat elválasztó keret színe. Alapértelmezett értéke megegyezik a panel.border értékével.", + "terminal.ansiColor": "'{0}' ANSI-szín a terminálban." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index a1e04bdb7c0..bb78a0034db 100644 --- a/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -21,6 +21,7 @@ "workbench.action.terminal.newWorkspacePlaceholder": "Az aktuális munkakönyvtár kiválasztása az új terminálhoz", "workbench.action.terminal.newInActiveWorkspace": "Új integrált terminál létrehozása (az aktív munkaterületen)", "workbench.action.terminal.split": "Terminál kettéosztása", + "workbench.action.terminal.splitInActiveWorkspace": "Terminál kettéosztása (az aktív munkaterületen)", "workbench.action.terminal.focusPreviousPane": "Váltás az előző panelra", "workbench.action.terminal.focusNextPane": "Ugrás a következő panelra", "workbench.action.terminal.resizePaneLeft": "Méret növelése balra", @@ -43,6 +44,7 @@ "workbench.action.terminal.scrollUpPage": "G9rgetés felfelé (oldalanként)", "workbench.action.terminal.scrollToTop": "Görgetés a tetejére", "workbench.action.terminal.clear": "Törlés", + "workbench.action.terminal.clearSelection": "Kijelölés megszüntetése", "workbench.action.terminal.allowWorkspaceShell": "Munkaterületspecifikus shellkonfiguráció engedélyezése", "workbench.action.terminal.disallowWorkspaceShell": "Munkaterületspecifikus shellkonfiguráció letiltása", "workbench.action.terminal.rename": "Átnevezés", @@ -52,8 +54,8 @@ "nextTerminalFindTerm": "Következő keresési kifejezés megjelenítése", "previousTerminalFindTerm": "Előző keresési kifejezés megjelenítése", "quickOpenTerm": "Aktív terminál váltása", - "workbench.action.terminal.focusPreviousCommand": "Váltás az előző parancsra", - "workbench.action.terminal.focusNextCommand": "Váltás a következő parancsra", + "workbench.action.terminal.scrollToPreviousCommand": "Görgetés az előző parancshoz", + "workbench.action.terminal.scrollToNextCommand": "Görgetés a következő parancshoz", "workbench.action.terminal.selectToPreviousCommand": "Előző parancs kiválasztása", "workbench.action.terminal.selectToNextCommand": "Következő parancs kiválasztása" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index dc383e1092c..4f60626235a 100644 --- a/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "A munkaterület olyan beállításokat tartalmaz, amelyeket csak a felhasználói beállításoknál lehet megadni (({0}). További információhoz kattintson [ide]({1})!", "openWorkspaceSettings": "Munkaterület beállításainak megnyitása", - "dontShowAgain": "Ne jelenítse meg újra", - "unsupportedWorkspaceSettings": "A munkaterület olyan beállításokat tartalmaz, amelyeket csak a felhasználói beállításoknál lehet megadni (({0}). További információhoz kattintson [ide]({1})!" + "dontShowAgain": "Ne jelenítse meg újra" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/hun/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 150b707b38f..ee159633915 100644 --- a/i18n/hun/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "Később", "releaseNotes": "Kiadási jegyzék", "showReleaseNotes": "Kiadási jegyzék megjelenítése", "read the release notes": "Üdvözöljük a {0} v{1} verziójában. Szeretné megtekinteni a kiadási jegyzéket?", @@ -16,13 +15,14 @@ "updateIsReady": "Új {0}-frissítés érhető el.", "noUpdatesAvailable": "Jelenleg nincs elérhető frissítés.", "ok": "OK", - "download now": "Letöltés most", "thereIsUpdateAvailable": "Van elérhető frissítés.", - "installUpdate": "Frissítés telepítése", + "download now": "Letöltés most", + "later": "Később", "updateAvailable": "Frissítés érhető el: {0} {1}", + "installUpdate": "Frissítés telepítése", "updateInstalling": "{0} {1} a háttérben települ. Jelzünk, ha elkészült.", + "updateAvailableAfterRestart": "A {0} újraindításával telepíthető a legújabb frissítés.", "updateNow": "Frissítés most", - "updateAvailableAfterRestart": "A {0} frissül az újraindítás után.", "commandPalette": "Parancskatalógus...", "settings": "Beállítások", "keyboardShortcuts": "Billentyűparancsok", diff --git a/i18n/hun/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 983527bcdae..d027e8f4428 100644 --- a/i18n/hun/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview-szerkesztő" + "webview.editor.label": "webview-szerkesztő", + "developer": "Fejlesztői" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/hun/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..89f213109cf --- /dev/null +++ b/i18n/hun/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Webview-fejlesztőeszközök megnyitása", + "refreshWebviewLabel": "Webview-k újratöltése" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index e2fd2549371..8e4e5a7201f 100644 --- a/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "Eszközök és nyelvek", "welcomePage.installExtensionPacksDescription": "{0} és {1} fejlesztőkörnyezetek telepítése ", "welcomePage.moreExtensions": "további", - "welcomePage.installKeymapDescription": "Billentyűparancsok telepítése", - "welcomePage.installKeymapExtension": "{0} és {1} billentyűparancsok telepítése ", "welcomePage.others": "további", "welcomePage.colorTheme": "Színtéma", "welcomePage.colorThemeDescription": "Alakítsa át szeretett szerkesztőjét úgy, ahogyan szeretné!", diff --git a/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index dc9b5a6e5f0..2d49c8ecc4a 100644 --- a/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "A beállítások összefoglaló leírása. Ez a címke jelenik meg a beállítások fájlban egy különálló megjegyzésként.", "vscode.extension.contributes.configuration.properties": "A konfigurációs tulajdonságok leírása.", + "scope.application.description": "Alkalmazásspecifikus beállítás, ami csak a felhasználói beállításokban konfigurálható.", "scope.window.description": "Ablakspecifikus beállítás, ami konfigurálható a felhasználói vagy munkaterületi beállításokban.", "scope.resource.description": "Erőforrásspecifikus beállítás, ami beállítható a felhasználói, munkaterületi és mappaszintű beállításokban.", "scope.description": "A hatókör, amire a beállítás vonatkozik. Az elérhető hatókörök: `window` és `resource`.", diff --git a/i18n/hun/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/hun/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..e25641ff799 --- /dev/null +++ b/i18n/hun/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedApplicationSetting": "Ez a beállítás csak a felhasználói beállításokban szerepelhet.", + "unsupportedWindowSetting": "Ez a beállítás jelenleg nem alkalmazható. Akkor van használatban, ha közvetlenül nyitja meg ezt a mappát." +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 4dd179c8823..4eade970e45 100644 --- a/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,16 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolderMultiRoot": "A ${workspaceFolder} értékét nem lehet feloldani egy többmappás munkaterületen. Pontosítsa a változó hatókörét a : karakterrel és a mappa nevének megadásával.", - "canNotResolveWorkspaceFolder": "A ${workspaceFolder} értékét nem lehet feloldani. Nyisson meg egy mappát!", - "canNotResolveFolderBasenameMultiRoot": "A ${workspaceFolderBasename} értékét nem lehet feloldani egy többmappás munkaterületen. Pontosítsa a változó hatókörét a : karakterrel és a mappa nevének megadásával.", - "canNotResolveFolderBasename": "A ${workspaceFolderBasename} értékét nem lehet feloldani. Nyisson meg egy mappát!", - "canNotResolveLineNumber": "A ${lineNumber} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", - "canNotResolveSelectedText": "A ${selectedText} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", - "canNotResolveFile": "A ${file} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", - "canNotResolveRelativeFile": "A ${relativeFile} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", - "canNotResolveFileDirname": "A ${fileDirname} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", - "canNotResolveFileExtname": "A ${fileExtname} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", - "canNotResolveFileBasename": "A ${fileBasename} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!", - "canNotResolveFileBasenameNoExtension": "A ${fileBasenameNoExtension} értékét nem lehet feloldani. Nyisson meg egy szerkesztőablakot!" + "canNotResolveWorkspaceFolder": "A '${workspaceFolder}' értékét nem lehet feloldani. Nyisson meg egy mappát!", + "canNotResolveFolderBasename": "A '${workspaceFolderBasename}' értékét nem lehet feloldani. Nyisson meg egy mappát!" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index e23237d0ba2..87c6a22e435 100644 --- a/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "A kiegészítő gazdafolyamata váratlanul leállt.", "extensionHostProcess.unresponsiveCrash": "A kiegészítő gazdafolyamata le lett állítva, mert nem válaszolt.", - "devTools": "Fejlesztői eszközök", "restart": "Kiegészítő gazdafolyamatának újraindítása", "overwritingExtension": "A(z) {0} kiegészítő felülírása a következővel: {1}.", "extensionUnderDevelopment": "A(z) {0} elérési úton található fejlesztői kiegészítő betöltése", diff --git a/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 3008795a9ef..6db59384b1a 100644 --- a/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,11 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "A működéshez Microsoft .NET-keretrendszer 4.5 szükséges. A telepítéshez kövesse az alábbi hivatkozást!", "installNet": ".NET Framework 4.5 letöltése", "neverShowAgain": "Ne jelenítse meg újra", - "netVersionError": "A működéshez Microsoft .NET-keretrendszer 4.5 szükséges. A telepítéshez kövesse az alábbi hivatkozást!", - "learnMore": "Utasítások", "enospcError": "A {0} nem tudja figyelni a fájlváltozásokat egy ilyen nagy munkaterületen. Kövesse az utasításokat az alábbi hivatkozáson a probléma megoldásához!", + "learnMore": "Utasítások", + "fileInvalidPath": "Érvénytelen fájlerőforrás ({0})", + "fileIsDirectoryError": "A fájl egy könyvtár", + "fileNotModifiedError": "A fájl azóta nem módosult", + "fileTooLargeError": "A fájl túl nagy a megnyitáshoz", + "fileNotFoundError": "Fájl nem található ({0})", + "fileBinaryError": "A fájl binárisnak tűnik és nem nyitható meg szövegként", + "filePermission": "Engedély megtagadva a fájl írására ({0})", + "fileExists": "A létrehozandó fájl már létezik ({0})", + "fileModifiedError": "A fájl azóta módosult", + "fileReadOnlyError": "A fájl csak olvasható", + "fileMoveConflict": "Nem lehet áthelyezni vagy másolni. A fájl már létezik a célhelyen.", + "unableToMoveCopyError": "Nem lehet áthelyezni vagy másolni. A fájl felülírná a mappát, amiben található.", "binFailed": "A következő fájlt nem sikerült a lomtárba helyezni: '{0}'", "trashFailed": "A(z) {0} kukába helyezése nem sikerült" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index cbbafb80120..91e90e2f957 100644 --- a/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Fájl nem található ({0})", "fileIsDirectoryError": "A fájl egy könyvtár", "fileNotModifiedError": "A fájl azóta nem módosult", "fileBinaryError": "A fájl binárisnak tűnik és nem nyitható meg szövegként" diff --git a/i18n/ita/extensions/css/package.i18n.json b/i18n/ita/extensions/css/package.i18n.json index 35229bd6699..5f1a325b6da 100644 --- a/i18n/ita/extensions/css/package.i18n.json +++ b/i18n/ita/extensions/css/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Nozioni di base del linguaggio CSS", + "description": "Offre l'evidenziazione della sintassi e la corrispondenza delle parentesi nei file CSS, LESS e SCSS." } \ No newline at end of file diff --git a/i18n/ita/extensions/emmet/package.i18n.json b/i18n/ita/extensions/emmet/package.i18n.json index 4b669f7fc49..ed7d2e37205 100644 --- a/i18n/ita/extensions/emmet/package.i18n.json +++ b/i18n/ita/extensions/emmet/package.i18n.json @@ -35,7 +35,6 @@ "emmetExtensionsPath": "Percorso di una cartella contenente profili e snippet Emmet.'", "emmetShowExpandedAbbreviation": "Mostra le abbreviazioni Emmet espanse come suggerimenti.\nL'opzione \"inMarkupAndStylesheetFilesOnly\" si applica a html, haml, jade, slim, xml, xsl, css, scss, sass, less e stylus.\nL'opzione \"sempre\" (always) si applica a tutte le parti del file indipendentemente dal markup/css.", "emmetShowAbbreviationSuggestions": "Mostra possibili abbreviazioni Emmet come suggerimenti. Non si applica a fogli di stile o quando emmet.showExpandedAbbreviation è impostata a \"mai\" (never).", - "emmetIncludeLanguages": "Abilita le abbreviazioni Emmet in linguaggi che non sono normalmente supportati. Qui si può aggiungere un mapping tra il linguaggio ed il linguaggio supportato da Emmet.\n Ad esempio: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "Variabili da utilizzare negli snippet Emmet", "emmetTriggerExpansionOnTab": "Se abilitate, le abbreviazioni Emmet vengono espanse quando si preme TAB.", "emmetPreferences": "Preferenze usate per modificare il comportamento di alcune azioni e i resolver di Emmet.", @@ -59,5 +58,6 @@ "emmetPreferencesCssWebkitProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'webkit' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'webkit' impostare stringa vuota.", "emmetPreferencesCssMozProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'moz' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'moz' impostare stringa vuota.", "emmetPreferencesCssOProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'o' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'o' impostare stringa vuota.", - "emmetPreferencesCssMsProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'ms' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'ms' impostare stringa vuota." + "emmetPreferencesCssMsProperties": "Proprietà CSS delimitate da virgola che assumono il prefisso 'ms' del vendor quando utilizzate nelle abbreviazioni di Emmet che iniziano per '-'. Per evitare sempre il prefisso 'ms' impostare stringa vuota.", + "emmetPreferencesCssFuzzySearchMinScore": "Il valore minimo (da 0 a 1) che dovrebbe raggiungere un'abbreviazione di fuzzy-match. I valori più bassi possono produrre molti falsi positivi, i valori più alti possono ridurre le possibili corrispondenze." } \ No newline at end of file diff --git a/i18n/ita/extensions/git/out/commands.i18n.json b/i18n/ita/extensions/git/out/commands.i18n.json index 13f1df3d818..792f4a2d3dd 100644 --- a/i18n/ita/extensions/git/out/commands.i18n.json +++ b/i18n/ita/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "OK", "push with tags success": "Il push con tag è riuscito.", "pick remote": "Selezionare un repository remoto in cui pubblicare il ramo '{0}':", + "sync is unpredictable": "Questa azione consentirà di effettuare il push e il pull di commit da e verso '{0}/[1]'.", "never again": "OK, non visualizzare più", "no remotes to publish": "Il repository non contiene elementi remoti configurati come destinazione della pubblicazione.", "no changes stash": "Non ci sono modifiche da accantonare.", diff --git a/i18n/ita/extensions/git/package.i18n.json b/i18n/ita/extensions/git/package.i18n.json index 24f0b387a00..3e99eceff18 100644 --- a/i18n/ita/extensions/git/package.i18n.json +++ b/i18n/ita/extensions/git/package.i18n.json @@ -77,6 +77,7 @@ "config.showInlineOpenFileAction": "Controlla se visualizzare un'azione Apri file inline nella visualizzazione modifiche GIT.", "config.inputValidation": "Controlla quando visualizzare la convalida sull'input del messaggio di commit.", "config.detectSubmodules": "Controlla se rilevare automaticamente i moduli secondari GIT.", + "config.detectSubmodulesLimit": "Controlla il limite dei sottomoduli git rilevati.", "colors.modified": "Colore delle risorse modificate.", "colors.deleted": "Colore delle risorse eliminate.", "colors.untracked": "Colore delle risorse non tracciate.", diff --git a/i18n/ita/extensions/html/package.i18n.json b/i18n/ita/extensions/html/package.i18n.json index 35229bd6699..9015f75af4c 100644 --- a/i18n/ita/extensions/html/package.i18n.json +++ b/i18n/ita/extensions/html/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Nozioni di base del linguaggio HTML", + "description": "Fornisce l'evidenziazione della sintassi, la corrispondenza delle parentesi & frammenti nei file HTML." } \ No newline at end of file diff --git a/i18n/ita/extensions/json-language-features/package.i18n.json b/i18n/ita/extensions/json-language-features/package.i18n.json index 6ae49c6efe4..2b426a9eac1 100644 --- a/i18n/ita/extensions/json-language-features/package.i18n.json +++ b/i18n/ita/extensions/json-language-features/package.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "Funzionalità del linguaggio JSON", "description": "Fornisce supporto avanzato del linguaggio per i file JSON.", "json.schemas.desc": "Associa schemi a file JSON nel progetto corrente", "json.schemas.url.desc": "URL di uno schema o percorso relativo di uno schema nella directory corrente", diff --git a/i18n/ita/extensions/json/package.i18n.json b/i18n/ita/extensions/json/package.i18n.json index 35229bd6699..d1cf4899cfa 100644 --- a/i18n/ita/extensions/json/package.i18n.json +++ b/i18n/ita/extensions/json/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Nozioni di base del linguaggio JSON", + "description": "Offre l'evidenziazione della sintassi e la corrispondenza delle parentesi nei file JSON." } \ No newline at end of file diff --git a/i18n/ita/extensions/php-language-features/package.i18n.json b/i18n/ita/extensions/php-language-features/package.i18n.json index ea44ea91d9f..b68565b4e5b 100644 --- a/i18n/ita/extensions/php-language-features/package.i18n.json +++ b/i18n/ita/extensions/php-language-features/package.i18n.json @@ -12,5 +12,7 @@ "configuration.validate.run": "Indica se il linter viene eseguito durante il salvataggio o la digitazione.", "configuration.title": "PHP", "commands.categroy.php": "PHP", - "command.untrustValidationExecutable": "Non consentire la convalida di PHP eseguibile (definito come impostazione dell'area di lavoro)" + "command.untrustValidationExecutable": "Non consentire la convalida di PHP eseguibile (definito come impostazione dell'area di lavoro)", + "displayName": "Funzionalità del linguaggio PHP", + "description": "Fornisce supporto avanzato del linguaggio per i file PHP." } \ No newline at end of file diff --git a/i18n/ita/extensions/php/package.i18n.json b/i18n/ita/extensions/php/package.i18n.json index 59850c0a057..6e9f75db20f 100644 --- a/i18n/ita/extensions/php/package.i18n.json +++ b/i18n/ita/extensions/php/package.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Funzionalità del linguaggio PHP" + "description": "Offre l'evidenziazione della sintassi e la corrispondenza delle parentesi nei file PHP." } \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/commands.i18n.json b/i18n/ita/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..ffa2bc44d1e --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Aprire una cartella in Visual Studio Code per usare un progetto TypeScript o JavaScript", + "typescript.projectConfigUnsupportedFile": "Non è stato possibile determinare il progetto TypeScript o JavaScript. Il tipo di file non è supportato", + "typescript.projectConfigCouldNotGetInfo": "Non è stato possibile determinare il progetto TypeScript o JavaScript", + "typescript.noTypeScriptProjectConfig": "Il file non fa parte di un progetto TypeScript. Clicca [qui]({0}) per saperne di più.", + "typescript.noJavaScriptProjectConfig": "Il file non fa parte di un progetto JavaScript. Clicca [qui]({0}) per saperne di più.", + "typescript.configureTsconfigQuickPick": "Configura tsconfig.json", + "typescript.configureJsconfigQuickPick": "Configura jsconfig.json" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..86de96163a7 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Selezionare l'azione codice da applicare", + "acquiringTypingsLabel": "Acquisizione dei file typings...", + "acquiringTypingsDetail": "Acquisizione delle definizioni dei file typings per IntelliSense.", + "autoImportLabel": "Importazione automatica da {0}" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..98bb57ed994 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Attiva il controllo semantico in un file JavaScript. Deve essere all'inizio del file.", + "ts-nocheck": "Disattiva il controllo semantico in un file JavaScript. Deve essere all'inizio del file.", + "ts-ignore": "Elimina errori di @ts-check sulla riga successiva di un file." +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..cd8cac2d81a --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 implementazione", + "manyImplementationLabel": "{0} implementazioni", + "implementationsErrorLabel": "Non è stato possibile determinare le implementazioni" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..2e98125f88d --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "Commento JSDoc" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..40c311f3382 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "Organizza gli Imports" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..9bccba0f7a0 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (Correggi tutti nel file)" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..4c74ac0e94a --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 riferimento", + "manyReferenceLabel": "{0} riferimenti", + "referenceErrorLabel": "Non è stato possibile determinare i riferimenti" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..a5aca9552f5 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "Compila - {0}", + "buildAndWatchTscLabel": "Osserva - {0}" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/ita/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..78e5e160a62 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "Il percorso {0} non punta a un'installazione valida di tsserver. Verrà eseguito il fallback alla versione in bundle di TypeScript.", + "serverCouldNotBeStarted": "Non è stato possibile avviare il server di linguaggio TypeScript. Messaggio di errore: {0}", + "typescript.openTsServerLog.notSupported": "Per la registrazione del server TypeScript è necessario almeno TypeScript 2.2.2", + "typescript.openTsServerLog.loggingNotEnabled": "La registrazione del server TypeScript è disattivata. Per abilitarla, impostare `typescript.tsserver.log` e riavviare il server TypeScript", + "typescript.openTsServerLog.enableAndReloadOption": "Abilita la registrazione e riavvia il server TypeScript", + "typescript.openTsServerLog.noLogFile": "Il server TypeScript non ha avviato la registrazione.", + "openTsServerLog.openFileFailedFailed": "Non è stato possibile aprire il file di log del server TypeScript", + "serverDiedAfterStart": "Il servizio di linguaggio TypeScript è stato arrestato in modo imprevisto per cinque volte dopo che è stato avviato e non verrà riavviato.", + "serverDiedReportIssue": "Segnala problema", + "serverDied": "Il servizio di linguaggio Typescript è stato arrestato in modo imprevisto per cinque volte negli ultimi cinque minuti." +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/ita/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..75f0f394012 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "versione non valida" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/ita/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/ita/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..ad1ac2efcc7 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "Per abilitare le funzionalità del linguaggio JavaScript/TypeScript a livello di progetto, escludere le cartelle che contengono molti file, come {0}", + "hintExclude.generic": "Per abilitare le funzionalità del linguaggio JavaScript/TypeScript a livello di progetto, escludere le cartelle di grandi dimensioni che contengono file di origine su cui non si lavora.", + "large.label": "Configura esclusioni", + "hintExclude.tooltip": "Per abilitare le funzionalità del linguaggio JavaScript/TypeScript a livello di progetto, escludere le cartelle di grandi dimensioni che contengono file di origine su cui non si lavora." +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/ita/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..78cf90b25ab --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Recupero dei dati per ottimizzare IntelliSense in TypeScript", + "typesInstallerInitializationFailed.title": "Non è stato possibile installare i file di definizione tipi per le funzionalità del linguaggio JavaScript. Verificare che NPM sia installato e o configurare 'typescript.npm' nelle impostazioni utente. Clicca [qui]({0}) per saperne di più.", + "typesInstallerInitializationFailed.doNotCheckAgain": "Non visualizzare più questo messaggio" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/ita/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..c0e18983544 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "Usa versione di VS Code", + "useWorkspaceVersionOption": "Usa versione dell'area di lavoro", + "learnMore": "Altre informazioni", + "selectTsVersion": "Selezionare la versione di TypeScript usata per le funzionalità del linguaggio JavaScript e TypeScript" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/ita/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..385cbc61377 --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "Non è stato possibile caricare la versione di TypeScript in questo percorso", + "noBundledServerFound": "Il file tsserver di VS Code è stato eliminato da un'altra applicazione, ad esempio uno strumento di rilevamento virus che non funziona correttamente. Reinstallare VS Code." +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript-language-features/package.i18n.json b/i18n/ita/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..9329475d6ab --- /dev/null +++ b/i18n/ita/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,57 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Funzionalità dei linguaggi TypeScript e JavaScript", + "description": "Fornisce un supporto avanzato per JavaScript e TypeScript", + "typescript.reloadProjects.title": "Ricarica progetto", + "javascript.reloadProjects.title": "Ricarica progetto", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Completare le funzioni con la relativa firma del parametro.", + "typescript.tsdk.desc": "Specifica il percorso della cartella che contiene i file tsserver e lib*.d.ts da usare.", + "typescript.disableAutomaticTypeAcquisition": "Disabilita l'acquisizione automatica del tipo. Richiede TypeScript >= 2.0.6.", + "typescript.tsserver.log": "Abilita la registrazione del server TypeScript in un file. Questo registro può essere utilizzato per diagnosticare problemi del server TypeScript. Il registro può contenere percorsi di file, codice sorgente e altre informazioni del progetto potenzialmente riservate. ", + "typescript.tsserver.trace": "Abilita la traccia dei messaggi inviati al server TypeScript. Questa traccia può essere utilizzata per diagnosticare problemi del server TypeScript. La traccia può contenere percorsi di file, codice sorgente e altre informazioni del progetto potenzialmente riservate.", + "typescript.validate.enable": "Abilita/Disabilita la convalida TypeScript.", + "typescript.format.enable": "Abilita/Disabilita il formattatore TypeScript predefinito.", + "javascript.format.enable": "Abilita/Disabilita il formattatore JavaScript predefinito.", + "format.insertSpaceAfterCommaDelimiter": "Consente di definire la gestione dello spazio dopo una virgola di delimitazione6", + "format.insertSpaceAfterConstructor": "Definisce la gestione dello spazio dopo la parola chiave constructor. Richiede TypeScript >= 2.3.0.", + "format.insertSpaceAfterSemicolonInForStatements": " Consente di definire la gestione dello spazio dopo un punto e virgola in un'istruzione for.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Consente di definire la gestione dello spazio dopo un operatore binario.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Consente di definire la gestione dello spazio dopo le parole chiave in un'istruzione del flusso di controllo.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Consente di definire la gestione dello spazio dopo la parola chiave function per funzioni anonime.", + "format.insertSpaceBeforeFunctionParenthesis": "Consente di definire la gestione dello spazio prima delle parentesi dell'argomento della funzione. Richiede TypeScript >= 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Consente di definire la gestione dello spazio dopo la parentesi graffa iniziale e prima della parentesi graffa finale della stringa del modello. Richiede TypeScript >= 2.0.6", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Consente di definire la gestione dello spazio dopo la parentesi graffa iniziale e prima della parentesi graffa finale dell'espressione JSX. Richiede TypeScript >= 2.0.6", + "format.insertSpaceAfterTypeAssertion": "Definisce la gestione dello spazio dopo le asserzioni di tipo in TypeScript. Richiede TypeScript >= 2.4.", + "format.placeOpenBraceOnNewLineForFunctions": "Consente di definire se una parentesi graffa di apertura viene o meno inserita su una riga per le funzioni.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Consente di definire se una parentesi graffa di apertura viene o meno inserita su una riga per i blocchi di controllo.", + "javascript.validate.enable": "Abilita/Disabilita la convalida JavaScript.", + "typescript.goToProjectConfig.title": "Passa a Configurazione progetto", + "javascript.goToProjectConfig.title": "Passa a Configurazione progetto", + "javascript.referencesCodeLens.enabled": "Abilita/disabilita riferimenti CodeLens nei file JavaScript.", + "typescript.referencesCodeLens.enabled": "Abilita/disabilita riferimenti CodeLens nei file TypeScript. Richiede TypeScript >= 2.0.6.", + "typescript.implementationsCodeLens.enabled": "Abilita/Disabilita le finestre CodeLens per le implementazioni. Richiede una versione di TypeScript uguale o successiva alla 2.2.0.", + "typescript.openTsServerLog.title": "Apri il log del server TypeScript", + "typescript.restartTsServer": "Riavvia server TS", + "typescript.selectTypeScriptVersion.title": "Seleziona la versione di TypeScript", + "typescript.reportStyleChecksAsWarnings": "Evidenzia i controlli di stile come warning", + "jsDocCompletion.enabled": "Abilita/Disabilita commenti automatici JSDoc", + "javascript.implicitProjectConfig.checkJs": "Abilita/disabilita il controllo semantico di file JavaScript. File jsconfig.json o tsconfig.json esistenti sovrascrivono su questa impostazione. Richiede TypeScript >= 2.3.1.", + "typescript.npm": "Specifica il percorso dell'eseguibile NPM utilizzato per l'acquisizione automatica delle definizioni di tipi. Richiede TypeScript >= 2.3.4.", + "typescript.check.npmIsInstalled": "Controlla se NPM è installato per l'acquisizione automatica delle definizioni di tipi", + "javascript.nameSuggestions": "Abilita/disabilita l'inclusione di nomi univoci dal file negli elenchi di suggerimento di JavaScript.", + "typescript.tsc.autoDetect": "Controlla l'auto-rilevazione di attività di tsc. 'off' disabilita questa funzionalità. 'build' crea solo attività di singola compilazione esecuzione. 'watch' crea solo attività di compilazione e controllo. 'on' crea attività sia di tipo 'build' che 'watch'. Il valore predefinito è 'on'.", + "typescript.problemMatchers.tsc.label": "Problemi TypeScript", + "typescript.problemMatchers.tscWatch.label": "Problemi TypeScript (modalità espressione di controllo)", + "typescript.locale": "Assegna le impostazioni internazionali utilizzate per riportare errori TypeScript. Richiede TypeScript > = 2.6.0. Il valore predefinito 'null' utilizza le impostazioni internazionali di VS Code.", + "javascript.implicitProjectConfig.experimentalDecorators": "Abilita/disabilita 'experimentalDecorators' per i file JavaScript che non fanno parte di un progetto. File jsconfig.json o tsconfig.json esistenti ignorano questa impostazione. Richiede TypeScript >= 2.3.1.", + "typescript.autoImportSuggestions.enabled": "Abilita/Disabilita suggerimenti importazione automatica. Richiede una versione di TypeScript >= 2.6.1", + "typescript.experimental.syntaxFolding": "Abilita/disabilita i marcatori di folding con riconoscimento della sintassi.", + "taskDefinition.tsconfig.description": "File tsconfig che definisce la compilazione TS." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/base/node/processes.i18n.json b/i18n/ita/src/vs/base/node/processes.i18n.json index 15d77305511..35229bd6699 100644 --- a/i18n/ita/src/vs/base/node/processes.i18n.json +++ b/i18n/ita/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "Non è possibile eseguire un comando della shell su un'unità UNC." + ] } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 2b9d73ba3f9..0cbefebbb8f 100644 --- a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -11,7 +11,6 @@ "similarIssues": "Problemi simili", "open": "Apri", "closed": "Chiuso", - "noResults": "Non sono stati trovati risultati", "settingsSearchIssue": "Problema di ricerca impostazioni", "bugReporter": "Segnalazione bug", "featureRequest": "Richiesta di funzionalità", diff --git a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index bd90ead3d7e..d087b3cb7c7 100644 --- a/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/ita/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,9 @@ ], "completeInEnglish": "Completare il modulo in lingua inglese.", "issueTypeLabel": "Questo è un", + "vscode": "Visual Studio Code", + "disableExtensions": "disabilitando tutte le estensioni e ricaricando la finestra", + "chooseExtension": "Estensione", "issueTitleLabel": "Titolo", "issueTitleRequired": "Immettere un titolo.", "titleLengthValidation": "Il titolo è troppo lungo.", @@ -18,13 +21,6 @@ "extensions": "Estensioni personali", "searchedExtensions": "Estensioni cercate", "settingsSearchDetails": "Dettagli ricerca impostazioni", - "tryDisablingExtensions": "Il problema è riproducibile quando le estensioni sono disabilitate?", - "yes": "Sì", - "no": "No", - "disableExtensionsLabelText": "Provare a riprodurre il problema dopo {0}.", - "disableExtensions": "disabilitando tutte le estensioni e ricaricando la finestra", - "showRunningExtensionsLabelText": "Se si sospetta che il problema sia relativo all'estensione, {0} per segnalare il problema.", - "showRunningExtensions": "visualizzare tutte le estensioni in esecuzione", "details": "Immettere i dettagli.", "loadingData": "Caricamento dei dati..." } \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..d72487d0df2 --- /dev/null +++ b/i18n/ita/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Nome" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json index 33f8c847059..f77cf818806 100644 --- a/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/ita/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Chiudi", - "header": "Differenza {0} di {1}: originali {2}, {3} righe, modificate {4}, righe {5}", "blankLine": "vuota", "equalLine": "originali {0}, modificate {1}: {2}", "insertLine": "+ modificate {0}: {1}", diff --git a/i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index e88f3f97e71..214bd3b8cab 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "Rappresenta il tasto 'Control' (ctrl) su Windows e Linux e il tasto 'Comando' (cmd) su OSX.", "multiCursorModifier.alt": "Rappresenta il tasto 'Alt' su Windows e Linux e il tasto 'Opzione' su OSX.", "multiCursorModifier": "Il modificatore da utilizzare per aggiungere molteplici cursori con il mouse. 'ctrlCmd' rappresenta il tasto 'Control' su Windows e Linux e il tasto 'Comando' su OSX. I gesti del mouse Vai a definizione e Apri il Link si adatteranno in modo da non entrare in conflitto con il modificatore multi-cursore.", + "multiCursorMergeOverlapping": "Unire i cursori multipli se sovrapposti.", "quickSuggestions.strings": "Abilita i suggerimenti rapidi all'interno di stringhe.", "quickSuggestions.comments": "Abilita i suggerimenti rapidi all'interno di commenti.", "quickSuggestions.other": "Abilita i suggerimenti rapidi all'esterno di stringhe e commenti.", diff --git a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json index 75512d966b7..8456c0eb96c 100644 --- a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "Colore delle guide per i rientri dell'editor.", "editorLineNumbers": "Colore dei numeri di riga dell'editor.", "editorActiveLineNumber": "Colore dei numeri per la riga attiva dell'editor", + "deprecatedEditorActiveLineNumber": "Id è deprecato. In alternativa utilizzare 'editorLineNumber.activeForeground'.", "editorRuler": "Colore dei righelli dell'editor.", "editorCodeLensForeground": "Colore primo piano delle finestre di CodeLens dell'editor", "editorBracketMatchBackground": "Colore di sfondo delle parentesi corrispondenti", @@ -28,6 +29,9 @@ "warningBorder": "Colore del bordo degli squggle di avviso nell'editor.", "infoForeground": "Colore primo piano degli squiggle di informazione nell'editor", "infoBorder": "Colore del bordo degli squiggle di informazione nell'editor", + "hintForeground": "Colore primo piano degli squiggle di suggerimento nell'editor.", + "hintBorder": "Colore del bordo degli squiggle di suggerimento nell'editor.", + "overviewRulerRangeHighlight": "Colore del marcatore righello panoramica per evidenziazione intervalli. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", "overviewRuleError": "Colore del marcatore del righello delle annotazioni per gli errori.", "overviewRuleWarning": "Colore del marcatore del righello delle annotazioni per gli avvisi.", "overviewRuleInfo": "Colore del marcatore del righello delle annotazioni per i messaggi di tipo informativo." diff --git a/i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..d3f4c9834ab --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Mostra correzioni ({0})", + "quickFix": "Mostra correzioni", + "organizeImports.label": "Organizza gli Imports" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/ita/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index 35229bd6699..af44bbbb9ea 100644 --- a/i18n/ita/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -5,5 +5,43 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "Sunday": "Domenica", + "Monday": "Lunedì", + "Tuesday": "Martedì", + "Wednesday": "Mercoledì", + "Thursday": "Giovedì", + "Friday": "Venerdì", + "Saturday": "Sabato", + "SundayShort": "Dom", + "MondayShort": "Lun", + "TuesdayShort": "Mar", + "WednesdayShort": "Mer", + "ThursdayShort": "Gio", + "FridayShort": "Ven", + "SaturdayShort": "Sab", + "January": "Gennaio", + "February": "Febbraio", + "March": "Marzo", + "April": "Aprile", + "May": "Maggio", + "June": "Giugno", + "July": "Luglio", + "August": "Agosto", + "September": "Settembre", + "October": "Ottobre", + "November": "Novembre", + "December": "Dicembre", + "JanuaryShort": "Gen", + "FebruaryShort": "Feb", + "MarchShort": "Mar", + "AprilShort": "Apr", + "MayShort": "Mag", + "JuneShort": "Giu", + "JulyShort": "Lug", + "AugustShort": "Ago", + "SeptemberShort": "Set", + "OctoberShort": "Ott", + "NovemberShort": "Nov", + "DecemberShort": "Dic" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json index 1ce97a983c4..e0d29249698 100644 --- a/i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -10,6 +10,8 @@ "wordHighlightStrong": "Colore di sfondo di un simbolo durante l'accesso in scrittura, per esempio durante la scrittura di una variabile. Il colore non deve essere opaco per evitare di nascondere le decorazioni sottostanti.", "wordHighlightBorder": "Colore del bordo di un simbolo durante l'accesso in lettura, ad esempio durante la lettura di una variabile.", "wordHighlightStrongBorder": "Colore del bordo di un simbolo durante l'accesso in scrittura, ad esempio durante la scrittura in una variabile.", + "overviewRulerWordHighlightForeground": "Colore del marcatore righello panoramica per evidenziazione simboli. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", + "overviewRulerWordHighlightStrongForeground": "Colore del marcatore righello panoramica per evidenziazione simboli con accesso in scrittura. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", "wordHighlight.next.label": "Vai al prossimo simbolo evidenziato", "wordHighlight.previous.label": "Vai al precedente simbolo evidenziato" } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json index e75bcb71ed2..320bbcac4d1 100644 --- a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "Eseguire l'avvio con il comando 'Developer: Startup Performance' abilitato.", "prof-startup": "Esegui il profiler della CPU durante l'avvio", "disableExtensions": "Disabilita tutte le estensioni installate.", - "inspect-extensions": "Consentire il debug e profiling delle estensioni. Controllare gli strumenti di sviluppo per l'uri di connessione.", - "inspect-brk-extensions": "Consentire il debug e profiling delle estensioni con l'host di estensione in pausa dopo inizio. Controllare gli strumenti di sviluppo per l'uri di connessione.", "disableGPU": "Disabilita l'accelerazione hardware della GPU.", "uploadLogs": "Caricamento dei log della sessione corrente verso un punto di comunicazione sicuro.", "maxMemory": "Dimensione massima della memoria per una finestra (in Mbytes).", diff --git a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 91d39114cd9..87d656a3dd0 100644 --- a/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ita/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -14,12 +14,15 @@ "errorInstallingDependencies": "Errore durante l'installazione delle dipendenze. {0}", "MarketPlaceDisabled": "Il Marketplace non è abilitato", "removeError": "Errore durante la rimozione dell'estensione: {0}. Chiudere e riavviare VS Code prima di riprovare.", + "Not a Marketplace extension": "Solo le Estensioni del Marketplace possono essere reinstallate", "notFoundCompatible": "Impossibile installare '{0}'; non è presente alcuna versione compatibile con VS Code '{1}'.", "malicious extension": "Non è possibile installare l'estensione poiché è stata segnalata come problematica.", "notFoundCompatibleDependency": "Impossibile installare perché non è stata trovata l'estensione dipendente '{0}' compatibile con la versione corrente '{1}' di VS Code.", "quitCode": "Impossibile installare l'estensione. Riavviare VS Code prima di procedere ad un nuovo setup.", "exitCode": "Impossibile installare l'estensione. Riavviare VS Code prima di procedere ad un nuovo setup.", "uninstallDependeciesConfirmation": "Disinstallare solo '{0}' o anche le relative dipendenze?", + "uninstallOnly": "Solo Estensioni", + "uninstallAll": "Disinstalla tutti", "uninstallConfirmation": "Disinstallare '{0}'?", "ok": "OK", "singleDependentError": "Non è possibile disinstallare l'estensione '{0}'. L'estensione '{1}' dipende da tale estensione.", diff --git a/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json index dc710b846d6..1a38b9222de 100644 --- a/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/ita/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "Non è stato possibile analizzare il valore {0} di `engines.vscode`. Usare ad esempio: ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x e così via.", "versionSpecificity1": "La versione specificata in `engines.vscode` ({0}) non è abbastanza specifica. Per le versioni di vscode precedenti alla 1.0.0, definire almeno le versioni principale e secondaria desiderate, ad esempio ^0.10.0, 0.10.x, 0.11.0 e così via.", "versionSpecificity2": "La versione specificata in `engines.vscode` ({0}) non è abbastanza specifica. Per le versioni di vscode successive alla 1.0.0, definire almeno la versione principale desiderata, ad esempio ^1.10.0, 1.10.x, 1.x.x, 2.x.x e così via.", "versionMismatch": "L'estensione non è compatibile con Visual Studio Code {0}. Per l'estensione è richiesto: {1}." diff --git a/i18n/ita/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/ita/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index 60001870a37..7abef1dc4df 100644 --- a/i18n/ita/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/ita/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "L'installazione di {0} sembra danneggiata. Reinstallare.", "integrity.moreInformation": "Altre informazioni", - "integrity.dontShowAgain": "Non visualizzare più questo messaggio", - "integrity.prompt": "L'installazione di {0} sembra danneggiata. Reinstallare." + "integrity.dontShowAgain": "Non visualizzare più questo messaggio" } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/list/browser/listService.i18n.json b/i18n/ita/src/vs/platform/list/browser/listService.i18n.json index adf48cd06e8..8a43e89f813 100644 --- a/i18n/ita/src/vs/platform/list/browser/listService.i18n.json +++ b/i18n/ita/src/vs/platform/list/browser/listService.i18n.json @@ -12,5 +12,6 @@ "multiSelectModifier": "Modificatore da usare per aggiungere un elemento in alberi ed elenchi a una selezione multipla con il mouse (ad esempio editor aperti e visualizzazione Gestione controllo servizi in Esplora risorse). 'ctrlCmd' rappresenta il tasto 'CTRL' in Windows e Linux e il tasto 'Cmd' in OSX. I gesti del mouse Apri lateralmente, se supportati, si adatteranno in modo da non entrare in conflitto con il modificatore di selezione multipla.", "openMode.singleClick": "Apre elementi facendo un singolo clic col mouse.", "openMode.doubleClick": "Apre elementi facendo doppio clic col mouse.", - "openModeModifier": "Controlla la modalità di apertura degli elementi in alberi ed elenchi con il mouse, se supportata. Impostare su `singleClick` per aprire gli elementi con un unico clic del mouse e `doubleClick` per aprirli solo se viene fatto doppio clic. Per gli elementi padre con elementi figlio negli alberi, questa impostazione controllerà se per espandere l'elemento padre è necessario fare clic una sola volta o fare doppio clic. Tenere presente che alcuni alberi ed elenchi potrebbero scegliere di ignorare questa impostazione se non è applicabile. " + "openModeModifier": "Controlla la modalità di apertura degli elementi in alberi ed elenchi con il mouse, se supportata. Impostare su `singleClick` per aprire gli elementi con un unico clic del mouse e `doubleClick` per aprirli solo se viene fatto doppio clic. Per gli elementi padre con elementi figlio negli alberi, questa impostazione controllerà se per espandere l'elemento padre è necessario fare clic una sola volta o fare doppio clic. Tenere presente che alcuni alberi ed elenchi potrebbero scegliere di ignorare questa impostazione se non è applicabile. ", + "horizontalScrolling setting": "Controlla se gli alberi supportano lo scorrimento orizzontale in workbench." } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index 2e5c4543ebf..ff2aecc6fe1 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -92,5 +92,7 @@ "mergeBorder": "Colore bordo su intestazioni e sulla barra di divisione di conflitti di merge in linea.", "overviewRulerCurrentContentForeground": "Colore primo piano righello panoramica attuale per i conflitti di merge in linea.", "overviewRulerIncomingContentForeground": "Colore primo piano del righello panoramica modifiche in arrivo per i conflitti di merge in linea.", - "overviewRulerCommonContentForeground": "Colore primo piano righello panoramica dell'antenato comune per i conflitti di merge in linea." + "overviewRulerCommonContentForeground": "Colore primo piano righello panoramica dell'antenato comune per i conflitti di merge in linea.", + "overviewRulerFindMatchForeground": "Colore del marcatore righello panoramica per trovare corrispondenze. Il colore non deve essere opaco per non nascondere decorazioni sottostanti.", + "overviewRulerSelectionHighlightForeground": "Colore del marcatore righello panoramica per evidenziazione selezioni. Il colore non deve essere opaco per non nascondere decorazioni sottostanti." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..490942db41e --- /dev/null +++ b/i18n/ita/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "la proprietà `{0}` è obbligatoria e deve essere di tipo `string`", + "showViewlet": "Mostra {0}", + "view": "Visualizza" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index e630b27b6a6..bad682f1630 100644 --- a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Contribuisce visualizzazioni all'editor", "views.explorer": "Visualizzazione di esplorazione", "views.debug": "Visualizzazione Debug", - "locationId.invalid": "'{0}' non è una posizione valida per la visualizzazione", "duplicateView1": "Non è possibile registrare più visualizzazioni con stesso ID `{0}` nel percorso `{1}`", "duplicateView2": "Nel percorso `{1}` è già registrata una visualizzazione con ID `{0}` " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 8488ca775b8..ac0f699ab1e 100644 --- a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "Comando Formatta dopo salvataggio interrotto dopo {0} ms", + "timeout.onWillSave": "Evento onWillSaveTextDocument interrotto dopo 1750 ms", "saveParticipants": "Esecuzione del salvataggio partecipanti..." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 6162c44dea8..35229bd6699 100644 --- a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "webview.editor.label": "editor Webview" + ] } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/node/extHostProgress.i18n.json b/i18n/ita/src/vs/workbench/api/node/extHostProgress.i18n.json index 35229bd6699..04c3870e62b 100644 --- a/i18n/ita/src/vs/workbench/api/node/extHostProgress.i18n.json +++ b/i18n/ita/src/vs/workbench/api/node/extHostProgress.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "extensionSource": "{0} (estensione)" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 6469f13b9ec..00854b582f8 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,6 @@ "screenReaderDetectedExtra": "Se non si utilizza un'utilità per la lettura dello schermo, si prega di impostare 'editor.accessibilitySupport' a \"off\".", "disableTabMode": "Disabilita modalità accessibilità", "gotoLine": "Vai alla riga", - "indentation": "Rientro", "selectEncoding": "Seleziona codifica", "selectEOL": "Seleziona sequenza di fine riga", "selectLanguageMode": "Seleziona modalità linguaggio", diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 46399326736..7d190d76980 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,7 @@ "sizeMB": "{0} MB", "sizeGB": "{0} GB", "sizeTB": "{0} TB", - "largeImageError": "Le dimensioni del file dell'immagine sono eccessive (maggiori di 1 MB) per la visualizzazione nell'editor. ", "resourceOpenExternalButton": "Aprire l'immagine utilizzando un programma esterno?", - "nativeBinaryError": "Il file non verrà visualizzato nell'editor perché è binario, è molto grande o usa una codifica testo non supportata.", "zoom.action.fit.label": "Immagine intera", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json index 40f3e83a7db..a203ffaf2a0 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "notificationsEmpty": "Nessuna nuova notifica", "notifications": "Notifiche", "notificationsToolbar": "Azioni del centro notifiche", "notificationsList": "Elenco notifiche" diff --git a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..bcdf56e4849 --- /dev/null +++ b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index e548589e82c..b0716c351ce 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,10 +45,17 @@ "windowConfigurationTitle": "Finestra", "window.openFilesInNewWindow.on": "I file verranno aperti in una nuova finestra", "window.openFilesInNewWindow.off": "I file verranno aperti nella finestra con la cartella dei file aperta o nell'ultima finestra attiva", + "window.openFilesInNewWindow.defaultMac": "I file verranno aperti nella finestra con la cartella dei file aperta o nell'ultima finestra attiva a meno che non vengano aperti tramite il pannello Dock o da Finder", + "window.openFilesInNewWindow.default": "I file verranno aperti in una nuova finestra a meno che non vengano selezionati all'interno dell'applicazione, ad esempio tramite il menu File", + "openFilesInNewWindowMac": "Controlla se i file devono essere aperti in una nuova finestra.\n- default: i file verranno aperti nella finestra con la cartella dei file aperta o nell'ultima finestra attiva a meno che non vengano aperti tramite il pannello Dock o da Finder\n- on: i file verranno aperti in una nuova finestra\n- off: i file verranno aperti nella finestra con la cartella dei file aperta o nell'ultima finestra attiva\nNota: possono comunque verificarsi casi in cui questa impostazione viene ignorata, ad esempio quando si usa l'opzione della riga di comando -new-window o -reuse-window.", + "openFilesInNewWindow": "Controlla se i file devono essere aperti in una nuova finestra.\n- default: i file verranno aperti in una nuova finestra a meno che non vengano selezionati all'interno dell'applicazione, ad esempio tramite il menu File\n- on: i file verranno aperti in una nuova finestra\n- off: i file verranno aperti nella finestra con la cartella dei file aperta o nell'ultima finestra attiva\nNota: possono comunque verificarsi casi in cui questa impostazione viene ignorata, ad esempio quando si usa l'opzione della riga di comando -new-window o -reuse-window.", "window.openFoldersInNewWindow.on": "Le cartelle verranno aperte in una nuova finestra", "window.openFoldersInNewWindow.off": "Le cartelle sostituiranno l'ultima finestra attiva", "window.openFoldersInNewWindow.default": "Le cartelle verranno aperte in una nuova finestra a meno che non si selezioni una cartella dall'interno dell'applicazione, ad esempio tramite il menu File", "openFoldersInNewWindow": "Controlla se le cartelle devono essere aperte in una nuova finestra o sostituire l'ultima finestra attiva.\n- default: le cartelle verranno aperte in una nuova finestra a meno che non si selezioni una cartella dall'interno dell'applicazione, ad esempio tramite il menu File\n- on: le cartelle verranno aperte in una nuova finestra\n- off: le cartelle sostituiranno l'ultima finestra attiva\nNota: possono comunque verificarsi casi in cui questa impostazione viene ignorata, ad esempio quando si usa l'opzione della riga di comando -new-window o -reuse-window.", + "window.openWithoutArgumentsInNewWindow.on": "Apri una nuova finestra vuota", + "window.openWithoutArgumentsInNewWindow.off": "Imposta lo stato attivo sull'ultima istanza in esecuzione attiva", + "openWithoutArgumentsInNewWindow": "Controlla se deve essere aperta una nuova finestra vuota quando si avvia una seconda istanza senza argomento o se è necessario impostare lo stato attivo sull'ultima istanza in esecuzione.\n- on: apre una nuova finestra vuota\n- off: imposta lo stato attivo sull'ultima istanza in esecuzione attiva\nNota: possono comunque verificarsi casi in cui questa impostazione viene ignorata, ad esempio quando si usa l'opzione della riga di comando -new-window o -reuse-window.", "window.reopenFolders.all": "Riapre tutte le finestre.", "window.reopenFolders.folders": "Riapre tutte le cartelle. Le aree di lavoro vuote non verranno ripristinate.", "window.reopenFolders.one": "Riapre l'ultima finestra attiva.", @@ -56,6 +63,7 @@ "restoreWindows": "Controlla la modalità di riapertura delle finestre dopo un riavvio. Selezionare 'none' per iniziare sempre con un'area di lavoro vuota, 'one' per riaprire l'ultima finestra usata, 'folders' per riaprire tutte le finestre con cartelle aperte oppure 'all' per riaprire tutte le finestre dell'ultima sessione.", "restoreFullscreen": "Controlla se una finestra deve essere ripristinata a schermo intero se è stata chiusa in questa modalità.", "zoomLevel": "Consente di modificare il livello di zoom della finestra. Il valore originale è 0 e ogni incremento superiore (ad esempio 1) o inferiore (ad esempio -1) rappresenta un aumento o una diminuzione del 20% della percentuale di zoom. È anche possibile immettere valori decimali per modificare il livello di zoom con maggiore granularità.", + "title": "Controlla il titolo della finestra in base all'editor attivo. Le variabili vengono sostituite in base al contesto:\n${activeEditorShort}: nome del file (ad es. MyFile.txt)\n${activeEditorMedium}: percorso del file relativo alla cartella dell'area di lavoro (ad es. myFolder/myFile.txt)\n${activeEditorLong}: percorso completo del file (ad es. / Users/Development/myProject/myFolder/myFile.txt)\n${folderName}: nome della cartella dell'area di lavoro in cui è contenuto il file (ad es. myFolder)\n${folderPath}: percorso della cartella dell'area di lavoro in cui è contenuto il file (ad es. /Users/Development/myFolder)\n${rootName}: nome dell'area di lavoro (ad es. myFolder o myWorkspace)\n${rootPath}: percorso dell'area di lavoro (ad es. /Users/Development/myWorkspace)\n$(appName): ad esempio VS Code\n${dirty}: indica se l'editor attivo è in fase di modifica\n${separator}: separatore condizionale (\" - \") che viene visualizzato solo quando circondato da variabili con valori o testo statico", "window.newWindowDimensions.default": "Apre nuove finestre al centro della schermata.", "window.newWindowDimensions.inherit": "Apre nuove finestre le cui dimensioni sono uguali a quelle dell'ultima finestra attiva.", "window.newWindowDimensions.maximized": "Apre nuove finestre ingrandite a schermo intero.", @@ -71,6 +79,7 @@ "autoDetectHighContrast": "Se è abilitata, passa automaticamente a un tema a contrasto elevato se Windows usa un tema di questo tipo e al tipo scuro quando non si usa più un tema a contrasto elevato Windows.", "titleBarStyle": "Consente di modificare l'aspetto della barra del titolo della finestra. Per applicare le modifiche, è necessario un riavvio completo.", "window.nativeTabs": "Abilita le finestre di tab per macOS Sierra. La modifica richiede un riavvio. Eventuali personalizzazioni della barra del titolo verranno disabilitate", + "window.smoothScrollingWorkaround": "Abilitare questa soluzione alternativa se lo scorrimento non è più fluido dopo il ripristino di una finestra di VS Code ridotta a icona. Si tratta di una soluzione alternativa per un problema (https://github.com/Microsoft/vscode/issues/13612) in cui si verificano ritardi nello scorrimento in dispositivi con trackpad di precisione, come quelli Surface di Microsoft. Se si abilita questa soluzione alternativa, si potrebbe riscontrare un certo sfarfallio del layout dopo aver ripristinato la finestra ridotta a icona alle dimensioni normali, ma in altre situazioni non produce alcun effetto negativo.", "zenModeConfigurationTitle": "Modalità Zen", "zenMode.fullScreen": "Consente di controllare se attivando la modalità Zen anche l'area di lavoro passa alla modalità schermo intero.", "zenMode.centerLayout": "Controlla se attivando la modalità Zen viene centrato anche il layout.", diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 5e7acab8dbe..e07e9f6101f 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Modifica punto di interruzione...", + "breakpoint": "Punto di interruzione", "functionBreakpointsNotSupported": "Punti di interruzione delle funzioni non sono supportati da questo tipo di debug", "functionBreakpointPlaceholder": "Funzione per cui inserire il punto di interruzione", "functionBreakPointInputAriaLabel": "Digitare il punto di interruzione della funzione", @@ -14,6 +14,7 @@ "breakpointUnverifieddHover": "Punto di interruzione non verificato", "functionBreakpointUnsupported": "Punti di interruzione di funzione non supportati da questo tipo di debug", "breakpointDirtydHover": "Punto di interruzione non verificato. Il file è stato modificato. Riavviare la sessione di debug.", + "logBreakpointUnsupported": "Punti di registrazione non supportati da questo tipo di debug", "conditionalBreakpointUnsupported": "Punti di interruzione condizionali non supportati da questo tipo di debug", "hitBreakpointUnsupported": "Sono stati raggiunti punti di interruzione condizionali non supportati da questo tipo di debug" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index f7b3467296b..d7d5ae4ad86 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "Debug: Attiva/Disattiva punto di interruzione", "conditionalBreakpointEditorAction": "Debug: Aggiungi Punto di interruzione condizionale...", + "logPointEditorAction": "Debug: Aggiungi punto di registrazione...", "runToCursor": "Esegui fino al cursore", "debugEvaluate": "Debug: Valuta", "debugAddToWatch": "Debug: Aggiungi a espressione di controllo", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 885d74b575b..330aaf0d3a7 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,7 @@ ], "breakpointWidgetHitCountPlaceholder": "Interrompe quando viene soddisfatta la condizione del numero di passaggi. Premere 'INVIO' per accettare oppure 'ESC' per annullare.", "breakpointWidgetExpressionPlaceholder": "Interrompe quando l'espressione restituisce true. Premere 'INVIO' per accettare oppure 'ESC' per annullare.", - "breakpointWidgetHitCountAriaLabel": "Il programma si arresterà in questo punto solo se viene raggiunto il numero di passaggi. Premere INVIO per accettare oppure ESC per annullare.", - "breakpointWidgetAriaLabel": "Il programma si arresterà in questo punto solo se la condizione è vera. Premere INVIO per accettare oppure ESC per annullare.", "expression": "Espressione", - "hitCount": "Numero di passaggi" + "hitCount": "Numero di passaggi", + "logMessage": "Messaggio di log" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 74e055397e3..1655f90169c 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "Usare nomi di configurazione univoci.", "app.launch.json.compound.folder": "Nome della cartella in cui si trova l'elemento compounds.", "app.launch.json.compounds.configurations": "Nomi delle configurazioni che verranno avviate per questo elemento compounds.", - "debugNoType": "L'adattatore di debug 'type' non può essere omesso e deve essere di tipo 'string'.", "selectDebug": "Seleziona ambiente", "DebugConfig.failed": "Non è possibile creare il file 'launch.json' all'interno della cartella '.vscode' ({0}).", "workspace": "area di lavoro", diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 171d99b96d1..423e65922d9 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Modifica punto di interruzione...", - "disableBreakpoint": "Disabilita punto di interruzione", - "enableBreakpoint": "Abilita punto di interruzione", + "breakpoint": "Punto di interruzione", "removeBreakpoints": "Rimuovi punti di interruzione", "removeBreakpointOnColumn": "Rimuovi punto di interruzione a colonna {0}", "removeLineBreakpoint": "Rimuovi punto di interruzione riga", @@ -21,6 +19,8 @@ "enableBreakpoints": "Abilita punto di interruzione a colonna {0}", "enableBreakpointOnLine": "Abilita punto di interruzione riga", "addBreakpoint": "Aggiungi punto di interruzione", - "conditionalBreakpoint": "Aggiungi punto di interruzione condizionale...", + "addConditionalBreakpoint": "Aggiungi punto di interruzione condizionale...", + "addLogPoint": "Aggiungi punto di registrazione...", + "cancel": "Annulla", "addConfiguration": "Aggiungi configurazione..." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 05a9304ef54..c085858a8c6 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -28,5 +28,7 @@ "preLaunchTaskExitCode": "L'attività di preavvio '{0}' è stata terminata ed è stato restituito il codice di uscita {1}.", "showErrors": "Mostra errori", "noFolderWorkspaceDebugError": "Non è possibile eseguire il debug del file attivo. Assicurarsi che sia salvato su disco e che sia installata un'estensione di debug per tale tipo di file.", - "cancel": "Annulla" + "cancel": "Annulla", + "DebugTaskNotFound": "Impossibile trovare l'attività '{0}'.", + "taskNotTracked": "L'attività '{0}' non può essere rintracciata." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 7334c58bd49..a77a1e4728d 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "Altre info", - "unableToLaunchDebugAdapter": "Non è possibile avviare l'adattatore di debug da '{0}'.", - "unableToLaunchDebugAdapterNoArgs": "Non è possibile avviare l'adattatore di debug.", - "stoppingDebugAdapter": "{0}. L'adattatore di debug verrà arrestato.", "debugAdapterCrash": "Il processo dell'adattatore di debug è stato terminato in modo imprevisto" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 98695801004..3a9023e4662 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "Il file eseguibile '{0}' dell'adattatore di debug non esiste.", "debugAdapterCannotDetermineExecutable": "Non è possibile determinare il file eseguibile per l'adattatore di debug '{0}'.", - "launch.config.comment1": "Usare IntelliSense per informazioni sui possibili attributi.", - "launch.config.comment2": "Al passaggio del mouse vengono visualizzate le descrizioni degli attributi esistenti.", - "launch.config.comment3": "Per ulteriori informazioni, visitare: {0}", - "debugType": "Tipo di configurazione.", - "debugTypeNotRecognised": "Il tipo di debug non è riconosciuto. Assicurarsi di avere un'estensione appropriata per il debug installata e che sia abilitata.", - "node2NotSupported": "\"node2\" non è più supportato. In alternativa, usare \"node\" e impostare l'attributo \"protocol\" su \"inspector\".", - "debugName": "Nome della configurazione. Viene visualizzato nel menu a discesa della configurazione di avvio.", - "debugRequest": "Tipo della richiesta di configurazione. Può essere \"launch\" o \"attach\".", - "debugServer": "Solo per lo sviluppo dell'estensione di debug: se si specifica una porta, Visual Studio Code prova a connettersi a un adattatore di debug in esecuzione in modalità server", - "debugPrelaunchTask": "Attività da eseguire prima dell'avvio della sessione di debug.", - "debugWindowsConfiguration": "Attributi della configurazione di avvio specifici di Windows.", - "debugOSXConfiguration": "Attributi della configurazione di avvio specifici di OS X.", - "debugLinuxConfiguration": "Attributi della configurazione di avvio specifici di Linux.", - "deprecatedVariables": "'env.', 'config.' e 'command.' sono deprecati. In alternativa, usare 'env:', 'config:' e 'command:'." + "unableToLaunchDebugAdapter": "Non è possibile avviare l'adattatore di debug da '{0}'.", + "unableToLaunchDebugAdapterNoArgs": "Non è possibile avviare l'adattatore di debug." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..c5d731b3ec8 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "Usare IntelliSense per informazioni sui possibili attributi.", + "launch.config.comment2": "Al passaggio del mouse vengono visualizzate le descrizioni degli attributi esistenti.", + "launch.config.comment3": "Per ulteriori informazioni, visitare: {0}", + "debugType": "Tipo di configurazione.", + "debugTypeNotRecognised": "Il tipo di debug non è riconosciuto. Assicurarsi di avere un'estensione appropriata per il debug installata e che sia abilitata.", + "node2NotSupported": "\"node2\" non è più supportato. In alternativa, usare \"node\" e impostare l'attributo \"protocol\" su \"inspector\".", + "debugName": "Nome della configurazione. Viene visualizzato nel menu a discesa della configurazione di avvio.", + "debugRequest": "Tipo della richiesta di configurazione. Può essere \"launch\" o \"attach\".", + "debugServer": "Solo per lo sviluppo dell'estensione di debug: se si specifica una porta, Visual Studio Code prova a connettersi a un adattatore di debug in esecuzione in modalità server", + "debugPrelaunchTask": "Attività da eseguire prima dell'avvio della sessione di debug.", + "debugWindowsConfiguration": "Attributi della configurazione di avvio specifici di Windows.", + "debugOSXConfiguration": "Attributi della configurazione di avvio specifici di OS X.", + "debugLinuxConfiguration": "Attributi della configurazione di avvio specifici di Linux.", + "deprecatedVariables": "'env.', 'config.' e 'command.' sono deprecati. In alternativa, usare 'env:', 'config:' e 'command:'." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..b2beae5d759 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "Console di Visual Studio Code", + "mac.terminal.script.failed": "Lo script '{0}' non è riuscito. Codice di uscita: {1}", + "mac.terminal.type.not.supported": "'{0}' non supportato", + "press.any.key": "Premere un tasto qualsiasi per continuare...", + "linux.term.failed": "'{0}' non riuscito. Codice di uscita: {1}" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 79c3b874203..8a9cb12815f 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -58,6 +58,9 @@ "configureWorkspaceFolderRecommendedExtensions": "Configura estensioni consigliate (cartella dell'area di lavoro)", "malicious tooltip": "Questa estensione è stata segnalata come problematica.", "malicious": "Dannosa", + "disabled": "Disabilitata", + "disabled globally": "Disabilitata", + "disabled workspace": "Disabilitata per questa area di lavoro", "disableAll": "Disabilita tutte le estensioni installate", "disableAllWorkspace": "Disabilita tutte le estensioni installate per questa area di lavoro", "enableAll": "Abilita tutte le estensioni", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index bf455524ce9..b89388c1e2b 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -8,10 +8,12 @@ ], "name": "Nome dell'estensione", "extension id": "Identificatore dell'estensione", + "preview": "Anteprima", "builtin": "Predefinita", "publisher": "Nome dell'editore", "install count": "Conteggio delle installazioni", "rating": "Valutazione", + "repository": "Repository", "license": "Licenza", "details": "Dettagli", "contributions": "Contributi", @@ -32,11 +34,11 @@ "view id": "ID", "view name": "Nome", "view location": "Dove", + "localizations": "Localizzazioni ({0})", "localizations language id": "ID lingua", - "localizations language name": "Nome lingua", - "localizations localized language name": "Nome lingua (localizzato)", "colorThemes": "Temi colore ({0})", "iconThemes": "Temi icona ({0})", + "colors": "Colori ({0})", "colorId": "ID", "defaultDark": "Predefinito scuro", "defaultLight": "Predefinito chiaro", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index aeb7cee0d71..93bd9376516 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "Questa estensione è consigliata dagli utenti dell'area di lavoro corrente.", "reallyRecommended2": "Per questo tipo di file è consigliabile utilizzare l'estensione '{0}'.", "reallyRecommendedExtensionPack": "Per questo tipo di file è consigliabile usare il pacchetto di estensione '{0}'.", - "showRecommendations": "Mostra gli elementi consigliati", "install": "Installa", + "showRecommendations": "Mostra gli elementi consigliati", "showLanguageExtensions": "Il Marketplace ha estensioni per i file '.{0}'", "workspaceRecommended": "Per questa area di lavoro sono disponibili estensioni consigliate.", "installAll": "Installa tutto", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index afa57c88868..b78ce5a7c83 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "Disabilitare altre mappature tastiera ({0}) per evitare conflitti tra tasti di scelta rapida?", "yes": "Sì", - "no": "No", - "betterMergeDisabled": "L'estensione Better Merge (miglior merge) è ora incorporata: l'estensione installata è stata disattivata e può essere disinstallata.", - "uninstall": "Disinstalla" + "no": "No" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index d9192794c71..bb58789eedb 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,8 @@ "recommendedExtensions": "Consigliate", "otherRecommendedExtensions": "Altri consigli", "workspaceRecommendedExtensions": "Consigli per l'area di lavoro", + "builtInExtensions": "Funzionalità", + "builtInThemesExtensions": "Temi", "searchExtensions": "Cerca le estensioni nel Marketplace", "sort by installs": "Ordina per: conteggio installazioni", "sort by rating": "Ordina per: classificazione", diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 3939225c04f..70fd8e87f6c 100644 --- a/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -27,12 +27,17 @@ "confirmMoveTrashMessageMultiple": "Sei sicuro di voler eliminarei seguenti {0} file?", "confirmMoveTrashMessageFolder": "Eliminare '{0}' e il relativo contenuto?", "confirmMoveTrashMessageFile": "Eliminare '{0}'?", + "undoBin": "È possibile ripristinare dal Cestino.", + "undoTrash": "È possibile ripristinare dal Cestino.", "doNotAskAgain": "Non chiedermelo di nuovo", "confirmDeleteMessageMultiple": "Sei sicuro di voler eliminare permanentemente i seguenti {0} file?", "confirmDeleteMessageFolder": "Eliminare definitivamente '{0}' e il relativo contenuto?", "confirmDeleteMessageFile": "Eliminare definitivamente '{0}'?", "irreversible": "Questa azione è irreversibile.", - "importFiles": "Importa file", + "binFailed": "Impossibile eliminare utilizzando il Cestino. Si desidera eliminare definitivamente invece?", + "trashFailed": "Impossibile eliminare utilizzando il Cestino. Si desidera eliminare definitivamente invece?", + "deletePermanentlyButtonLabel": "&& Eliminare in modo permanente", + "retryButtonLabel": "&& Riprova", "confirmOverwrite": "Nella cartella di destinazione esiste già un file o una cartella con lo stesso nome. Sovrascrivere?", "replaceButtonLabel": "&&Sostituisci", "fileIsAncestor": "Il file da incollare è un predecessore della cartella di destinazione", diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 33e0072ede8..27f682715d4 100644 --- a/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -37,6 +37,7 @@ "defaultLanguage": "Modalità linguaggio predefinita assegnata ai nuovi file.", "editorConfigurationTitle": "Editor", "formatOnSave": "Formatta un file durante il salvataggio. Deve essere disponibile un formattatore, il file non deve essere salvato automaticamente e l'editor non deve essere in fase di chiusura.", + "formatOnSaveTimeout": "Timeout per Formatta dopo il salvataggio. Specifica un limite di tempo in millisecondi per i comandi formatOnSave. I comandi che richiedono più tempo del timeout specificato verranno annullati.", "explorerConfigurationTitle": "Esplora file", "openEditorsVisible": "Numero di editor visualizzati nel riquadro degli editor aperti.", "autoReveal": "Controlla se Esplora risorse deve rivelare automaticamente e selezionare i file durante l'apertura.", diff --git a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index fffcdf8e562..43b7d826b9f 100644 --- a/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,13 +7,14 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Digitare il nome file. Premere INVIO per confermare oppure ESC per annullare.", - "constructedPath": "Crea {0} in **{1}**", "filesExplorerViewerAriaLabel": "{0}, Esplora file", "dropFolders": "Aggiungere le cartelle all'area di lavoro?", "dropFolder": "Aggiungere la cartella all'area di lavoro?", "addFolders": "&& Aggiungi cartelle", "addFolder": "&&Aggiungi cartella", + "confirmRootsMove": "Sei sicuro che si desidera modificare l'ordine di più cartelle root nell'area di lavoro?", "confirmMultiMove": "Sei sicuro di voler spostare i seguenti {0} file?", + "confirmRootMove": "Sei sicuro che si desidera modificare l'ordine delle cartella principale '{0}' nell'area di lavoro?", "confirmMove": "Sei sicuro di voler spostare '{0}'?", "doNotAskAgain": "Non chiedermelo di nuovo", "moveButtonLabel": "&&Sposta", diff --git a/i18n/ita/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index 1677c2679d4..d821a4ec5e0 100644 --- a/i18n/ita/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "Cambiare la lingua dell'interfaccia utente di VS Code in {0} e riavviare?", "yes": "Sì", "no": "No", - "doNotAskAgain": "Non chiedermelo di nuovo", + "neverAgain": "Non visualizzare più questo messaggio", "JsonSchema.locale": "Linguaggio dell'interfaccia utente da usare.", "vscode.extension.contributes.localizations": "Contribuisce traduzioni all'editor", "vscode.extension.contributes.localizations.languageId": "Id della lingua in cui sono tradotte le stringhe visualizzate.", diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index cd233dbc352..c8c335d94e4 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "copyMarker": "Copia" + "copyMarker": "Copia", + "copyMessage": "Copia messaggio " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 8c26d708058..f743668975c 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Totale {0} problemi", - "filteredProblems": "Mostrando {0} di {1} problemi" + "totalProblems": "Totale {0} problemi" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json index 54af867231c..2fafad9b706 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.i18n.json @@ -7,5 +7,7 @@ "Do not edit this file. It is machine generated." ], "label": "Problemi", - "tooltip.N": "{0} problemi in questo file" + "tooltip.1": "1 problema in questo file ", + "tooltip.N": "{0} problemi in questo file", + "markers.showOnFile": "Mostra errori e avvisi relativi a file e cartella. " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 8425fd2a247..5a6174bd99e 100644 --- a/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "Problemi", "markers.panel.aria.label.problems.tree": "Problemi raggruppati per file", "markers.panel.no.problems.build": "Finora non sono stati rilevati problemi nell'area di lavoro.", - "markers.panel.no.problems.filters": "Non sono stati trovati risultati corrispondenti ai criteri di filtro specificati", "markers.panel.action.filter": "Filtra problemi", - "markers.panel.filter.placeholder": "Filtra per tipo o testo", + "markers.panel.filter.ariaLabel": "Filtra problemi", "markers.panel.filter.errors": "errori", "markers.panel.filter.warnings": "avvisi", "markers.panel.filter.infos": "messaggi informativi", @@ -30,5 +29,15 @@ "markers.panel.multiple.unknowns.label": "{0} sconosciuti", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "{0} con {1} problemi", + "problems.tree.aria.label.marker.relatedInformation": " Questo problema include riferimenti a {0} percorsi.", + "problems.tree.aria.label.error.marker": "Errore generato da {0}: {1} a riga {2} e carattere {3}.{4}", + "problems.tree.aria.label.error.marker.nosource": "Errore: {0} a riga {1} e carattere {2}.{3}", + "problems.tree.aria.label.warning.marker": "Avviso generato da {0}: {1} a riga {2} e carattere {3}.{4}", + "problems.tree.aria.label.warning.marker.nosource": "Avviso: {0} a riga {1} e carattere {2}.{3}", + "problems.tree.aria.label.info.marker": "Messaggio informativo generato da {0}: {1} a riga {2} e carattere {3}.{4}", + "problems.tree.aria.label.info.marker.nosource": "Messaggio informativo: {0} a riga {1} e carattere {2}.{3}", + "problems.tree.aria.label.marker": "Problema generato da {0}: {1} a riga {2} e carattere {3}.{4}", + "problems.tree.aria.label.marker.nosource": "Problema: {0} a riga {1} e carattere {2}.{3}", + "problems.tree.aria.label.relatedinfo.message": "{0} a riga {1} e carattere {2} in {3}", "errors.warnings.show.label": "Mostra errori e avvisi" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/ita/src/vs/workbench/parts/output/browser/outputActions.i18n.json index 3ab66459385..1aaa39797ad 100644 --- a/i18n/ita/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "Attiva/Disattiva output", "clearOutput": "Cancella output", "toggleOutputScrollLock": "Attiva/Disattiva blocco scorrimento per output", - "switchToOutput.label": "Passa all'output" + "switchToOutput.label": "Passa all'output", + "openInLogViewer": "Apri file di log" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index d18b35762b8..9800b7b0870 100644 --- a/i18n/ita/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "Output", "logViewer": "Visualizzatore Log", "viewCategory": "Visualizza", - "clearOutput.label": "Cancella output" + "clearOutput.label": "Cancella output", + "openActiveLogOutputFile": "Visualizza: Apri file di output del log attivo" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 915767115f7..ab7704c8c47 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Scelte rapide da tastiera", + "showDefaultKeybindings": "Mostra tasti di scelta rapida predefiniti", + "showUserKeybindings": "Mostra tasti di scelta rapida utente", "SearchKeybindings.AriaLabel": "Cerca tasti di scelta rapida", "SearchKeybindings.Placeholder": "Cerca tasti di scelta rapida", "sortByPrecedene": "Ordina per Precedenza", diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index b1521d61b1f..695670cf87c 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Apri impostazioni predefinite non elaborate", + "openSettings": "Apri impostazioni", "openGlobalSettings": "Apri impostazioni utente", "openGlobalKeybindings": "Apri tasti di scelta rapida", "openGlobalKeybindingsFile": "Apri file dei tasti di scelta rapida", diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 01dd3d9cc62..05ccccf41ee 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Impostazioni predefinite", "SearchSettingsWidget.AriaLabel": "Cerca impostazioni", "SearchSettingsWidget.Placeholder": "Cerca impostazioni", "noSettingsFound": "Nessun risultato", diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index a4608aa9da5..acbb94499dd 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "Mostra l'estensione \"{0}\"", "editTtile": "Modifica", "replaceDefaultValue": "Sostituisci nelle impostazioni", - "copyDefaultValue": "Copia nelle impostazioni", - "unsupportedPHPExecutablePathSetting": "Questa deve essere un'impostazione utente. Per configurare PHP per l'area di lavoro, aprire un file PHP e fare clic su 'Percorso PHP' nella barra di stato.", - "unsupportedWorkspaceSetting": "Questa deve essere un'impostazione utente.", - "unsupportedWorkbenchSetting": "Non è possibile applicare ora questa impostazione. Verrà applicata direttamente all'apertura della cartella.", - "unsupportedWorkbenchSettingDevMode": "L'impostazione non può essere applicata in questo momento. Essa verrà applicata se il suo ambito sarà definito come 'risorsa' durante la registrazione, o quando si aprirà questa cartella direttamente." + "copyDefaultValue": "Copia nelle impostazioni" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index b11614a0056..781c9834bae 100644 --- a/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "Installa ulteriori provider SCM ...", "no open repo": "Non esistono provider di controllo codice sorgente attivi.", "source control": "Controllo del codice sorgente", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "Nascondi" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 4fdc0d624d6..2e43beadd2d 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Mostra i criteri di inclusione per la ricerca successivi", "previousSearchIncludePattern": "Mostra i criteri di inclusione per la ricerca precedenti", + "nextSearchExcludePattern": "Mostra i criteri di esclusione per la ricerca successivi", + "previousSearchExcludePattern": "Mostra i criteri di esclusione per la ricerca precedenti", "nextSearchTerm": "Mostra il termine di ricerca successivo", "previousSearchTerm": "Mostra il termine di ricerca precedente", - "showSearchViewlet": "Mostra Cerca", "findInFiles": "Cerca nei file", "replaceInFiles": "Sostituisci nei file", "RefreshAction.label": "Aggiorna", diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/searchView.i18n.json index a0d921fec70..e2aee106234 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Attiva/Disattiva dettagli ricerca", + "searchScope.includes": "file da includere", + "label.includes": "Criteri di inclusione per la ricerca", + "searchScope.excludes": "file da escludere", + "label.excludes": "Criteri di esclusione per la ricerca", "replaceAll.confirmation.title": "Sostituisci tutto", "replaceAll.confirm.button": "&&Sostituisci", "replaceAll.occurrence.file.message": "{0} occorrenza in {1} file è stata sostituita con '{2}'.", diff --git a/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 2990ba49e00..3f0b88cd28f 100644 --- a/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Cerca", + "copyMatchLabel": "Copia", + "copyPathLabel": "Copia percorso", + "copyAllLabel": "Copia tutti", "findInFolder": "Trova nella cartella...", "findInWorkspace": "Trova nell'area di lavoro...", "showTriggerActions": "Vai al simbolo nell'area di lavoro...", "name": "Cerca", - "search": "Cerca", "showSearchViewl": "Mostra Cerca", "view": "Visualizza", "findInFiles": "Cerca nei file", @@ -25,6 +28,5 @@ "search.quickOpen.includeSymbols": "Configurare questa opzione per includere i risultati di una ricerca di simboli globale nei risultati dei file per Quick Open.", "search.followSymlinks": "Controlla se seguire i collegamenti simbolici durante la ricerca.", "search.smartCase": "Cerca in modo insensibile alle maiuscole/minuscole se il criterio è tutto minuscolo, altrimenti cerca in modalità sensibile a maiuscole/minuscole", - "search.globalFindClipboard": "Controlla se il viewlet di ricerca deve leggere o modificare gli appunti di ricerca condivisi in macOS", - "search.location": "Anteprima: controlla se la ricerca verrà mostrata in una visualizzazione della barra laterale o in un pannello nell'area pannelli in modo da disporre di maggiore spazio in orizzontale. Nella versione successiva la ricerca nel pannello sarà caratterizzata da un layout orizzontale ottimizzato e questa funzione non sarà più un'anteprima." + "search.globalFindClipboard": "Controlla se il viewlet di ricerca deve leggere o modificare gli appunti di ricerca condivisi in macOS" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index aa1a8710d4d..c0eba234792 100644 --- a/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "Aiutaci a migliorare il nostro supporto all'{0}", "takeShortSurvey": "Partecipa a un breve sondaggio", "remindLater": "Visualizza più tardi", - "neverAgain": "Non visualizzare più questo messaggio", - "helpUs": "Aiutaci a migliorare il nostro supporto all'{0}" + "neverAgain": "Non visualizzare più questo messaggio" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index a2e9e03a390..613cfcb5fd1 100644 --- a/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "Partecipare a un breve sondaggio?", "takeSurvey": "Partecipa a sondaggio", "remindLater": "Visualizza più tardi", - "neverAgain": "Non visualizzare più questo messaggio", - "surveyQuestion": "Partecipare a un breve sondaggio?" + "neverAgain": "Non visualizzare più questo messaggio" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index 65ecc6909d4..f2036927853 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "Criterio di problema o nome di un criterio di problema predefinito o aggiunto come contributo. Può essere omesso se si specifica base.", "ProblemMatcherSchema.base": "Nome di un matcher problemi di base da usare.", "ProblemMatcherSchema.owner": "Proprietario del problema in Visual Studio Code. Può essere omesso se si specifica base. Se è omesso e non si specifica base, viene usato il valore predefinito 'external'.", + "ProblemMatcherSchema.source": "Stringa in formato leggibile che descrive l'origine di questa diagnostica, ad esempio 'typescript' o 'super lint'.", "ProblemMatcherSchema.severity": "Gravità predefinita per i problemi di acquisizione. Viene usato se il criterio non definisce un gruppo di corrispondenze per la gravità.", "ProblemMatcherSchema.applyTo": "Controlla se un problema segnalato in un documento di testo è valido solo per i documenti aperti o chiusi oppure per tutti i documenti.", "ProblemMatcherSchema.fileLocation": "Consente di definire come interpretare i nomi file indicati in un criterio di problema.", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index d2e532ded80..a83add2496b 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,7 +28,14 @@ "JsonSchema.tasks.group.none": "Non assegna l'attività ad alcun gruppo", "JsonSchema.tasks.group": "Definisce il gruppo di esecuzione a cui appartiene questa attività. Supporta \"build\" per aggiungerlo al gruppo di compilazione e \"test\" per aggiungerlo al gruppo di test.", "JsonSchema.tasks.type": "Definisce se l'attività viene eseguita come un processo o come un comando all'interno di una shell.", + "JsonSchema.command.quotedString.value": "Valore effettivo del comando", + "JsonSchema.tasks.quoting.escape": "Evita i caratteri utilizzando il carattere di escape della shell (per esempio ` sotto PowerShell e \\ sotto bash).", + "JsonSchema.tasks.quoting.strong": "Virgoletta l'argomento utilizzando il carattere di doppio apice della shell (per esempio \" sotto PowerShell e bash).", + "JsonSchema.tasks.quoting.weak": "Virgoletta l'argomento utilizzando il carattere di singolo apice della shell (per esempio ' sotto PowerShell e bash).", + "JsonSchema.command.quotesString.quote": "Come il valore del comando dovrebbe essere virgolettato", "JsonSchema.command": "Comando da eseguire. Può essere un programma esterno o un comando della shell.", + "JsonSchema.args.quotedString.value": "Valore effettivo del comando", + "JsonSchema.args.quotesString.quote": "Come il valore dell'argomento dovrebbe essere virgolettato", "JsonSchema.tasks.args": "Argomenti passati al comando quando viene richiamata questa attività.", "JsonSchema.tasks.label": "Etichetta dell'attività per l'interfaccia utente ", "JsonSchema.version": "Numero di versione della configurazione", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 72ae41d5c50..f4b25f34a5c 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,7 +11,9 @@ "totalErrors": "{0} errori", "totalWarnings": "{0} avvisi", "totalInfos": "{0} messaggi informativi", + "problems": "Problemi", "building": "Compilazione in corso...", + "manyProblems": "Più di 10.000", "runningTasks": "Visualizza attività in esecuzione", "tasks": "Attività", "TaskSystem.noHotSwap": "Se si cambia il motore di esecuzione delle attività con un'attività attiva in esecuzione, è necessario ricaricare la finestra", @@ -29,8 +31,8 @@ "selectProblemMatcher": "Selezionare il tipo di errori e di avvisi per cui analizzare l'output dell'attività", "customizeParseErrors": "La configurazione dell'attività corrente presenta errori. Per favore correggere gli errori prima di personalizzazione un'attività.", "moreThanOneBuildTask": "tasks.json contiene molte attività di compilazione. È in corso l'esecuzione della prima.\n", - "TaskSystem.activeSame.background": "L'attività '{0}' è già attiva ed in modalità background. Per terminarla, usare 'Termina attività' dal menu Attività.", - "TaskSystem.activeSame.noBackground": "L'attività '{0}' è già attiva. Per terminarla, usare 'Termina attività' dal menu Attività.", + "terminateTask": "Termina attività", + "restartTask": "Riavvia attività", "TaskSystem.active": "Al momento c'è già un'attività in esecuzione. Terminarla prima di eseguirne un'altra.", "TaskSystem.restartFailed": "Non è stato possibile terminare e riavviare l'attività {0}", "TaskService.noConfiguration": "Errore: Il rilevamento di attività {0} non ha contribuito un'attività nella seguente configurazione: \n{1} \nL'attività verrà ignorata.\n", @@ -47,8 +49,8 @@ "recentlyUsed": "attività usate di recente", "configured": "attività configurate", "detected": "attività rilevate", - "TaskService.notAgain": "Non visualizzare più questo messaggio", "TaskService.ignoredFolder": "Le cartelle dell'area di lavoro seguenti verranno ignorate perché usano la versione 0.1.0 delle attività: {0}", + "TaskService.notAgain": "Non visualizzare più questo messaggio", "TaskService.pickRunTask": "Selezionare l'attività da eseguire", "TaslService.noEntryToRun": "Non è stata trovata alcuna attività da eseguire. Configurare le attività...", "TaskService.fetchingBuildTasks": "Recupero delle attività di compilazione...", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 5cf7f264969..b89a9a5d2c8 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "Avviso: options.cwd deve essere di tipo string. Il valore {0} verrà ignorato.\n", + "ConfigurationParser.inValidArg": "Errore: l'argomento del comando deve essere una stringa o una stringa virgolettata. Il valore specificato è:\n{0}", "ConfigurationParser.noargs": "Errore: gli argomenti del comando devono essere un array di stringhe. Il valore specificato è:\n{0}", "ConfigurationParser.noShell": "Avviso: la configurazione della shell è supportata solo quando si eseguono attività nel terminale.", "ConfigurationParser.noName": "Errore: è necessario specificare un nome per il matcher problemi nell'ambito di dichiarazione:\n{0}\n", diff --git a/i18n/ita/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..7ae3aac58f6 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "Il colore di sfondo del terminale, questo consente di colorare il terminale in modo diverso dal pannello.", + "terminal.foreground": "Il colore di primo piano del terminale.", + "terminalCursor.foreground": "Colore di primo piano del cursore del terminale.", + "terminalCursor.background": "Colore di sfondo del cursore del terminale. Permette di personalizzare il colore di un carattere quando sovrapposto da un blocco cursore.", + "terminal.selectionBackground": "Colore di sfondo di selezione del terminale.", + "terminal.border": "Colore del bordo che separa i riquadri divisi all'interno del terminale. L'impostazione predefinita è panel.border.", + "terminal.ansiColor": "'{0}' colori ANSI nel terminale. " +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 183e933c6e1..d18ee9b5c9c 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -51,5 +51,7 @@ "workbench.action.terminal.hideFindWidget": "Nascondi widget Trova", "nextTerminalFindTerm": "Mostra il termine di ricerca successivo", "previousTerminalFindTerm": "Mostra il termine di ricerca precedente", - "quickOpenTerm": "Cambia terminale attivo" + "quickOpenTerm": "Cambia terminale attivo", + "workbench.action.terminal.selectToPreviousCommand": "Aggiungi selezione a comando precedente", + "workbench.action.terminal.selectToNextCommand": "Aggiungi selezione a comando successivo" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index a2ee6206bbf..deb5b14b127 100644 --- a/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "Quest'area di lavoro contiene impostazioni che è possibile specificare solo nelle impostazioni utente ({0}). Per maggiori informazioni, fare clic [qui]({1}).", "openWorkspaceSettings": "Apri impostazioni area di lavoro", - "dontShowAgain": "Non visualizzare più questo messaggio", - "unsupportedWorkspaceSettings": "Quest'area di lavoro contiene impostazioni che è possibile specificare solo nelle impostazioni utente ({0}). Per maggiori informazioni, fare clic [qui]({1})." + "dontShowAgain": "Non visualizzare più questo messaggio" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json index f16acee2d3f..c1d4fe9a7f2 100644 --- a/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "In seguito", "releaseNotes": "Note sulla versione", "showReleaseNotes": "Mostra note sulla versione", "read the release notes": "Benvenuti in {0} versione {1}. Leggere le note sulla versione?", @@ -16,13 +15,12 @@ "updateIsReady": "Nuovo aggiornamento di {0} disponibile.", "noUpdatesAvailable": "Al momento non sono disponibili aggiornamenti.", "ok": "OK", - "download now": "Scarica ora", "thereIsUpdateAvailable": "È disponibile un aggiornamento.", + "download now": "Scarica ora", + "later": "In seguito", "installUpdate": "Installa aggiornamento", - "updateAvailable": "È disponibile un aggiornamento: {0} {1}", "updateInstalling": "{0} {1} verrà installato in background. Al termine, verrà visualizzato un messaggio.", "updateNow": "Aggiorna adesso", - "updateAvailableAfterRestart": "{0} verrà aggiornato dopo il riavvio.", "commandPalette": "Riquadro comandi...", "settings": "Impostazioni", "keyboardShortcuts": "Scelte rapide da tastiera", diff --git a/i18n/ita/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 6162c44dea8..09c98a26547 100644 --- a/i18n/ita/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "editor Webview" + "webview.editor.label": "editor Webview", + "developer": "Sviluppatore" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/ita/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..ee36d0bcec9 --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Apri strumenti di sviluppo Webview", + "refreshWebviewLabel": "Ricarica Webview" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index 184feafb8ac..647449f9420 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Per contribuire al miglioramento di VS Code, è possibile consentire a Microsoft di raccogliere i dati di utilizzo. Leggere l'[informativa sulla privacy]({0}) per informazioni su come [rifiutare esplicitamente]({1}).", + "telemetryOptOut.optInNotice": "Per contribuire al miglioramento di VS Code, è possibile consentire a Microsoft di raccogliere i dati di utilizzo. Leggere l'[informativa sulla privacy]({0}) per informazioni su come [acconsentire esplicitamente]({1}).", "telemetryOptOut.readMore": "Altre informazioni" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 98e9bb87b0d..7d4936d889c 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "Strumenti e linguaggi", "welcomePage.installExtensionPacksDescription": "Installare il supporto per {0} e {1}", "welcomePage.moreExtensions": "altro", - "welcomePage.installKeymapDescription": "Installa i tasti di scelta rapida", - "welcomePage.installKeymapExtension": "Installa i tasti di scelta rapida di {0} e {1}", "welcomePage.others": "altri", "welcomePage.colorTheme": "Tema colori", "welcomePage.colorThemeDescription": "Tutto quel che serve per configurare editor e codice nel modo desiderato", diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..96561150bb5 --- /dev/null +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedWindowSetting": "Non è possibile applicare ora questa impostazione. Verrà applicata direttamente all'apertura della cartella." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 08ddb51d21f..05e96e21215 100644 --- a/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "L'host dell'estensione è stato terminato in modo imprevisto.", "extensionHostProcess.unresponsiveCrash": "L'host dell'estensione è stato terminato perché non rispondeva.", - "devTools": "Strumenti di sviluppo", "restart": "Riavvia host dell'estensione", "overwritingExtension": "Sovrascrittura dell'estensione {0} con {1}.", "extensionUnderDevelopment": "Caricamento dell'estensione di sviluppo in {0}", diff --git a/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 50a2d3795ee..5b7706bdc38 100644 --- a/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,10 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Microsoft .NET Framework 4.5 è obbligatorio. Selezionare il collegamento per installarlo.", "installNet": "Scarica .NET Framework 4.5", "neverShowAgain": "Non visualizzare più questo messaggio", - "netVersionError": "Microsoft .NET Framework 4.5 è obbligatorio. Selezionare il collegamento per installarlo.", + "enospcError": "{0} non è in grado di controllare le modifiche di una grande area di lavoro. Per risolvere questo problema, seguire il collegamento alle istruzioni. ", "learnMore": "Istruzioni", + "fileInvalidPath": "Risorsa del file non valida ({0})", + "fileIsDirectoryError": "Il File è una Directory", + "fileNotModifiedError": "File non modificato dal giorno", + "fileTooLargeError": "File troppo grande per essere aperto", + "fileNotFoundError": "Il file non è stato trovato ({0})", + "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo", + "filePermission": "Autorizzazione di scrittura sul file negata ({0}) ", + "fileExists": "Il file da creare esiste già ({0})", + "fileModifiedError": "File modificato da", + "fileReadOnlyError": "Il file è di sola lettura", + "fileMoveConflict": "Non è possibile eseguire operazioni di spostamento/copia. Il file esiste già nella destinazione.", + "unableToMoveCopyError": "Non è possibile eseguire operazioni di spostamento/copia. Il file sostituirebbe la cartella in cui è contenuto.", "binFailed": "Non è stato possibile spostare '{0}' nel Cestino", "trashFailed": "Non è stato possibile spostare '{0}' nel Cestino" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index d95f7f919aa..0679938a47a 100644 --- a/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Il file non è stato trovato ({0})", "fileIsDirectoryError": "Il File è una Directory", "fileNotModifiedError": "File non modificato dal giorno", "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo" diff --git a/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index 10246e41a96..d8c6c0c8a17 100644 --- a/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "Nome dell'ambito TextMate usato dal file tmLanguage.", "vscode.extension.contributes.grammars.path": "Percorso del file tmLanguage. È relativo alla cartella delle estensioni e in genere inizia con './syntaxes/'.", "vscode.extension.contributes.grammars.embeddedLanguages": "Mapping tra nome ambito e ID linguaggio se questa grammatica contiene linguaggi incorporati.", + "vscode.extension.contributes.grammars.tokenTypes": "Mapping tra nome di ambito e tipi di token.", "vscode.extension.contributes.grammars.injectTo": "Elenco di nomi di ambito del linguaggio in cui viene inserita questa grammatica." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index 5fb7d00f03d..1c4e6bd4f78 100644 --- a/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/ita/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "È previsto un valore stringa in `contributes.{0}.path`. Valore specificato: {1}", "invalid.injectTo": "Il valore in `contributes.{0}.injectTo` non è valido. Deve essere una matrice di nomi di ambito del linguaggio. Valore specificato: {1}", "invalid.embeddedLanguages": "Il valore in `contributes.{0}.embeddedLanguages` non è valido. Deve essere un mapping di oggetti tra nome ambito e linguaggio. Valore specificato: {1}", + "invalid.tokenTypes": "Il valore in `contributes.{0}.tokenTypes` non è valido. Deve essere un mapping di oggetti tra nome ambito e tipo di token. Valore specificato: {1}", "invalid.path.1": "Valore previsto di `contributes.{0}.path` ({1}) da includere nella cartella dell'estensione ({2}). L'estensione potrebbe non essere più portatile.", "no-tm-grammar": "Non è stata registrata alcuna grammatica TM per questo linguaggio." } \ No newline at end of file diff --git a/i18n/jpn/extensions/emmet/package.i18n.json b/i18n/jpn/extensions/emmet/package.i18n.json index 6989669cdcb..2ea428b8ba7 100644 --- a/i18n/jpn/extensions/emmet/package.i18n.json +++ b/i18n/jpn/extensions/emmet/package.i18n.json @@ -35,7 +35,7 @@ "emmetExtensionsPath": "Emmet のプロファイルとスニペットを含むフォルダーへのパス。", "emmetShowExpandedAbbreviation": "展開された Emmet 省略記法を候補として表示します。\n\"inMarkupAndStylesheetFilesOnly\" オプションは、html、haml、jade、slim、xml、xsl、css、scss、sass、less、stylus に適用されます。\n\"always\" オプションは markup/css に関係なくファイルのすべての部分に適用されます。", "emmetShowAbbreviationSuggestions": "利用できる Emmet 省略記法を候補として表示します。スタイルシートや emmet.showExpandedAbbreviation を \"never\" に設定していると適用されません。", - "emmetIncludeLanguages": "既定でサポートされていない言語で Emmet 省略記法を有効にします。 言語と Emmet がサポートする言語の間にマッピングを追加します。\n例: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", + "emmetIncludeLanguages": "既定でサポートされていない言語で Emmet 略語を有効にします。ここに、その言語と Emmet でサポートされる言語のマッピングを追加します。\n 例: {\"vue-html\":\"html\"、\"javascript\":\"javascriptreact\"}", "emmetVariables": "Emmet のスニペットで使用される変数", "emmetTriggerExpansionOnTab": "有効にすると、TAB キーを押したときに Eemmet 省略記法が展開されます。", "emmetPreferences": "Emmet の一部のアクションやリゾルバーの動作の変更に使用される基本設定。", @@ -60,5 +60,6 @@ "emmetPreferencesCssMozProperties": "Emmet 省略記法で使用される場合に `-` で始まる 'moz' ベンダー プレフィックスを取得するカンマ区切りの CSS プロパティ。常に 'moz' プレフィックスを避ける場合は空の文字列に設定します。", "emmetPreferencesCssOProperties": "Emmet 省略記法で使用される場合に `-` で始まる 'o' ベンダー プレフィックスを取得するカンマ区切りの CSS プロパティ。常に 'o' プレフィックスを避ける場合は空の文字列に設定します。", "emmetPreferencesCssMsProperties": "Emmet 省略記法で使用される場合に `-` で始まる 'ms' ベンダー プレフィックスを取得するカンマ区切りの CSS プロパティ。常に 'ms' プレフィックスを避ける場合は空の文字列に設定します。", - "emmetPreferencesCssFuzzySearchMinScore": "あいまい検索の省略形が達成すべき (0 から 1 の) 最小スコア。値が低ければ多くの誤検出が発生する可能性があります。値が高ければ一致する見込みが減る可能性があります。" + "emmetPreferencesCssFuzzySearchMinScore": "あいまい検索の省略形が達成すべき (0 から 1 の) 最小スコア。値が低ければ多くの誤検出が発生する可能性があります。値が高ければ一致する見込みが減る可能性があります。", + "emmetOptimizeStylesheetParsing": "false に設定すると、現在位置が Emmet 略語の展開位置として有効かどうかを判定するためにファイル全体を解析します。true に設定すると、css/scss/less ファイルの現在位置周辺のコンテンツのみを解析します。" } \ No newline at end of file diff --git a/i18n/jpn/extensions/markdown-language-features/out/security.i18n.json b/i18n/jpn/extensions/markdown-language-features/out/security.i18n.json index 22ad7c7170c..4e88fd4f8be 100644 --- a/i18n/jpn/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/jpn/extensions/markdown-language-features/out/security.i18n.json @@ -8,6 +8,8 @@ ], "strict.title": "高レベル", "strict.description": "セキュリティで保護されたコンテンツのみを読み込む", + "insecureLocalContent.title": "安全でないローカル コンテンツを許可する", + "insecureLocalContent.description": "localhost から http で提供されるコンテンツの読み込みを有効にします", "insecureContent.title": "セキュリティで保護されていないコンテンツを許可する", "insecureContent.description": "HTTP を介したコンテンツの読み込みを有効にする", "disable.title": "無効にする", diff --git a/i18n/jpn/extensions/php/package.i18n.json b/i18n/jpn/extensions/php/package.i18n.json index 5989177b903..16bb0ef7ca1 100644 --- a/i18n/jpn/extensions/php/package.i18n.json +++ b/i18n/jpn/extensions/php/package.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "PHP 言語機能", + "displayName": "PHP の基本言語サポート", "description": "PHP ファイル内に構文ハイライト、かっこ一致を提供します。" } \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/commands.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..e69dc45423d --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "TypeScript または JavaScript プロジェクトを使用するには、VS Code でフォルダーを開いてください", + "typescript.projectConfigUnsupportedFile": "TypeScript または JavaScript のプロジェクトを判別できませんでした。サポートされていないファイルの種類です", + "typescript.projectConfigCouldNotGetInfo": "TypeScript または JavaScript のプロジェクトを判別できませんでした", + "typescript.noTypeScriptProjectConfig": "ファイルは TypeScript プロジェクトの一部ではありません。詳細情報は [こちら]({1}) をクリックしてください。", + "typescript.noJavaScriptProjectConfig": "ファイルは JavaScript プロジェクトの一部ではありません。詳細情報は [こちら]({1}) をクリックしてください。", + "typescript.configureTsconfigQuickPick": "tsconfig.json を構成する", + "typescript.configureJsconfigQuickPick": "jsconfig.json を構成する" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..adb307b9768 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "適用するコード アクションを選択", + "acquiringTypingsLabel": "Typings の定義ファイルを取得中...", + "acquiringTypingsDetail": "IntelliSense の Typings の定義ファイルを取得しています。", + "autoImportLabel": "{0} から自動インポート" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..19d9bea48dd --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "JavaScript ファイルのセマンティック チェックを有効にします。 ファイルの先頭にある必要があります。", + "ts-nocheck": "JavaScript ファイルのセマンティック チェックを無効にします。 ファイルの先頭にある必要があります。", + "ts-ignore": "ファイルの次の行で @ts-check エラーを抑制します。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..64c5084a0d1 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 個の実装", + "manyImplementationLabel": "{0} 個の実装", + "implementationsErrorLabel": "実装を特定できませんでした" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..26a29c2851a --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "JSDoc コメント" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..7882c9fa95f --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "インポートを整理" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..453c92d6195 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (ファイルの中のすべてを修正する)" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..71699891f3b --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 個の参照", + "manyReferenceLabel": "{0} 個の参照", + "referenceErrorLabel": "参照を判別できませんでした" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..bb8e166d153 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "ビルド - {0}", + "buildAndWatchTscLabel": "ウォッチ - {0}" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..904634944f4 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "パス {0} は、有効な tsserver インストールを指していません。バンドルされている TypeScript バージョンにフォールバックしています。", + "serverCouldNotBeStarted": "TypeScript 言語サーバーを起動できません。エラー メッセージ: {0}", + "typescript.openTsServerLog.notSupported": "TS サーバーのログには TS 2.2.2 以降が必要です", + "typescript.openTsServerLog.loggingNotEnabled": "TS サーバーのログがオフになっています。ログを有効にするには、`typescript.tsserver.log` を設定して TS サーバーを再起動してください", + "typescript.openTsServerLog.enableAndReloadOption": "ログを有効にして、TS サーバーを再起動する", + "typescript.openTsServerLog.noLogFile": "TS サーバーはログを開始していません。", + "openTsServerLog.openFileFailedFailed": "TS サーバーのログ ファイルを開くことができませんでした", + "serverDiedAfterStart": "TypeScript 言語サービスは、開始直後に 5 回停止しました。サービスは再開されません。", + "serverDiedReportIssue": "問題の報告", + "serverDied": "TypeScript 言語サービスは、直前の 5 分間に 5 回、予期せずに停止しました。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..4b09d67cea3 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "バージョンが無効です" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..d4f07accea4 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "プロジェクト全体の JavaScript/TypeScript 言語機能を有効にするには、多数のファイルが含まれるフォルダーを除外します。例: {0}", + "hintExclude.generic": "プロジェクト全体の JavaScript/TypeScript 言語機能を有効にするには、作業していないソース ファイルが含まれるサイズの大きなフォルダーを除外します。", + "large.label": "除外の構成", + "hintExclude.tooltip": "プロジェクト全体の JavaScript/TypeScript 言語機能を有効にするには、作業していないソース ファイルが含まれるサイズの大きなフォルダーを除外します。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..416302dc017 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "より適した TypeScript IntelliSense に関するデータをフェッチしています", + "typesInstallerInitializationFailed.title": "JavaScript 言語機能のための型定義ファイルをインストールできませんでした。NPM のインストールを確認するか、ユーザー設定で 'typescript.npm' を構成してください。詳細は [こちら]({0}) をクリックしてください。", + "typesInstallerInitializationFailed.doNotCheckAgain": "今後は表示しない" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..e9aaf978151 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "VS Code のバージョンを使用", + "useWorkspaceVersionOption": "ワークスペースのバージョンを使用", + "learnMore": "詳細情報", + "selectTsVersion": "JavaScript および TypeScript 言語の機能に使用する TypeScript バージョンを選択します" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/jpn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..bb98209ca70 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "このパスでは TypeScript のバージョンを読み込むことができません", + "noBundledServerFound": "VS Code の tsserver が適切に動作しないウイルス検出ツールなどの他アプリケーションにより削除されました。VS Code を再インストールしてください。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript-language-features/package.i18n.json b/i18n/jpn/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..9cfdd473386 --- /dev/null +++ b/i18n/jpn/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,65 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "TypeScript と JavaScript の言語機能", + "description": "JavaScript と TypeScript ファイルに豊富な言語サポートを提供。", + "typescript.reloadProjects.title": "プロジェクトの再読み込み", + "javascript.reloadProjects.title": "プロジェクトの再読み込み", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "パラメーター シグネチャを含む完全な関数。", + "typescript.tsdk.desc": "使用する tsserver と lib*.d.ts ファイルが含まれているフォルダーのパスを指定します。", + "typescript.disableAutomaticTypeAcquisition": "型定義の自動取得を無効にします。TypeScript 2.0.6 以上が必要です。", + "typescript.tsserver.log": "ファイルへの TS サーバーのログを有効にします。このログは TS サーバーの問題を診断するために使用できます。ログには、プロジェクトのファイルパス、ソースコード、その他の潜在的に機密性の高い情報が含まれている場合があります。", + "typescript.tsserver.pluginPaths": "Typescript 言語サービス プラグインを検出する追加のパス。TypeScript 2.3.0以上が必要。", + "typescript.tsserver.pluginPaths.item": "絶対または相対パスのいずれか。相対パスはワークスペース フォルダーに対して解決されます。", + "typescript.tsserver.trace": "TS サーバーに送信されるメッセージのトレースを有効にします。このトレースは TS サーバーの問題を診断するために使用できます。トレースには、プロジェクトのファイルパス、ソースコード、その他の潜在的に機密性の高い情報が含まれている場合があります。", + "typescript.validate.enable": "TypeScript の検証を有効/無効にします。", + "typescript.format.enable": "既定の TypeScript フォーマッタを有効/無効にします。", + "javascript.format.enable": "既定の JavaScript フォーマッタを有効/無効にします。", + "format.insertSpaceAfterCommaDelimiter": "コンマ区切り記号の後のスペース処理を定義します。", + "format.insertSpaceAfterConstructor": "コンストラクター キーワードの後にスペース処理を定義します。TypeScript が 2.3.0 以上である必要があります。", + "format.insertSpaceAfterSemicolonInForStatements": " for ステートメント内のセミコロンの後のスペース処理を定義します。", + "format.insertSpaceBeforeAndAfterBinaryOperators": "2 項演算子の後のスペース処理を定義します。", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "制御フロー ステートメント内のキーワードの後のスペース処理を定義します。", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "匿名関数の関数キーワードの後のスペース処理を定義します。", + "format.insertSpaceBeforeFunctionParenthesis": "関数の引数のかっこの前にあるスペース処理を定義します。TypeScript が 2.1.5. 以上である必要があります。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "左右の空でないかっこの間のスペース処理を定義します。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "左右の空でない角かっこの間のスペース処理を定義します。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "左右の空でないかっこの間のスペース処理を定義します。TypeScript が 2.3.0 以上である必要があります。", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "テンプレート文字列の始め波かっこの後と終わり波かっこの前のスペース処理を定義します。TypeScript が 2.0.6 以上である必要があります。", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "JSX 式の始め波かっこの後と終わり波かっこの前のスペース処理を定義します。TypeScript が 2.0.6 以上である必要があります。", + "format.insertSpaceAfterTypeAssertion": "TypeScript の型アサーションの後のスペース処理を定義します。TypeScript が 2.4 以上である必要があります。", + "format.placeOpenBraceOnNewLineForFunctions": "新しい行に関数の始め波かっこを配置するかどうかを定義します。", + "format.placeOpenBraceOnNewLineForControlBlocks": "新しい行にコントロール ブロックの始め波かっこを配置するかどうかを定義します。", + "javascript.validate.enable": "JavaScript の検証を有効/無効にします。", + "typescript.goToProjectConfig.title": "プロジェクト構成に移動", + "javascript.goToProjectConfig.title": "プロジェクト構成に移動", + "javascript.referencesCodeLens.enabled": "JavaScript ファイル内で CodeLens の参照を有効/無効にします。", + "typescript.referencesCodeLens.enabled": "TypeScript ファイル内で CodeLens の参照を有効/無効にします。TypeScript 2.0.6 以上が必要です。", + "typescript.implementationsCodeLens.enabled": "CodeLens の実装を有効/無効にします。TypeScript 2.2.0 以上が必要です。", + "typescript.openTsServerLog.title": "TS サーバーのログを開く", + "typescript.restartTsServer": "TS サーバーを再起動", + "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", + "typescript.reportStyleChecksAsWarnings": "スタイルチェックレポートを警告扱いとする", + "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", + "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", + "typescript.npm": "型定義の自動取得に使用される NPM 実行可能ファイルへのパスを指定します。TypeScript 2.3.4 以上が必要です。", + "typescript.check.npmIsInstalled": "型定義の自動取得に NPM がインストールされているかどうかを確認します。", + "javascript.nameSuggestions": "JavaScript の候補リスト内でファイルから一意の名前を含むかどうかを有効/無効にします。", + "typescript.tsc.autoDetect": "tsc タスクの自動検出を制御します。'off' はこの機能を無効にします。'build' は 1 つのコンパイル実行タスクのみを表示します。'watch' はコンパイルとウォッチ タスクのみを表示します。'on' はビルド タスクとウォッチ タスクの両方を表示します。既定値は 'on' です。", + "typescript.problemMatchers.tsc.label": "TypeScript の問題", + "typescript.problemMatchers.tscWatch.label": "TypeScript の問題 (ウォッチ モード)", + "typescript.quickSuggestionsForPaths": "Import パスを入力するときのクイック候補を有効/無効にします。", + "typescript.locale": "TypeScript のエラーを報告するために使用するロケールを設定します。TypeScript 2.6.0 以上が必要です。'null' の規定値は TypeScript のエラーに VS Code のロケールを使用します。", + "javascript.implicitProjectConfig.experimentalDecorators": "プロジェクト外の JavaScript ファイルの 'experimentalDecorators' を有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", + "typescript.autoImportSuggestions.enabled": "自動 import 提案を有効/無効にします。TypeScript 2.6.1 以上が必要です", + "typescript.experimental.syntaxFolding": "構文の折りたたみマーカー認識を有効/無効にします。", + "taskDefinition.tsconfig.description": "TS ビルドを定義する tsconfig ファイル。", + "javascript.suggestionActions.enabled": "エディター内で JavaScript ファイルの診断の提案を有効または無効にします。TypeScript 2.8 以上である必要があります。", + "typescript.suggestionActions.enabled": "エディター内で TypeScript ファイルの診断の提案を有効または無効にします。TypeScript 2.8 以上である必要があります。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/node/processes.i18n.json b/i18n/jpn/src/vs/base/node/processes.i18n.json index 1a69c4ed49d..35229bd6699 100644 --- a/i18n/jpn/src/vs/base/node/processes.i18n.json +++ b/i18n/jpn/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "UNC ドライブでシェル コマンドを実行できません。" + ] } \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json b/i18n/jpn/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json index ce4101ffa70..bb65d0f69b0 100644 --- a/i18n/jpn/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json +++ b/i18n/jpn/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json @@ -6,6 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "quickOpenAriaLabelEntry": "{0}、選択", + "quickOpenAriaLabelEntry": "{0}, ピッカー", "quickOpenAriaLabel": "選択" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 17b19815820..e06ec774240 100644 --- a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,10 +8,11 @@ ], "previewOnGitHub": "GitHub 上でプレビュー", "loadingData": "データを読み込んでいます...", + "rateLimited": "GitHub クエリの制限を超えました。お待ちください。", "similarIssues": "類似の問題", "open": "Open", "closed": "Closed", - "noResults": "一致する項目はありません", + "noSimilarIssues": "類似の問題は見つかりませんでした", "settingsSearchIssue": "設定検索の問題", "bugReporter": "バグ レポート", "featureRequest": "機能欲求", diff --git a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 4222ad5ea5d..06d09e1c611 100644 --- a/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/jpn/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,12 @@ ], "completeInEnglish": "英語で記入して下さい。", "issueTypeLabel": "種類", + "issueSourceLabel": "記録", + "vscode": "Visual Studio Code", + "extension": "拡張機能", + "disableExtensionsLabelText": "{0} を実行後に問題を再現してみてください。拡張機能がアクティブな場合にのみ問題が再現する場合は、拡張機能の問題である可能性があります。", + "disableExtensions": "すべての拡張機能を無効にしてウィンドウを再読みする", + "chooseExtension": "拡張機能", "issueTitleLabel": "題名", "issueTitleRequired": "題名を入力してください", "titleLengthValidation": "タイトルが長すぎます。", @@ -18,13 +24,6 @@ "extensions": "私の拡張機能", "searchedExtensions": "見つかった拡張機能", "settingsSearchDetails": "設定検索の詳細", - "tryDisablingExtensions": "拡張機能が無効な場合に問題は再現可能ですか?", - "yes": "はい", - "no": "いいえ", - "disableExtensionsLabelText": "{0} を実行後に問題を再現してみてください。", - "disableExtensions": "すべての拡張機能を無効にしてウィンドウを再読みする", - "showRunningExtensionsLabelText": "拡張機能の問題と疑われる場合、拡張機能の問題を報告するために {0} を実行してください。", - "showRunningExtensions": "すべての実行中の拡張機能を表示する", "details": "詳細を入力してください。", "loadingData": "データを読み込んでいます..." } \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..fb628eb4d5d --- /dev/null +++ b/i18n/jpn/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cpu": "CPU %", + "memory": "メモリ (MB)", + "pid": "pid", + "name": "名前", + "killProcess": "プロセスの終了", + "forceKillProcess": "プロセスの強制終了" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index 764bb3ddb5f..64e268008b7 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -161,6 +161,7 @@ "mMergeAllWindows": "すべてのウィンドウを統合", "miToggleDevTools": "開発者ツールの切り替え(&&T)", "miAccessibilityOptions": "ユーザー補助オプション(&&O)", + "miOpenProcessExplorerer": "プロセス エクスプローラーを開く(&&P)", "miReportIssue": "問題の報告(&&I)", "miWelcome": "ようこそ(&&W)", "miInteractivePlayground": "対話型プレイグラウンド(&&I)", diff --git a/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json index 427defd525a..fde5f743633 100644 --- a/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/jpn/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "閉じる", - "header": "{1} の差分 {0}: 変更前の {2}、{3} 行、変更後の {4}、{5} 行", "blankLine": "空白", "equalLine": "変更前の {0}、変更後の {1}: {2}", "insertLine": "+ 変更後の {0}: {1}", diff --git a/i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/jpn/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 1024574c477..f0fdce2980a 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "Windows および Linux 上の `Control` キーと macOS 上の `Command` キーに割り当てます。", "multiCursorModifier.alt": "Windows および Linux 上の `Alt` キーと macOS 上の `Option` キーに割り当てます。", "multiCursorModifier": "マウスを使用して複数のカーソルを追加するときに使用する修飾キーです。`ctrlCmd` は Windows および Linux 上の `Control` キーと macOS 上の `Command` キーに割り当てます。「定義に移動」や「リンクを開く」のマウス操作は、マルチカーソルの修飾キーと競合しないように適用されます。", + "multiCursorMergeOverlapping": "複数のカーソルが重なっているときは、マージします。", "quickSuggestions.strings": "文字列内でクイック候補を有効にします。", "quickSuggestions.comments": "コメント内でクイック候補を有効にします。", "quickSuggestions.other": "文字列およびコメント外でクイック候補を有効にします。", @@ -88,6 +89,9 @@ "renderLineHighlight": "エディターが現在の行をどのように強調表示するかを制御します。考えられる値は 'none'、'gutter'、'line'、'all' です。", "codeLens": "エディターで CodeLens を表示するかどうかを制御する", "folding": "エディターでコードの折りたたみを有効にするかどうかを制御します", + "foldingStrategyAuto": "利用可能であれば、言語に特有の折りたたみ方式を使用して、そうでない場合はインデント方式に戻ります。", + "foldingStrategyIndentation": "常にインデントに基づく折りたたみ方式を使用します", + "foldingStrategy": "折りたたみ範囲の計算方法を制御します。'auto' は利用可能であれば言語固有の折りたたみ方式を使用します。'indentation' は常にインデントに基づく折りたたみ方式を使用します。", "showFoldingControls": "余白上の折りたたみコントロールを自動的に非表示にするかどうかを制御します 。", "matchBrackets": "かっこを選択すると、対応するかっこを強調表示します。", "glyphMargin": "エディターで縦のグリフ余白が表示されるかどうかを制御します。ほとんどの場合、グリフ余白はデバッグに使用されます。", @@ -105,5 +109,7 @@ "selectionClipboard": "Linux の PRIMARY クリップボードをサポートするかどうかを制御します。", "sideBySide": "差分エディターが差分を横に並べて表示するか、行内に表示するかを制御します", "ignoreTrimWhitespace": "差分エディターが、先頭または末尾の空白の変更を差分として表示するかどうかを制御します。", + "largeFileSize": "特別な最適化ルールが適用されるバイト単位でファイルサイズのしきい値を制御します", + "largeFileLineCount": "特別な最適化ルールが適用される行数の観点からファイルサイズのしきい値を制御します", "renderIndicators": "差分エディターが追加/削除された変更に +/- インジケーターを示すかどうかを制御します" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json index d5e55bf5dc9..3edd17c221f 100644 --- a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "エディター インデント ガイドの色。", "editorLineNumbers": "エディターの行番号の色。", "editorActiveLineNumber": "エディターのアクティブ行番号の色", + "deprecatedEditorActiveLineNumber": "id は使用しないでください。代わりに 'EditorLineNumber.activeForeground' を使用してください。", "editorRuler": "エディター ルーラーの色。", "editorCodeLensForeground": "CodeLens エディターの前景色。", "editorBracketMatchBackground": "一致するかっこの背景色", diff --git a/i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..8afb4eaf750 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,18 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "修正プログラム ({0}) を表示する", + "quickFix": "修正プログラムを表示する", + "quickfix.trigger.label": "クイック フィックス...", + "editor.action.quickFix.noneMessage": "利用可能なコード アクションはありません", + "refactor.label": "リファクター...", + "editor.action.refactor.noneMessage": "利用可能なリファクタリングはありません", + "source.label": "ソース アクション...", + "editor.action.source.noneMessage": "利用可能なソース アクションはありません", + "organizeImports.label": "インポートを整理" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json b/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json index 2f1848eb3b1..a95eddbcb87 100644 --- a/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/format/formatActions.i18n.json @@ -12,5 +12,6 @@ "hintnn": "行 {1} と {2} の間で {0} 個の書式設定を編集", "no.provider": "インストールされた '{0}'ファイル用のフォーマッターが存在しません。", "formatDocument.label": "ドキュメントのフォーマット", + "no.documentprovider": "インストールされた '{0}'ファイル用のドキュメント フォーマッターが存在しません。", "formatSelection.label": "選択範囲のフォーマット" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/links/links.i18n.json b/i18n/jpn/src/vs/editor/contrib/links/links.i18n.json index 0b3715fb4e0..5bdb5b2382d 100644 --- a/i18n/jpn/src/vs/editor/contrib/links/links.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/links/links.i18n.json @@ -10,7 +10,9 @@ "links.navigate": "Ctrl キーを押しながらクリックしてリンク先を表示", "links.command.mac": "command キーを押しながらクリックしてコマンドを実行", "links.command": "Ctrl キーを押しながらクリックしてコマンドを実行", + "links.navigate.al.mac": "Option キーを押しながらクリックしてリンク先を表示", "links.navigate.al": "Altl キーを押しながらクリックしてリンク先を表示", + "links.command.al.mac": "Option キーを押しながらクリックしてコマンドを実行", "links.command.al": "Alt キーを押しながらクリックしてコマンドを実行", "invalid.url": "このリンクは形式が正しくないため開くことができませんでした: {0}", "missing.url": "このリンクはターゲットが存在しないため開くことができませんでした。", diff --git a/i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json index ac1989254f6..80c47f9bca0 100644 --- a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "'Developer: Startup Performance' コマンドを有効にして開始します。", "prof-startup": "起動中に CPU プロファイラーを実行する", "disableExtensions": "インストールされたすべての拡張機能を無効にします。", - "inspect-extensions": "拡張機能のデバッグとプロファイリングを許可します。接続 URI を開発者ツールでチェックします。", - "inspect-brk-extensions": "起動後に一時停止されている拡張ホストとの拡張機能のデバッグとプロファイリングを許可します。接続 URI を開発者ツールでチェックします。", "disableGPU": "GPU ハードウェア アクセラレータを無効にします。", "uploadLogs": "現在のセッションから安全なエンドポイントにログをアップロードします。", "maxMemory": "ウィンドウの最大メモリ サイズ (バイト単位)。", diff --git a/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json index 4b14b839908..96e0f8571e1 100644 --- a/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "`engines.vscode` 値 {0} を解析できませんでした。使用可能な値の例: ^0.10.0、^1.2.3、^0.11.0、^0.10.x など。", + "versionSyntax": "`engines.vscode` の値 {0} を解析できませんでした。使用可能な値の例: ^1.22.0、^1.22.x など。", "versionSpecificity1": "`engines.vscode` ({0}) で指定されたバージョンが十分に特定されていません。1.0.0 より前の vscode バージョンの場合は、少なくとも想定されているメジャー バージョンとマイナー バージョンを定義してください。例 ^0.10.0、0.10.x、0.11.0 など。", "versionSpecificity2": "`engines.vscode` ({0}) で指定されたバージョンが明確ではありません。1.0.0 より後のバージョンの vscode の場合は、少なくとも、想定されているメジャー バージョンを定義してください。例 ^1.10.0、1.10.x、1.x.x、2.x.x など。", "versionMismatch": "拡張機能が Code {0} と互換性がありません。拡張機能に必要なバージョン: {1}。" diff --git a/i18n/jpn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/jpn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index 020c403fa83..fca35bd3e43 100644 --- a/i18n/jpn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/jpn/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "{0} インストールが壊れている可能性があります。再インストールしてください。", "integrity.moreInformation": "詳細情報", - "integrity.dontShowAgain": "今後は表示しない", - "integrity.prompt": "{0} インストールが壊れている可能性があります。再インストールしてください。" + "integrity.dontShowAgain": "今後は表示しない" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/issue/electron-main/issueService.i18n.json b/i18n/jpn/src/vs/platform/issue/electron-main/issueService.i18n.json index 40973f69053..3e52b3813de 100644 --- a/i18n/jpn/src/vs/platform/issue/electron-main/issueService.i18n.json +++ b/i18n/jpn/src/vs/platform/issue/electron-main/issueService.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "issueReporter": "問題のレポーター" + "issueReporter": "問題のレポーター", + "processExplorer": "プロセス エクスプローラー" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..badee921d01 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": " `{0}` プロパティは必須で、`string` 型でなければなりません", + "showViewlet": "{0} を表示", + "view": "表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 34c3b6de4d3..d69af0170e1 100644 --- a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "ビューをエディターに提供します", "views.explorer": "エクスプローラー ビュー", "views.debug": "デバッグ ビュー", - "locationId.invalid": "`{0}` は有効なビューの場所ではありません", "duplicateView1": "location `{1}` で同じ id `{0}` を使用する複数のビューを登録できません", "duplicateView2": "location `{1}` で id `{0}` のビューが既に登録されています" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 01bd67d78ca..b0aba9ae620 100644 --- a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview エディター" + "errorMessage": "view:{0} を復元中にエラーが発生しました" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 7c41e9e639c..e7c0107e6c1 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,7 @@ "screenReaderDetectedExtra": "スクリーン リーダーを使用しない場合、`editor.accessibilitySupport` を \"off\" にしてください。", "disableTabMode": "アクセシビリティ モードを無効にする", "gotoLine": "行へ移動", - "indentation": "インデント", + "selectIndentation": "インデントを選択", "selectEncoding": "エンコードの選択", "selectEOL": "改行コードの選択", "selectLanguageMode": "言語モードの選択", diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 93c2b61746d..9be51e2dac8 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,11 @@ "sizeMB": "{0}MB", "sizeGB": "{0}GB", "sizeTB": "{0}TB", - "largeImageError": "画像のファイル サイズが非常に大きい (>1MB) ため、エディターに表示されません。 ", + "largeImageError": "画像が大きすぎるため、エディターに表示されません ({0})。", "resourceOpenExternalButton": "外部のプログラムを使用して画像を開きますか?", - "nativeBinaryError": "このファイルはバイナリか、非常に大きいか、またはサポートされていないテキスト エンコードを使用しているため、エディターに表示されません。", + "nativeFileTooLargeError": "ファイルが大きすぎるため、エディターに表示されません ({0})。", + "nativeBinaryError": "このファイルはバイナリか、サポートされていないテキスト エンコードを使用しているため、エディターに表示されません。", + "openAsText": "このまま開きますか?", "zoom.action.fit.label": "画像全体", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..82b9f0d836c --- /dev/null +++ b/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInput.countSelected": "{0} 個選択済み", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..f4c7eecf0db --- /dev/null +++ b/i18n/jpn/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickInputBox.ariaLabel": "入力すると結果が絞り込まれます。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json index e28495c07d9..bb47142b456 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/actions.i18n.json @@ -32,6 +32,7 @@ "openRecent": "最近開いた項目…", "quickOpenRecent": "最近使用したものを開く...", "reportIssueInEnglish": "問題の報告", + "openProcessExplorer": "プロセス エクスプローラーを開く", "reportPerformanceIssue": "パフォーマンスの問題のレポート", "keybindingsReference": "キーボード ショートカットの参照", "openDocumentationUrl": "ドキュメント", diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 78f2e08e8dc..3b03f305576 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -80,6 +80,7 @@ "titleBarStyle": "ウィンドウのタイトル バーの外観を調整します。変更を適用するには、完全に再起動する必要があります。", "window.nativeTabs": "macOS Sierra ウィンドウ タブを有効にします。この変更を適用するには完全な再起動が必要であり、ネイティブ タブでカスタムのタイトル バー スタイルが構成されていた場合はそれが無効になることに注意してください。", "window.smoothScrollingWorkaround": "最小化した VS Code ウィンドウを元のサイズに戻したあと、スクロールが滑らかにならない場合はこの回避策を有効にしてください。これは Microsoft Surface のような高精度タッチパッドを備えたデバイスで、スクロールの開始が遅れる問題 (https://github.com/Microsoft/vscode/issues/13612) の回避策です。有効にすると、最小化の状態からウィンドウを元に戻したあとに少しレイアウトがちらつきますが、そうでなければ無害です。", + "window.clickThroughInactive": "有効な場合、非アクティブなウィンドウをクリックするとウィンドウがアクティブになり、クリック可能な場合はマウスの下の要素がトリガーされます。無効にすると、非アクティブなウィンドウの任意の場所をクリックするとそのウィンドウがアクティブになり、要素には 2 回目のクリックが必要になります。", "zenModeConfigurationTitle": "Zen Mode", "zenMode.fullScreen": "Zen Mode をオンにするとワークベンチを自動的に全画面モードに切り替えるかどうかを制御します。", "zenMode.centerLayout": "Zen Mode をオンにしたときにレイアウトを中央揃えにするかどうかを制御します。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 2f23d0808e7..0338237fdd3 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "ブレークポイントの編集...", + "breakpoint": "ブレークポイント", "functionBreakpointsNotSupported": "このデバッグの種類では関数ブレークポイントはサポートされていません", "functionBreakpointPlaceholder": "中断対象の関数", "functionBreakPointInputAriaLabel": "関数ブレークポイントを入力します", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index e5f19bbddb1..46a0d6b70e2 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -6,12 +6,9 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "breakpointWidgetLogMessagePlaceholder": "ブレークポイントにヒットしたときにログに記録するメッセージ。'Enter' で決定、 'esc' でキャンセルします。", + "breakpointWidgetLogMessagePlaceholder": "ブレークポイントにヒットしたときにログに記録するメッセージ。{} 内の式は補間されます。受け入れるには 'Enter' を、キャンセルするには 'esc' を押します。", "breakpointWidgetHitCountPlaceholder": "ヒット カウント条件が満たされる場合に中断します。'Enter' を押して受け入れるか 'Esc' を押して取り消します。", "breakpointWidgetExpressionPlaceholder": "式が true と評価される場合に中断します。'Enter' を押して受け入れるか 'Esc' を押して取り消します。", - "breakpointWidgetLogMessageAriaLabel": "このブレークポイントがヒットするたびにプログラムはこのメッセージを記録します。Enter を押して受け入れるか、Esc を押して取り消します。", - "breakpointWidgetHitCountAriaLabel": "ヒット カウントが満たされる場合にのみプログラムはこの位置で停止します。Enter を押して受け入れるか、Esc を押して取り消します。", - "breakpointWidgetAriaLabel": "この条件が true の場合にのみプログラムはこの位置で停止します。Enter を押して受け入れるか、Esc を押して取り消します。", "expression": "式", "hitCount": "ヒット カウント", "logMessage": "ログ メッセージ" diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 54068276642..87ac8b86e6a 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -27,5 +27,6 @@ "onFirstSessionStart": "初めてデバッグが開始されたときのみステータス バーにデバッグを表示する", "showInStatusBar": "デバッグのステータス バーが表示されるタイミングを制御", "openDebug": "デバッグ ビューを開くか、デバッグ セッションを開始するかを制御します。", - "launch": "グローバル デバッグ起動構成。ワークスペース間で共有される 'launch.json' の代わりとして使用する必要があります" + "launch": "グローバル デバッグ起動構成。ワークスペース間で共有される 'launch.json' の代わりとして使用する必要があります", + "extensionHostDebugAdapter": "拡張機能ホストのデバッグ アダプターを実行します" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 4964b4c61de..8d180e08a3d 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,7 @@ "useUniqueNames": "一意の構成名を使用してください。", "app.launch.json.compound.folder": "複合があるフォルダーの名前。", "app.launch.json.compounds.configurations": "この複合の一部として開始される構成の名前。", - "debugNoType": "デバッグ アダプター 'type' は省略不可で、'string' 型でなければなりません。", + "debugNoType": "デバッガー 'type' は省略不可で、'string' 型でなければなりません。", "selectDebug": "環境の選択", "DebugConfig.failed": "'launch.json' ファイルを '.vscode' フォルダー ({0}) 内に作成できません。", "workspace": "ワークスペース", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index ab14921810e..8856e9d9942 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "ブレークポイントの編集...", - "disableBreakpoint": "ブレークポイントの無効化", - "enableBreakpoint": "ブレークポイントの有効化", + "breakpoint": "ブレークポイント", "removeBreakpoints": "ブレークポイントの削除", "removeBreakpointOnColumn": "列 {0} のブレークポイントの削除", "removeLineBreakpoint": "行のブレークポイントの削除", @@ -21,7 +19,8 @@ "enableBreakpoints": "列 {0} のブレークポイントの有効化", "enableBreakpointOnLine": "行のブレークポイントの有効化", "addBreakpoint": "ブレークポイントの追加", - "conditionalBreakpoint": "条件付きブレークポイントの追加...", + "addConditionalBreakpoint": "条件付きブレークポイントの追加...", "addLogPoint": "ログ ポイントを追加...", + "cancel": "キャンセル", "addConfiguration": "構成の追加..." } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index fa6decef9ba..262d8dacd54 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "詳細情報", - "unableToLaunchDebugAdapter": "デバッグ アダプターを {0} から起動できません。", - "unableToLaunchDebugAdapterNoArgs": "デバッグ アダプターを起動できません。", - "stoppingDebugAdapter": "{0}。デバッグ アダプターを停止しています。", "debugAdapterCrash": "デバッグ アダプター プロセスが予期せず終了しました" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index d8917f641c3..152d9f1c423 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,19 +8,6 @@ ], "debugAdapterBinNotFound": "デバッグ アダプターの実行可能ファイル '{0}' がありません。", "debugAdapterCannotDetermineExecutable": "デバッグ アダプター '{0}' の実行可能ファイルを判別できません。", - "launch.config.comment1": "IntelliSense を使用して利用可能な属性を学べます。", - "launch.config.comment2": "既存の属性の説明をホバーして表示します。", - "launch.config.comment3": "詳細情報は次を確認してください: {0}", - "debugType": "構成の種類。", - "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能がインストールされており、有効になっていることを確認してください。", - "node2NotSupported": "\"node2\" はサポートされていません。代わりに \"node\" を使用し、\"protocol\" 属性を \"inspector\" に設定してください。", - "debugName": "構成の名前。起動構成のドロップダウン メニューに表示されます。", - "debugRequest": "構成の要求の種類。\"launch\" または \"attach\" です。", - "debugServer": "デバッグ拡張機能の開発のみ。ポートが指定の VS Code の場合、サーバー モードで実行中のデバッグ アダプターへの接続が試行されます。", - "debugPrelaunchTask": "デバッグ セッションの開始前に実行するタスク。", - "debugPostDebugTask": "デバッグ セッションの終了後に実行するタスク。", - "debugWindowsConfiguration": "Windows 固有の起動構成の属性。", - "debugOSXConfiguration": "OS X 固有の起動構成の属性。", - "debugLinuxConfiguration": "Linux 固有の起動構成の属性。", - "deprecatedVariables": "'env.'、'config.'、'command.' は使用されていません。代わりに、'env:'、'config:'、'command:' を使用してください。" + "unableToLaunchDebugAdapter": "デバッグ アダプターを {0} から起動できません。", + "unableToLaunchDebugAdapterNoArgs": "デバッグ アダプターを起動できません。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..af1ed513222 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "IntelliSense を使用して利用可能な属性を学べます。", + "launch.config.comment2": "既存の属性の説明をホバーして表示します。", + "launch.config.comment3": "詳細情報は次を確認してください: {0}", + "debugType": "構成の種類。", + "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能がインストールされており、有効になっていることを確認してください。", + "node2NotSupported": "\"node2\" はサポートされていません。代わりに \"node\" を使用し、\"protocol\" 属性を \"inspector\" に設定してください。", + "debugName": "構成の名前。起動構成のドロップダウン メニューに表示されます。", + "debugRequest": "構成の要求の種類。\"launch\" または \"attach\" です。", + "debugServer": "デバッグ拡張機能の開発のみ。ポートが指定の VS Code の場合、サーバー モードで実行中のデバッグ アダプターへの接続が試行されます。", + "debugPrelaunchTask": "デバッグ セッションの開始前に実行するタスク。", + "debugPostDebugTask": "デバッグ セッションの終了前に実行するタスク。", + "debugWindowsConfiguration": "Windows 固有の起動構成の属性。", + "debugOSXConfiguration": "OS X 固有の起動構成の属性。", + "debugLinuxConfiguration": "Linux 固有の起動構成の属性。", + "deprecatedVariables": "'env.'、'config.'、'command.' は使用されていません。代わりに、'env:'、'config:'、'command:' を使用してください。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..3b21863f9bf --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "VS Code コンソール", + "mac.terminal.script.failed": "スクリプト '{0}' が終了コード {1} で失敗しました", + "mac.terminal.type.not.supported": "'{0}' はサポートされていません", + "press.any.key": "続行するには、任意のキーを押してください...", + "linux.term.failed": "'{0}' が終了コード {1} で失敗しました" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 039a3a0e4af..6012be2dbf3 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -37,7 +37,7 @@ "localizations": "ローカライズ ({0})", "localizations language id": "言語 ID", "localizations language name": "言語名", - "localizations localized language name": "言語名 (ローカライズ済み)", + "localizations localized language name": "言語名 (ローカライズ)", "colorThemes": "配色テーマ ({0})", "iconThemes": "アイコン テーマ ({0})", "colors": "配色 ({0})", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 23443bd8220..cea0c685ac7 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "現在のワークスペースのユーザーによってこの拡張機能が推奨されています。", "reallyRecommended2": "このファイルの種類には拡張機能 '{0}' が推奨されます。", "reallyRecommendedExtensionPack": "このファイルの種類には拡張機能パック '{0}' が推奨されます。", - "showRecommendations": "推奨事項を表示", "install": "インストール", + "showRecommendations": "推奨事項を表示", "showLanguageExtensions": "'.{0}' ファイルに役立つ拡張機能が Marketplace にあります", "workspaceRecommended": "このワークスペースには拡張機能の推奨事項があります。", "installAll": "すべてインストール", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 75dbb45c728..22837a8d961 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "キーバインド間の競合を回避するために、他のキーマップ ({0}) を無効にしますか?", "yes": "はい", - "no": "いいえ", - "betterMergeDisabled": "拡張機能 Better Merge は現在ビルトインです。インストール済みの拡張機能は無効化され、アンインストールできます。", - "uninstall": "アンインストール" + "no": "いいえ" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index bab69eb2957..5d9d43e41b5 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -14,7 +14,7 @@ "workspaceRecommendedExtensions": "ワークスペースの推奨事項", "builtInExtensions": "機能", "builtInThemesExtensions": "テーマ", - "builtInBasicsExtensions": "言語", + "builtInBasicsExtensions": "プログラミング言語", "searchExtensions": "Marketplace で拡張機能を検索する", "sort by installs": "並べ替え: インストール数", "sort by rating": "並べ替え: 評価", diff --git a/i18n/jpn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json index 75b84f17fd8..0c2ececf19e 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -8,8 +8,8 @@ ], "textFileEditor": "テキスト ファイル エディター", "createFile": "ファイルの作成", - "relaunchWithIncreasedMemoryLimit": "再起動", - "configureMemoryLimit": "構成", + "relaunchWithIncreasedMemoryLimit": "{0} MB で再起動", + "configureMemoryLimit": "メモリ制限を構成する", "fileEditorWithInputAriaLabel": "{0}。テキスト ファイル エディター。", "fileEditorAriaLabel": "テキスト ファイル エディター。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 128e5ec3d69..9887d214dcb 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -38,7 +38,7 @@ "trashFailed": "ごみ箱を使用した削除に失敗しました。代わりに完全に削除しますか?", "deletePermanentlyButtonLabel": "完全に削除(&&D)", "retryButtonLabel": "再試行(&&R)", - "importFiles": "ファイルのインポート", + "addFiles": "ファイルを追加", "confirmOverwrite": "保存先のフォルダーに同じ名前のファイルまたはフォルダーが既に存在します。置き換えてもよろしいですか?", "replaceButtonLabel": "置換(&&R)", "fileIsAncestor": "ペーストするファイルは送り先フォルダの上位にいます", diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 0f218645e33..fa96297a410 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -35,7 +35,7 @@ "hotExit": "エディターを終了するときに保存を確認するダイアログを省略し、保存されていないファイルをセッション後も保持するかどうかを制御します。", "useExperimentalFileWatcher": "新しい試験的な File Watcher を使用します。", "defaultLanguage": "新しいファイルに割り当てられる既定の言語モード。", - "maxMemoryForLargeFilesMB": "大きなファイルを開くために再起動するときに、アプリケーションが使用する新しい MB 単位のメモリ制限。上限を再設定して起動する場合、 --max-memory=NEWSIZE をコマンド ラインで指定してアプリケーションを起動することもできます。", + "maxMemoryForLargeFilesMB": "大きなファイルを開こうとしたとき、VS Code の再起動後に使用できるメモリを制御します。コマンド ラインで --max-memory=NEWSIZE を指定するのと同じ効果があります。", "editorConfigurationTitle": "エディター", "formatOnSave": "ファイルを保存するときにフォーマットしてください。フォーマッタを使用可能にして、ファイルを自動保存せず、エディターをシャットダウンしないでください。", "formatOnSaveTimeout": "保存時フォーマットのタイムアウトを制御します。formatOnSave-コマンドの時間制限をミリ秒単位で指定してください。指定したタイムアウトよりも時間がかかるコマンドはキャンセルされます。", diff --git a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index bc26deafdbb..49eca2ec9c5 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "ファイル名を入力します。Enter キーを押して確認するか、Esc キーを押して取り消します。", - "constructedPath": "**{1}** に {0} を作成", "filesExplorerViewerAriaLabel": "{0}、ファイル エクスプローラー", "dropFolders": "ワークスペースにフォルダーを追加しますか?", "dropFolder": "ワークスペースにフォルダーを追加しますか?", diff --git a/i18n/jpn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index a9659f21937..19b3916384b 100644 --- a/i18n/jpn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -9,7 +9,7 @@ "updateLocale": "VS Code の UI 言語を {0} にして再起動しますか?", "yes": "はい", "no": "いいえ", - "doNotAskAgain": "再度表示しない", + "neverAgain": "今後は表示しない", "JsonSchema.locale": "使用する UI 言語。", "vscode.extension.contributes.localizations": "ローカリゼーションをエディターに提供します", "vscode.extension.contributes.localizations.languageId": "表示文字列が翻訳される言語の id。", diff --git a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index d2939459ebd..c26e068a735 100644 --- a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "コピー", - "copyMarkerMessage": "メッセージのコピー" + "copyMessage": "メッセージのコピー" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 4d411c1a062..182631b8761 100644 --- a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "合計 {0} 個の問題", - "filteredProblems": "{1} 個中 {0} 個の問題を表示しています" + "totalProblems": "合計 {0} 個の問題" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..d91b356dc32 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "disableFilesExclude": "ファイルの除外を無効。", + "clearFilter": "フィルターの解除。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..568a2eaf8e4 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "showing filtered problems": "{0} / {1} を表示しています" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 67dcb1da19f..58202066e48 100644 --- a/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,13 @@ "markers.panel.title.problems": "問題", "markers.panel.aria.label.problems.tree": "ファイル別にグループ化した問題", "markers.panel.no.problems.build": "現時点でワークスペースの問題は検出されていません。", - "markers.panel.no.problems.filters": "指定されたフィルター条件による結果はありません", + "markers.panel.no.problems.filters": "指定されたフィルター条件による結果はありません。", + "markers.panel.no.problems.file.exclusions": "ファイルの除外設定が有効なため、すべての問題が非表示になっています。", + "markers.panel.action.useFilesExclude": "ファイルの除外設定を使用してフィルター処理", + "markers.panel.action.donotUseFilesExclude": "ファイルの除外設定を使用しない", "markers.panel.action.filter": "問題のフィルター処理", - "markers.panel.filter.placeholder": "種類またはテキストでフィルター処理", + "markers.panel.filter.ariaLabel": "問題のフィルター処理", + "markers.panel.filter.placeholder": "フィルター。例: text, **/*.ts, !**/node_modules/**", "markers.panel.filter.errors": "エラー", "markers.panel.filter.warnings": "警告", "markers.panel.filter.infos": "情報", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 15fc42aa021..efda21bd767 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "キーボード ショートカット", "showDefaultKeybindings": "既定のキーバインドを表示", "showUserKeybindings": "ユーザーのキーバインドを表示", "SearchKeybindings.AriaLabel": "キー バインドの検索", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index dd841c1f6e7..4cea9d36a1a 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "既定の設定を Raw で開く", + "openSettings": "設定を開く", "openGlobalSettings": "ユーザー設定を開く", "openGlobalKeybindings": "キーボード ショートカットを開く", "openGlobalKeybindingsFile": "キーボード ショートカット ファイルを開く", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index b7e7f03ad0d..e3cca40ad76 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "既定の設定", "SearchSettingsWidget.AriaLabel": "設定の検索", "SearchSettingsWidget.Placeholder": "設定の検索", "noSettingsFound": "結果なし", @@ -16,6 +15,8 @@ "nlpResult": "自然文 (natural language) の結果", "filterResult": "フィルター後の結果", "defaultSettings": "既定の設定", + "defaultUserSettings": "既定のユーザー設定", + "defaultWorkspaceSettings": "既定のワークスペース設定", "defaultFolderSettings": "既定のフォルダー設定", "defaultEditorReadonly": "既定値を上書きするには、右側のエディターを編集します。", "preferencesAriaLabel": "既定の基本設定。読み取り専用のテキスト エディター。" diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 4a81bb3201b..c8dc571e62a 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "拡張機能 \"{0}\" を表示", "editTtile": "編集", "replaceDefaultValue": "設定を置換", - "copyDefaultValue": "設定にコピー", - "unsupportedPHPExecutablePathSetting": "この設定はユーザー設定でなければなりません。ワークスペースのために PHP を構成するには、PHP ファイルを開き、ステータス バーの [PHP パス] をクリックします。", - "unsupportedWorkspaceSetting": "この設定はユーザー設定でなければなりません。", - "unsupportedWorkbenchSetting": "この設定は現在適用できません。このフォルダーを直接開いたときに適用されます。", - "unsupportedWorkbenchSettingDevMode": "この設定は現在適用できません。登録時にスコープを 'resource' と定義している場合かこのフォルダーを直接開いたときに適用されます。" + "copyDefaultValue": "設定にコピー" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index cb6f2096d64..fadead296a9 100644 --- a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "その他の SCM プロバイダーをインストール...", "no open repo": "有効なソース管理プロバイダーがありません。", "source control": "ソース管理", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "非表示" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json index 2f468e9bae1..3e97075b786 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "次の検索包含パターンを表示", "previousSearchIncludePattern": "前の検索包含パターンを表示", + "nextSearchExcludePattern": "次の検索除外パターンを表示", + "previousSearchExcludePattern": "前の検索除外パターンを表示", "nextSearchTerm": "次の検索語句を表示", "previousSearchTerm": "前の検索語句を表示", - "showSearchViewlet": "検索の表示", "findInFiles": "フォルダーを指定して検索", "replaceInFiles": "複数のファイルで置換", "RefreshAction.label": "最新の情報に更新", diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/searchView.i18n.json index 641a488aa05..e3bc313f762 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,9 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "詳細検索の切り替え", - "searchIncludeExclude.label": "包含/除外するファイル", - "searchIncludeExclude.ariaLabel": "検索の包含/除外パターン", - "searchIncludeExclude.placeholder": "例: src, !*.ts, test/**/*.log", + "searchScope.includes": "含めるファイル", + "label.includes": "検索包含パターン", + "searchScope.excludes": "除外するファイル", + "label.excludes": "検索除外パターン", "replaceAll.confirmation.title": "すべて置換", "replaceAll.confirm.button": "置換(&&R)", "replaceAll.occurrence.file.message": "{1} 個のファイルで {0} 件の出現箇所を '{2}' に置換しました。", diff --git a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 2fde4d268c7..f6fb99713ec 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "検索", + "copyMatchLabel": "コピー", + "copyPathLabel": "パスのコピー", + "copyAllLabel": "すべてコピー", + "toggleSearchViewPositionLabel": "検索ビュー位置の切り替え", "findInFolder": "フォルダー内を検索...", "findInWorkspace": "ワークスペース内を検索...", "showTriggerActions": "ワークスペース内のシンボルへ移動...", "name": "検索", - "search": "検索", "showSearchViewl": "検索の表示", "view": "表示", "findInFiles": "フォルダーを指定して検索", @@ -26,5 +30,5 @@ "search.followSymlinks": "検索中にシンボリック リンクをたどるかどうかを制御します。", "search.smartCase": "すべて小文字のパターンの場合、大文字と小文字を区別しないで検索し、そうでない場合は大文字と小文字を区別して検索する", "search.globalFindClipboard": "macOS で検索ビューが共有の検索クリップボードを読み取りまたは変更するかどうかを制御します", - "search.location": "プレビュー: 検索をサイドバーのビューとして表示するか、より水平方向の空間をとるためにパネル領域のパネルとして表示するかを制御します。次のリリースのパネル内の検索で水平レイアウトが改善され、プレビューではなくなります。" + "search.location": "検索をサイドバーのビューとして、または、より水平的なパネルとして表示するかを制御します。次期リリースではパネル内検索の水平レイアウトが改善され、プレビューではなくなります。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json index 2b6db6f461c..21441eaa272 100644 --- a/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -7,7 +7,7 @@ "Do not edit this file. It is machine generated." ], "invalid.path.0": "`contributes.{0}.path` に文字列が必要です。提供された値: {1}", - "invalid.language.0": "言語を省略するとき、`contributes.{0}.path` の値は `.code-snippets`-file にする必要があります。提供された値: {1}", + "invalid.language.0": "言語を省略するとき、`contributes.{0}.path` の値は `.code-snippets`-file にする必要があります。提供された値: {1}", "invalid.language": "`contributes.{0}.language` で不明な言語です。提供された値: {1}", "invalid.path.1": "拡張機能のフォルダー ({2}) の中に `contributes.{0}.path` ({1}) が含まれている必要があります。これにより拡張を移植できなくなる可能性があります。", "vscode.extension.contributes.snippets": "スニペットを提供します。", diff --git a/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 1219aeec2ac..a1569ecbff5 100644 --- a/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "{0} のサポートの改善にご協力ください", "takeShortSurvey": "簡単なアンケートの実施", "remindLater": "後で通知する", - "neverAgain": "今後は表示しない", - "helpUs": "{0} のサポートの改善にご協力ください" + "neverAgain": "今後は表示しない" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 0592d0f299f..8a3c261d16c 100644 --- a/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "短いフィードバック アンケートにご協力をお願いできますか?", "takeSurvey": "アンケートの実施", "remindLater": "後で通知する", - "neverAgain": "今後は表示しない", - "surveyQuestion": "短いフィードバック アンケートにご協力をお願いできますか?" + "neverAgain": "今後は表示しない" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index df1f241a2c9..8021ef7847f 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,6 +11,7 @@ "totalErrors": "エラー {0}", "totalWarnings": "警告 {0}", "totalInfos": "情報 {0}", + "problems": "問題", "building": "ビルド中...", "manyProblems": "10K+", "runningTasks": "実行中のタスクを表示", @@ -30,8 +31,10 @@ "selectProblemMatcher": "スキャンするタスク出力のエラーと警告の種類を選択", "customizeParseErrors": "現在のタスクの構成にはエラーがあります。タスクをカスタマイズする前にエラーを修正してください。", "moreThanOneBuildTask": "tasks.json で複数のビルド タスクが定義されています。最初のタスクのみを実行します。\\n", - "TaskSystem.activeSame.background": "'{0}' タスクは既にバックグラウンド モードでアクティブです。タスクを終了するにはタスク メニューから `タスクの終了...` を使用します。", - "TaskSystem.activeSame.noBackground": "{0}' タスクは既にアクティブです。タスクを終了するにはタスク メニューから `タスクの終了...` を使用します。", + "TaskSystem.activeSame.background": "タスク '{0}' は既にバックグラウンド モードでアクティブです。", + "TaskSystem.activeSame.noBackground": "タスク '{0}' は既にアクティブです。", + "terminateTask": "タスクの終了", + "restartTask": "タスクの再開", "TaskSystem.active": "既に実行中のタスクがあります。まずこのタスクを終了してから、別のタスクを実行してください。", "TaskSystem.restartFailed": "タスク {0} を終了して再開できませんでした", "TaskService.noConfiguration": "エラー: {0} タスク検出は次の構成に対してタスクを提供していません:\n{1}\nこのタスクは無視されます。\n", @@ -48,8 +51,8 @@ "recentlyUsed": "最近使用したタスク", "configured": "構成済みのタスク", "detected": "検出されたタスク", - "TaskService.notAgain": "今後は表示しない", "TaskService.ignoredFolder": "次のワークスペース フォルダーはタスク バージョン 0.1.0 を使用しているため無視されます: {0}", + "TaskService.notAgain": "今後は表示しない", "TaskService.pickRunTask": "実行するタスクを選択してください", "TaslService.noEntryToRun": "実行するタスクがありません。タスクを構成する...", "TaskService.fetchingBuildTasks": "ビルド タスクをフェッチしています...", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..1941d0b6328 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "ターミナルの背景色。パネルごとに異なる色を指定できます。", + "terminal.foreground": "ターミナルの前景色。", + "terminalCursor.foreground": "ターミナルのカーソル前景色。", + "terminalCursor.background": "ターミナルのカーソルの背景色。ブロックカーソルで重ねた文字の色をカスタマイズできます。", + "terminal.selectionBackground": "ターミナルの選択範囲の背景色。", + "terminal.border": "ターミナル内の分割パネルを区切る境界線色。デフォルトは panel.border です。", + "terminal.ansiColor": "ターミナルの '{0}' ANSI カラー。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 332b26ef5fc..3d8b5a103a8 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -19,8 +19,9 @@ "workbench.action.terminal.new": "新しい統合ターミナルの作成", "workbench.action.terminal.new.short": "新しいターミナル", "workbench.action.terminal.newWorkspacePlaceholder": "新しいターミナルの作業ディレクトリを選択してください", - "workbench.action.terminal.newInActiveWorkspace": "新しい統合ターミナルを作成 (アクティブなワークスペースに)", + "workbench.action.terminal.newInActiveWorkspace": "(アクティブなワークスペースで) 新しいターミナルの作成", "workbench.action.terminal.split": "ターミナルの分割", + "workbench.action.terminal.splitInActiveWorkspace": "(アクティブなワークスペースで) ターミナルの分割", "workbench.action.terminal.focusPreviousPane": "前のペインにフォーカス", "workbench.action.terminal.focusNextPane": "次のペインにフォーカス", "workbench.action.terminal.resizePaneLeft": "ペインを左にリサイズ", @@ -43,6 +44,7 @@ "workbench.action.terminal.scrollUpPage": "スクロール アップ (ページ)", "workbench.action.terminal.scrollToTop": "一番上にスクロール", "workbench.action.terminal.clear": "クリア", + "workbench.action.terminal.clearSelection": "選択のクリア", "workbench.action.terminal.allowWorkspaceShell": "ワークスペースでシェルを構成することを許可する", "workbench.action.terminal.disallowWorkspaceShell": "ワークスペースでシェルを構成することを許可しない", "workbench.action.terminal.rename": "名前変更", @@ -52,8 +54,8 @@ "nextTerminalFindTerm": "次の検索語句を表示", "previousTerminalFindTerm": "前の検索語句を表示", "quickOpenTerm": "アクティブなターミナルの切り替え", - "workbench.action.terminal.focusPreviousCommand": "前のコマンドにフォーカス", - "workbench.action.terminal.focusNextCommand": "次のコマンドにフォーカス", + "workbench.action.terminal.scrollToPreviousCommand": "前のコマンドにスクロール", + "workbench.action.terminal.scrollToNextCommand": "次のコマンドにスクロール", "workbench.action.terminal.selectToPreviousCommand": "前のコマンドを選択", "workbench.action.terminal.selectToNextCommand": "次のコマンドを選択" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index e57be05971a..c4c322cdd54 100644 --- a/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "このワークスペースには、ユーザー設定でのみ設定可能な設定が含まれています ({0})。詳細情報は[こちら]({1})をクリックしてください。", "openWorkspaceSettings": "ワークスペース設定を開く", - "dontShowAgain": "今後は表示しない", - "unsupportedWorkspaceSettings": "このワークスペースには、ユーザー設定でのみ設定可能な設定が含まれています ({0})。詳細情報は[こちら]({1})をクリックしてください。" + "dontShowAgain": "今後は表示しない" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/jpn/src/vs/workbench/parts/update/electron-browser/update.i18n.json index a45d01fca51..be4c3ee187a 100644 --- a/i18n/jpn/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "後で", "releaseNotes": "リリース ノート", "showReleaseNotes": "リリース ノートの表示", "read the release notes": "{0} v{1} へようこそ! リリース ノートを確認しますか?", @@ -16,13 +15,14 @@ "updateIsReady": "新しい更新 {0} が利用可能です。", "noUpdatesAvailable": "現在入手可能な更新はありません。", "ok": "OK", - "download now": "今すぐダウンロード", "thereIsUpdateAvailable": "利用可能な更新プログラムがあります。", - "installUpdate": "更新プログラムのインストール", + "download now": "今すぐダウンロード", + "later": "後で", "updateAvailable": "利用可能な更新プログラムがあります: {0} {1}", + "installUpdate": "更新プログラムのインストール", "updateInstalling": "バックグラウンドで {0} {1} がインストールされています。処理が完了次第、お知らせします。", + "updateAvailableAfterRestart": "最新の更新プログラムを適用するために {0} を再起動してください。", "updateNow": "今すぐ更新", - "updateAvailableAfterRestart": "{0} は再起動後に更新されます。", "commandPalette": "コマンド パレット...", "settings": "設定", "keyboardShortcuts": "キーボード ショートカット", diff --git a/i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 01bd67d78ca..4dfeb1219a9 100644 --- a/i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview エディター" + "webview.editor.label": "webview エディター", + "developer": "開発者" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..14a4dc22123 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Webview 開発者ツールを開く", + "refreshWebviewLabel": "WebView の再読み込み" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json index 7ea668065a4..335e27fbbcd 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -13,6 +13,7 @@ "welcomeOverlay.extensions": "拡張機能の管理", "welcomeOverlay.problems": "エラーおよび警告の表示", "welcomeOverlay.commandPalette": "すべてのコマンドの検索と実行", + "welcomeOverlay.notifications": "通知を表示", "welcomeOverlay": "ユーザー インターフェイスの概要", "hideWelcomeOverlay": "インターフェイスの概要を非表示にします", "help": "ヘルプ" diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 047af6a333f..f7166ecfc88 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "ツールと言語", "welcomePage.installExtensionPacksDescription": "{0} と {1} のサポートをインストールする ", "welcomePage.moreExtensions": "その他", - "welcomePage.installKeymapDescription": "キーボード ショートカットをインストールします", - "welcomePage.installKeymapExtension": "{0} と {1} のキーボード ショートカットをインストール", "welcomePage.others": "その他", "welcomePage.colorTheme": "配色テーマ", "welcomePage.colorThemeDescription": "エディターとコードの外観を自由に設定します", diff --git a/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json index 9b3063f1b25..56d40c7d548 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/common/configurationExtensionPoint.i18n.json @@ -8,6 +8,7 @@ ], "vscode.extension.contributes.configuration.title": "設定の概要です。このラベルは、設定ファイルでコメントの区切り文字として使用します。", "vscode.extension.contributes.configuration.properties": "構成のプロパティの説明です。", + "scope.application.description": "ユーザー設定でのみ構成できるアプリケーション固有の構成。", "scope.window.description": "ウィンドウ固有の構成。ユーザーまたはワークスペースの設定で構成できます。", "scope.resource.description": "リソース固有の構成。ユーザー、ワークスペース、またはフォルダーの設定で構成できます。", "scope.description": "構成が適用される範囲。 使用可能なスコープは `window` と ` resource` です。", diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 2b7849ba68a..627b2d01b48 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -11,6 +11,7 @@ "open": "設定を開く", "saveAndRetry": "保存して再試行", "errorUnknownKey": "{1} は登録済みの構成ではないため、{0} に書き込むことができません。", + "errorInvalidWorkspaceConfigurationApplication": "{0} をワークスペース設定に書き込めません。この設定はユーザー設定にのみ書き込めます。", "errorInvalidFolderConfiguration": "{0} はフォルダーのリソース スコープをサポートしていないため、フォルダー設定に書き込むことができません。", "errorInvalidUserTarget": "{0} はグローバル スコープをサポートしていないため、ユーザー設定に書き込むことができません。", "errorInvalidWorkspaceTarget": "{0} はマルチ フォルダー ワークスペースでワークスペース スコープをサポートしていないため、ワークスペース設定を書き込むことができません。", diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..8283d684b01 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedApplicationSetting": "この設定はユーザー設定でのみ適用できます", + "unsupportedWindowSetting": "この設定は現在適用できません。このフォルダーを直接開いたときに適用されます。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 3f0c29658fc..9ca110727dd 100644 --- a/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -6,16 +6,16 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "canNotResolveWorkspaceFolderMultiRoot": "マルチ フォルダー ワークスペースで ${workspaceFolder} を解決できません。この変数を : とフォルダー名を使用して範囲指定してください。", - "canNotResolveWorkspaceFolder": "${workspaceFolder} を解決できません。フォルダーを開いてください。", - "canNotResolveFolderBasenameMultiRoot": "マルチ フォルダー ワークスペースで ${workspaceFolderBasename} を解決できません。この変数を : とフォルダー名を使用してスコープしてください。", - "canNotResolveFolderBasename": "${workspaceFolderBasename} を解決できません。フォルダーを開いてください。", - "canNotResolveLineNumber": "${lineNumber} を解決できません。エディターを開いてください。", - "canNotResolveSelectedText": "${selectedText} を解決できません。エディターを開いてください。", - "canNotResolveFile": "${file} を解決できません。エディターを開いてください。", - "canNotResolveRelativeFile": "${relativeFile} を解決できません。エディターを開いてください。", - "canNotResolveFileDirname": "${fileDirname} を解決できません。エディターを開いてください。", - "canNotResolveFileExtname": "${fileExtname} を解決できません。エディターを開いてください。", - "canNotResolveFileBasename": "${fileBasename} を解決できません。エディターを開いてください。", - "canNotResolveFileBasenameNoExtension": "${fileBasenameNoExtension} を解決できません。エディターを開いてください。" + "canNotResolveWorkspaceFolderMultiRoot": "'${workspaceFolder}' はマルチ フォルダー ワークスペースで解決できません。 ':' とフォルダー名を使用して、この変数のスコープを指定してください。", + "canNotResolveWorkspaceFolder": "'${workspaceFolder}' を解決できません。フォルダーを開いてください。", + "canNotResolveFolderBasenameMultiRoot": "'${workspaceFolderBasename}' はマルチ フォルダー ワークスペースで解決できません。 ':' とフォルダー名を使用して、この変数のスコープを指定してください。", + "canNotResolveFolderBasename": "'${workspaceFolderBasename}' を解決できません。フォルダーを開いてください。", + "canNotResolveLineNumber": "'${lineNumber}' を解決できません。エディターを開いてください。", + "canNotResolveSelectedText": "'${selectedText}' を解決できません。エディターを開いてください。", + "canNotResolveFile": "'${file}' を解決できません。エディターを開いてください。", + "canNotResolveRelativeFile": "'${relativeFile}' を解決できません。エディターを開いてください。", + "canNotResolveFileDirname": "'${fileDirname}' を解決できません。エディターを開いてください。", + "canNotResolveFileExtname": "'${fileExtname}' を解決できません。エディターを開いてください。", + "canNotResolveFileBasename": "'${fileBasename}' を解決できません。エディターを開いてください。", + "canNotResolveFileBasenameNoExtension": "'${fileBasenameNoExtension}' を解決できません。エディターを開いてください。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index 96725800f80..5fe7c380aea 100644 --- a/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -6,10 +6,12 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "vscode.extension.engines": "エンジンの互換性。", "vscode.extension.engines.vscode": "VS Code 拡張機能の場合、拡張機能と互換性のある VS Code バージョンを指定します。* を指定することはできません。たとえば、^0.10.5 は最小の VS Code バージョン 0.10.5 との互換性を示します。", "vscode.extension.publisher": "VS Code 拡張機能の公開元。", "vscode.extension.displayName": "VS Code ギャラリーで使用される拡張機能の表示名。", "vscode.extension.categories": "VS Code ギャラリーで拡張機能の分類に使用されるカテゴリ。", + "vscode.extension.category.languages.deprecated": "代わりに 'Programming Languages' を使用してください", "vscode.extension.galleryBanner": "VS Code マーケットプレースで使用されるバナー。", "vscode.extension.galleryBanner.color": "VS Code マーケットプレース ページ ヘッダー上のバナーの色。", "vscode.extension.galleryBanner.theme": "バナーで使用されるフォントの配色テーマ。", @@ -28,6 +30,8 @@ "vscode.extension.badges.url": "バッジのイメージ URL。", "vscode.extension.badges.href": "バッジのリンク。", "vscode.extension.badges.description": "バッジの説明。", + "vscode.extension.markdown": "Marketplace で使用される Markdown レンダリング エンジンを制御します。github (既定) か standard のいずれかを指定できます。", + "vscode.extension.qna": "Marketplace の Q&A リンクを制御します。既定の Marketplace Q & A サイトを有効にするには marketplace を設定します。カスタム Q & A サイトの URL を提供するには文字列を設定します。Q & A を完全に無効にするには false を設定します。", "vscode.extension.extensionDependencies": "他の拡張機能に対する依存関係。拡張機能の識別子は常に ${publisher}.${name} です。例: vscode.csharp。", "vscode.extension.scripts.prepublish": "パッケージが VS Code 拡張機能として公開される前に実行されるスクリプト。", "vscode.extension.scripts.uninstall": "VS コード拡張機能のフックをアンインストールします。 VS コードから拡張機能を完全にアンインストールした時に実行されるスクリプトです。スクリプトは、拡張機能をアンインストールした後に VS コードを再起動 (シャット ダウンしてから起動) したときに実行されます。Node スクリプトのみがサポートされます。", diff --git a/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 13e9e7d526d..ebdf2bc38d9 100644 --- a/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "extensionsDisabled": "すべての拡張機能が無効化されています。", "extensionHostProcess.crash": "拡張機能のホストが予期せずに終了しました。", "extensionHostProcess.unresponsiveCrash": "拡張機能のホストが応答しないため終了しました。", - "devTools": "開発者ツール", + "devTools": "開発者ツールを開く", "restart": "拡張機能のホストを再起動", "overwritingExtension": "拡張機能 {0} を {1} で上書きしています。", "extensionUnderDevelopment": "開発の拡張機能を {0} に読み込んでいます", diff --git a/i18n/jpn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/jpn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 840a5a93e43..ae5be60aaaf 100644 --- a/i18n/jpn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,11 +6,24 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Microsoft .NET Framework 4.5 が必要です。リンクに移動してインストールしてください。", "installNet": ".NET Framework 4.5 をダウンロードします", "neverShowAgain": "今後は表示しない", - "netVersionError": "Microsoft .NET Framework 4.5 が必要です。リンクに移動してインストールしてください。", - "learnMore": "説明書", "enospcError": "{0} はこの大規模なワークスペース内のファイル変更を監視できません。この問題を解決するには、リンクの手順に従ってください。", + "learnMore": "説明書", + "fileInvalidPath": "ファイルのリソース ({0}) が無効です", + "fileIsDirectoryError": "ファイルはディレクトリです", + "fileNotModifiedError": "ファイルは次の時点以後に変更されていません:", + "fileTooLargeForHeapError": "このサイズのファイルを開くには、VS Code を再起動してより多くのメモリ使用を許可する必要があります", + "fileTooLargeError": "開くファイルが大きすぎます", + "fileNotFoundError": "ファイルが見つかりません ({0})", + "fileBinaryError": "ファイルはバイナリのようなので、テキストとして開くことができません", + "filePermission": "ファイルへの書き込み許可が拒否されました ({0})", + "fileExists": "生成しようとしているファイル ({0}) は既に存在しています", + "fileModifiedError": "ファイルは次の時点以後に更新されました:", + "fileReadOnlyError": "ファイルは読み取り専用です", + "fileMoveConflict": "移動/コピーできません。移動/コピー先にファイルが既に存在します。", + "unableToMoveCopyError": "移動/コピーできません。ファイルが含まれるフォルダーが置き換わることになります。", "binFailed": "'{0}' をごみ箱に移動できませんでした", "trashFailed": "'{0}' をごみ箱に移動できませんでした" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 8d829d16685..660883f87f6 100644 --- a/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "ファイルが見つかりません ({0})", "fileIsDirectoryError": "ファイルはディレクトリです", "fileNotModifiedError": "ファイルは次の時点以後に変更されていません:", "fileBinaryError": "ファイルはバイナリのようなので、テキストとして開くことができません" diff --git a/i18n/kor/extensions/css/package.i18n.json b/i18n/kor/extensions/css/package.i18n.json index 35229bd6699..2d4d9da9391 100644 --- a/i18n/kor/extensions/css/package.i18n.json +++ b/i18n/kor/extensions/css/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "CSS 언어 기본", + "description": "CSS,LESS,SCSS 파일에서 구문 강조 표시와 괄호 일치를 제공합니다." } \ No newline at end of file diff --git a/i18n/kor/extensions/emmet/package.i18n.json b/i18n/kor/extensions/emmet/package.i18n.json index d4ae14fedae..11c3bae8db4 100644 --- a/i18n/kor/extensions/emmet/package.i18n.json +++ b/i18n/kor/extensions/emmet/package.i18n.json @@ -35,7 +35,6 @@ "emmetExtensionsPath": "Emmet 프로필 및 코드 조각이 포함된 폴더의 경로입니다.'", "emmetShowExpandedAbbreviation": "확장된 emmet 약어를 제안으로 표시합니다.\n\"inMarkupAndStylesheetFilesOnly\" 옵션이 html, haml, jade, slim, xml, xsl, css, scss, sass, less 및 stylus에 적용됩니다.\n\"always\" 옵션이 마크업/css에 관계없이 파일의 모든 부분에 적용됩니다.", "emmetShowAbbreviationSuggestions": "가능한 emmet 약어를 제안으로 표시합니다. 스타일시트에는 적용되지 않고 emmet.showExpandedAbbreviation이 \"never\"로 설정되어 있을 때도 적용되지 않습니다.", - "emmetIncludeLanguages": "기본 지원되지 않는 언어에서 emmet 약어를 사용합니다. 언어와 emmet 지원 언어 사이에 매핑을 추가합니다.\n예: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "emmet 조각에 사용되는 변수", "emmetTriggerExpansionOnTab": "사용하도록 설정하면 emmet 약어는 Tab 키를 눌렀을 때 확장됩니다.", "emmetPreferences": "Emmet의 일부 작업 및 해결 프로그램의 동작을 수정하는 데 사용되는 기본 설정입니다.", @@ -59,5 +58,6 @@ "emmetPreferencesCssWebkitProperties": "`-`로 시작하는 Emmet 약어에서 사용될 때 'webkit' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'webkit' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다.", "emmetPreferencesCssMozProperties": "`-`로 시작하는 Emmet 약어에서 사용될 때 'moz' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'moz' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다.", "emmetPreferencesCssOProperties": "`-`로 시작하는 emmet 약어에서 사용할 때 'o' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'o' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다.", - "emmetPreferencesCssMsProperties": "`-`로 시작하는 emmet 약어에서 사용할 때 'ms' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'ms' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다." + "emmetPreferencesCssMsProperties": "`-`로 시작하는 emmet 약어에서 사용할 때 'ms' 공급업체 접두사를 가져오는 쉼표로 구분된 CSS 속성입니다. 항상 'ms' 접두사를 사용하지 않으려면 빈 문자열로 설정합니다.", + "emmetPreferencesCssFuzzySearchMinScore": "유사 일치 약어가 획득해야 하는 최소 점수(0에서 1 사이)입니다. 값이 낮을수록 가양성 일치 항목이 늘 수 있고, 값이 높을수록 가능한 일치 항목이 줄 수 있습니다." } \ No newline at end of file diff --git a/i18n/kor/extensions/git/out/commands.i18n.json b/i18n/kor/extensions/git/out/commands.i18n.json index bc4b7753a32..e1ccbbf253f 100644 --- a/i18n/kor/extensions/git/out/commands.i18n.json +++ b/i18n/kor/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "확인", "push with tags success": "태그와 함께 푸시되었습니다.", "pick remote": "'{0}' 분기를 다음에 게시하려면 원격을 선택하세요.", + "sync is unpredictable": "이 작업은 '{0}/{1}' 간에 커밋을 푸시하고 풀합니다. ", "never again": "다시 표시 안 함", "no remotes to publish": "리포지토리에 게시하도록 구성된 원격이 없습니다.", "no changes stash": "스태시할 변경 내용이 없습니다.", diff --git a/i18n/kor/extensions/git/package.i18n.json b/i18n/kor/extensions/git/package.i18n.json index 07838b84a85..3703ac48f99 100644 --- a/i18n/kor/extensions/git/package.i18n.json +++ b/i18n/kor/extensions/git/package.i18n.json @@ -77,6 +77,7 @@ "config.showInlineOpenFileAction": "Git 변경점 보기에서 파일 열기 동작 줄을 표시할지의 여부를 제어합니다.", "config.inputValidation": "커밋 메시지 입력 유효성 검사를 언제 표시할지 제어합니다.", "config.detectSubmodules": "Git 하위 모듈을 자동으로 검색할지 여부를 제어합니다.", + "config.detectSubmodulesLimit": "Git submodules 검출 개수의 제한을 제어합니다.", "colors.modified": "수정된 리소스의 색상입니다.", "colors.deleted": "삭제된 리소스의 색상입니다.", "colors.untracked": "추적되지 않은 리소스의 색상입니다.", diff --git a/i18n/kor/extensions/html/package.i18n.json b/i18n/kor/extensions/html/package.i18n.json index 35229bd6699..0801cef7b57 100644 --- a/i18n/kor/extensions/html/package.i18n.json +++ b/i18n/kor/extensions/html/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "HTML 언어 기본", + "description": "HTML 파일에서 구문 강조 표시, 괄호 일치 및 코드 조각을 제공합니다." } \ No newline at end of file diff --git a/i18n/kor/extensions/json-language-features/package.i18n.json b/i18n/kor/extensions/json-language-features/package.i18n.json index 1f6c4dd2f4a..d86c7ffa3da 100644 --- a/i18n/kor/extensions/json-language-features/package.i18n.json +++ b/i18n/kor/extensions/json-language-features/package.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "JSON 언어 기능", "description": "JSON 파일에 대한 다양한 언어 지원을 제공합니다.", "json.schemas.desc": "현재 프로젝트에서 스키마를 JSON 파일에 연결", "json.schemas.url.desc": "현재 디렉터리에 있는 스키마의 URL 또는 상대 경로", diff --git a/i18n/kor/extensions/json/package.i18n.json b/i18n/kor/extensions/json/package.i18n.json index 35229bd6699..c63982946ed 100644 --- a/i18n/kor/extensions/json/package.i18n.json +++ b/i18n/kor/extensions/json/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "JSON 언어 기본", + "description": "JSON 파일에서 구문 강조 표시 및 괄호 일치를 제공합니다. " } \ No newline at end of file diff --git a/i18n/kor/extensions/markdown-language-features/out/features/preview.i18n.json b/i18n/kor/extensions/markdown-language-features/out/features/preview.i18n.json index 1c1e1aed9de..4bc763aedcc 100644 --- a/i18n/kor/extensions/markdown-language-features/out/features/preview.i18n.json +++ b/i18n/kor/extensions/markdown-language-features/out/features/preview.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "lockedPreviewTitle": "[미리 보기] {0}", "previewTitle": "미리 보기 {0}" } \ No newline at end of file diff --git a/i18n/kor/extensions/markdown-language-features/package.i18n.json b/i18n/kor/extensions/markdown-language-features/package.i18n.json index ae5e530af4c..83878314ebe 100644 --- a/i18n/kor/extensions/markdown-language-features/package.i18n.json +++ b/i18n/kor/extensions/markdown-language-features/package.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "Markdown 언어 기능", "description": "Markdown에 대한 다양한 언어 지원을 제공합니다.", "markdown.preview.breaks.desc": "마크다운 미리 보기에서 줄바꿈 렌더링 방식을 설정합니다. 'true'로 설정하면 모든 행에 대해 <br>이(가) 생성됩니다.", "markdown.preview.linkify": "Markdown 미리 보기에서 URL 같은 텍스트를 링크로 변환을 사용하거나 사용하지 않도록 설정합니다.", @@ -26,5 +27,6 @@ "markdown.styles.dec": "markdown 미리 보기에서 사용할 CSS 스타일시트의 URL 또는 로컬 경로 목록입니다. 상대 경로는 탐색기에서 열린 폴더를 기준으로 해석됩니다. 열린 폴더가 없으면 markdown 파일의 위치를 기준으로 해석됩니다. 모든 '\\'는 '\\\\'로 써야 합니다.", "markdown.showPreviewSecuritySelector.title": "미리 보기 보안 설정 변경", "markdown.trace.desc": "Markdown 확장에 대해 디버그 로깅을 사용하도록 설정합니다.", + "markdown.preview.refresh.title": "미리 보기 새로 고침", "markdown.preview.toggleLock.title": "미리 보기 잠금 설정/해제" } \ No newline at end of file diff --git a/i18n/kor/extensions/php/package.i18n.json b/i18n/kor/extensions/php/package.i18n.json index a55af556ea0..7ffd59966bb 100644 --- a/i18n/kor/extensions/php/package.i18n.json +++ b/i18n/kor/extensions/php/package.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "PHP 언어 기능" + "description": "PHP 파일에서 구문 강조 표시 및 괄호 일치를 제공합니다. " } \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/commands.i18n.json b/i18n/kor/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..dd43847bd6e --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "TypeScript 또는 JavaScript 프로젝트를 사용하려면 VS Code의 폴더를 여세요.", + "typescript.projectConfigUnsupportedFile": "TypeScript 또는 JavaScript 프로젝트를 확인할 수 없습니다. 지원되지 않는 파일 형식", + "typescript.projectConfigCouldNotGetInfo": "TypeScript 또는 JavaScript 프로젝트를 확인할 수 없습니다.", + "typescript.noTypeScriptProjectConfig": "파일이 TypeScript 프로젝트의 일부가 아닙니다. 자세히 알아보려면 [여기]({0})를 클릭하세요.", + "typescript.noJavaScriptProjectConfig": "파일이 JavaScript 프로젝트의 일부가 아닙니다. 자세히 알아보려면 [여기]({0})를 클릭하세요.", + "typescript.configureTsconfigQuickPick": "tsconfig.json 구성", + "typescript.configureJsconfigQuickPick": "jsconfig.json 구성" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..65d840cf0b5 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "적용할 코드 동작 선택", + "acquiringTypingsLabel": "typings를 가져오는 중...", + "acquiringTypingsDetail": "IntelliSense에 대한 typings 정의를 가져오는 중입니다.", + "autoImportLabel": "{0}에서 자동으로 가져오기" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..365792bc459 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "JavaScript 파일에서 의미 검사를 사용합니다. 파일의 최상단에 있어야 합니다.", + "ts-nocheck": "JavaScript 파일에서 의미 검사를 사용하지 않습니다. 파일의 최상단에 있어야 합니다.", + "ts-ignore": "파일의 다음 행에서 @ts-check 오류를 억제합니다." +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..272312dad8e --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1개 구현", + "manyImplementationLabel": "{0}개 구현", + "implementationsErrorLabel": "구현을 확인할 수 없음" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..de5777d4c7a --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "JSDoc 주석" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..86003226d94 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "가져오기 구성" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..b91c84de957 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (파일에서 모두 수정)" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..69609e31fcb --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "참조 1개", + "manyReferenceLabel": "참조 {0}개", + "referenceErrorLabel": "참조를 확인할 수 없음" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..6982eedcfd9 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "빌드 - {0}", + "buildAndWatchTscLabel": "보기 - {0}" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/kor/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..3f50eeec8ab --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "경로 {0}이(가) 올바른 tsserver 설치를 가리키지 않습니다. 포함된 TypeScript 버전을 대신 사용합니다.", + "serverCouldNotBeStarted": "TypeScript 언어 서버를 시작할 수 없습니다. 오류 메시지: {0}", + "typescript.openTsServerLog.notSupported": "TS 서버 로깅을 사용하려면 TS 2.2.2 이상이 필요합니다.", + "typescript.openTsServerLog.loggingNotEnabled": "TS 서버 로깅이 꺼져 있습니다. `typescript.tsserver.log`를 설정하고 TS 서버를 다시 시작하여 로깅을 사용하도록 설정하세요.", + "typescript.openTsServerLog.enableAndReloadOption": "로깅 사용 및 TS 서버 다시 시작", + "typescript.openTsServerLog.noLogFile": "TS 서버에서 로깅을 시작하지 않았습니다.", + "openTsServerLog.openFileFailedFailed": "TS 서버 로그 파일을 열 수 없습니다.", + "serverDiedAfterStart": "TypeScript 언어 서비스가 시작된 직후 5번 종료되었습니다. 서비스가 다시 시작되지 않습니다.", + "serverDiedReportIssue": "문제 보고", + "serverDied": "TypeScript 언어 서비스가 지난 5분 동안 예기치 않게 5번 종료되었습니다." +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/kor/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..f57994230cb --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "잘못된 버전" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/kor/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/kor/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..49fa81ab46e --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "프로젝트 전체에서 JavaScript/TypeScript 언어 기능을 사용하도록 설정하려면 {0}과(와) 같이 파일이 많은 폴더를 제외하세요.", + "hintExclude.generic": "프로젝트 전체에서 JavaScript/TypeScript 언어 기능을 사용하도록 설정하려면 사용하지 않는 소스 파일이 포함된 큰 폴더를 제외하세요.", + "large.label": "제외 구성", + "hintExclude.tooltip": "프로젝트 전체에서 JavaScript/TypeScript 언어 기능을 사용하도록 설정하려면 사용하지 않는 소스 파일이 포함된 큰 폴더를 제외하세요." +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/kor/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..0fad82fa51a --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "TypeScript IntelliSense를 향상하기 위해 데이터를 페치하는 중", + "typesInstallerInitializationFailed.title": "JavaScript 언어 기능에 대한 입력 파일을 설치할 수 없습니다. NPM이 설치되어 있는지 확인하거나 사용자 설정에서 'typescript.npm'을 구성하세요. 자세히 알아보려면 [여기]({0})를 클릭하세요.", + "typesInstallerInitializationFailed.doNotCheckAgain": "다시 표시 안 함" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/kor/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..bdd4f232c51 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "VS Code의 버전 사용", + "useWorkspaceVersionOption": "작업 영역 버전 사용", + "learnMore": "자세한 정보", + "selectTsVersion": "JavaScript 및 TypeScript 언어 기능에 사용되는 TypeScript 버전 선택" +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..979038a5298 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noBundledServerFound": "잘못 동작하는 바이러스 감지 도구와 같은 다른 응용 프로그램에서 VS Code의 tsserver가 삭제되었습니다. VS Code를 다시 설치하세요." +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript-language-features/package.i18n.json b/i18n/kor/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..3f2230bf284 --- /dev/null +++ b/i18n/kor/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,58 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "TypeScript 및 JavaScript 언어 기능", + "description": "JavaScript 및 TypeScript에 대한 다양한 언어 지원을 제공합니다.", + "typescript.reloadProjects.title": "프로젝트 다시 로드", + "javascript.reloadProjects.title": "프로젝트 다시 로드", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "매개 변수 서명으로 함수를 완료하세요.", + "typescript.tsdk.desc": "사용할 tsserver 및 lib*.d.ts 파일이 들어 있는 폴더 경로를 지정합니다.", + "typescript.disableAutomaticTypeAcquisition": "자동 형식 인식을 사용하지 않습니다. TypeScript >= 2.0.6이 필요합니다.", + "typescript.tsserver.log": "파일에 대해 TS 서버 로깅을 사용하도록 설정합니다. 이 로그는 TS 서버 문제를 진단하는 데 사용될 수 있습니다. 로그에는 파일 경로, 소스 코드 및 프로젝트에서 잠재적으로 중요한 기타 정보가 포함될 수 있습니다.", + "typescript.tsserver.trace": "TS 서버로 전송한 메시지 추적을 사용하도록 설정합니다. 이\n 추적은 TS 서버 문제를 진단하는 데 사용될 수 있습니다. 추적에는 파일 경로, 소스 코드 및 프로젝트에서 잠재적으로 중요한\n 기타 정보가 포함될 수 있습니다.", + "typescript.validate.enable": "TypeScript 유효성 검사를 사용하거나 사용하지 않습니다.", + "typescript.format.enable": "기본 TypeScript 포맷터를 사용하거나 사용하지 않습니다.", + "javascript.format.enable": "기본 JavaScript 포맷터를 사용하거나 사용하지 않습니다.", + "format.insertSpaceAfterCommaDelimiter": "쉼표 구분 기호 뒤에 오는 공백 처리를 정의합니다.", + "format.insertSpaceAfterConstructor": "컨스트럭터 키워드 뒤 공백 처리를 정의합니다. TypeScript >= 2.3.0이 필요합니다.", + "format.insertSpaceAfterSemicolonInForStatements": " for 문에서 세미콜론 뒤에 오는 공백 처리를 정의합니다.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "이항 연산자 뒤에 오는 공백 처리를 정의합니다.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "제어 흐름 문의 키워드 뒤에 오는 공백 처리를 정의합니다.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "익명 함수의 function 키워드 뒤에 오는 공백 처리를 정의합니다.", + "format.insertSpaceBeforeFunctionParenthesis": "함수 인수 괄호 앞에 오는 공백 처리를 정의합니다. TypeScript 2.1.5 이상이 필요합니다.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "템플릿 문자열의 여는 중괄호 뒤와 닫는 중괄호 앞의 공백 처리를 정의합니다. TypeScript >= 2.0.6이 필요합니다.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "JSX 식의 여는 중괄호 뒤와 닫는 중괄호 앞의 공백 처리를 정의합니다. TypeScript >= 2.0.6이 필요합니다.", + "format.insertSpaceAfterTypeAssertion": "TypeScript에서 유형 어설션 이후 공백 처리를 정의합니다. TypeScript >= 2.4가 필요합니다.", + "format.placeOpenBraceOnNewLineForFunctions": "함수의 새 줄에 여는 중괄호를 넣을지 정의합니다.", + "format.placeOpenBraceOnNewLineForControlBlocks": "제어 블록의 새 줄에 여는 중괄호를 넣을지 정의합니다.", + "javascript.validate.enable": "JavaScript 유효성 검사를 사용하거나 사용하지 않습니다.", + "typescript.goToProjectConfig.title": "프로젝트 구성으로 이동", + "javascript.goToProjectConfig.title": "프로젝트 구성으로 이동", + "javascript.referencesCodeLens.enabled": "JavaScript 파일에서 CodeLense 참조를 사용/사용 안 함으로 설정합니다.", + "typescript.referencesCodeLens.enabled": "TypeScript 파일에서 참조 CodeLense를 사용/사용 안 함으로 설정합니다. TypeScript >= 2.0.6이 필요합니다.", + "typescript.implementationsCodeLens.enabled": "구현 CodeLens를 사용하거나 사용하지 않도록 설정합니다. TypeScript >= 2.2.0이 필요합니다.", + "typescript.openTsServerLog.title": "TS 서버 로그 열기", + "typescript.restartTsServer": "TS 서버 다시 시작", + "typescript.selectTypeScriptVersion.title": "TypeScript 버전 선택", + "typescript.reportStyleChecksAsWarnings": "스타일 검사를 경고로 보고", + "jsDocCompletion.enabled": "자동 JSDoc 주석 사용/사용 안 함", + "javascript.implicitProjectConfig.checkJs": "JavaScript 파일의 의미 체계 검사를 사용/사용하지 않습니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript >=2.3.1이 필요합니다. ", + "typescript.npm": "자동 입력 인식에 사용된 NPM 실행 파일 경로를 지정합니다. TypeScript >= 2.3.4가 필요합니다.", + "typescript.check.npmIsInstalled": "자동 입력 인식에 대해 NPM이 설치되어 있는지 확인합니다.", + "javascript.nameSuggestions": "JavaScript 제안 목록의 파일에서 고유한 이름 포함을 사용/사용 안 함으로 설정합니다.", + "typescript.tsc.autoDetect": "tsc 작업의 자동 검색을 제어합니다. '해제'는 이 기능을 사용하지 않도록 설정합니다. '빌드'는 단일 실행 컴파일 작업만 만듭니다. '보기'는 컴파일 및 보기 작업만 만듭니다. '설정'은 빌드 및 보기 작업을 모두 만듭니다. 기본 옵션은 '설정'입니다.", + "typescript.problemMatchers.tsc.label": "TypeScript 문제", + "typescript.problemMatchers.tscWatch.label": "TypeScript 문제(감시 모드)", + "typescript.quickSuggestionsForPaths": "가져오기 경로를 입력할 때 빠른 제안을 사용하거나 사용하지 않습니다.", + "typescript.locale": "TypeScript 오류를 보고하는 데 사용하는 로캘을 설정합니다. TypeScript >= 2.6.0이 필요합니다. 기본값 'null'은 TypeScript 오류에 대해 VS Code의 로캘을 사용합니다.", + "javascript.implicitProjectConfig.experimentalDecorators": "프로젝트의 일부가 아닌 JavaScript 파일에 대해 'experimentalDecorators'를 사용하거나 사용하지 않도록 설정합니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript >=2.3.1이 필요합니다.", + "typescript.autoImportSuggestions.enabled": "자동 가져오기 제안을 사용하거나 사용하지 않도록 설정합니다. TypeScript >=2.6.1이 필요합니다.", + "typescript.experimental.syntaxFolding": "구문 인식 접기 마커를 설정하거나 해제합니다.", + "taskDefinition.tsconfig.description": "TS 빌드를 정의하는 tsconfig 파일입니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/base/node/processes.i18n.json b/i18n/kor/src/vs/base/node/processes.i18n.json index 05a4cd5f14f..35229bd6699 100644 --- a/i18n/kor/src/vs/base/node/processes.i18n.json +++ b/i18n/kor/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "UNC 드라이브에서 셸 명령을 실행할 수 없습니다." + ] } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 9bcb11a8721..0d6f74e08a2 100644 --- a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -11,7 +11,6 @@ "similarIssues": "유사한 문제", "open": "열기", "closed": "닫힘", - "noResults": "결과 없음", "settingsSearchIssue": "설정 검색 문제", "bugReporter": "버그 보고서", "featureRequest": "기능 요청", diff --git a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 838b50751aa..00754823fe4 100644 --- a/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/kor/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,9 @@ ], "completeInEnglish": "양식을 영어로 작성해 주세요.", "issueTypeLabel": "이것은", + "vscode": "Visual Studio Code", + "disableExtensions": "모든 확장을 사용하지 않도록 설정하고 창 다시 로드", + "chooseExtension": "확장", "issueTitleLabel": "제목", "issueTitleRequired": "제목을 입력하세요.", "titleLengthValidation": "제목이 너무 깁니다.", @@ -18,13 +21,6 @@ "extensions": "내 확장", "searchedExtensions": "검색된 확장", "settingsSearchDetails": "설정 검색 세부 정보", - "tryDisablingExtensions": "확장을 사용하지 않도록 설정해도 문제 재현이 가능한가요?", - "yes": "예", - "no": "아니요", - "disableExtensionsLabelText": "{0} 후 문제를 재현해 보세요.", - "disableExtensions": "모든 확장을 사용하지 않도록 설정하고 창 다시 로드", - "showRunningExtensionsLabelText": "확장 문제로 의심되면 {0}에서 확장에 대한 문제를 보고하세요.", - "showRunningExtensions": "모든 실행 중인 확장 보기", "details": "상세 내용을 입력하세요.", "loadingData": "데이터 로드 중..." } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..d2f76643375 --- /dev/null +++ b/i18n/kor/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "이름" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json index 801e8c450ff..1839bc77e72 100644 --- a/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/kor/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "닫기", - "header": "다른 항목 {0} / {1}: 원본 {2}, {3}행, 수정 {4}, {5}행", "blankLine": "비어 있음", "equalLine": "원본 {0}, 수정 {1}: {2}", "insertLine": "+ 수정됨 {0}: {1}", diff --git a/i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json index b02180c6602..f226af7ac85 100644 --- a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,9 +16,10 @@ "editorIndentGuides": "편집기 들여쓰기 안내선 색입니다.", "editorLineNumbers": "편집기 줄 번호 색입니다.", "editorActiveLineNumber": "편집기 활성 영역 줄번호 색상", + "deprecatedEditorActiveLineNumber": "Id는 사용 되지 않습니다. 대신 'editorLineNumber.activeForeground'를 사용 합니다.", "editorRuler": "편집기 눈금의 색상입니다.", "editorCodeLensForeground": "편집기 코드 렌즈의 전경색입니다.", - "editorBracketMatchBackground": "일치하는 브래킷 뒤의 배경색입니다.", + "editorBracketMatchBackground": "일치하는 괄호 뒤의 배경색", "editorBracketMatchBorder": "일치하는 브래킷 박스의 색상", "editorOverviewRulerBorder": "개요 눈금 경계의 색상입니다.", "editorGutter": "편집기 거터의 배경색입니다. 거터에는 글리프 여백과 행 수가 있습니다.", @@ -28,6 +29,9 @@ "warningBorder": "편집기 내 경고 표시선의 테두리 색입니다.", "infoForeground": "편집기 내 정보 표시선의 전경색입니다.", "infoBorder": "편집기 내 정보 표시선의 테두리 색입니다.", + "hintForeground": "편집기에서 힌트 표시선의 전경색입니다.", + "hintBorder": "편집기에서 힌트 표시선의 테두리 색입니다.", + "overviewRulerRangeHighlight": "범위 강조의 개요 눈금자 표식 색입니다. 이 색은 불투명해야만 내부 장식을 가리지 않습니다.", "overviewRuleError": "오류의 개요 눈금자 마커 색입니다.", "overviewRuleWarning": "경고의 개요 눈금자 마커 색입니다.", "overviewRuleInfo": "정보의 개요 눈금자 마커 색입니다." diff --git a/i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..cc5bf67d866 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "수정 사항 표시({0})", + "quickFix": "수정 사항 표시", + "organizeImports.label": "가져오기 구성" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/kor/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index 35229bd6699..7078503b8e1 100644 --- a/i18n/kor/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -5,5 +5,43 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "Sunday": "일요일", + "Monday": "월요일", + "Tuesday": "화요일", + "Wednesday": "수요일", + "Thursday": "목요일", + "Friday": "금요일", + "Saturday": "토요일", + "SundayShort": "일", + "MondayShort": "월", + "TuesdayShort": "화", + "WednesdayShort": "수", + "ThursdayShort": "목", + "FridayShort": "금", + "SaturdayShort": "토", + "January": "1 월", + "February": "2 월", + "March": "3 월", + "April": "4 월", + "May": "5 월", + "June": "6 월", + "July": "7 월", + "August": "8 월", + "September": "9 월", + "October": "10 월", + "November": "11 월", + "December": "12 월", + "JanuaryShort": "1 월", + "FebruaryShort": "2 월", + "MarchShort": "3 월", + "AprilShort": "4 월", + "MayShort": "5 월", + "JuneShort": "6 월", + "JulyShort": "7 월", + "AugustShort": "8 월", + "SeptemberShort": "9 월", + "OctoberShort": "10 월", + "NovemberShort": "11 월", + "DecemberShort": "12 월" } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json index 296e9aa25b5..aaaf9225abd 100644 --- a/i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -10,6 +10,8 @@ "wordHighlightStrong": "변수에 쓰기와 같은 쓰기 액세스 중 기호의 배경색입니다. 색상은 밑에 깔린 꾸밈을 가리지 않도록 반드시 불투명이 아니어야 합니다.", "wordHighlightBorder": "변수 읽기와 같은 읽기 액세스 중 기호의 테두리 색입니다.", "wordHighlightStrongBorder": "변수에 쓰기와 같은 쓰기 액세스 중 기호의 테두리 색입니다.", + "overviewRulerWordHighlightForeground": "기호 강조의 개요 눈금자 표식 색입니다. 이 색은 불투명해야만 내부 장식을 가리지 않습니다.", + "overviewRulerWordHighlightStrongForeground": "쓰기 액세스 기호 강조의 개요 눈금자 표식 색입니다. 이 색은 불투명해야만 내부 장식을 가리지 않습니다.", "wordHighlight.next.label": "다음 강조 기호로 이동", "wordHighlight.previous.label": "이전 강조 기호로 이동" } \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json index 4542715a33c..9fa2e539d0c 100644 --- a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "'Developer: Startup Performance' 명령을 사용하여 시작합니다.", "prof-startup": "시작하는 동안 CPU 프로파일러 실행", "disableExtensions": "설치된 모든 확장을 사용하지 않도록 설정합니다.", - "inspect-extensions": "디버깅 및 확장 프로파일링을 허용합니다. 연결 uri에 대한 개발자 도구를 확인하십시오.", - "inspect-brk-extensions": "시작 후 일시 중시된 확장 호스트에서 디버깅 및 확장 프로파일링을 허용합니다. 연결 URL은 개발자 도구를 확인하세요.", "disableGPU": "GPU 하드웨어 가속을 사용하지 않도록 설정합니다.", "uploadLogs": "현재의 세션에서 안전한 종점으로 로그 업로드", "maxMemory": "윈도우에 대한 최대 메모리 크기 (단위 MB).", diff --git a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index deafbdf4de7..29a28e29329 100644 --- a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -14,12 +14,15 @@ "errorInstallingDependencies": "의존성 설치 중 오류가 발생했습니다. {0}", "MarketPlaceDisabled": "Marketplace를 사용할 수 없습니다.", "removeError": "확장을 제거하는 동안 오류가 발생했습니다. {0}. 다시 시도하기 전에 VS Code를 종료하고 다시 시작하세요.", + "Not a Marketplace extension": "마켓플레이스 확장만 다시 설치할 수 있습니다.", "notFoundCompatible": "'{0}'을(를) 설치할 수 없습니다; VS Code '{1}'과 호환되는 버전이 없습니다.", "malicious extension": "문제가 있다고 보고되었으므로 확장을 설치할 수 없습니다.", "notFoundCompatibleDependency": "VS Code의 현재 버전 '{1}'과(와) 호환되는 종속된 확장 '{0}'을(를) 찾을 수 없으므로 설치할 수 없습니다.", "quitCode": "확장을 설치할 수 없습니다. 다시 설치하기 위해 VS Code를 종료하고 다시 시작하십시오.", "exitCode": "확장을 설치할 수 없습니다. 다시 설치하기 전에 VS 코드를 종료한 후 다시 시작하십시오. ", "uninstallDependeciesConfirmation": "'{0}'만 제거할까요, 아니면 종속성도 제거할까요?", + "uninstallOnly": "확장만", + "uninstallAll": "모두 제거", "uninstallConfirmation": "'{0}'을(를) 제거할까요?", "ok": "확인", "singleDependentError": "확장 '{0}'을(를) 제거할 수 없습니다. 확장 '{1}'이(가) 이 확장에 종속됩니다.", diff --git a/i18n/kor/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/kor/src/vs/platform/extensions/node/extensionValidator.i18n.json index a87a8f4f639..660bdbdaf9c 100644 --- a/i18n/kor/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/kor/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "`engines.vscode` 값 {0}을(를) 구문 분석할 수 없습니다. ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x 등을 사용하세요.", "versionSpecificity1": "`engines.vscode`({0})에 지정된 버전이 명확하지 않습니다. vscode 버전이 1.0.0 이전이면 최소한 원하는 주 버전과 부 버전을 정의하세요( 예: ^0.10.0, 0.10.x, 0.11.0 등).", "versionSpecificity2": "`engines.vscode`({0})에 지정된 버전이 명확하지 않습니다. vscode 버전이 1.0.0 이후이면 최소한 원하는 주 버전을 정의하세요(예: ^1.10.0, 1.10.x, 1.x.x, 2.x.x 등).", "versionMismatch": "확장이 Code {0}과(와) 호환되지 않습니다. 확장에 {1}이(가) 필요합니다." diff --git a/i18n/kor/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/kor/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index cac1d48881f..78585e502ec 100644 --- a/i18n/kor/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/kor/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "{0} 설치가 손상된 것 같습니다. 다시 설치하세요.", "integrity.moreInformation": "추가 정보", - "integrity.dontShowAgain": "다시 표시 안 함", - "integrity.prompt": "{0} 설치가 손상된 것 같습니다. 다시 설치하세요." + "integrity.dontShowAgain": "다시 표시 안 함" } \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/list/browser/listService.i18n.json b/i18n/kor/src/vs/platform/list/browser/listService.i18n.json index 26cbc3957bc..8b32c5188c5 100644 --- a/i18n/kor/src/vs/platform/list/browser/listService.i18n.json +++ b/i18n/kor/src/vs/platform/list/browser/listService.i18n.json @@ -12,5 +12,6 @@ "multiSelectModifier": "마우스로 트리와 목록의 항목을 다중 선택에 추가할 때 사용할 한정자입니다(예를 들어 탐색기에서 편집기와 SCM 보기를 여는 경우). `ctrlCmd`는 Windows와 Linux에서 `Control`로 매핑되고 macOS에서 `Command`로 매핑됩니다. '옆에서 열기' 마우스 제스처(지원되는 경우)는 다중 선택 한정자와 충돌하지 않도록 조정됩니다.", "openMode.singleClick": "마우스를 한 번 클릭하여 항목을 엽니다.", "openMode.doubleClick": "마우스를 두 번 클릭하여 항목을 엽니다.", - "openModeModifier": "트리와 목록에서 마우스를 사용하여 항목을 여는 방법을 제어합니다(지원되는 경우). 마우스을 한 번 클릭하여 항목을 열려면 `singleClick` 으로 설정하고 마우스 두 번 클릭을 통해서만 열려면 `doubleClick`으로 설정합니다. 트리에서 하위 항목이 있는 상위 항목의 경우 이 설정은 상위 항목을 한 번 클릭으로 확장할지 두 번 클릭으로 확장할지를 제어합니다. 일부 트리와 목록에서는 이 설정을 적용할 수 없는 경우 무시하도록 선택할 수 있습니다. " + "openModeModifier": "트리와 목록에서 마우스를 사용하여 항목을 여는 방법을 제어합니다(지원되는 경우). 마우스을 한 번 클릭하여 항목을 열려면 `singleClick` 으로 설정하고 마우스 두 번 클릭을 통해서만 열려면 `doubleClick`으로 설정합니다. 트리에서 하위 항목이 있는 상위 항목의 경우 이 설정은 상위 항목을 한 번 클릭으로 확장할지 두 번 클릭으로 확장할지를 제어합니다. 일부 트리와 목록에서는 이 설정을 적용할 수 없는 경우 무시하도록 선택할 수 있습니다. ", + "horizontalScrolling setting": "워크벤치에서 수평 스크롤 지원 여부를 제어 합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json index 0a927c21be7..2e819fd951d 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -92,5 +92,7 @@ "mergeBorder": "인라인 병합 충돌에서 헤더 및 스플리터의 테두리 색입니다.", "overviewRulerCurrentContentForeground": "인라인 병합 충돌에서 현재 개요 눈금 전경색입니다.", "overviewRulerIncomingContentForeground": "인라인 병합 충돌에서 수신 개요 눈금 전경색입니다.", - "overviewRulerCommonContentForeground": "인라인 병합 충돌에서 공통 과거 개요 눈금 전경색입니다." + "overviewRulerCommonContentForeground": "인라인 병합 충돌에서 공통 과거 개요 눈금 전경색입니다.", + "overviewRulerFindMatchForeground": "일치하는 항목 찾기의 개요 눈금자 표식 색입니다. 이 색은 불투명해야만 내부 장식을 가리지 않습니다.", + "overviewRulerSelectionHighlightForeground": "선택 영역 강조의 개요 눈금자 표식 색입니다. 이 색은 불투명해야만 내부 장식을 가리지 않습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..354f883f4b8 --- /dev/null +++ b/i18n/kor/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "속성 `{0}`은(는) 필수이며 `string` 형식이어야 합니다.", + "showViewlet": "{0} 표시", + "view": "보기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index e621977a343..224d3705a5f 100644 --- a/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "뷰를 에디터에 적용합니다.", "views.explorer": "탐색기 뷰", "views.debug": "디버그 보기", - "locationId.invalid": "`{0}`은(는) 유효한 뷰 위치가 아닙니다.", "duplicateView1": "위치 '{1}'에서 동일한 ID '{0}'(으)로된 여러 개의 보기를 등록할 수 없습니다.", "duplicateView2": "ID `{0}`이(가) 포함된 뷰가 위치 `{1}`에 이미 등록되어 있습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 45094f9c862..c4d54f1034d 100644 --- a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "저장 시 {0}ms 후에 서식 지정이 중단됨", + "timeout.onWillSave": "1750ms 후에 onWillSaveTextDocument-event가 중단됨", "saveParticipants": "실행중인 저장 관계자..." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 4a956b0bd25..35229bd6699 100644 --- a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "webview.editor.label": "webview 편집기" + ] } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/node/extHostProgress.i18n.json b/i18n/kor/src/vs/workbench/api/node/extHostProgress.i18n.json index 35229bd6699..b3d4a235518 100644 --- a/i18n/kor/src/vs/workbench/api/node/extHostProgress.i18n.json +++ b/i18n/kor/src/vs/workbench/api/node/extHostProgress.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "extensionSource": "{0} (확장)" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index c08ed22ae06..54b686eb140 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,6 @@ "screenReaderDetectedExtra": "화면 읽기 프로그램을 사용하지 않는 경우 `editor.accessibilitySupport` 설정을 \"off\"로 변경하세요.", "disableTabMode": "접근성 모드 사용 안 함", "gotoLine": "줄 이동", - "indentation": "들여쓰기", "selectEncoding": "인코딩 선택", "selectEOL": "줄 시퀀스의 끝 선택", "selectLanguageMode": "언어 모드 선택", diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 2eb6210e93a..2a9e8323db8 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,7 @@ "sizeMB": "{0}MB", "sizeGB": "{0}GB", "sizeTB": "{0}TB", - "largeImageError": "이미지의 파일 크기가 너무 커서(>1MB) 편집기에서 표시할 수 없습니다. ", "resourceOpenExternalButton": " 외부 프로그램으로 이미지를 열까요?", - "nativeBinaryError": "파일이 이진이거나 매우 크거나 지원되지 않는 텍스트 인코딩을 사용하기 때문에 편집기에서 표시되지 않습니다.", "zoom.action.fit.label": "전체 이미지", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json index 26c8431a513..68b015e8455 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "notificationsEmpty": "새 알림 없음", "notifications": "알림", "notificationsToolbar": "알림 센터 작업", "notificationsList": "알림 목록" diff --git a/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..e9877e526b5 --- /dev/null +++ b/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ok": "확인" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json index 30e974a33fc..641eb3e2062 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,10 +45,17 @@ "windowConfigurationTitle": "창", "window.openFilesInNewWindow.on": "파일이 새 창에서 열립니다.", "window.openFilesInNewWindow.off": "파일이 파일의 폴더가 열려 있는 창 또는 마지막 활성 창에서 열립니다.", + "window.openFilesInNewWindow.defaultMac": "Dock 또는 Finder를 통해 파일을 연 경우를 제외하고 파일이 파일의 폴더가 열린 창 또는 마지막 활성 창에서 열립니다.", + "window.openFilesInNewWindow.default": "응용 프로그램 내에서 선택(예: 파일 메뉴를 통해)하는 경우를 제외하고 파일이 새 창에서 열립니다. ", + "openFilesInNewWindowMac": "파일을 새 창에서 열지 여부를 제어합니다.\n- default: Dock 또는 Finder를 통해 파일을 연 경우를 제외하고, 파일이 파일의 폴더가 열린 창 또는 마지막 활성 창에서 열립니다.\n- on: 파일이 새 창에서 열립니다.\n- off: 파일이 파일의 폴더가 열린 창 또는 마지막 활성 창에서 열립니다.\n이 설정이 무시되는 경우도 있을 수 있습니다(예: -new-window 또는 reuse-window 명령줄 옵션을 사용할 경우).", + "openFilesInNewWindow": "파일을 새 창에서 열지 여부를 제어합니다.\n- default: 응용 프로그램 내에서 [파일] 메뉴 등을 통해 파일을 선택하는 경우를 제외하고, 파일이 새 창에서 열립니다.\n- on: 파일이 새 창에서 열립니다.\n- off: 파일이 파일의 폴더가 열린 창 또는 마지막 활성 창에서 열립니다.\n이 설정이 무시되는 경우도 있을 수 있습니다(예: -new-window 또는 reuse-window 명령줄 옵션을 사용할 경우).", "window.openFoldersInNewWindow.on": "폴더가 새 창에서 열립니다.", "window.openFoldersInNewWindow.off": "폴더가 마지막 활성 창을 바꿉니다.", "window.openFoldersInNewWindow.default": "폴더를 응용 프로그램 내에서 선택(예: 파일 메뉴를 통해)하는 경우를 제외하고 폴더가 새 창에서 열립니다.", "openFoldersInNewWindow": "폴더를 새 창에서 열지, 마지막 활성 창과 바꿀지를 제어합니다.\n- default: 응용 프로그램 내에서 [파일] 메뉴 등을 통해 폴더를 선택하는 경우를 제외하고, 폴더는 새 창에서 열립니다.\n- on: 폴더가 새 창에서 열립니다.\n- off: 폴더가 마지막 활성 창을 대체합니다\n이 설정이 무시되는 경우도 있을 수 있습니다(예: -new-window 또는 -reuse-window 명령줄 옵션을 사용할 경우).", + "window.openWithoutArgumentsInNewWindow.on": "새로운 빈 창 열기", + "window.openWithoutArgumentsInNewWindow.off": "실행 중인 마지막 활성 인스턴스에 포커스", + "openWithoutArgumentsInNewWindow": "인수 없이 두 번째 인스턴스를 시작할 때 새로운 빈 창을 열지 또는 실행 중인 마지막 인스턴스에 포커스가 생길지 여부를 제어합니다.\n- on: 새로운 빈 창을 엽니다.\n- off: 실행 중인 마지막 활성 인스턴스에 포커스가 생깁니다.\n이 설정이 무시되는 경우도 있을 수 있습니다(예: -new-window 또는 -reuse-window 명령줄 옵션을 사용할 경우).", "window.reopenFolders.all": "모든 창을 다시 엽니다.", "window.reopenFolders.folders": "모든 폴더를 다시 엽니다. 빈 작업 영역은 복원되지 않습니다.", "window.reopenFolders.one": "마지막 활성 창을 다시 엽니다.", @@ -56,6 +63,7 @@ "restoreWindows": "다시 시작한 이후에 창을 다시 여는 방법을 설정합니다. 'none'을 선택하면 항상 빈 작업 영역으로 시작하고 'one'을 선택하면 마지막으로 작업한 창이 다시 열리고 'folders'를 선택하면 열었던 폴더가 포함된 모든 창이 다시 열리며 'all'을 선택하면 지난 세션의 모든 창이 다시 열립니다.", "restoreFullscreen": "창이 전체 화면 모드에서 종료된 경우 창을 전체 화면 모드로 복원할지 여부를 제어합니다.", "zoomLevel": "창의 확대/축소 수준을 조정합니다. 원래 크기는 0이고 각 상한 증분(예: 1) 또는 하한 증분(예: -1)은 20% 더 크거나 더 작게 확대/축소하는 것을 나타냅니다. 10진수를 입력하여 확대/축소 수준을 세부적으로 조정할 수도 있습니다.", + "title": "활성 편집기를 기반으로 창 제목을 제어합니다. 변수는 컨텍스트를 기준으로 대체됩니다.\n${activeEditorShort}: 파일 이름(예: myFile.txt)\n${activeEditorMedium}: 작업 영역 폴더를 기준으로 하는 파일에 대한 상대 경로(예: myFolder/myFile.txt)\n${activeEditorLong}: 파일의 전체 경로(예: /Users/Development/myProject/myFolder/myFile.txt)\n${folderName}: 파일이 포함된 작업 영역 폴더의 이름(예: myFolder)\n${folderPath}: 파일이 포함된 작업 영역 폴더의 파일 경로(예: /Users/Development/myFolder)\n${rootName}: 작업 영역의 이름(예: myFolder or myWorkspace)\n${rootPath}: 작업 영역의 파일 경로(예: /Users/Development/myWorkspace)\n${appName}: 예: VS Code\n${dirty}: 활성 편집기가 더티인 경우 더티 표시기\n${separator}: 값 또는 정적 텍스트가 있는 변수로 둘러싸인 경우에만 표시되는 조건부 구분 기호(\" - \")", "window.newWindowDimensions.default": "화면 가운데에서 새 창을 엽니다.", "window.newWindowDimensions.inherit": "마지막 활성 창과 동일한 크기로 새 창을 엽니다.", "window.newWindowDimensions.maximized": "최대화된 새 창을 엽니다.", @@ -71,6 +79,7 @@ "autoDetectHighContrast": "사용하도록 설정한 경우 Windows에서 고대비 테마를 사용 중이면 고대비 테마로 자동으로 변경되고 Windows 고대비 테마를 해제하면 어두운 테마로 변경됩니다.", "titleBarStyle": "창 제목 표시줄의 모양을 조정합니다. 변경 내용을 적용하려면 전체 다시 시작해야 합니다.", "window.nativeTabs": "macOS Sierra 창 탭을 사용하도록 설정합니다. 변경\n 내용을 적용하려면 전체 다시 시작해야 하고, 기본 탭에서\n 사용자 지정 제목 표시줄 스타일(구성된 경우)을 비활성화합니다.", + "window.smoothScrollingWorkaround": "최소화된 VS Code 창을 복원한 후 더 이상 원활하게 스크롤되지 않으면 이 해결 방법을 사용하도록 설정하세요. 이 해결 방법은 Microsoft의 Surface 장치와 같이 정밀 트랙 패드가 장착된 장치에서 스크롤이 지연되기 시작하는 문제(https://github.com/Microsoft/vscode/issues/13612)를 해결합니다. 이 해결 방법을 사용하도록 설정하면 최소화된 상태에서 창을 복원한 후 약간의 레이아웃 깜박거림이 발생할 수 있지만 그 외의 해는 없습니다.", "zenModeConfigurationTitle": "Zen 모드", "zenMode.fullScreen": "Zen 모드를 켜면 워크벤치도 전체 화면 모드로 전환되는지 여부를 제어합니다.", "zenMode.centerLayout": "Zen 모드를 켜면 레이아웃도 가운데로 맞춰지는지 여부를 제어합니다.", diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 8a6f29b83bf..88ab766249d 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "중단점 편집...", + "breakpoint": "중단점", "functionBreakpointsNotSupported": "이 디버그 형식은 함수 중단점을 지원하지 않습니다.", "functionBreakpointPlaceholder": "중단할 함수", "functionBreakPointInputAriaLabel": "함수 중단점 입력", @@ -14,6 +14,7 @@ "breakpointUnverifieddHover": "확인되지 않은 중단점", "functionBreakpointUnsupported": "이 디버그 형식은 함수 중단점을 지원하지 않습니다.", "breakpointDirtydHover": "확인되지 않은 중단점입니다. 파일이 수정되었습니다. 디버그 세션을 다시 시작하세요.", + "logBreakpointUnsupported": "이 디버그 형식에서 지원되지 않는 로그 지점", "conditionalBreakpointUnsupported": "이 디버그 형식에서 지원되지 않는 조건부 중단점", "hitBreakpointUnsupported": "이 디버그 형식은 조건부 중단점 적중을 지원하지 않습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 782e05fd2a4..a942f921e39 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "디버그: 중단점 설정/해제", "conditionalBreakpointEditorAction": "디버그: 조건부 중단점 추가...", + "logPointEditorAction": "디버그: 로그 지점 추가...", "runToCursor": "커서까지 실행", "debugEvaluate": "디버그: 평가", "debugAddToWatch": "디버그: 조사식에 추가", diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 484e21f6e54..37973e78856 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,7 @@ ], "breakpointWidgetHitCountPlaceholder": "적중 횟수 조건이 충족될 경우 중단합니다. 적용하려면 'Enter' 키를 누르고 취소하려면 'Esc' 키를 누릅니다.", "breakpointWidgetExpressionPlaceholder": "식이 true로 계산될 경우 중단합니다. 적용하려면 'Enter' 키를 누르고 취소하려면 'Esc' 키를 누릅니다.", - "breakpointWidgetHitCountAriaLabel": "적중 횟수가 충족되는 경우에만 프로그램이 여기서 중지됩니다. 수락하려면 <Enter> 키를 누르고, 취소하려면 <Esc> 키를 누르세요.", - "breakpointWidgetAriaLabel": "이 조건이 true인 경우에만 프로그램이 여기서 중지됩니다. 수락하려면 <Enter> 키를 누르고, 취소하려면 <Esc> 키를 누르세요.", "expression": "식", - "hitCount": "적중 횟수" + "hitCount": "적중 횟수", + "logMessage": "로그 메시지" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 31d9ef02895..2b16fc7aa13 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "고유한 구성 이름을 사용하세요.", "app.launch.json.compound.folder": "복합형 항목이 있는 폴더의 이름입니다.", "app.launch.json.compounds.configurations": "이 복합의 일부로 시작되는 구성의 이름입니다.", - "debugNoType": "디버그 어댑터 '형식'은 생략할 수 없으며 '문자열' 형식이어야 합니다.", "selectDebug": "환경 선택", "DebugConfig.failed": "'.vscode' 폴더({0}) 내에 'launch.json' 파일을 만들 수 없습니다.", "workspace": "작업 영역", diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 07989327ee8..f17252c082d 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "중단점 편집...", - "disableBreakpoint": "중단점 사용 안 함", - "enableBreakpoint": "중단점 사용", + "breakpoint": "중단점", "removeBreakpoints": "중단점 제거", "removeBreakpointOnColumn": "{0} 열에서 중단점 제거", "removeLineBreakpoint": "줄 중단점 제거", @@ -21,6 +19,8 @@ "enableBreakpoints": "{0} 열에서 중단점 사용", "enableBreakpointOnLine": "줄 중단점 사용", "addBreakpoint": "중단점 추가", - "conditionalBreakpoint": "조건부 중단점 추가...", + "addConditionalBreakpoint": "조건부 중단점 추가...", + "addLogPoint": "로그 지점 추가...", + "cancel": "취소", "addConfiguration": "구성 추가..." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 3b9db932452..f0485e490c5 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -28,5 +28,7 @@ "preLaunchTaskExitCode": "preLaunchTask '{0}'이(가) {1} 종료 코드와 함께 종료되었습니다.", "showErrors": "오류 표시", "noFolderWorkspaceDebugError": "활성 파일은 디버그할 수 없습니다. 이 파일이 디스크에 저장되어 있고 해당 파일 형식에 대한 디버그 확장이 설치되어 있는지 확인하세요.", - "cancel": "취소" + "cancel": "취소", + "DebugTaskNotFound": "작업 '{0}' 을(를) 찾을 수 없습니다.", + "taskNotTracked": "작업 '{0}' 을(를) 추적할 수 없습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 7818afada97..742e35e3d50 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "추가 정보", - "unableToLaunchDebugAdapter": "'{0}'에서 디버그 어댑터를 시작할 수 없습니다.", - "unableToLaunchDebugAdapterNoArgs": "디버그 어댑터를 시작할 수 없습니다.", - "stoppingDebugAdapter": "{0}. 디버그 어댑터를 중지합니다.", "debugAdapterCrash": "디버그 어댑터 프로세스가 예기치 않게 종료되었습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 75d5a498631..e49f8a732d5 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "디버그 어댑터 실행 파일 '{0}'이(가) 없습니다.", "debugAdapterCannotDetermineExecutable": "디버그 어댑터 '{0}'에 대한 실행 파일을 확인할 수 없습니다.", - "launch.config.comment1": "IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.", - "launch.config.comment2": "기존 특성에 대한 설명을 보려면 가리킵니다.", - "launch.config.comment3": "자세한 내용을 보려면 {0}을(를) 방문하세요.", - "debugType": "구성의 형식입니다.", - "debugTypeNotRecognised": "디버그 형식이 인식되지 않습니다. 해당하는 디버그 확장을 설치하고 사용하도록 설정했는지 확인하세요.", - "node2NotSupported": "\"node2\"는 더 이상 지원되지 않습니다. 대신 \"node\"를 사용하고 \"protocol\" 특성을 \"inspector\"로 설정하세요.", - "debugName": "구성 이름이며, 구성 시작 드롭다운 메뉴에 표시됩니다.", - "debugRequest": "구성 형식을 요청합니다. \"시작\" 또는 \"연결\"일 수 있습니다.", - "debugServer": "디버그 확장 배포 전용입니다. 포트가 지정된 경우 VS Code에서는 서버 모드로 실행하는 디버그 어댑터에 연결을 시도합니다.", - "debugPrelaunchTask": "디버그 세션이 시작되기 이전에 실행할 작업입니다.", - "debugWindowsConfiguration": "Windows 특정 시작 구성 특성입니다.", - "debugOSXConfiguration": "OS X 특정 시작 구성 특성입니다.", - "debugLinuxConfiguration": "Linux 특정 시작 구성 특성입니다.", - "deprecatedVariables": "'env.', 'config.' 및 'command.'는 사용되지 않습니다. 대신 'env:', 'config:' 및 'command:'를 사용하세요." + "unableToLaunchDebugAdapter": "'{0}'에서 디버그 어댑터를 시작할 수 없습니다.", + "unableToLaunchDebugAdapterNoArgs": "디버그 어댑터를 시작할 수 없습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..ded2c6ad581 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "IntelliSense를 사용하여 가능한 특성에 대해 알아보세요.", + "launch.config.comment2": "기존 특성에 대한 설명을 보려면 가리킵니다.", + "launch.config.comment3": "자세한 내용을 보려면 {0}을(를) 방문하세요.", + "debugType": "구성의 형식입니다.", + "debugTypeNotRecognised": "디버그 형식이 인식되지 않습니다. 해당하는 디버그 확장을 설치하고 사용하도록 설정했는지 확인하세요.", + "node2NotSupported": "\"node2\"는 더 이상 지원되지 않습니다. 대신 \"node\"를 사용하고 \"protocol\" 특성을 \"inspector\"로 설정하세요.", + "debugName": "구성 이름이며, 구성 시작 드롭다운 메뉴에 표시됩니다.", + "debugRequest": "구성 형식을 요청합니다. \"시작\" 또는 \"연결\"일 수 있습니다.", + "debugServer": "디버그 확장 배포 전용입니다. 포트가 지정된 경우 VS Code에서는 서버 모드로 실행하는 디버그 어댑터에 연결을 시도합니다.", + "debugPrelaunchTask": "디버그 세션이 시작되기 이전에 실행할 작업입니다.", + "debugPostDebugTask": "디버그 세션 종료 후 실행할 작업입니다.", + "debugWindowsConfiguration": "Windows 특정 시작 구성 특성입니다.", + "debugOSXConfiguration": "OS X 특정 시작 구성 특성입니다.", + "debugLinuxConfiguration": "Linux 특정 시작 구성 특성입니다.", + "deprecatedVariables": "'env.', 'config.' 및 'command.'는 사용되지 않습니다. 대신 'env:', 'config:' 및 'command:'를 사용하세요." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..850e1c758d6 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "VS Code 콘솔", + "mac.terminal.script.failed": "스크립트 '{0}'이(가) 실패했습니다(종료 코드: {1}).", + "mac.terminal.type.not.supported": "'{0}'이(가) 지원되지 않습니다.", + "press.any.key": "계속하려면 아무 키나 누르세요.", + "linux.term.failed": "'{0}'에서 실패했습니다(종료 코드: {1})." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index d1ad83723cb..3b79008f444 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -58,6 +58,9 @@ "configureWorkspaceFolderRecommendedExtensions": "권장 확장 구성(작업 영역 폴더)", "malicious tooltip": "이 확장은 문제가 있다고 보고되었습니다.", "malicious": "악성", + "disabled": "사용 안 함", + "disabled globally": "사용 안 함", + "disabled workspace": "이 작업 영역에 대해 사용 안 함", "disableAll": "설치된 모든 확장 사용 안 함", "disableAllWorkspace": "이 작업 영역에 대해 설치된 모든 확장 사용 안 함", "enableAll": "모든 확장 사용", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 73fe67dbadf..1de6037ae75 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -8,6 +8,7 @@ ], "name": "확장 이름", "extension id": "확장 ID", + "preview": "미리 보기", "builtin": "기본 제공", "publisher": "게시자 이름", "install count": "설치 수", @@ -35,7 +36,6 @@ "view location": "위치", "localizations": "지역화({0})", "localizations language id": "언어 ID", - "localizations localized language name": "언어 이름(지역화됨)", "colorThemes": "색 테마({0})", "iconThemes": "아이콘 테마({0})", "colors": "색({0})", @@ -44,6 +44,8 @@ "defaultLight": "밝게 기본값", "defaultHC": "고대비 기본값", "JSON Validation": "JSON 유효성 검사({0})", + "fileMatch": "파일 일치", + "schema": "스키마", "commands": "명령({0})", "command name": "이름", "keyboard shortcuts": "바로 가기 키(&&K)", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index c2d64485c12..b497dd8ac6a 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "이 확장은 현재 작업 영역 사용자가 권장합니다.", "reallyRecommended2": "이 파일 형식에 대해 '{0}' 확장이 권장됩니다.", "reallyRecommendedExtensionPack": "이 파일 형식에 대해 '{0}' 확장 팩이 권장됩니다.", - "showRecommendations": "권장 사항 표시", "install": "설치", + "showRecommendations": "권장 사항 표시", "showLanguageExtensions": "Marketplace에 '.{0}' 파일이 지원되는 확장이 있습니다.", "workspaceRecommended": "이 작업 영역에 확장 권장 사항이 있습니다.", "installAll": "모두 설치", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 0a1652fb592..b4035d78429 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "키 바인딩 간 충돌을 피하기 위해 다른 키 맵({0})을 사용하지 않도록 설정할까요?", "yes": "예", - "no": "아니요", - "betterMergeDisabled": "Better Merge 확장이 이제 빌드되었습니다. 설치된 확장은 사용하지 않도록 설정되었으며 제거할 수 있습니다.", - "uninstall": "제거" + "no": "아니요" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index d88f38093be..adaba790ee3 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,8 @@ "recommendedExtensions": "권장", "otherRecommendedExtensions": "기타 권장 사항", "workspaceRecommendedExtensions": "작업 영역 권장 사항", + "builtInExtensions": "기능", + "builtInThemesExtensions": "테마", "searchExtensions": "마켓플레이스에서 확장 검색", "sort by installs": "정렬 기준: 설치 수", "sort by rating": "정렬 기준: 등급", diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index 42e37cef1b1..9e37e959f54 100644 --- a/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -27,14 +27,17 @@ "confirmMoveTrashMessageMultiple": "다음 {0}개 파일을 삭제하시겠습니까?", "confirmMoveTrashMessageFolder": "'{0}'과(와) 해당 내용을 삭제할까요?", "confirmMoveTrashMessageFile": "'{0}'을(를) 삭제할까요?", + "undoBin": "휴지통에서 복원할 수 있습니다.", + "undoTrash": "휴지통에서 복원할 수 있습니다.", "doNotAskAgain": "이 메시지를 다시 표시 안 함", "confirmDeleteMessageMultiple": "다음 {0}개 파일을 영구히 삭제하시겠습니까?", "confirmDeleteMessageFolder": "'{0}'과(와) 해당 내용을 영구히 삭제할까요?", "confirmDeleteMessageFile": "'{0}'을(를) 영구히 삭제할까요?", "irreversible": "이 작업은 취소할 수 없습니다.", + "binFailed": "휴지통을 사용하여 삭제하지 못했습니다. 대신 영구히 삭제하시겠습니까?", + "trashFailed": "휴지통을 사용하여 삭제하지 못했습니다. 대신 영구히 삭제하시겠습니까?", "deletePermanentlyButtonLabel": "영구 삭제 (&&D)", "retryButtonLabel": "다시 시도 (&&R)", - "importFiles": "파일 가져오기", "confirmOverwrite": "이름이 같은 파일 또는 폴더가 대상 폴더에 이미 있습니다. 덮어쓸까요?", "replaceButtonLabel": "바꾸기(&&R)", "fileIsAncestor": "붙여 넣을 파일이 대상 폴더의 상위 항목입니다.", diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 60fac1e96fa..5f7b04e2b00 100644 --- a/i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -37,6 +37,7 @@ "defaultLanguage": "새 파일에 할당되는 기본 언어 모드입니다.", "editorConfigurationTitle": "편집기", "formatOnSave": "파일 저장 시 서식을 지정합니다. 포맷터를 사용할 수 있어야 하며, 파일이 자동으로 저장되지 않아야 하고, 편집기가 종료되지 않아야 합니다.", + "formatOnSaveTimeout": "저장 시 서식 지정의 시간 제한. FormatOnSave 명령에 대한 시간 제한을 밀리초로 지정합니다. 지정된 시간 제한보다 오래 걸리는 명령은 취소됩니다.", "explorerConfigurationTitle": "파일 탐색기", "openEditorsVisible": "열려 있는 편집기 창에 표시되는 편집기 수입니다.", "autoReveal": "탐색기에서 파일을 열 때 자동으로 표시하고 선택할지를 제어합니다.", diff --git a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index b6d91a6d575..39635da205e 100644 --- a/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,13 +7,14 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "파일 이름을 입력합니다. 확인하려면 Enter 키를 누르고, 취소하려면 Esc 키를 누릅니다.", - "constructedPath": "**{1}**에 {0} 만들기", "filesExplorerViewerAriaLabel": "{0}, 파일 탐색기", "dropFolders": "작업 영역에 폴더를 추가하시겠습니까?", "dropFolder": "작업 영역에 폴더를 추가하시겠습니까?", "addFolders": "폴더 추가(&&A)", "addFolder": "폴더 추가(&&A)", + "confirmRootsMove": "작업 영역에서 다중 루트 폴더의 순서를 변경하시겠습니까? ", "confirmMultiMove": "다음 {0}개 파일을 이동하시겠습니까?", + "confirmRootMove": "작업 영역에서 루트 폴더 '{0}'의 순서를 변경하시겠습니까? ", "confirmMove": "'{0}'을(를) 이동하시겠습니까?", "doNotAskAgain": "이 메시지를 다시 표시 안 함", "moveButtonLabel": "이동(&&M)", diff --git a/i18n/kor/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index d95a0ea15d2..2fdfcbff78e 100644 --- a/i18n/kor/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "VS Code의 UI 언어를 {0}(으)로 변경하고 다시 시작하시겠습니까?", "yes": "예", "no": "아니요", - "doNotAskAgain": "이 메시지를 다시 표시 안 함", + "neverAgain": "다시 표시 안 함", "JsonSchema.locale": "사용할 UI 언어입니다.", "vscode.extension.contributes.localizations": "편집기에 지역화를 적용합니다.", "vscode.extension.contributes.localizations.languageId": "표시 문자열이 번역되는 언어의 ID입니다.", diff --git a/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 5ea2aa6a147..dae3babf1ff 100644 --- a/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "총 {0}개 문제", - "filteredProblems": "{1}개 중 {0}개 문제 표시" + "totalProblems": "총 {0}개 문제" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index a28f9554902..3efd6d563c7 100644 --- a/i18n/kor/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "문제", "markers.panel.aria.label.problems.tree": "파일별로 그룹화된 문제", "markers.panel.no.problems.build": "지금까지 작업 영역에서 문제가 감지되지 않았습니다.", - "markers.panel.no.problems.filters": "제공된 필터 기준으로 결과를 찾을 수 없습니다.", "markers.panel.action.filter": "문제 필터링", - "markers.panel.filter.placeholder": "형식 또는 텍스트로 필터링", + "markers.panel.filter.ariaLabel": "문제 필터링", "markers.panel.filter.errors": "오류", "markers.panel.filter.warnings": "경고", "markers.panel.filter.infos": "정보", @@ -30,5 +29,15 @@ "markers.panel.multiple.unknowns.label": "알 수 없음 {0}개", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "{0}에 {1}개의 문제가 있음", + "problems.tree.aria.label.marker.relatedInformation": " 이 문제에는 {0} 위치에 대한 참조가 있습니다.", + "problems.tree.aria.label.error.marker": "{0}에 의해 오류 발생: 줄 {2} 및 문자 {3}.{4}의 {1}", + "problems.tree.aria.label.error.marker.nosource": "오류: 줄 {1} 및 문자 {2}의 {0}.{3}", + "problems.tree.aria.label.warning.marker": "{0}에 의해 경고 발생: 줄 {2} 및 문자 {3}의 {1}.{4}", + "problems.tree.aria.label.warning.marker.nosource": "경고: 줄 {1} 및 문자 {2}의 {0}.{3}", + "problems.tree.aria.label.info.marker": "{0}에 의해 정보가 생성됨: 줄 {2} 및 문자 {3}의 {1}.{4}", + "problems.tree.aria.label.info.marker.nosource": "정보: 줄 {1} 및 문자 {2}의 {0}.{3}", + "problems.tree.aria.label.marker": "{0}에 의해 문제 발생: 줄 {2} 및 문자 {3}의 {1}.{4}", + "problems.tree.aria.label.marker.nosource": "문제: 줄 {1} 및 문자 {2}의 {0}.{3}", + "problems.tree.aria.label.relatedinfo.message": "{3}에서 줄 {1} 및 문자 {2}의 {0}", "errors.warnings.show.label": "오류 및 경고 표시" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/kor/src/vs/workbench/parts/output/browser/outputActions.i18n.json index 17ffb17a533..bce61a36cfe 100644 --- a/i18n/kor/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "출력 설정/해제", "clearOutput": "출력 내용 지우기", "toggleOutputScrollLock": "출력 스크롤 잠금 설정/해제", - "switchToOutput.label": "출력으로 전환" + "switchToOutput.label": "출력으로 전환", + "openInLogViewer": "로그 파일 열기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index bb2fd60239e..1b45ff7d927 100644 --- a/i18n/kor/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "출력", "logViewer": "로그 표시기", "viewCategory": "보기", - "clearOutput.label": "출력 내용 지우기" + "clearOutput.label": "출력 내용 지우기", + "openActiveLogOutputFile": "보기: 활성 로그 출력 파일 열기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index e80e5a7a2f1..6a6e7f15271 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "바로 가기 키(&&K)", + "showDefaultKeybindings": "기본 키 바인딩 표시", + "showUserKeybindings": "사용자 키 바인딩 표시", "SearchKeybindings.AriaLabel": "키 바인딩 검색", "SearchKeybindings.Placeholder": "키 바인딩 검색", "sortByPrecedene": "우선 순위별 정렬", diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 7aa0e3bd202..96e3df98eee 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "원시 기본 설정 열기", + "openSettings": "설정 열기", "openGlobalSettings": "사용자 설정 열기", "openGlobalKeybindings": "바로 가기 키 열기", "openGlobalKeybindingsFile": "바로 가기 키 파일 열기", diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 845d9b2416b..4839ff6ed8b 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "기본 설정", "SearchSettingsWidget.AriaLabel": "설정 검색", "SearchSettingsWidget.Placeholder": "설정 검색", "noSettingsFound": "결과 없음", diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 2af08d6ae4a..952972db109 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "\"{0}\" 확장 표시", "editTtile": "편집", "replaceDefaultValue": "설정에서 바꾸기", - "copyDefaultValue": "설정에 복사", - "unsupportedPHPExecutablePathSetting": "이 설정은 사용자 설정이어야 합니다. 작업 영역에 대해 PHP를 구성하려면 PHP 파일을 열고 상태 표시줄에서 'PHP 경로'를 클릭합니다.", - "unsupportedWorkspaceSetting": "이 설정은 사용자 설정이어야 합니다.", - "unsupportedWorkbenchSetting": "이 설정은 지금 적용할 수 없으며 이 폴더를 직접 열 경우에 적용됩니다.", - "unsupportedWorkbenchSettingDevMode": "현재 이 설정을 적용할 수 없습니다. 등록하는 동안 범위를 '리소스'로 정의하거나 이 폴더를 직접 여는 경우 적용됩니다." + "copyDefaultValue": "설정에 복사" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json index b5c27aa50bb..6dd3b8d0504 100644 --- a/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -10,7 +10,6 @@ "previousSearchIncludePattern": "이전 검색 포함 패턴 표시", "nextSearchTerm": "다음 검색어 표시", "previousSearchTerm": "이전 검색어 표시", - "showSearchViewlet": "검색 표시", "findInFiles": "파일에서 찾기", "replaceInFiles": "파일에서 바꾸기", "RefreshAction.label": "새로 고침", diff --git a/i18n/kor/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/kor/src/vs/workbench/parts/search/browser/searchView.i18n.json index 863a56d6989..c98e307c23b 100644 --- a/i18n/kor/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "검색 세부 정보 설정/해제", + "searchScope.includes": "포함할 파일", + "label.includes": "패턴 포함 검색", + "searchScope.excludes": "제외할 파일", + "label.excludes": "패턴 제외 검색", "replaceAll.confirmation.title": "모두 바꾸기", "replaceAll.confirm.button": "바꾸기(&&R)", "replaceAll.occurrence.file.message": "{1}개 파일에서 {0}개를 '{2}'(으)로 바꿨습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 40920aa65c0..a894a8df8a0 100644 --- a/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "검색", + "copyMatchLabel": "복사", + "copyPathLabel": "경로 복사", + "copyAllLabel": "모두 복사", "findInFolder": "폴더에서 찾기...", "findInWorkspace": "작업 영역에서 찾기...", "showTriggerActions": "작업 영역에서 기호로 이동...", "name": "검색", - "search": "검색", "showSearchViewl": "검색 표시", "view": "보기", "findInFiles": "파일에서 찾기", @@ -25,6 +28,5 @@ "search.quickOpen.includeSymbols": "Quick Open에 대한 파일 결과에 전역 기호 검색 결과를 포함하도록 구성합니다.", "search.followSymlinks": "검색하는 동안 symlink를 누를지 여부를 제어합니다.", "search.smartCase": "패턴이 모두 소문자인 경우 대/소문자를 구분하지 않고 검색하고, 그렇지 않으면 대/소문자를 구분하여 검색합니다.", - "search.globalFindClipboard": "macOS에서 검색 보기가 공유 클립보드 찾기를 읽거나 수정해야 할지를 제어합니다.", - "search.location": "미리 보기: 검색을 사이드바의 보기로 표시할지 또는 가로 간격을 늘리기 위해 패널 영역의 패널로 표시할지를 제어합니다. 다음 릴리스의 패널에서의 검색은 가로 레이아웃이 개선되며 더 이상 미리 보기가 아닙니다." + "search.globalFindClipboard": "macOS에서 검색 보기가 공유 클립보드 찾기를 읽거나 수정해야 할지를 제어합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 2e803e32bfa..e6bd5e0a444 100644 --- a/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "{0}에 대한 지원을 개선하는 데 도움을 주세요.", "takeShortSurvey": "간단한 설문 조사 참여", "remindLater": "나중에 알림", - "neverAgain": "다시 표시 안 함", - "helpUs": "{0}에 대한 지원을 개선하는 데 도움을 주세요." + "neverAgain": "다시 표시 안 함" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 76f84d4a43e..9e0d0c2fac7 100644 --- a/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "간단한 피드백 설문 조사에 참여하시겠어요?", "takeSurvey": "설문 조사 참여", "remindLater": "나중에 알림", - "neverAgain": "다시 표시 안 함", - "surveyQuestion": "간단한 피드백 설문 조사에 참여하시겠어요?" + "neverAgain": "다시 표시 안 함" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index a5f47526ecf..a6d3822b0a1 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "문제 패턴 또는 제공되거나 미리 정의된 문제 패턴의 이름입니다. 기본이 지정된 경우 생략할 수 있습니다.", "ProblemMatcherSchema.base": "사용할 기본 문제 선택기의 이름입니다.", "ProblemMatcherSchema.owner": "Code 내부의 문제 소유자입니다. 기본값을 지정한 경우 생략할 수 있습니다. 기본값을 지정하지 않고 생략한 경우 기본값은 '외부'입니다.", + "ProblemMatcherSchema.source": "이 진단의 소스를 설명하는 사람이 읽을 수 있는 문자열입니다(예: 'typescript' 또는 'super lint').", "ProblemMatcherSchema.severity": "캡처 문제에 대한 기본 심각도입니다. 패턴에서 심각도에 대한 일치 그룹을 정의하지 않은 경우에 사용됩니다.", "ProblemMatcherSchema.applyTo": "텍스트 문서에 복된 문제가 열린 문서, 닫힌 문서 또는 모든 문서에 적용되는지를 제어합니다.", "ProblemMatcherSchema.fileLocation": "문제 패턴에 보고된 파일 이름을 해석하는 방법을 정의합니다.", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index e02ee2a8a5f..abf1b203d31 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,7 +28,14 @@ "JsonSchema.tasks.group.none": "작업을 그룹에 할당 안 함", "JsonSchema.tasks.group": "이 작업을 할당할 실행 그룹을 정의합니다. 빌드 그룹에 추가를 위한 \"build'와 테스트 그룹에 추가를 위한 \"test\"를 지원합니다.", "JsonSchema.tasks.type": "작업이 프로세스로 실행되는지 또는 셸 내의 명령으로 실행되는지를 제어합니다.", + "JsonSchema.command.quotedString.value": "실제 명령 값", + "JsonSchema.tasks.quoting.escape": "셸의 이스케이프 문자를 사용하여 문자를 이스케이프합니다(예: ` under PowerShell 및 \\ under bash).", + "JsonSchema.tasks.quoting.strong": "셸의 강력한 따옴표 문자를 사용하여 인수를 따옴표 처리합니다(예: \" under PowerShell and bash).", + "JsonSchema.tasks.quoting.weak": "셸의 약한 따옴표 문자를 사용하여 인수를 따옴표 처리합니다(예: PowerShell 및 bash의 경우 ').", + "JsonSchema.command.quotesString.quote": "명령 값을 따옴표로 묶을 방법입니다.", "JsonSchema.command": "실행할 명령이며, 외부 프로그램 또는 셸 명령입니다.", + "JsonSchema.args.quotedString.value": "실제 인수 값", + "JsonSchema.args.quotesString.quote": "인수 값을 따옴표로 묶을 방법입니다.", "JsonSchema.tasks.args": "이 작업이 호출될 때 명령에 전달되는 인수입니다.", "JsonSchema.tasks.label": "작업 사용자 인터페이스 레이블", "JsonSchema.version": "구성의 버전 번호입니다.", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 9fba55129c8..4d86707ccea 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,7 +11,9 @@ "totalErrors": "오류 {0}개", "totalWarnings": "경고 {0}개", "totalInfos": "정보 {0}개", + "problems": "문제", "building": "빌드하고 있습니다...", + "manyProblems": "10K+", "runningTasks": "실행 중인 작업 표시", "tasks": "작업", "TaskSystem.noHotSwap": "실행 중인 활성 작업이 있는 작업 실행 엔진을 변경하면 Window를 다시 로드해야 합니다.", @@ -29,8 +31,8 @@ "selectProblemMatcher": "작업 출력에서 스캔할 오류 및 경고 유형을 선택", "customizeParseErrors": "현재 작성 구성에 오류가 있습니다. 작업을 사용자 지정하기 전에 오류를 수정하세요.\n", "moreThanOneBuildTask": "tasks.json에 여러 빌드 작업이 정의되어 있습니다. 첫 번째 작업을 실행합니다.\n", - "TaskSystem.activeSame.background": "'{0}' 작업이 이미 활성 상태로 백그라운드 모드에 있습니다. 종료하려면 [작업] 메뉴에서 '작업 종료...'를 사용하세요.", - "TaskSystem.activeSame.noBackground": "'{0}' 작업이 이미 활성 상태입니다. 종료하려면 [작업] 메뉴에서 '작업 종료...'를 사용하세요.", + "terminateTask": "작업 종료", + "restartTask": "작업 다시 시작", "TaskSystem.active": "이미 실행 중인 작업이 있습니다. 다른 작업을 실행하려면 먼저 이 작업을 종료하세요.", "TaskSystem.restartFailed": "{0} 작업을 종료하고 다시 시작하지 못했습니다.", "TaskService.noConfiguration": "오류: {0} 작업 검색에서는 다음 구성에 대한 작업을 제공하지 않습니다:\n{1}\n이 작업이 무시됩니다.\n", @@ -47,8 +49,8 @@ "recentlyUsed": "최근에 사용한 작업", "configured": "구성된 작업", "detected": "감지된 작업", - "TaskService.notAgain": "다시 표시 안 함", "TaskService.ignoredFolder": "작업 버전 0.1.0을 사용하기 때문에 다음 작업 영역 폴더는 무시됩니다. {0}", + "TaskService.notAgain": "다시 표시 안 함", "TaskService.pickRunTask": "실행할 작업 선택", "TaslService.noEntryToRun": "실행할 작업이 없습니다. 작업 구성...", "TaskService.fetchingBuildTasks": "빌드 작업을 페치하는 중...", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index d7f18841ff1..13963265fec 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "경고: options.cwd는 string 형식이어야 합니다. {0} 값을 무시합니다.\n", + "ConfigurationParser.inValidArg": "오류: 명령 인수는 문자열 또는 따옴표 붙은 문자열이어야 합니다. 제공된 값:\n{0}", "ConfigurationParser.noargs": "오류: 명령 인수는 문자열의 배열이어야 합니다. 제공된 값:\n{0}", "ConfigurationParser.noShell": "경고: 셸 구성은 작업을 터미널에서 실행 중일 때에만 지원됩니다.", "ConfigurationParser.noName": "오류: 선언 범위 내의 문제 선택기는 이름이 있어야 합니다.\n{0}\n", diff --git a/i18n/kor/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..28e78284f3f --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "터미널의 배경색입니다. 이 설정을 사용하면 터미널\n 색을 패널과 다르게 지정할 수 있습니다.", + "terminal.foreground": "터미널의 전경색입니다.", + "terminalCursor.background": "터미널 커서의 배경색입니다. 블록 커서와 겹친 문자의 색상을 사용자 정의할 수 있습니다.", + "terminal.selectionBackground": "터미널의 선택 영역 배경색입니다.", + "terminal.border": "터미널 내의 분할 창을 구분하는 테두리의 색입니다. 기본값은 panel.border입니다.", + "terminal.ansiColor": "터미널의 '{0}' ANSI 색상" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index ba974a50480..1d3dab07b1f 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -51,5 +51,7 @@ "workbench.action.terminal.hideFindWidget": "파인드 위젯 숨기기", "nextTerminalFindTerm": "다음 검색어 표시", "previousTerminalFindTerm": "이전 검색어 표시", - "quickOpenTerm": "활성 터미널 전환" + "quickOpenTerm": "활성 터미널 전환", + "workbench.action.terminal.selectToPreviousCommand": "이전 명령까지 선택", + "workbench.action.terminal.selectToNextCommand": "다음 명령까지 선택" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index 1dfa3710832..9eeadb37e3c 100644 --- a/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "이 작업 영역에는 사용자 설정({0})에서만 지정할 수 있는 설정이 포함되어 있습니다. 자세히 알아보려면 [여기]({1})를 클릭하세요.", "openWorkspaceSettings": "작업 영역 설정 열기", - "dontShowAgain": "다시 표시 안 함", - "unsupportedWorkspaceSettings": "이 작업 영역에는 사용자 설정({0})에서만 지정할 수 있는 설정이 포함되어 있습니다. 자세히 알아보려면 [여기]({1})를 클릭하세요." + "dontShowAgain": "다시 표시 안 함" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 42eb2d479ae..a8da9f65b7b 100644 --- a/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "나중에", "releaseNotes": "릴리스 정보", "showReleaseNotes": "릴리스 정보 표시", "read the release notes": "{0} v{1}을(를) 시작합니다. 릴리스 정보를 확인하시겠습니까?", @@ -16,13 +15,12 @@ "updateIsReady": "새 {0} 업데이트를 사용할 수 있습니다.", "noUpdatesAvailable": "현재 사용할 수 있는 업데이트가 없습니다.", "ok": "확인", - "download now": "지금 다운로드", "thereIsUpdateAvailable": "사용 가능한 업데이트가 있습니다.", + "download now": "지금 다운로드", + "later": "나중에", "installUpdate": "업데이트 설치", - "updateAvailable": "사용 가능한 업데이트가 있습니다. {0} {1}", "updateInstalling": "{0} {1}이(가) 백그라운드로 설치되고 있습니다. 완료되면 알려드리겠습니다.", "updateNow": "지금 업데이트", - "updateAvailableAfterRestart": "다시 시작하면 {0}이(가) 업데이트됩니다.", "commandPalette": "명령 팔레트...", "settings": "설정", "keyboardShortcuts": "바로 가기 키(&&K)", diff --git a/i18n/kor/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 4a956b0bd25..d6b00d87854 100644 --- a/i18n/kor/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "webview 편집기" + "webview.editor.label": "webview 편집기", + "developer": "개발자" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/kor/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..3a107e5fb3a --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Webview 개발자 도구 열기", + "refreshWebviewLabel": "Webview 다시 로드" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index 3b2a1e0eaac..88ec2a103e6 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Microsoft에서 사용 데이터를 수집하도록 허용하여 VS Code 개선에 도움을 주세요. Microsoft [개인정보처리방침]({0})을 읽고 [옵트아웃]({1})하는 방법을 알아보세요.", + "telemetryOptOut.optInNotice": "Microsoft에서 사용 데이터를 수집하도록 허용하여 VS Code 개선에 도움을 주세요. Microsoft [개인정보처리방침]({0})을 읽고 [옵트인]({1})하는 방법을 알아보세요.", "telemetryOptOut.readMore": "자세히 알아보기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index cd8e176a8e2..ea167dd210d 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "도구 및 언어", "welcomePage.installExtensionPacksDescription": "{0} 및 {1}에 대한 지원 설치", "welcomePage.moreExtensions": "자세히", - "welcomePage.installKeymapDescription": "바로 가기 키 설치", - "welcomePage.installKeymapExtension": "{0} 및 {1}의 바로 가기 키 설치", "welcomePage.others": "기타", "welcomePage.colorTheme": "색 테마", "welcomePage.colorThemeDescription": "편집기 및 코드가 좋아하는 방식으로 표시되게 만들기", diff --git a/i18n/kor/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/kor/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..78e97f64704 --- /dev/null +++ b/i18n/kor/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedWindowSetting": "이 설정은 지금 적용할 수 없으며 이 폴더를 직접 열 경우에 적용됩니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json b/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json index 83747fca0e8..35229bd6699 100644 --- a/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.i18n.json @@ -5,16 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "canNotResolveWorkspaceFolderMultiRoot": "${workspaceFolder} 은(는) 멀티 폴더 작업 영역에서 확인할 수 없습니다. : 와 폴더 이름을 사용하여 변수 범위를 정합니다.", - "canNotResolveWorkspaceFolder": "${workspaceFolder} 을(를) 확인할 수 없습니다. 폴더를 여십시오.", - "canNotResolveFolderBasenameMultiRoot": "${workspaceFolderBasename} 은(는) 멀티 폴더 작업 영역에서 확인할 수 없습니다. : 와 폴더 이름을 사용하여 변수 범위를 정합니다.", - "canNotResolveFolderBasename": "${workspaceFolderBasename} 을(를) 확인할 수 없습니다. 폴더를 여십시오.", - "canNotResolveLineNumber": "${lineNumber} 을(를) 확인할 수 없습니다. 편집기를 여십시오.", - "canNotResolveFile": "${file} 을(를) 확인할 수 없으므로, 편집기를 여십시오.", - "canNotResolveRelativeFile": "${relativeFile} 을(를) 확인할 수 없습니다. 편집기를 여십시오.", - "canNotResolveFileDirname": "${fileDirname} 을(를) 확인할 수 없습니다. 편집기를 여십시오.", - "canNotResolveFileExtname": "${fileExtname} 을(를) 확인할 수 없습니다. 편집기를 여십시오.", - "canNotResolveFileBasename": "${fileBasename} 을(를) 확인할 수 없습니다. 편집기를 여십시오.", - "canNotResolveFileBasenameNoExtension": "${fileBasenameNoExtension} 을(를) 확인할 수 없습니다. 편집기를 여십시오." + ] } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 44b8401265d..8d3f616011b 100644 --- a/i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "확장 호스트가 예기치 않게 종료되었습니다.", "extensionHostProcess.unresponsiveCrash": "확장 호스트가 응답하지 않아서 종료되었습니다.", - "devTools": "개발자 도구", "restart": "확장 호스트 다시 시작", "overwritingExtension": "확장 {0}을(를) {1}(으)로 덮어쓰는 중입니다.", "extensionUnderDevelopment": "{0}에서 개발 확장 로드 중", diff --git a/i18n/kor/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/kor/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index eb17227dbfa..a5a6d77d42c 100644 --- a/i18n/kor/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,10 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Microsoft .NET Framework 4.5가 필요합니다. 설치하려면 링크를 클릭하세요.", "installNet": ".NET Framework 4.5 다운로드", "neverShowAgain": "다시 표시 안 함", - "netVersionError": "Microsoft .NET Framework 4.5가 필요합니다. 설치하려면 링크를 클릭하세요.", + "enospcError": "{0}은(는) 이 큰 작업 영역에서 파일 변경 내용을 감시할 수 없습니다. 지침 링크에 따라 이 문제를 해결하세요.", "learnMore": "지침", + "fileInvalidPath": "잘못된 파일 리소스({0})", + "fileIsDirectoryError": "파일이 디렉터리입니다.", + "fileNotModifiedError": "파일 수정 안 됨", + "fileTooLargeError": "파일이 너무 커서 열 수 없음", + "fileNotFoundError": "파일을 찾을 수 없습니다({0}).", + "fileBinaryError": "파일이 이진인 것 같으므로 테스트로 열 수 없습니다.", + "filePermission": "파일 쓰기 권한이 거부되었습니다. ({0})", + "fileExists": "만드려는 파일이 이미 있음({0})", + "fileModifiedError": "파일 수정됨", + "fileReadOnlyError": "파일이 읽기 전용입니다.", + "fileMoveConflict": "이동/복사할 수 없습니다. 대상에 파일이 이미 있습니다.", + "unableToMoveCopyError": "이동/복사할 수 없습니다. 파일이 포함된 폴더를 파일로 대체합니다.", "binFailed": "'{0}'을(를) 휴지통으로 이동하지 못함", "trashFailed": "'{0}'을(를) 휴지통으로 이동하지 못함" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 181d6e0ea56..cdcbe91c8d9 100644 --- a/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "파일을 찾을 수 없습니다({0}).", "fileIsDirectoryError": "파일이 디렉터리입니다.", "fileNotModifiedError": "파일 수정 안 됨", "fileBinaryError": "파일이 이진인 것 같으므로 테스트로 열 수 없습니다." diff --git a/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index 32ea33e3988..9535580ff01 100644 --- a/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "tmLanguage 파일에 사용되는 Textmate 범위 이름입니다.", "vscode.extension.contributes.grammars.path": "tmLanguage 파일의 경로입니다. 확장 폴더의 상대 경로이며 일반적으로 './syntaxes/'로 시작합니다.", "vscode.extension.contributes.grammars.embeddedLanguages": "이 문법에 포함된 언어가 있는 경우 언어 ID에 대한 범위 이름의 맵입니다.", + "vscode.extension.contributes.grammars.tokenTypes": "토큰 형식에 대한 범위 이름의 맵입니다.", "vscode.extension.contributes.grammars.injectTo": "이 문법이 삽입되는 언어 범위 이름 목록입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index b13ed2dcb37..1b87a0da7e9 100644 --- a/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/kor/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "`contributes.{0}.path`에 문자열이 필요합니다. 제공된 값: {1}", "invalid.injectTo": "`contributes.{0}.injectTo`의 값이 잘못되었습니다. 언어 범위 이름 배열이어야 합니다. 제공된 값: {1}", "invalid.embeddedLanguages": "`contributes.{0}.embeddedLanguages` 값이 잘못되었습니다. 범위 이름에서 언어까지의 개체 맵이어야 합니다. 제공된 값: {1}", + "invalid.tokenTypes": "`contributes.{0}.tokenTypes` 값이 잘못되었습니다. 범위 이름에서 언어까지의 개체 맵이어야 합니다. 제공된 값: {1}", "invalid.path.1": "확장 폴더({2})에 포함할 `contributes.{0}.path`({1})가 필요합니다. 확장이 이식 불가능해질 수 있습니다.", "no-tm-grammar": "이 언어에 대해 등록된 TM 문법이 없습니다." } \ No newline at end of file diff --git a/i18n/ptb/extensions/configuration-editing/package.i18n.json b/i18n/ptb/extensions/configuration-editing/package.i18n.json index ff707c572bc..10996414b61 100644 --- a/i18n/ptb/extensions/configuration-editing/package.i18n.json +++ b/i18n/ptb/extensions/configuration-editing/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Edição de Configuração" + "displayName": "Edição de Configuração", + "description": "Fornece recursos (IntelliSense avançado, correção automática) em arquivos de configuração, como configurações, inicialização e arquivos de recomendação de extensão." } \ No newline at end of file diff --git a/i18n/ptb/extensions/css-language-features/package.i18n.json b/i18n/ptb/extensions/css-language-features/package.i18n.json index c6bb31b4fbc..a05cdcfbdc2 100644 --- a/i18n/ptb/extensions/css-language-features/package.i18n.json +++ b/i18n/ptb/extensions/css-language-features/package.i18n.json @@ -8,6 +8,7 @@ ], "displayName": "Recursos da Linguagem CSS", "description": "Fornece suporte de linguagem rico para arquivos CSS, LESS e SCSS.", + "css.title": "CSS", "css.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", "css.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", "css.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", @@ -50,6 +51,7 @@ "less.lint.zeroUnits.desc": "Nenhuma unidade para zero é necessária", "less.validate.title": "Controla MENOS as severidades de validação e problemas.", "less.validate.desc": "Habilita ou desabilita todas as validações", + "scss.title": "SCSS (Sass)", "scss.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", "scss.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", "scss.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", diff --git a/i18n/ptb/extensions/css/package.i18n.json b/i18n/ptb/extensions/css/package.i18n.json index 35229bd6699..b5a1c26e58b 100644 --- a/i18n/ptb/extensions/css/package.i18n.json +++ b/i18n/ptb/extensions/css/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Noções Básicas da Linguagem CSS", + "description": "Fornece realce de sintaxe e correspondência de colchetes para arquivos CSS, LESS e SCSS." } \ No newline at end of file diff --git a/i18n/ptb/extensions/emmet/package.i18n.json b/i18n/ptb/extensions/emmet/package.i18n.json index f66c3b617c3..bd44dd5d552 100644 --- a/i18n/ptb/extensions/emmet/package.i18n.json +++ b/i18n/ptb/extensions/emmet/package.i18n.json @@ -35,7 +35,7 @@ "emmetExtensionsPath": "Caminho para uma pasta que contém os perfis Emmet e trechos de códigos.'", "emmetShowExpandedAbbreviation": "Mostrar abreviaturas Emmet expandidas como sugestões.\nA opção \"inMarkupAndStylesheetFilesOnly\" aplica-se a html, haml, jade, slim, xml, xsl, css, scss, sass, less e stylus.\nA opção \"always\" se aplica a todas as partes do arquivo independentemente de marcação/css.", "emmetShowAbbreviationSuggestions": "Mostra abreviações Emmet possíveis como sugestões. Não aplicável em folhas de estilo ou quando emmet.showExpandedAbbreviation é definido como \"never\".", - "emmetIncludeLanguages": "Habilita as abreviaturas Emmet em linguagens que não são suportados por padrão. Adicionar um mapeamento aqui entre a linguagem e a linguagem emmet suportada.\n Por exemplo: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", + "emmetIncludeLanguages": "Ative abreviações do Emmet em idiomas que não são suportados por padrão. Adicione um mapeamento aqui entre o idioma e a linguagem suportada emmet.\nPor exemplo: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "Variáveis a serem usadas em trechos de código Emmet", "emmetTriggerExpansionOnTab": "Quando habilitado, abreviações Emmet são expandidas ao pressionar TAB.", "emmetPreferences": "Preferências usadas para modificar o comportamento de algumas ações e resolvedores de Emmet.", @@ -59,5 +59,7 @@ "emmetPreferencesCssWebkitProperties": "Propriedades CSS separadas por vírgula que recebem o prefixo vendor 'webkit' quando utilizado em abreviações do Emmet que iniciam com `-`. Defina como string vazia para sempre evitar o prefixo 'webkit'.", "emmetPreferencesCssMozProperties": "Propriedades CSS separadas por vírgula que recebem o prefixo vendor 'moz' quando utilizado em abreviações do Emmet que iniciam com `-`. Defina como string vazia para sempre evitar o prefixo 'moz'.", "emmetPreferencesCssOProperties": "Propriedades CSS separadas por vírgula que recebem o prefixo vendor 'o' quando utilizado em abreviações do Emmet que iniciam com `-`. Defina como string vazia para sempre evitar o prefixo 'o'.", - "emmetPreferencesCssMsProperties": "Propriedades CSS separadas por vírgula que recebem o prefixo vendor 'ms' quando utilizado em abreviações do Emmet que iniciam com `-`. Defina como string vazia para sempre evitar o prefixo 'ms'." + "emmetPreferencesCssMsProperties": "Propriedades CSS separadas por vírgula que recebem o prefixo vendor 'ms' quando utilizado em abreviações do Emmet que iniciam com `-`. Defina como string vazia para sempre evitar o prefixo 'ms'.", + "emmetPreferencesCssFuzzySearchMinScore": "A pontuação mínima (de 0 a 1) que a abreviação difusa deve alcançar. Os valores mais baixos podem produzir muitas correspondências falso-positivas, valores mais elevados podem reduzir possíveis correspondências.\n", + "emmetOptimizeStylesheetParsing": "Quando definido como false, o arquivo inteiro é analisado para determinar se a posição atual é válida para expandir as abreviações Emmet. Quando definido como true, somente o conteúdo em torno da posição atual em arquivos css / scss / less é analisado." } \ No newline at end of file diff --git a/i18n/ptb/extensions/extension-editing/package.i18n.json b/i18n/ptb/extensions/extension-editing/package.i18n.json index f7701436c08..5be926c7d74 100644 --- a/i18n/ptb/extensions/extension-editing/package.i18n.json +++ b/i18n/ptb/extensions/extension-editing/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Edição de Arquivo de Pacote" + "displayName": "Edição de Arquivo de Pacote", + "description": "Fornece IntelliSense para os pontos de extensão de código do VS Code e capacidade de linting em arquivos package.json." } \ No newline at end of file diff --git a/i18n/ptb/extensions/fsharp/package.i18n.json b/i18n/ptb/extensions/fsharp/package.i18n.json index a6752d374cf..3d6dee1adb0 100644 --- a/i18n/ptb/extensions/fsharp/package.i18n.json +++ b/i18n/ptb/extensions/fsharp/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem F#" + "displayName": "Noções Básicas Sobre a Linguagem F#", + "description": "Fornece trechos de código, realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos F#." } \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/commands.i18n.json b/i18n/ptb/extensions/git/out/commands.i18n.json index afacddeaf5a..64a2c5576d9 100644 --- a/i18n/ptb/extensions/git/out/commands.i18n.json +++ b/i18n/ptb/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "OK", "push with tags success": "Envio de rótulos finalizado com sucesso.", "pick remote": "Pegue um remoto para publicar o ramo '{0}':", + "sync is unpredictable": "Esta ação vai empurrar e puxar commits de e para '{0}/{1}'.", "never again": "OK, Não Mostrar Novamente", "no remotes to publish": "Seu repositório não possui remotos configurados para publicação.", "no changes stash": "Não há nenhuma mudança para esconder.", diff --git a/i18n/ptb/extensions/git/package.i18n.json b/i18n/ptb/extensions/git/package.i18n.json index d293df15a4e..6ab84324adb 100644 --- a/i18n/ptb/extensions/git/package.i18n.json +++ b/i18n/ptb/extensions/git/package.i18n.json @@ -77,6 +77,7 @@ "config.showInlineOpenFileAction": "Controla se deve mostrar uma ação Abrir Arquivo em linha na visualização de alterações do Git.", "config.inputValidation": "Controla quando exibir validação do campo de mensagem do commit.", "config.detectSubmodules": "Controla se deve detectar automaticamente os sub-módulos do git.", + "config.detectSubmodulesLimit": "Controla o limite de sub-módulos git detectados.", "colors.modified": "Cor para recursos modificados.", "colors.deleted": "Cor para recursos excluídos.", "colors.untracked": "Cor para recursos não controlados.", diff --git a/i18n/ptb/extensions/go/package.i18n.json b/i18n/ptb/extensions/go/package.i18n.json index 3425e376a6d..203f97d1603 100644 --- a/i18n/ptb/extensions/go/package.i18n.json +++ b/i18n/ptb/extensions/go/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Go" + "displayName": "Noções Básicas Sobre a Linguagem Go", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Go." } \ No newline at end of file diff --git a/i18n/ptb/extensions/groovy/package.i18n.json b/i18n/ptb/extensions/groovy/package.i18n.json index 875bfb0802e..abdb1ff0880 100644 --- a/i18n/ptb/extensions/groovy/package.i18n.json +++ b/i18n/ptb/extensions/groovy/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Groovy" + "displayName": "Noções Básicas Sobre a Linguagem Groovy", + "description": "Fornece trechos de código, realce de sintaxe e correspondência de colchetes em arquivos Groovy." } \ No newline at end of file diff --git a/i18n/ptb/extensions/handlebars/package.i18n.json b/i18n/ptb/extensions/handlebars/package.i18n.json index 7fa3a76c709..2eb0ec888d5 100644 --- a/i18n/ptb/extensions/handlebars/package.i18n.json +++ b/i18n/ptb/extensions/handlebars/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Handlebars" + "displayName": "Noções Básicas Sobre a Linguagem Handlebars", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Handlebars." } \ No newline at end of file diff --git a/i18n/ptb/extensions/hlsl/package.i18n.json b/i18n/ptb/extensions/hlsl/package.i18n.json index 4e272ff2dd7..f00e509b8c7 100644 --- a/i18n/ptb/extensions/hlsl/package.i18n.json +++ b/i18n/ptb/extensions/hlsl/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem HLSL" + "displayName": "Noções Básicas Sobre a Linguagem HLSL", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos HLSL." } \ No newline at end of file diff --git a/i18n/ptb/extensions/html-language-features/package.i18n.json b/i18n/ptb/extensions/html-language-features/package.i18n.json index cbbf188d7c1..a434dbe0f11 100644 --- a/i18n/ptb/extensions/html-language-features/package.i18n.json +++ b/i18n/ptb/extensions/html-language-features/package.i18n.json @@ -8,6 +8,7 @@ ], "displayName": "Recursos da Linguagem HTML", "description": "Fornece suporte de linguagem rico para arquivos HTML, Razor e Handlebar.", + "html.format.enable.desc": "Ativar/desativar o formatador HTML padrão", "html.format.wrapLineLength.desc": "Quantidade máxima de caracteres por linha (0 = desativar).", "html.format.unformatted.desc": "Lista de tags, separados por vírgula, que não deveria ser reformatada. o padrão é 'nulo' para todas as tags listadas em https://www.w3.org/TR/html5/dom.html#phrasing-content.", "html.format.contentUnformatted.desc": "Lista de tags, separada por vírgula, onde o conteúdo não deve ser reformatado. o padrão é 'nulo' para a tag 'pré'.", diff --git a/i18n/ptb/extensions/html/package.i18n.json b/i18n/ptb/extensions/html/package.i18n.json index 35229bd6699..53d3b893dda 100644 --- a/i18n/ptb/extensions/html/package.i18n.json +++ b/i18n/ptb/extensions/html/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Noções Básicas da Linguagem HTML", + "description": "Fornece realce de sintaxe, correspondência de colchetes e trechos em arquivos HTML." } \ No newline at end of file diff --git a/i18n/ptb/extensions/ini/package.i18n.json b/i18n/ptb/extensions/ini/package.i18n.json index d3c9a58f2d7..f7e7bd037dd 100644 --- a/i18n/ptb/extensions/ini/package.i18n.json +++ b/i18n/ptb/extensions/ini/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Ini" + "displayName": "Noções Básicas Sobre a Linguagem Ini", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Ini." } \ No newline at end of file diff --git a/i18n/ptb/extensions/java/package.i18n.json b/i18n/ptb/extensions/java/package.i18n.json index 446ed1b1df3..207e95a5b2f 100644 --- a/i18n/ptb/extensions/java/package.i18n.json +++ b/i18n/ptb/extensions/java/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Java" + "displayName": "Noções Básicas Sobre a Linguagem Java", + "description": "Fornece trechos de código, realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos Java." } \ No newline at end of file diff --git a/i18n/ptb/extensions/javascript/package.i18n.json b/i18n/ptb/extensions/javascript/package.i18n.json index 455ec8a3376..582a7ee0bac 100644 --- a/i18n/ptb/extensions/javascript/package.i18n.json +++ b/i18n/ptb/extensions/javascript/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem JavaScript" + "displayName": "Noções Básicas Sobre a Linguagem JavaScript", + "description": "Fornece realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos JavaScript." } \ No newline at end of file diff --git a/i18n/ptb/extensions/json/package.i18n.json b/i18n/ptb/extensions/json/package.i18n.json index 35229bd6699..4f2081eef5f 100644 --- a/i18n/ptb/extensions/json/package.i18n.json +++ b/i18n/ptb/extensions/json/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Noções Básicas da Linguagem JSON", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos JSON." } \ No newline at end of file diff --git a/i18n/ptb/extensions/less/package.i18n.json b/i18n/ptb/extensions/less/package.i18n.json index 498dbc3c941..f83a843880a 100644 --- a/i18n/ptb/extensions/less/package.i18n.json +++ b/i18n/ptb/extensions/less/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Less" + "displayName": "Noções Básicas Sobre a Linguagem Less", + "description": "Fornece realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos Less." } \ No newline at end of file diff --git a/i18n/ptb/extensions/log/package.i18n.json b/i18n/ptb/extensions/log/package.i18n.json index 257db2e6372..0f7313e5de8 100644 --- a/i18n/ptb/extensions/log/package.i18n.json +++ b/i18n/ptb/extensions/log/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Log" + "displayName": "Log", + "description": "Fornece realce de sintaxe para arquivos com extensão .log." } \ No newline at end of file diff --git a/i18n/ptb/extensions/lua/package.i18n.json b/i18n/ptb/extensions/lua/package.i18n.json index c1a61a7ed26..a85199917e7 100644 --- a/i18n/ptb/extensions/lua/package.i18n.json +++ b/i18n/ptb/extensions/lua/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Lua" + "displayName": "Noções Básicas Sobre a Linguagem Lua", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Lua." } \ No newline at end of file diff --git a/i18n/ptb/extensions/make/package.i18n.json b/i18n/ptb/extensions/make/package.i18n.json index 9302615da23..52ddd461b8d 100644 --- a/i18n/ptb/extensions/make/package.i18n.json +++ b/i18n/ptb/extensions/make/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Make" + "displayName": "Noções Básicas Sobre a Linguagem Make", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Make." } \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown-basics/package.i18n.json b/i18n/ptb/extensions/markdown-basics/package.i18n.json index 1f82410c626..4295e53ce24 100644 --- a/i18n/ptb/extensions/markdown-basics/package.i18n.json +++ b/i18n/ptb/extensions/markdown-basics/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Markdown" + "displayName": "Noções Básicas Sobre a Linguagem Markdown", + "description": "Fornece trechos de código e destaque de sintaxe para Markdown." } \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown-language-features/out/features/previewContentProvider.i18n.json b/i18n/ptb/extensions/markdown-language-features/out/features/previewContentProvider.i18n.json index 92d5546b323..3d1337eab3e 100644 --- a/i18n/ptb/extensions/markdown-language-features/out/features/previewContentProvider.i18n.json +++ b/i18n/ptb/extensions/markdown-language-features/out/features/previewContentProvider.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "preview.securityMessage.text": "Parte do conteúdo foi desativada neste documento", "preview.securityMessage.title": "Conteúdo potencialmente inseguro foi desativado na visualização de remarcação. Altere a configuração de segurança de visualização do Markdown para permitir conteúdo inseguro ou habilitar scripts", "preview.securityMessage.label": "Conteúdo do Aviso de Segurança Desativado" } \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown-language-features/out/security.i18n.json b/i18n/ptb/extensions/markdown-language-features/out/security.i18n.json index e8aa71537e2..ead307bcb9d 100644 --- a/i18n/ptb/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/ptb/extensions/markdown-language-features/out/security.i18n.json @@ -6,11 +6,17 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "strict.title": "Estrito", "strict.description": "Somente carregar conteúdo seguro", + "insecureLocalContent.title": "Permitir conteúdo local inseguro", + "insecureLocalContent.description": "Permitir carregar conteúdo por http servida por localhost", "insecureContent.title": "Permitir conteúdo inseguro", + "insecureContent.description": "Permitir o carregamento de conteúdo via http", "disable.title": "Desabilitar", "disable.description": "Permitir a execução de conteúdo e scripts. Não recomendado", "moreInfo.title": "Mais informações", "enableSecurityWarning.title": "Habilitar a visualização de avisos de segurança neste espaço de trabalho", - "disableSecurityWarning.title": "Desabilitar a visualização de avisos de segurança neste espaço de trabalho" + "disableSecurityWarning.title": "Desabilitar a visualização de avisos de segurança neste espaço de trabalho", + "toggleSecurityWarning.description": "Não afeta o nível de segurança do conteúdo", + "preview.showPreviewSecuritySelector.title": "Selecione as configurações de segurança para pré-visualização de Markdown nesta área de trabalho." } \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown-language-features/package.i18n.json b/i18n/ptb/extensions/markdown-language-features/package.i18n.json index 30cdb8f363d..2a40b868546 100644 --- a/i18n/ptb/extensions/markdown-language-features/package.i18n.json +++ b/i18n/ptb/extensions/markdown-language-features/package.i18n.json @@ -17,10 +17,16 @@ "markdown.preview.markEditorSelection.desc": "Marca a seleção atual do editor na pré-visualização de markdown.", "markdown.preview.scrollEditorWithPreview.desc": "Quando uma pré-visualização de markdown é rolada, atualiza a exibição do editor.", "markdown.preview.scrollPreviewWithEditor.desc": "Quando um editor de markdown é rolado, atualiza a exibição da pré-visualização.", + "markdown.preview.scrollPreviewWithEditorSelection.desc": "[Descontinuada] Rola a pré-visualização Markdown para mostrar a linha atualmente selecionada no editor.", + "markdown.preview.scrollPreviewWithEditorSelection.deprecationMessage": "Esta configuração foi substituída por 'markdown.preview.scrollPreviewWithEditor' e já não tem qualquer efeito.", "markdown.preview.title": "Abrir a visualização", "markdown.previewFrontMatter.dec": "Configura como o frontispicio YAML frente questão devem ser processado na pré-visualização de markdown. 'hide' remove o frontispicio. Caso contrário, o frontispicio é tratado como conteúdo de markdown.", "markdown.previewSide.title": "Abre pré-visualização ao lado", + "markdown.showLockedPreviewToSide.title": "Abrir pré-visualização travada ao lado", "markdown.showSource.title": "Exibir Código-Fonte", "markdown.styles.dec": "Uma lista de URLs ou caminhos locais para folhas de estilo CSS para usar na pré-visualização do markdown. Caminhos relativos são interpretados em relação à pasta aberta no explorer. Se não houver nenhuma pasta aberta, eles são interpretados em relação ao local do arquivo markdown. Todos os ' \\' precisam ser escritos como ' \\ \\ '.", - "markdown.trace.desc": "Habilitar log de depuração para a extensão do markdown." + "markdown.showPreviewSecuritySelector.title": "Alterar configurações de segurança da pré-visualização", + "markdown.trace.desc": "Habilitar log de depuração para a extensão do markdown.", + "markdown.preview.refresh.title": "Atualizar pré-visualização", + "markdown.preview.toggleLock.title": "Alternar Bloqueio de Visualização" } \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/package.i18n.json b/i18n/ptb/extensions/merge-conflict/package.i18n.json index 1aa2e946156..7c3c0804258 100644 --- a/i18n/ptb/extensions/merge-conflict/package.i18n.json +++ b/i18n/ptb/extensions/merge-conflict/package.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "displayName": "Mesclar conflitos", + "description": "Realce e comandos para mesclagem de conflitos inline.", "command.category": "Conflito de Mesclagem", "command.accept.all-current": "Aceitar Todos os Atuais", "command.accept.all-incoming": "Aceitar todas entradas", diff --git a/i18n/ptb/extensions/objective-c/package.i18n.json b/i18n/ptb/extensions/objective-c/package.i18n.json index 6c21271685a..be2418c54c4 100644 --- a/i18n/ptb/extensions/objective-c/package.i18n.json +++ b/i18n/ptb/extensions/objective-c/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Objective-C" + "displayName": "Noções Básicas Sobre a Linguagem Objective-C", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Objective-C." } \ No newline at end of file diff --git a/i18n/ptb/extensions/perl/package.i18n.json b/i18n/ptb/extensions/perl/package.i18n.json index c45067607b6..5b15ff68e47 100644 --- a/i18n/ptb/extensions/perl/package.i18n.json +++ b/i18n/ptb/extensions/perl/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Perl" + "displayName": "Noções Básicas Sobre a Linguagem Perl", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Perl." } \ No newline at end of file diff --git a/i18n/ptb/extensions/php-language-features/package.i18n.json b/i18n/ptb/extensions/php-language-features/package.i18n.json index a88cd375f35..7779248205c 100644 --- a/i18n/ptb/extensions/php-language-features/package.i18n.json +++ b/i18n/ptb/extensions/php-language-features/package.i18n.json @@ -12,5 +12,7 @@ "configuration.validate.run": "Se o linter é executado ao salvar ou ao digitar.", "configuration.title": "PHP", "commands.categroy.php": "PHP", - "command.untrustValidationExecutable": "Desabilita a validação de executável do PHP (definida como configuração do espaço de trabalho)" + "command.untrustValidationExecutable": "Desabilita a validação de executável do PHP (definida como configuração do espaço de trabalho)", + "displayName": "Recursos da linguagem PHP", + "description": "Fornece suporte de linguagem rica para arquivos PHP." } \ No newline at end of file diff --git a/i18n/ptb/extensions/php/package.i18n.json b/i18n/ptb/extensions/php/package.i18n.json index 324291e15f7..5ebf52a77aa 100644 --- a/i18n/ptb/extensions/php/package.i18n.json +++ b/i18n/ptb/extensions/php/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Recursos da linguagem PHP" + "displayName": "Noções básicas de linguagem PHP", + "description": "Fornece realce de sintaxe e suporte a correspondência de colchetes para arquivos PHP." } \ No newline at end of file diff --git a/i18n/ptb/extensions/powershell/package.i18n.json b/i18n/ptb/extensions/powershell/package.i18n.json index 8d1fc47c67e..c8d4a44ac0b 100644 --- a/i18n/ptb/extensions/powershell/package.i18n.json +++ b/i18n/ptb/extensions/powershell/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Powershell" + "displayName": "Noções Básicas Sobre a Linguagem Powershell", + "description": "Fornece realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos Powershell." } \ No newline at end of file diff --git a/i18n/ptb/extensions/pug/package.i18n.json b/i18n/ptb/extensions/pug/package.i18n.json index 9898328e3cb..a4a9f443d88 100644 --- a/i18n/ptb/extensions/pug/package.i18n.json +++ b/i18n/ptb/extensions/pug/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Pug" + "displayName": "Noções Básicas Sobre a Linguagem Pug", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Pug." } \ No newline at end of file diff --git a/i18n/ptb/extensions/python/package.i18n.json b/i18n/ptb/extensions/python/package.i18n.json index 6f1ce258965..ee8ff1f709e 100644 --- a/i18n/ptb/extensions/python/package.i18n.json +++ b/i18n/ptb/extensions/python/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Python" + "displayName": "Noções Básicas Sobre a Linguagem Python", + "description": "Fornece realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos Python." } \ No newline at end of file diff --git a/i18n/ptb/extensions/r/package.i18n.json b/i18n/ptb/extensions/r/package.i18n.json index b8dd971968a..d6beac66e30 100644 --- a/i18n/ptb/extensions/r/package.i18n.json +++ b/i18n/ptb/extensions/r/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem R" + "displayName": "Noções Básicas Sobre a Linguagem R", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos R." } \ No newline at end of file diff --git a/i18n/ptb/extensions/razor/package.i18n.json b/i18n/ptb/extensions/razor/package.i18n.json index e852ddd68a9..c79997f74c3 100644 --- a/i18n/ptb/extensions/razor/package.i18n.json +++ b/i18n/ptb/extensions/razor/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Razor" + "displayName": "Noções Básicas Sobre a Linguagem Razor", + "description": "Fornece realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos Razor." } \ No newline at end of file diff --git a/i18n/ptb/extensions/ruby/package.i18n.json b/i18n/ptb/extensions/ruby/package.i18n.json index 96c639a55b4..11ef2cb215a 100644 --- a/i18n/ptb/extensions/ruby/package.i18n.json +++ b/i18n/ptb/extensions/ruby/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Ruby" + "displayName": "Noções Básicas Sobre a Linguagem Ruby", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Ruby." } \ No newline at end of file diff --git a/i18n/ptb/extensions/rust/package.i18n.json b/i18n/ptb/extensions/rust/package.i18n.json index 423ab816de0..7812f5b58c1 100644 --- a/i18n/ptb/extensions/rust/package.i18n.json +++ b/i18n/ptb/extensions/rust/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Rust" + "displayName": "Noções Básicas Sobre a Linguagem Rust", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Rust." } \ No newline at end of file diff --git a/i18n/ptb/extensions/scss/package.i18n.json b/i18n/ptb/extensions/scss/package.i18n.json index 2007a85cbe3..1f732d38a0a 100644 --- a/i18n/ptb/extensions/scss/package.i18n.json +++ b/i18n/ptb/extensions/scss/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem SCSS" + "displayName": "Noções Básicas Sobre a Linguagem SCSS", + "description": "Fornece realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos SCSS." } \ No newline at end of file diff --git a/i18n/ptb/extensions/shaderlab/package.i18n.json b/i18n/ptb/extensions/shaderlab/package.i18n.json index f7ded2dce77..6138101920b 100644 --- a/i18n/ptb/extensions/shaderlab/package.i18n.json +++ b/i18n/ptb/extensions/shaderlab/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Shaderlab" + "displayName": "Noções Básicas Sobre a Linguagem Shaderlab", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos Shaderlab." } \ No newline at end of file diff --git a/i18n/ptb/extensions/shellscript/package.i18n.json b/i18n/ptb/extensions/shellscript/package.i18n.json index d8764c3903c..f52f15ed9de 100644 --- a/i18n/ptb/extensions/shellscript/package.i18n.json +++ b/i18n/ptb/extensions/shellscript/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Shell Script" + "displayName": "Noções Básicas Sobre a Linguagem Shell Script", + "description": "Fornece realce de sintaxe e correspondência de colchetes em arquivos de Script de Shell." } \ No newline at end of file diff --git a/i18n/ptb/extensions/sql/package.i18n.json b/i18n/ptb/extensions/sql/package.i18n.json index bb7822cba12..95abedb5aac 100644 --- a/i18n/ptb/extensions/sql/package.i18n.json +++ b/i18n/ptb/extensions/sql/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem SQL" + "displayName": "Noções Básicas Sobre a Linguagem SQL", + "description": "Fornece realce de sintaxe e correspondência de colchetes nos arquivos SQL." } \ No newline at end of file diff --git a/i18n/ptb/extensions/swift/package.i18n.json b/i18n/ptb/extensions/swift/package.i18n.json index 7ca859e9a6e..aa1efe8c491 100644 --- a/i18n/ptb/extensions/swift/package.i18n.json +++ b/i18n/ptb/extensions/swift/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Swift" + "displayName": "Noções Básicas Sobre a Linguagem Swift", + "description": "Fornece trechos de código, realce de sintaxe e correspondência de colchetes em arquivos Swift." } \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-basics/package.i18n.json b/i18n/ptb/extensions/typescript-basics/package.i18n.json index 0a1d2df7587..24615fd096d 100644 --- a/i18n/ptb/extensions/typescript-basics/package.i18n.json +++ b/i18n/ptb/extensions/typescript-basics/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas da Linguagem TypeScript" + "displayName": "Noções Básicas da Linguagem TypeScript", + "description": "Fornece trechos, realce de sintaxe, correspondência de colchetes e oclusão de código em arquivos TypeScript." } \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/commands.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..43bfcb4644a --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Favor abrir uma pasta no VS Code para usar um projeto TypeScript ou JavaScript", + "typescript.projectConfigUnsupportedFile": "Não foi possível determinar o projeto TypeScript ou JavaScript. Tipo de arquivo não suportado", + "typescript.projectConfigCouldNotGetInfo": "Não foi possível determinar o projeto TypeScript ou JavaScript", + "typescript.noTypeScriptProjectConfig": "O arquivo não é parte do projeto TypeScript. Clique [aqui]({0}) para mais informações.", + "typescript.noJavaScriptProjectConfig": "O arquivo não é parte do projeto JavaScript. Clique [aqui]({0}) para mais informações.", + "typescript.configureTsconfigQuickPick": "Configurar tsconfig.json", + "typescript.configureJsconfigQuickPick": "Configurar jsconfig.json" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..07ef27a5bcf --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Selecione uma ação de código para aplicar", + "acquiringTypingsLabel": "Adquirindo digitações...", + "acquiringTypingsDetail": "Adquirindo definições de digitações para o Intellisense.", + "autoImportLabel": "Importação automática de {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..eafca22f53d --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Habilita verificação semântica em um arquivo JavaScript. Deve estar no topo de um arquivo.", + "ts-nocheck": "Desabilita verificação semântica em um arquivo JavaScript. Deve estar no topo de um arquivo.", + "ts-ignore": "Suprime erros de @ts-check na próxima linha de um arquivo." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..c0ccafb6005 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 implementação", + "manyImplementationLabel": "{0} implementações", + "implementationsErrorLabel": "Não foi possível determinar implementações" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..0f22e0563e3 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "Comentário JSDoc" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..a0dd22d5e1e --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "Organizar as importações" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..96d00a06bb5 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (Reparar tudo no arquivo)" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..fd899d96208 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 referência", + "manyReferenceLabel": "{0} referências", + "referenceErrorLabel": "Não foi possível determinar as referências" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..083f9cdd4a2 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "compilar - {0}", + "buildAndWatchTscLabel": "monitorar - {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..18d31ac5959 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "O caminho {0} não aponta para uma instalação de tsserver válida. Voltando para a versão do TypeScript empacotada.", + "serverCouldNotBeStarted": "Servidor de linguagem TypeScript não pôde ser iniciado. Mensagem de erro é: {0}", + "typescript.openTsServerLog.notSupported": "Logging de TS Server requer TS TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "Logging de TS Server está desligado. Por favor configure 'typescript.tsserver.log' e reinicie o TS Server para habilitar o log", + "typescript.openTsServerLog.enableAndReloadOption": "Habilitar logging e reniciar TS server", + "typescript.openTsServerLog.noLogFile": "O TS Server não iniciou o logging.", + "openTsServerLog.openFileFailedFailed": "Não foi possível abrir o arquivo de log do TS Server", + "serverDiedAfterStart": "O serviço de linguagem TypeScript morreu 5 vezes depois que começou. O serviço não será reiniciado.", + "serverDiedReportIssue": "Reportar Problema", + "serverDied": "O serviço TypeScript morreu inesperadamente 5 vezes nos últimos 5 minutos." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..c723b32adb6 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "versão inválida" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..6cf4fd3d7e5 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas com muitos arquivos, como: {0}", + "hintExclude.generic": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas grandes com arquivos em que você não trabalha.", + "large.label": "Configurar exclusões", + "hintExclude.tooltip": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas grandes com arquivos em que você não trabalha." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..26560f00bfe --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Buscando dados para melhor IntelliSense do TypeScript", + "typesInstallerInitializationFailed.title": "Não foi possível instalar os arquivos de tipagem para recursos da linguagem JavaScript. Por favor, certifique-se que o NPM está instalado ou configure 'typescript.npm' em suas configurações de usuário. Clique [aqui]({0}) para mais informações.", + "typesInstallerInitializationFailed.doNotCheckAgain": "Não mostrar novamente" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..8f3cd072f30 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "Use a versão do VS Code", + "useWorkspaceVersionOption": "Use a versão de área de trabalho", + "learnMore": "Saiba Mais", + "selectTsVersion": "Selecione a versão do TypeScript usada para os recursos de linguagem JavaScript e TypeScript" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/ptb/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..ba136d68e8b --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "Não foi possível carregar a versão do TypeScript neste caminho", + "noBundledServerFound": "Tsserver do VS Code foi eliminado por outro aplicativo como uma ferramenta de detecção de vírus com um comportamento inadequado. Por favor reinstale o VS Code." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript-language-features/package.i18n.json b/i18n/ptb/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..97dd0af87e4 --- /dev/null +++ b/i18n/ptb/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,64 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Recursos da Linguagem TypeScript e JavaScript", + "description": "Fornece suporte à linguagem rica pra JavaScript e TypeScript.", + "typescript.reloadProjects.title": "Recarregar Projeto", + "javascript.reloadProjects.title": "Recarregar Projeto", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Funções completas com a assinatura do parâmetro.", + "typescript.tsdk.desc": "Especifica o caminho da pasta que contém os arquivos tsserver e lib*.d.ts para usar.", + "typescript.disableAutomaticTypeAcquisition": "Desabilita a aquisição automática de tipo. Requer TypeScript > = 2.0.6.", + "typescript.tsserver.log": "Habilita o log do servidor TS para um arquivo. Este log pode ser usado para diagnosticar problemas do servidor de TS. O log pode conter caminhos de arquivo, código-fonte e outras informações potencialmente confidenciais do seu projeto.", + "typescript.tsserver.pluginPaths": "Caminhos adicionais para descobrir os plugins do serviço de linguagem TypeScript. Requer TypeScript > = 2.3.0.", + "typescript.tsserver.pluginPaths.item": "Pode ser um caminho absoluto ou relativo. Caminho relativo será resolvido a partir da pasta da área de trabalho.", + "typescript.tsserver.trace": "Habilita o rastreamento de mensagens enviadas para o servidor de TS. Este rastreamento pode ser usado para diagnosticar problemas do servidor de TS. O rastreamento pode conter caminhos de arquivo, código-fonte e outras informações potencialmente confidenciais do seu projeto.", + "typescript.validate.enable": "Habilita/Desabilita a validação TypeScript.", + "typescript.format.enable": "Habilita/Desabilita o formatador padrão TypeScript.", + "javascript.format.enable": "Habilita/Desabilita o formatador padrão JavaScript.", + "format.insertSpaceAfterCommaDelimiter": "Define o tratamento de espaços após um delimitador vírgula.", + "format.insertSpaceAfterConstructor": "Define a manipulação de espaços após a palavra-chave do construtor. Requer TypeScript > = 2.3.0.", + "format.insertSpaceAfterSemicolonInForStatements": "Define o tratamento de espaços após um ponto e vírgula para um comando.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Define o tratamento de espaços após um operador binário.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Define o tratamento de espaços após palavras-chave em um comando de controle de fluxo.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Define o tratamento de espaços após uma palavra-chave de função para funções anônimas.", + "format.insertSpaceBeforeFunctionParenthesis": "Define a manipulação de espaços antes de parênteses do argumento de função. Requer TypeScript > = 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Define a manipulação de espaços após abrir e antes de fechar parênteses não vazios.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Define a manipulação de espaços após abrir e antes de fechar colchetes não vazios.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de cadeias de caracteres de modelos. Requer TypeScript >= 2.0.6.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de expressões JSX. Requer TypeScript >= 2.0.6.", + "format.insertSpaceAfterTypeAssertion": "Define a manipulação de espaços após asserções de tipo em TypeScript. Requer TypeScript >= 2,4.", + "format.placeOpenBraceOnNewLineForFunctions": "Define-se uma chave de abertura é colocada em uma nova linha para funções ou não.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Define-se uma chave de abertura é colocada em uma nova linha para blocos de controle ou não.", + "javascript.validate.enable": "Habilitar/Desabilitar validação JavaScript.", + "typescript.goToProjectConfig.title": "Ir para a Configuração do Projeto", + "javascript.goToProjectConfig.title": "Ir para a Configuração do Projeto", + "javascript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos JavaScript.", + "typescript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos TypeScript. Requer TypeScript > = 2.0.6.", + "typescript.implementationsCodeLens.enabled": "Habilitar/desabilitar implementações CodeLens. Requer TypeScript > = 2.0.6.", + "typescript.openTsServerLog.title": "Abrir arquivo de log do servidor TS", + "typescript.restartTsServer": "Reiniciar o servidor TS", + "typescript.selectTypeScriptVersion.title": "Selecionar a versão do JavaScript", + "typescript.reportStyleChecksAsWarnings": "Reportar verificações de estilo como avisos", + "jsDocCompletion.enabled": "Habilitar/Desabilitar comentários JSDoc automáticos.", + "javascript.implicitProjectConfig.checkJs": "Habilitar/desabilitar verificação semântica de arquivos JavaScript. Os arquivos existentes jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript > = 2.3.1.", + "typescript.npm": "Especifica o caminho para o executável do NPM usado para Aquisição de Tipo Automático. Requer TypeScript > = 2.3.4.", + "typescript.check.npmIsInstalled": "Verificar se o NPM está instalado para aquisição automática de tipo.", + "javascript.nameSuggestions": "Habilitar/desabilitar incluindo nomes exclusivos do arquivo nas listas de sugestão de JavaScript.", + "typescript.tsc.autoDetect": "Controla a auto deteção das tarefas de tsc. 'off' desativa esse recurso. 'build' só cria tarefas de compilação de execução única. 'watch' cria apenas tarefas de compilação e monitoramento. 'on' cria ambas as tarefas de compilar e monitoramento. Padrão é 'on'.", + "typescript.problemMatchers.tsc.label": "Problemas TypeScript", + "typescript.problemMatchers.tscWatch.label": "Problemas TypeScript (modo observação)", + "typescript.quickSuggestionsForPaths": "Ativar/desativar sugestões rápidas quando estiver digitando um caminho de importação.", + "typescript.locale": "Define a localidade usada para relatar erros TypeScript. Requer TypeScript > = 2.6.0. Padrão 'null' usa a localidade do VS Code para erros TypeScript.", + "javascript.implicitProjectConfig.experimentalDecorators": "Ativar/desativar 'experimentalDecorators' para arquivos JavaScript que não fazem parte de um projeto. Os arquivos existentes de jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript >= 2.3.1.", + "typescript.autoImportSuggestions.enabled": "Ativar/desativar sugestões de importação automática. Requer TypeScript >= 2.6.1", + "typescript.experimental.syntaxFolding": "Habilita/Desabilita a sintaxe dos marcadores de pastas ativas.", + "taskDefinition.tsconfig.description": "O arquivo tsconfig que define a compilação do TS.", + "javascript.suggestionActions.enabled": "Ativar/desativar o diagnóstico de sugestões para arquivos JavaScript no editor. Requer TypeScript > = 2.8", + "typescript.suggestionActions.enabled": "Ativar/desativar o diagnóstico de sugestões para arquivos TypeScript no editor. Requer TypeScript > = 2.8." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/vb/package.i18n.json b/i18n/ptb/extensions/vb/package.i18n.json index 4ce55e93689..eaf6b99fa56 100644 --- a/i18n/ptb/extensions/vb/package.i18n.json +++ b/i18n/ptb/extensions/vb/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem Visual Basic" + "displayName": "Noções Básicas Sobre a Linguagem Visual Basic", + "description": "Fornece trechos, destaque de sintaxe, correspondência de colchetes e oclusão em arquivos do Visual Basic." } \ No newline at end of file diff --git a/i18n/ptb/extensions/xml/package.i18n.json b/i18n/ptb/extensions/xml/package.i18n.json index c021fd6f6b1..a5b08901983 100644 --- a/i18n/ptb/extensions/xml/package.i18n.json +++ b/i18n/ptb/extensions/xml/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem XML" + "displayName": "Noções Básicas Sobre a Linguagem XML", + "description": "Fornece realce de sintaxe e suporte a correspondência de colchetes em arquivos XML." } \ No newline at end of file diff --git a/i18n/ptb/extensions/yaml/package.i18n.json b/i18n/ptb/extensions/yaml/package.i18n.json index 8b586bfe33c..4a6a3b45e48 100644 --- a/i18n/ptb/extensions/yaml/package.i18n.json +++ b/i18n/ptb/extensions/yaml/package.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Noções Básicas Sobre a Linguagem YAML" + "displayName": "Noções Básicas Sobre a Linguagem YAML", + "description": "Fornece realce de sintaxe e suporte a correspondência de colchetes em arquivos YAML." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/processes.i18n.json b/i18n/ptb/src/vs/base/node/processes.i18n.json index 19c9978965a..35229bd6699 100644 --- a/i18n/ptb/src/vs/base/node/processes.i18n.json +++ b/i18n/ptb/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "Não é possível executar um comando shell em uma unidade UNC." + ] } \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 57e561ae158..ff2a8afaccd 100644 --- a/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -8,10 +8,11 @@ ], "previewOnGitHub": "Pré-visualizar no GitHub", "loadingData": "Carregando dados...", + "rateLimited": "Limite de consulta do GitHub excedido. Por favor, espere.", "similarIssues": "Problemas semelhantes", "open": "Abrir", "closed": "Fechado", - "noResults": "Nenhum resultado encontrado", + "noSimilarIssues": "Nenhum problema semelhante encontrado", "settingsSearchIssue": "Problema na Pesquisa de Configurações", "bugReporter": "Relatório de Bug", "featureRequest": "Solicitação de Recurso", diff --git a/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 9dcb83270fb..779dbc700cc 100644 --- a/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/ptb/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,12 @@ ], "completeInEnglish": "Por favor, preencha o formulário em inglês.", "issueTypeLabel": "Isso é um", + "issueSourceLabel": "Arquivo na", + "vscode": "Visual Studio Code", + "extension": "Uma extensão", + "disableExtensionsLabelText": "Tente reproduzir o problema depois de {0}. Se o problema só se reproduz quando as extensões são ativas, provavelmente é um problema com uma extensão.", + "disableExtensions": "desabilitando todas as extensões e recarregando a janela", + "chooseExtension": "Extensão", "issueTitleLabel": "Título", "issueTitleRequired": "Por favor, digite um título.", "titleLengthValidation": "O título é muito longo.", @@ -18,13 +24,6 @@ "extensions": "Minhas extensões", "searchedExtensions": "Extensões Pesquisadas", "settingsSearchDetails": "Detalhes da Pesquisa de Configurações", - "tryDisablingExtensions": "O problema é reproduzível quando as extensões são desabilitadas?", - "yes": "Sim", - "no": "Não", - "disableExtensionsLabelText": "Tente reproduzir o problema depois de {0}.", - "disableExtensions": "desabilitando todas as extensões e recarregando a janela", - "showRunningExtensionsLabelText": "Se você suspeita que isso seja um problema de extensão, {0} para reportar o problema com a extensão.", - "showRunningExtensions": "ver todas as extensões em execução", "details": "Por favor informe detalhes.", "loadingData": "Carregando dados..." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..8f468bf0efc --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,15 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "cpu": "% DE CPU", + "memory": "Memória (MB)", + "pid": "PID", + "name": "Nome", + "killProcess": "Matar processo", + "forceKillProcess": "Matar processo a força" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json index 19bc2c801cd..68f544d5457 100644 --- a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json @@ -161,6 +161,7 @@ "mMergeAllWindows": "Mesclar todas as janelas", "miToggleDevTools": "&&Alternar Ferramentas do Desenvolvedor", "miAccessibilityOptions": "&&Opções de Acessibilidade", + "miOpenProcessExplorerer": "Abrir o &&Process Explorer", "miReportIssue": "Reportar &&Problema", "miWelcome": "&&Bem-vindo", "miInteractivePlayground": "Playground &&Interativo", diff --git a/i18n/ptb/src/vs/code/electron-main/windows.i18n.json b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json index a6234f91276..25a098f0535 100644 --- a/i18n/ptb/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json @@ -8,7 +8,7 @@ ], "ok": "OK", "pathNotExistTitle": "O caminho não existe", - "pathNotExistDetail": "O caminho '{0}' não parece mais existir no disco.", + "pathNotExistDetail": "Aparentemente o caminho {0} não existe mais no disco.", "reopen": "&&Reabrir", "wait": "&&Continuar Aguardando", "close": "&&Fechar", diff --git a/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json index de20d2cf5b9..fd79f520ec4 100644 --- a/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/ptb/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Fechar", - "header": "Diferença {0} de {1}: original {2}, {3} linhas, modificado {4}, {5} linhas", "blankLine": "branco", "equalLine": "original {0}, modificados {1}: {2}", "insertLine": "+ modificado {0}: {1}", diff --git a/i18n/ptb/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/ptb/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json index d31266adb34..0b3fe531920 100644 --- a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -46,6 +46,7 @@ "multiCursorModifier.ctrlCmd": "Mapeia para 'Control' no Windows e Linux e para 'Command' no macOS.", "multiCursorModifier.alt": "Mapeia para 'Alt' em Windows e Linux e para 'Option' em macOS.", "multiCursorModifier": "O modificador a ser usado para adicionar vários cursores com o mouse. `ctrlCmd` mapeia para 'Control' no Windows e Linux e para 'Command' no macOS. Os gestos do mouse Ir para definição e Abrir Link irão adaptar-se de forma que eles não entrem em conflito com o modificador multicursor.", + "multiCursorMergeOverlapping": "Mesclar vários cursores quando eles estão sobrepostos.", "quickSuggestions.strings": "Habilitar sugestões rápidas dentro de strings.", "quickSuggestions.comments": "Habilitar sugestões rápidas dentro de comentários.", "quickSuggestions.other": "Habilitar sugestões rápidas fora de strings e comentários.", @@ -88,6 +89,9 @@ "renderLineHighlight": "Controla como o editor deve renderizar a linha atual, as possibilidades são 'none', 'gutter', 'line' e 'all'.", "codeLens": "Controla se o editor exibirá a lente de códigos.", "folding": "Controla se o editor tem codigo colapsível hablitado", + "foldingStrategyAuto": "Se disponível, use uma estratégia de dobramento específica de idioma, caso contrário, recua para a estratégia baseada na indentação.", + "foldingStrategyIndentation": "Sempre use a estratégia de dobragem baseada no indentação ", + "foldingStrategy": "Controla a maneira como os intervalos de dobra são calculados. As opções 'auto' usam uma estratégia de dobra específica de idioma, se disponível. 'indentação' força o uso da estratégia de dobragem baseada na indentação.", "showFoldingControls": "Controla se os controles de desdobramento na divisão são ocultas automaticamente.", "matchBrackets": "Realça colchetes correspondente quando um deles estiver selecionado.", "glyphMargin": "Controla se o editor deve renderizar a margem vertical de ícones. A margem vertical de ícones é usada primordialmente na depuração", @@ -105,5 +109,7 @@ "selectionClipboard": "Controla se a área primária de transferência Linux deve ser suportada.", "sideBySide": "Controla se o editor de diff mostra as diff lado a lado ou inline.", "ignoreTrimWhitespace": "Controla se o editor de diff mostra alterações nos espaços iniciais ou finais como diferenças", + "largeFileSize": "Controles de limite de tamanho do arquivo em bytes além do qual são aplicadas as regras de otimização especial", + "largeFileLineCount": "Limite de tamanho de arquivo de controles em termos de número de linhas, além do qual são aplicadas as regras de otimização especial", "renderIndicators": "Controla se o editor de diff mostra indicadores +/- para alterações adicionadas/removidas" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json index 7ac6b700d4b..d7f075f4fc0 100644 --- a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,6 +16,7 @@ "editorIndentGuides": "Cor das guias de indentação do editor.", "editorLineNumbers": "Cor dos números de linha do editor.", "editorActiveLineNumber": "Cor dos números de linhas do editor", + "deprecatedEditorActiveLineNumber": "Identificação foi descontinuado. Use 'editorLineNumber.activeForeground' em vez disso.", "editorRuler": "Cor das réguas do editor.", "editorCodeLensForeground": "Cor do primeiro plano das lentes de código do editor", "editorBracketMatchBackground": "Cor de fundo atrás do colchetes correspondentes", @@ -28,6 +29,9 @@ "warningBorder": "Cor da borda das linhas onduladas de aviso no editor.", "infoForeground": "Cor do primeiro plano das linhas de informação no editor.", "infoBorder": "Cor da borda das linhas de informação no editor.", + "hintForeground": "Cor de primeiro plano de linhas onduladas de dica no editor.", + "hintBorder": "Cor da borda de linhas onduladas de dica no editor.", + "overviewRulerRangeHighlight": "Visão geral da cor do marcador da régua para destaques do intervalo. A cor não deve ser opaca para não esconder decorações subjacentes.", "overviewRuleError": "Visão geral da cor do marcador da régua para erros.", "overviewRuleWarning": "Visão geral da cor do marcador da régua para avisos.", "overviewRuleInfo": "Visão geral da cor do marcador da régua para informações." diff --git a/i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..11ddcaff63f --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Mostrar correções ({0})", + "quickFix": "Mostrar correções" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/ptb/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index 35229bd6699..8b1d4736ce9 100644 --- a/i18n/ptb/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -5,5 +5,43 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "Sunday": "Domingo", + "Monday": "Segunda-feira", + "Tuesday": "Terça-feira", + "Wednesday": "Quarta-feira", + "Thursday": "Quinta-feira", + "Friday": "Sexta-feira", + "Saturday": "Sábado", + "SundayShort": "Dom", + "MondayShort": "Seg", + "TuesdayShort": "Ter", + "WednesdayShort": "Qua", + "ThursdayShort": "Qui", + "FridayShort": "Sex", + "SaturdayShort": "Sáb", + "January": "Janeiro", + "February": "Fevereiro", + "March": "Março", + "April": "Abril", + "May": "Maio", + "June": "Junho", + "July": "Julho", + "August": "Agosto", + "September": "Setembro", + "October": "Outubro", + "November": "Novembro", + "December": "Dezembro", + "JanuaryShort": "Jan", + "FebruaryShort": "Fev", + "MarchShort": "Mar", + "AprilShort": "Abr", + "MayShort": "Mai", + "JuneShort": "Jun", + "JulyShort": "Jul", + "AugustShort": "Ago", + "SeptemberShort": "Set", + "OctoberShort": "Out", + "NovemberShort": "Nov", + "DecemberShort": "Dez" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json index 882f079794f..1c858bde51c 100644 --- a/i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -10,6 +10,8 @@ "wordHighlightStrong": "Cor de fundo de um símbolo durante o acesso de escrita, como ao escrever uma variável. A cor não deve ser opaca para não ocultar as decorações subjacentes.", "wordHighlightBorder": "Cor de fundo de um símbolo durante acesso de leitura, como ao ler uma variável.", "wordHighlightStrongBorder": "Cor de fundo de um símbolo durante acesso de escrita, como ao escrever uma variável.", + "overviewRulerWordHighlightForeground": "Visão geral da cor do marcador da régua para destaques de símbolos. A cor não deve ser opaca para não esconder decorações subjacentes.", + "overviewRulerWordHighlightStrongForeground": "Visão geral da cor do marcador da régua para destaques de símbolos de acesso de escrita. A cor não deve ser opaca para não esconder decorações subjacentes.", "wordHighlight.next.label": "Ir para o próximo símbolo em destaque", "wordHighlight.previous.label": "Ir para o símbolo de destaque anterior" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json index 9e468f9401d..768ee3289ce 100644 --- a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json @@ -29,9 +29,7 @@ "performance": "Comece com o 'Desenvolvedor: Desempenho de inicialização' comando habilitado.", "prof-startup": "Rodar o CPU profiler durante a inicialização", "disableExtensions": "Desabilita todas as extensões instaladas.", - "inspect-extensions": "Permite depuração e criação de perfis de extensões. Verifique as ferramentas de desenvolvimento para a conexão uri.", - "inspect-brk-extensions": "Permitir depuração e criação de perfil de extensões com o host de extensão em pausa após o início. Verifique as ferramentas do desenvolvedor para a conexão uri.", - "disableGPU": "Desabilita aceleração de hardware da GPU.", + "disableGPU": "Desabilita aceleração de hardware via GPU.", "uploadLogs": "Envia os registros de atividade da sessão atual para um destino seguro.", "maxMemory": "Tamanho máximo de memória para uma janela (em Mbytes).", "usage": "Uso", diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index fd53e61c4d3..6bd9ed493bf 100644 --- a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -14,12 +14,15 @@ "errorInstallingDependencies": "Erro ao instalar dependências. {0}", "MarketPlaceDisabled": "Loja não está habilitada.", "removeError": "Erro ao remover a extensão: {0}. por favor, Saia e Inicie o VS Code antes de tentar novamente.", + "Not a Marketplace extension": "Somente Extensões da Loja podem ser reinstaladas", "notFoundCompatible": "Não foi possível instalar '{0}; não existe nenhuma versão compatível com o VSCode '{1}'.", "malicious extension": "Não foi possível instalar a extensão, pois foi relatada como problemática.", "notFoundCompatibleDependency": "Não foi possível instalar porque a extensão dependente '{0}' compatível com a versão atual '{1}' do VS Code não foi encontrada.", "quitCode": "Não foi possível instalar a extensão. Por favor, saia e reinicie o VS Code antes de reinstalar.", "exitCode": "Não foi possível instalar a extensão. Por favor, saia e reinicie o VS Code antes de reinstalar.", "uninstallDependeciesConfirmation": "Gostaria de desinstalar '{0}' somente, ou suas dependências também?", + "uninstallOnly": "Somente Extensão", + "uninstallAll": "Desinstalar Tudo", "uninstallConfirmation": "Tem certeza que deseja desinstalar '{0}'?", "ok": "OK", "singleDependentError": "Não foi possível desinstalar a extensão '{0}'. A extensão '{1}' depende dela.", diff --git a/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json index 01ad5432236..ba2aa8d0b24 100644 --- a/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "Não foi possível analisar o valor de 'engines.vscode' {0}. Por favor, utilize, por exemplo: ^ 0.10.0, ^ 1.2.3, ^ 0.11.0, ^ 0.10.x, etc.", "versionSpecificity1": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para versões do vscode anteriores a 1.0.0, por favor defina no mínimo a versão principal e secundária desejada. Por exemplo, ^ 0.10.0, 0.10.x, 0.11.0, etc.", "versionSpecificity2": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para as versões do vscode posteriores a 1.0.0, por favor defina no mínimo a versão principal do desejado. Por exemplo, ^ 1.10.0, 1.10.x 1. XX, 2.x.x, etc.", "versionMismatch": "Extensão não é compatível com Code {0}. A extensão requer: {1}." diff --git a/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index 941e39f27a1..a3c2b5abd84 100644 --- a/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "Sua instalação de {0} parece estar corrompida. Favor reinstalar.", "integrity.moreInformation": "Mais informações", - "integrity.dontShowAgain": "Não mostrar novamente", - "integrity.prompt": "Sua instalação de {0} parece estar corrompida. Favor reinstalar." + "integrity.dontShowAgain": "Não mostrar novamente" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/list/browser/listService.i18n.json b/i18n/ptb/src/vs/platform/list/browser/listService.i18n.json index 0d4902c10e2..e21fa3376d2 100644 --- a/i18n/ptb/src/vs/platform/list/browser/listService.i18n.json +++ b/i18n/ptb/src/vs/platform/list/browser/listService.i18n.json @@ -12,5 +12,6 @@ "multiSelectModifier": "O modificador deve ser usado para adicionar um item nas listas e árvores para uma multi-seleção com o mouse (por exemplo, no explorador, editores abertos e exibição scm). 'ctrlCmd' mapeia para 'Control' no Windows e Linux e 'Command' no macOS. Os gestos do mouse 'Aberto ao lado' - se suportado - irá adaptar-se de tal forma que eles não entrem em conflito com o modificador de várias seleções.", "openMode.singleClick": "Abre os itens em um único clique do mouse.", "openMode.doubleClick": "Abre os itens com duplo clique do mouse. ", - "openModeModifier": "Controla como abrir itens em árvores e listas usando o mouse (se suportado). Definido como 'singleClick' para abrir itens com um único clique do mouse e 'doubleClick' para abrir somente através do duplo clique do mouse. Para os pais com filhos em árvores, essa configuração controla se um único clique expande o pai ou um clique duplo. Note que algumas árvores e listas podem optar por ignorar essa configuração, se não for aplicável. " + "openModeModifier": "Controla como abrir itens em árvores e listas usando o mouse (se suportado). Definido como 'singleClick' para abrir itens com um único clique do mouse e 'doubleClick' para abrir somente através do duplo clique do mouse. Para os pais com filhos em árvores, essa configuração controla se um único clique expande o pai ou um clique duplo. Note que algumas árvores e listas podem optar por ignorar essa configuração, se não for aplicável. ", + "horizontalScrolling setting": "Controla se as árvores suportam a rolagem horizontal na área de trabalho." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json index e1497a91dee..a33d1357414 100644 --- a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -92,5 +92,7 @@ "mergeBorder": "Cor da borda dos cabeçalhos e separadores estão em conflito de mesclagem em linha.", "overviewRulerCurrentContentForeground": "Cor de fundo de régua de visuaização atual em conflito de mesclagem em linha.", "overviewRulerIncomingContentForeground": "Cor de fundo de régua de visuaização de entrada em conflito de mesclagem em linha.", - "overviewRulerCommonContentForeground": "Ancestral comum da cor da régua de visão geral para conflitos de mesclagem inline." + "overviewRulerCommonContentForeground": "Ancestral comum da cor da régua de visão geral para conflitos de mesclagem inline.", + "overviewRulerFindMatchForeground": "Visão geral da cor do marcador da régua para correspondências de localização. A cor não deve ser opaca para não esconder decorações subjacentes.", + "overviewRulerSelectionHighlightForeground": "Visão geral da cor do marcador da régua para destaques de seleção. A cor não deve ser opaca para não esconder decorações subjacentes." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..b25f4fe2939 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "showViewlet": "Mostrar {0}", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 94adc8bdb1b..dfe343c9d2b 100644 --- a/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Contribui visualizações ao editor", "views.explorer": "Visualização do explorador", "views.debug": "Visualizar Depurador", - "locationId.invalid": "'{0}' não é um local válido de visualização", "duplicateView1": "Não é possível registrar vários modos de exibição com a mesma id '{0}' no local '{1}'", "duplicateView2": "Uma exibição com id '{0}' já está registrada no local '{1}'" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 4498984aac3..35229bd6699 100644 --- a/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "webview.editor.label": "editor webview" + ] } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json index 745e5b68758..3991d555141 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json @@ -26,6 +26,7 @@ "showOpenedEditors": "Mostrar editores abertos", "keepEditor": "Manter editor", "closeEditorsInGroup": "Fechar todos editores no grupo", + "closeSavedEditors": "Fechar Editores Salvos em Grupo", "closeOtherEditors": "Fechar outros editores", "closeRightEditors": "Fechar editores à direita" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index ec0d2b3b02a..086dcb9f4da 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,6 @@ "screenReaderDetectedExtra": "Se você não estiver usando um leitor de tela, por favor altere a configuração `editor.accessibilitySupport` para \"desligado\".", "disableTabMode": "Desativar o modo de acessibilidade", "gotoLine": "Ir para linha", - "indentation": "Indentação", "selectEncoding": "Selecionar a codificação", "selectEOL": "Selecionar a sequência de fim de linha", "selectLanguageMode": "Selecionar modo de idioma", diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index bfe39400384..d65e8370bed 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,7 @@ "sizeMB": "{0}MB", "sizeGB": "{0}GB", "sizeTB": "{0}TB", - "largeImageError": "O tamanho do arquivo da imagem é muito grande (>1MB) para exibir no editor. ", "resourceOpenExternalButton": "Abrir imagem usando um programa externo?", - "nativeBinaryError": "O arquivo não pode ser exibido no editor porque é binário, muito grande ou usa uma codificação de texto sem suporte.", "zoom.action.fit.label": "Toda a imagem", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json index b2e58614a30..0f4a30c299f 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json @@ -6,6 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "notificationsEmpty": "Nenhuma nova notificação", "notifications": "Notificações", + "notificationsToolbar": "Ações da Central de Notificações", "notificationsList": "Lista de Notificações" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsStatus.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsStatus.i18n.json index 02b9b9c0ccf..c73d363c135 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsStatus.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/notifications/notificationsStatus.i18n.json @@ -7,5 +7,8 @@ "Do not edit this file. It is machine generated." ], "hideNotifications": "Ocultar Notificações", - "oneNotification": "1 Nova Notificação" + "zeroNotifications": "Sem Notificações", + "noNotifications": "Sem Novas Notificações", + "oneNotification": "1 Nova Notificação", + "notifications": "{0} Novas Notificações" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..bcdf56e4849 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json b/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json index bf6f25565e7..d3bee3ce826 100644 --- a/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "compositePart.hideSideBarLabel": "Ocultar a Barra Lateral", "collapse": "Recolher tudo" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json index 69ab398eeb1..74295c8a145 100644 --- a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json @@ -18,6 +18,7 @@ "zoomReset": "Reinicializar Zoom", "appPerf": "Desempenho de inicialização", "reloadWindow": "Recarregar Janela", + "reloadWindowWithExntesionsDisabled": "Recarregar Janela Com Extensões Desabilitadas", "switchWindowPlaceHolder": "Selecionar uma janela para onde alternar", "current": "Janela Atual", "close": "Fechar Janela", @@ -48,5 +49,6 @@ "moveWindowTabToNewWindow": "Mover a guia da janela para a nova janela", "mergeAllWindowTabs": "Mesclar todas as janelas", "toggleWindowTabsBar": "Alternar a Barra de Guias da Janela", - "about": "Sobre {0}" + "about": "Sobre {0}", + "inspect context keys": "Inspecionar Chaves de Contexto" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json index 8fd73e4f40c..15dd21d37a3 100644 --- a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,10 +45,13 @@ "windowConfigurationTitle": "Janela", "window.openFilesInNewWindow.on": "Arquivos serão abertos em uma nova janela", "window.openFilesInNewWindow.off": "Arquivos serão abertos em uma nova janela com a pasta de arquivos aberta ou com a última janela ativa.", + "window.openFilesInNewWindow.defaultMac": "Arquivos serão abertos na janela com a pasta dos arquivos aberta ou a última janela ativa, a menos que tenha sido aberta pelo Dock ou pelo Finder", + "window.openFilesInNewWindow.default": "Arquivos serão abertos em uma nova janela, a menos que escolhidos dentro do aplicativo (por exemplo, através do menu de arquivo)", "window.openFoldersInNewWindow.on": "As pastas serão abertas em uma nova janela", "window.openFoldersInNewWindow.off": "As pastas substituirão a última janela ativa", "window.openFoldersInNewWindow.default": "As pastas serão abertas em uma nova janela, a menos que uma pasta seja selecionada dentro do aplicativo (por exemplo, através do menu Arquivo)", "openFoldersInNewWindow": "Controla se as pastas devem ser abertas em uma nova janela ou substituir a última janela ativa\n- padrão: as pastas serão abertas em uma nova janela, a menos que seja selecionada dentro do aplicativo (por exemplo, através do menu Arquivo)\n- ligado: as pastas serão abertas em uma nova janela\n- desligado: as pastas substituirão a última janela ativa\nNote que ainda podem haver casos em que esta configuração será ignorada (por exemplo, quando estiver usando as opções de linha de comando -new-window ou -reuse-window).", + "window.openWithoutArgumentsInNewWindow.on": "Abrir uma nova janela vazia", "window.reopenFolders.all": "Reabrir todas as janelas.", "window.reopenFolders.folders": "Reabrir todas as pastas. Espaços de trabalho vazios não serão restaurados.", "window.reopenFolders.one": "Reabrir a última janela ativa.", @@ -73,6 +76,7 @@ "window.nativeTabs": "Habilita as abas da janela do macOS Sierra. Note que as alterações exigem um reinício completo e que as abas nativas desabilitarão um estilo de barra de título customizado, se configurado.", "zenModeConfigurationTitle": "Modo Zen", "zenMode.fullScreen": "Controla se a ativação do modo Zen também coloca o espaço de trabalho em modo de tela cheia.", + "zenMode.centerLayout": "Controla se ativar o Modo Zen também centraliza o layout.", "zenMode.hideTabs": "Controla se a ativação do modo Zen também oculta as abas do espaço de trabalho.", "zenMode.hideStatusBar": "Controla se a ativação do modo Zen também oculta a barra de status no rodapé do espaço de trabalho.", "zenMode.hideActivityBar": "Controla se a ativação do modo Zen também oculta a barra de atividades à esquerda do espaço de trabalho.", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index e3be93ecafc..4aab0d24a42 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,11 +6,13 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Editar o Ponto de Parada...", "functionBreakpointsNotSupported": "Pontos de parada de função não são suportados por este tipo de depuração", "functionBreakpointPlaceholder": "Função de parada", "functionBreakPointInputAriaLabel": "Digitar Ponto de Parada de Função", "breakpointDisabledHover": "Ponto de interrupção desativado", + "breakpointUnverifieddHover": "Ponto de Parada não Verificado", + "functionBreakpointUnsupported": "Função de ponto de parada não é suportado por este tipo de debug", "breakpointDirtydHover": "Ponto de parada não verificado. O arquivo foi modificado, por favor reinicie a sessão de depuração.", - "conditionalBreakpointUnsupported": "Pontos de parada condicionais não são suportados por esse tipo de depurador" + "conditionalBreakpointUnsupported": "Pontos de parada condicionais não são suportados por esse tipo de depurador", + "hitBreakpointUnsupported": "Pontos de parada condicionais não são suportados por este tipo de debug" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json index fc9ccfbe315..8d9d177e084 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugCommands.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "noFolderDebugConfig": "Primeiro abra uma pasta para fazer uma configuração de depuração avançada.", + "columnBreakpoint": "Coluna de ponto de parada", "debug": "Depurar", "addColumnBreakpoint": "Adicionar Ponto de Interrupção de Coluna" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json index 291cad9feea..ae25f330896 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "unable": "Não é possível resolver o recurso sem uma sessão de depuração" + "unable": "Não é possível resolver o recurso sem uma sessão de depuração", + "canNotResolveSource": "Não foi possível resolver o recurso {0}, não há resposta da extensão do debug." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index e3644af4287..0e03569a94f 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,6 @@ ], "breakpointWidgetHitCountPlaceholder": "Parar quando contagem de ocorrências condição for alcançada. 'Enter' para aceitar, 'esc' para cancelar.", "breakpointWidgetExpressionPlaceholder": "Parar quando a expressão for avaliada como true. 'Enter' para aceitar, 'esc' para cancelar.", - "breakpointWidgetHitCountAriaLabel": "O programa só vai parar aqui, se a contagem de ocorrências for alcançada. Pressione Enter para aceitar ou Escape para cancelar.", - "breakpointWidgetAriaLabel": "O programa só vai parar aqui se esta condição for verdadeira. Pressione Enter para aceitar ou Escape para cancelar.", "expression": "Expressão", "hitCount": "Contagem de ocorrências" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 6d03421bc47..7d73da69fcf 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "Por favor, use nomes únicos de configuração.", "app.launch.json.compound.folder": "Nome da pasta em que o composto se encontra.", "app.launch.json.compounds.configurations": "Nomes das configurações que serão iniciadas como parte deste composto.", - "debugNoType": "'type' do adaptador de depuração não pode ser omitido e deve ser do tipo 'string'.", "selectDebug": "Selecione o ambiente", "DebugConfig.failed": "Não é possível criar o arquivo 'launch.json' dentro da pasta '.vscode' ({0}).", "workspace": "espaço de trabalho", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 0f414408390..3e8dc5d2303 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Editar o Ponto de Parada...", - "disableBreakpoint": "Desativar Ponto de Parada", - "enableBreakpoint": "Habilitar ponto de Parada", "removeBreakpoints": "Remover pontos de interrupção", "removeBreakpointOnColumn": "Remover ponto de interrupção na coluna {0}", "removeLineBreakpoint": "Remover ponto de interrupção de linha", @@ -21,6 +18,7 @@ "enableBreakpoints": "Habilitar o ponto de interrupção na coluna {0}", "enableBreakpointOnLine": "Habilitar o ponto de interrupção de linha", "addBreakpoint": "Adicionar ponto de interrupção", - "conditionalBreakpoint": "Adicionar Ponto de Parada Condicional...", + "addConditionalBreakpoint": "Adicionar Ponto de Parada Condicional...", + "cancel": "Cancelar", "addConfiguration": "Adicionar Configuração..." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index a29d2cb2439..1551a564cda 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -14,9 +14,11 @@ "breakpointRemoved": "Ponto de interrupção removido, linha {0}, arquivo {1}", "compoundMustHaveConfigurations": "Composição deve ter o atributo \"configurations\" definido para iniciar várias configurações.", "noConfigurationNameInWorkspace": "Não foi possível encontrar a configuração de inicialização '{0}' na área de trabalho.", + "multipleConfigurationNamesInWorkspace": "Existem múltiplas configurações de lançamento '{0}' na área de trabalho. Use o nome da pasta para qualificar a configuração.", "noFolderWithName": "Não é possível encontrar a pasta com nome '{0}' para configuração '{1}' no composto '{2}'.", "configMissing": "Configuração '{0}' não tem 'launch.json'.", "launchJsonDoesNotExist": "'launch.json' não existe.", + "debugRequestNotSupported": "Atributo '{0}' tem um valor sem suporte '{1}' na configuração de debug escolhida.", "debugRequesMissing": "Atributo '{0}' está faltando para a configuração de depuração escolhida.", "debugTypeNotSupported": "Tipo de depuração configurado '{0}' não é suportado.", "debugTypeMissing": "Falta a propriedade 'type' para a configuração de lançamento escolhida.", @@ -26,5 +28,6 @@ "preLaunchTaskExitCode": "A preLaunchTask '{0}' encerrada com código de saída {1}.", "showErrors": "Mostrar erros", "noFolderWorkspaceDebugError": "O arquivo ativo não pode ser depurado. Certifique-se de que ele está salvo no disco e que tem uma extensão de depuração instalada para esse tipo de arquivo.", - "cancel": "Cancelar" + "cancel": "Cancelar", + "taskNotTracked": "A tarefa '{0}' não pode ser rastreada." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index c6a227f6440..3b712f1be09 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "Mais Informações", - "unableToLaunchDebugAdapter": "Não é possível executar o adaptador de depuração de '{0}'.", - "unableToLaunchDebugAdapterNoArgs": "Não é possível executar o adaptador de depuração.", - "stoppingDebugAdapter": "{0}. Parando o adaptador de depuração.", "debugAdapterCrash": "Processo do adaptador de depuração foi finalizado inesperadamente" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 68f9e1f25bf..18e436b0f51 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "Executável do adaptador de depuração '{0}' não existe.", "debugAdapterCannotDetermineExecutable": "Não é possível determinar o executável para o adaptador de depuração '{0}'.", - "launch.config.comment1": "Use o IntelliSense para aprender sobre possíveis atributos.", - "launch.config.comment2": "Passe o mouse para ver as descrições dos atributos existentes.", - "launch.config.comment3": "Para obter mais informações, visite: {0}", - "debugType": "Tipo de configuração.", - "debugTypeNotRecognised": "O tipo de depuração não é reconhecido. Certifique-se de que você tem uma extensão de depuração correspondente instalada e que ela está habilitada.", - "node2NotSupported": "\"node2\" não é mais suportado, use \"node\" ao invés e defina o atributo \"protocol\" para \"inspector\".", - "debugName": "Nome da configuração; aparece no menu drop-down da configuração de lançamento. ", - "debugRequest": "Requer o tipo de configuração. Pode ser \"launch\" ou \"attach\".", - "debugServer": "Somente para o desenvolvimento de extensão de depuração: se uma porta é especificada, o VS Code tenta se conectar a um adaptador de depuração executando em modo de servidor", - "debugPrelaunchTask": "Tarefa para ser executada antes de começar a sessão de depuração.", - "debugWindowsConfiguration": "Atributos de configuração de lançamento específicos do Windows.", - "debugOSXConfiguration": "Atributos de configuração de lançamento específicos do OS X.", - "debugLinuxConfiguration": "Atributos de configuração de lançamento específicos do Linux.", - "deprecatedVariables": "'env.', 'config.' e 'command.' foram descontinuados, use ' env:', ' config:' e ' command:' em vez disso." + "unableToLaunchDebugAdapter": "Não é possível executar o adaptador de depuração de '{0}'.", + "unableToLaunchDebugAdapterNoArgs": "Não é possível executar o adaptador de depuração." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..ddf29b94374 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment2": "Passe o mouse para ver as descrições dos atributos existentes.", + "launch.config.comment3": "Para obter mais informações, visite: {0}", + "debugType": "Tipo de configuração.", + "debugTypeNotRecognised": "O tipo de depuração não é reconhecido. Certifique-se de que você tem uma extensão de depuração correspondente instalada e que ela está habilitada.", + "node2NotSupported": "\"node2\" não é mais suportado, use \"node\" ao invés e defina o atributo \"protocol\" para \"inspector\".", + "debugName": "Nome da configuração; aparece no menu drop-down da configuração de lançamento. ", + "debugRequest": "Requer o tipo de configuração. Pode ser \"launch\" ou \"attach\".", + "debugServer": "Somente para o desenvolvimento de extensão de depuração: se uma porta é especificada, o VS Code tenta se conectar a um adaptador de depuração executando em modo de servidor", + "debugPrelaunchTask": "Tarefa para ser executada antes de começar a sessão de depuração.", + "debugPostDebugTask": "Tarefa para ser executada após término da sessão de debug.", + "debugWindowsConfiguration": "Atributos de configuração de lançamento específicos do Windows.", + "debugOSXConfiguration": "Atributos de configuração de lançamento específicos do OS X.", + "debugLinuxConfiguration": "Atributos de configuração de lançamento específicos do Linux.", + "deprecatedVariables": "'env.', 'config.' e 'command.' foram descontinuados, use ' env:', ' config:' e ' command:' em vez disso." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..0043a4db9f3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "Console VS Code", + "mac.terminal.script.failed": "Script '{0}' falhou com código de saída {1}", + "mac.terminal.type.not.supported": "'{0}' não suportado", + "press.any.key": "Pressione qualquer tecla para continuar...", + "linux.term.failed": "'{0}' falhou com código de saída {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index ed84158ab3a..86302d2d217 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -6,12 +6,15 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "download": "Baixar manualmente", "installAction": "Instalar", "installing": "Instalando", + "failedToInstall": "Falha ao instalar '{0}'.", "uninstallAction": "Desinstalar", "Uninstalling": "Desinstalando", "updateAction": "Atualizar", "updateTo": "Atualizar para {0}", + "failedToUpdate": "Falha ao atualizar '{0}'.", "ManageExtensionAction.uninstallingTooltip": "Desinstalando", "enableForWorkspaceAction": "Habilitar (Espaço de Trabalho)", "enableGloballyAction": "Habilitar", @@ -54,8 +57,11 @@ "configureWorkspaceFolderRecommendedExtensions": "Configurar as Extensões Recomendadas (Pasta do Espaço de Trabalho)", "malicious tooltip": "Esta extensão foi relatada como problemática.", "malicious": "Malicioso", + "disabled": "Desativado", + "disabled globally": "Desativado", "disableAll": "Desabilitar Todas as Extensões Instaladas", "disableAllWorkspace": "Desabilitar Todas as Extensões Instaladas para este Espaço de Trabalho", + "enableAll": "Ativar Todas as Extensões", "openExtensionsFolder": "Abrir a Pasta de Extensões", "installVSIX": "Instalar do VSIX...", "installFromVSIX": "Instalar a partir do VSIX", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index c50dddb3166..f6209cf359d 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -33,13 +33,17 @@ "view id": "ID", "view name": "Nome", "view location": "Onde", + "localizations": "Localizações ({0})", "localizations language id": "Id do Idioma", - "localizations language name": "Nome do Idioma", - "localizations localized language name": "Nome do Idioma (Localizado)", + "colorThemes": "Temas de cores ({0})", + "iconThemes": "Temas de ícones ({0})", + "colors": "Cores ({0})", "colorId": "Id", "defaultDark": "Padrão Escuro", "defaultLight": "Padrão Claro", + "defaultHC": "Padrão de Alto Contraste", "JSON Validation": "Validação JSON ({0})", + "schema": "Esquema", "commands": "Comandos ({0})", "command name": "Nome", "keyboard shortcuts": "Atalhos de Teclado", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 9afc0966221..e88b86ca28f 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,13 +8,15 @@ ], "neverShowAgain": "Não mostrar novamente", "searchMarketplace": "Pesquisar na Loja", + "showLanguagePackExtensions": "A loja possui extensões que podem ajudar na localização do VS Code para o local '{0}'", + "dynamicWorkspaceRecommendation": "Esta extensão pode interessá-lo porque é popular entre os usuários do repositório {0}.", "exeBasedRecommendation": "Esta extensão é recomendada porque você tem {0} instalado.", "fileBasedRecommendation": "Esta extensão é recomendada baseada nos arquivos que você abriu recentemente.", "workspaceRecommendation": "Esta extensão é recomendada pelos usuários da área de trabalho atual.", "reallyRecommended2": "A extensão {0} é recomendada para este tipo de arquivo.", "reallyRecommendedExtensionPack": "O pacote de extensão '{0}' é recomendado para este tipo de arquivo.", - "showRecommendations": "Mostrar Recomendações", "install": "Instalar", + "showRecommendations": "Mostrar Recomendações", "showLanguageExtensions": "A Loja tem extensões que podem ajudar com arquivos '.{0}'", "workspaceRecommended": "Este espaço de trabalho possui recomendações de extensão.", "installAll": "Instalar Tudo", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index d9fc84f40b8..af3364f4bd8 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "Desabilitar outros mapeamentos de teclado ({0}) para evitar conflitos entre as combinações de teclas?", "yes": "Sim", - "no": "Não", - "betterMergeDisabled": "A extensão Better Merge agora é intrínseca, a extensão instalada foi desabilitada e pode ser desinstalada.", - "uninstall": "Desinstalar" + "no": "Não" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 963936e2ac1..5d4dd840e84 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,8 @@ "recommendedExtensions": "Recomendado", "otherRecommendedExtensions": "Outras recomendações", "workspaceRecommendedExtensions": "Recomendações do Espaço de Trabalho", + "builtInExtensions": "Funcionalidades", + "builtInThemesExtensions": "Temas", "searchExtensions": "Pesquisar Extensões na Loja", "sort by installs": "Ordenar por: Quantidade de Instalações", "sort by rating": "Ordenar por: Avaliação", diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index d626a3f28d4..bb320e7128c 100644 --- a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -32,7 +32,8 @@ "confirmDeleteMessageFolder": "Tem certeza de que deseja excluir permanentemente '{0}' e seu conteúdo?", "confirmDeleteMessageFile": "Tem certeza de que deseja excluir permanentemente '{0}'?", "irreversible": "Esta ação é irreversível!", - "importFiles": "Importar Arquivos", + "deletePermanentlyButtonLabel": "&&Excluir Permanentemente", + "retryButtonLabel": "&&Tentar Novamente", "confirmOverwrite": "Um arquivo ou pasta com o mesmo nome já existe na pasta de destino. Você quer substituí-lo?", "replaceButtonLabel": "&&Substituir", "fileDeleted": "Arquivo para colar foi excluído ou movido no meio-tempo", diff --git a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index bfb3cdc41bf..d918ced097a 100644 --- a/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Digite o Nome do arquivo. Pressione Enter para confirmar ou Escape para cancelar.", - "constructedPath": "Criar {0} em **{1}**", "filesExplorerViewerAriaLabel": "{0}, Explorador de Arquivos", "dropFolders": "Você deseja adicionar as pastas ao espaço de trabalho?", "dropFolder": "Você quer adicionar a pasta no espaço de trabalho?", diff --git a/i18n/ptb/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index 1148faff8d9..32575a778b5 100644 --- a/i18n/ptb/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "Gostaria de alternar o idioma da interface do usuário do VS Code para {0} e reiniciar?", "yes": "Sim", "no": "Não", - "doNotAskAgain": "Não me pergunte novamente", + "neverAgain": "Não mostrar novamente", "JsonSchema.locale": "O idioma da interface do usuário a ser usada.", "vscode.extension.contributes.localizations": "Contribui localizações ao editor", "vscode.extension.contributes.localizations.languageId": "Id do idioma em que as strings de exibição estão traduzidas.", diff --git a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index a285e05a853..ed26614c2ca 100644 --- a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "Copiar", - "copyMarkerMessage": "Copiar Mensagem" + "copyMessage": "Copiar Mensagem" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index b5d8f47647e..8323facb36a 100644 --- a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Total {0} Problemas", - "filteredProblems": "Mostrando {0} de {1} Problemas" + "totalProblems": "Total {0} Problemas" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 9997fe77588..4c8c7d44a47 100644 --- a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "Problemas", "markers.panel.aria.label.problems.tree": "Problemas agrupados por arquivos", "markers.panel.no.problems.build": "Nenhum problema foi detectado na área de trabalho até agora.", - "markers.panel.no.problems.filters": "Nenhum resultado encontrado com os critérios de filtro fornecidos", "markers.panel.action.filter": "Problemas de Filtro", - "markers.panel.filter.placeholder": "Filtrar por tipo ou texto", + "markers.panel.filter.ariaLabel": "Problemas de Filtro", "markers.panel.filter.errors": "erros", "markers.panel.filter.warnings": "avisos", "markers.panel.filter.infos": "informações", diff --git a/i18n/ptb/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index e1415c136bc..9b707612469 100644 --- a/i18n/ptb/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "Saída", "logViewer": "Visualizador do Log", "viewCategory": "Exibir", - "clearOutput.label": "Limpar saída" + "clearOutput.label": "Limpar saída", + "openActiveLogOutputFile": "Exibir: Abrir Arquivo de Saída de Log Ativo" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 7db752c5c98..b2078df07b5 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Atalhos de Teclado", "SearchKeybindings.AriaLabel": "Pesquisar keybindings", "SearchKeybindings.Placeholder": "Pesquisar keybindings", "sortByPrecedene": "Ordenar por precedência", diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 3bdbd7e75ff..adf9b0ba020 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Abrir Configurações Padrão Raw", + "openSettings": "Abrir configurações", "openGlobalSettings": "Abra as Configurações de Usuário", "openGlobalKeybindings": "Abrir Atalhos de Teclado", "openGlobalKeybindingsFile": "Abrir Arquivo de Atalhos de Teclado", diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 1c1c058a5fd..6036183487d 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Configurações Padrão", "SearchSettingsWidget.AriaLabel": "Configurações de Pesquisa", "SearchSettingsWidget.Placeholder": "Configurações de Pesquisa", "noSettingsFound": "Nenhum resultado", diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 5ca42fabfaf..d9d0d18805d 100644 --- a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "Mostrar Extensão \"{0}\"", "editTtile": "Editar", "replaceDefaultValue": "Substituir nas Configurações", - "copyDefaultValue": "Copiar para Configurações", - "unsupportedPHPExecutablePathSetting": "Essa configuração deve ser uma Configuração de Usuário. Para configurar o PHP para o espaço de trabalho, abra um arquivo PHP e clique em 'Caminho do PHP' na barra de status.", - "unsupportedWorkspaceSetting": "Essa configuração deve ser uma Configuração de Usuário.", - "unsupportedWorkbenchSetting": "Essa configuração não pode ser aplicada agora. Será aplicada quando você abrir esta pasta diretamente.", - "unsupportedWorkbenchSettingDevMode": "Essa configuração não pode ser aplicada agora. Ela será aplicada se você definir o seu escopo como 'recurso' durante o registo, ou quando você abrir esta pasta diretamente." + "copyDefaultValue": "Copiar para Configurações" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index c8a848c68bd..dfb6a734a7b 100644 --- a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -9,6 +9,8 @@ "scm providers": "Provedores de Controle de Código Fonte", "hideRepository": "Ocultar", "installAdditionalSCMProviders": "Instalar provedores de SCM adicionais...", + "no open repo": "Não existem provedores de controle de código fonte ativos.", "source control": "Controle de código-fonte", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "Ocultar" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json index ddfd526d730..ba5b86d8773 100644 --- a/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Mostrar a Próxima Busca Incluindo Padrões", "previousSearchIncludePattern": "Mostrar a Busca Anterior Incluindo Padrões", + "nextSearchExcludePattern": "Mostrar a Próxima Busca Excluindo Padrões", + "previousSearchExcludePattern": "Mostrar a Busca Anterior Excluindo Padrões", "nextSearchTerm": "Mostrar o Próximo Termo de Pesquisa", "previousSearchTerm": "Mostrar Termo de Pesquisa Anterior", - "showSearchViewlet": "Mostrar Busca", "findInFiles": "Localizar nos Arquivos", "replaceInFiles": "Substituir nos Arquivos", "RefreshAction.label": "Atualizar", diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchView.i18n.json index 213e59f2810..b3ae6818505 100644 --- a/i18n/ptb/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,7 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Alternar Detalhes da Pesquisa", - "searchIncludeExclude.label": "arquivos para incluir/excluir", + "searchScope.includes": "arquivos a serem incluídos", + "label.includes": "Pesquisa Padrões de Inclusão", + "searchScope.excludes": "arquivos a serem excluídos", + "label.excludes": "Pesquisa de Padrões de Exclusão", "replaceAll.confirmation.title": "Substituir Tudo", "replaceAll.confirm.button": "&&Substituir", "replaceAll.occurrence.file.message": "Substituída {0} ocorrência no arquivo {1} com '{2}'.", @@ -27,6 +30,7 @@ "removeAll.occurrences.files.confirmation.message": "Substituir {0} ocorrências nos arquivos {1} com '{2}'?", "replaceAll.occurrences.files.confirmation.message": "Substituir {0} ocorrências nos arquivos {1}?", "treeAriaLabel": "Resultados da Pesquisa", + "searchPathNotFoundError": "Caminho de pesquisa não encontrado: {0}", "searchMaxResultsWarning": "O conjunto de resultados contém apenas um subconjunto de todas as correspondências. Seja mais específico na sua pesquisa para diminuir o número de resultados.", "searchCanceled": "Pesquisa foi cancelada antes de qualquer resultado ser encontrado - ", "noResultsIncludesExcludes": "Nenhum resultado encontrado em '{0}' excluindo '{1}' - ", diff --git a/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 485dee67981..56d88e0a648 100644 --- a/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Pesquisar", + "copyMatchLabel": "Copiar", + "copyPathLabel": "Copiar Caminho", + "copyAllLabel": "Copiar todos", "findInFolder": "Procurar na pasta...", "findInWorkspace": "Procurar no Espaço de Trabalho...", "showTriggerActions": "Ir para Símbolo no Espaço de Trabalho...", "name": "Pesquisar", - "search": "Pesquisar", "showSearchViewl": "Mostrar Busca", "view": "Exibir", "findInFiles": "Localizar nos Arquivos", @@ -24,5 +27,6 @@ "useIgnoreFiles": "Controla se utiliza arquivos .gitignore e .ignore por padrão ao fazer pesquisas de arquivos.", "search.quickOpen.includeSymbols": "Configurar para incluir resultados de uma pesquisa símbolo global nos resultados do arquivo para Abertura Rápida.", "search.followSymlinks": "Controla quando seguir symlinks ao realizar uma busca.", - "search.smartCase": "Faz pesquisas do tipo case-insensitive se o termo for totalmente minúsculo, caso contrário, faz pesquisas do tipo case-sensitive." + "search.smartCase": "Faz pesquisas do tipo case-insensitive se o termo for totalmente minúsculo, caso contrário, faz pesquisas do tipo case-sensitive.", + "search.globalFindClipboard": "Controla se a visualização de busca deve ler ou modificar a área de transferência de busca compartilhada no macOS" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 0dca83c74ee..79f168bdecb 100644 --- a/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "Nos ajude a melhorar o nosso apoio para {0}", "takeShortSurvey": "Responda a uma pesquisa curta", "remindLater": "Lembrar mais tarde", - "neverAgain": "Não mostrar novamente", - "helpUs": "Nos ajude a melhorar o nosso apoio para {0}" + "neverAgain": "Não mostrar novamente" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 40d20b6cd54..0e5b3cbd493 100644 --- a/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "Você deseja responder a uma pequena pesquisa?", "takeSurvey": "Responder a pesquisa", "remindLater": "Lembrar mais tarde", - "neverAgain": "Não mostrar novamente", - "surveyQuestion": "Você deseja responder a uma pequena pesquisa?" + "neverAgain": "Não mostrar novamente" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 739fd01f6dd..c3c8aff5499 100644 --- a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,6 +11,7 @@ "totalErrors": "{0} Erros", "totalWarnings": "{0} Avisos", "totalInfos": "{0} Informações", + "problems": "Problemas", "building": "Compilando...", "manyProblems": "10K+", "runningTasks": "Mostrar tarefas em execução", @@ -30,8 +31,8 @@ "selectProblemMatcher": "Selecione quais tipos de erros e avisos da saída da tarefa você deseja verificar", "customizeParseErrors": "A configuração da tarefa atual tem erros. Por favor, corrija os erros primeiro antes de personalizar uma tarefa.", "moreThanOneBuildTask": "Há muitas tarefas de compilação definidas em tasks.json. Executando a primeira.\n", - "TaskSystem.activeSame.background": "A tarefa '{0}' já está ativa e executando em segundo plano. Para finalizá-la use 'Finalizar Tarefa' no menu Tarefas.", - "TaskSystem.activeSame.noBackground": "A tarefa '{0}' já está ativa. Para finalizá-la use 'Finalizar Tarefa' no menu Tarefas.", + "terminateTask": "Finalizar Tarefa", + "restartTask": "Reiniciar Tarefa", "TaskSystem.active": "Já existe uma tarefa sendo executada. Finalize-a antes de executar outra tarefa.", "TaskSystem.restartFailed": "Falha ao finalizar e reiniciar a tarefa {0}", "TaskService.noConfiguration": "Erro: A deteção de tarefa {0} não contribuiu para uma tarefa para a seguinte configuração: {1} a tarefa será ignorada.\n", diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..eb2f070aafe --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "A cor de fundo do terminal, isso permite colorir o terminal com uma cor diferente do painel.", + "terminal.foreground": "A cor de primeiro plano do terminal.", + "terminal.ansiColor": "'{0}' cor ANSI no terminal." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index a0dc8f3fbc0..ccb060cdd99 100644 --- a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -35,6 +35,7 @@ "terminal.integrated.env.linux": "Objeto com variáveis de ambiente que serão adicionadas ao VS Code e utilizadas pelo terminal no Linux", "terminal.integrated.env.windows": "Objeto com variáveis de ambiente que serão adicionadas ao VS Code e utilizadas pelo terminal no Windows", "terminal.integrated.showExitAlert": "Mostrar alerta 'O processo terminal foi encerrado com código de saída' quando o código de saída é diferente de zero.", + "terminal.integrated.experimentalRestore": "Se deseja restaurar sessões de terminal para a área de trabalho automaticamente quando executa o VS Code. Essa é uma configuração experimental; Ele pode ser falho e pode mudar no futuro.", "terminalCategory": "Terminal", "viewCategory": "Exibir" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 2e5bc67362f..5844af8cc38 100644 --- a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -22,6 +22,7 @@ "workbench.action.terminal.newInActiveWorkspace": "Criar Novo Terminal Integrado (No Espaço de Trabalho Ativo)", "workbench.action.terminal.split": "Dividir Terminal", "workbench.action.terminal.focusPreviousPane": "Focar Painel Anterior", + "workbench.action.terminal.focusNextPane": "Foco próximo painel", "workbench.action.terminal.resizePaneLeft": "Redimensionar Painel à Esquerda", "workbench.action.terminal.resizePaneRight": "Redimensionar Painel à Direita", "workbench.action.terminal.resizePaneUp": "Redimensionar Painel Superior", diff --git a/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index de16a43b9aa..c77824faf3b 100644 --- a/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "Esta área de trabalho contém configurações que só podem ser definidas nas configurações do usuário. ({0}). Clique [aqui]({1}) para mais informações.", "openWorkspaceSettings": "Abrir as configurações do espaço de trabalho", - "dontShowAgain": "Não mostrar novamente", - "unsupportedWorkspaceSettings": "Esta área de trabalho contém configurações que só podem ser definidas nas configurações do usuário. ({0}). Clique [aqui]({1}) para mais informações." + "dontShowAgain": "Não mostrar novamente" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json index 6b7eb5e33c4..0f2f852e685 100644 --- a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "Mais tarde", "releaseNotes": "Notas da Versão", "showReleaseNotes": "Mostrar Notas da Versão", "read the release notes": "Bem-vindo a {0} v{1}! Gostaria de ler as Notas da Versão?", @@ -16,13 +15,12 @@ "updateIsReady": "Nova atualização de {0} disponível.", "noUpdatesAvailable": "Não há nenhuma atualização disponível no momento.", "ok": "OK", - "download now": "Baixar agora", "thereIsUpdateAvailable": "Há uma atualização disponível.", + "download now": "Baixar agora", + "later": "Mais tarde", "installUpdate": "Instalar Atualização", - "updateAvailable": "Há uma atualização disponível: {0} {1}", "updateInstalling": "{0} {1} está sendo instalado no plano de fundo, nós te avisaremos quando estiver pronto.", "updateNow": "Atualizar Agora", - "updateAvailableAfterRestart": "{0} será atualizado após reiniciar.", "commandPalette": "Paleta de comandos...", "settings": "Configurações", "keyboardShortcuts": "Atalhos de Teclado", diff --git a/i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 4498984aac3..0169a443115 100644 --- a/i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "editor webview" + "webview.editor.label": "editor webview", + "developer": "Desenvolvedor" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..3533d84f530 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Abrir Ferramentas de Desenvolvedor do Webview", + "refreshWebviewLabel": "Recarregar Webviews" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 0e1241ddfa4..39c7626f423 100644 --- a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "Ferramentas e linguagens", "welcomePage.installExtensionPacksDescription": "Instalar o suporte para {0} e {1}", "welcomePage.moreExtensions": "mais", - "welcomePage.installKeymapDescription": "Instalar atalhos de teclado", - "welcomePage.installKeymapExtension": "Instalar os atalhos de teclado de {0} e {1}", "welcomePage.others": "outros", "welcomePage.colorTheme": "Tema de cores", "welcomePage.colorThemeDescription": "Fazer o editor e seu código parecer do jeito que você gosta", diff --git a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 988b848fc4e..68215b632ce 100644 --- a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -16,6 +16,11 @@ "errorInvalidWorkspaceTarget": "Não é possível gravar as configurações do espaço de trabalho porque {0} não oferece suporte para o escopo de espaço de trabalho em um espaço de trabalho de múltiplas pastas.", "errorInvalidFolderTarget": "Não é possível gravar as configurações da pasta porque nenhum recurso é fornecido.", "errorNoWorkspaceOpened": "Não é possível gravar {0} porque nenhum espaço de trabalho está aberto. Por favor, abra um espaço de trabalho primeiro e tente novamente.", + "errorInvalidTaskConfiguration": "Não é possível escrever no arquivo de configuração de tarefas. Por favor, abra o arquivo para corrigir erros/avisos e tente novamente.", + "errorInvalidLaunchConfiguration": "Não é possível escrever no arquivo de configuração de lançamento. Por favor, abra o arquivo para corrigir erros/avisos e tente novamente.", + "errorInvalidConfiguration": "Não é possível escrever nas configurações do usuário. Por favor, abra as configurações do usuário para corrigir erros/avisos e tente novamente.", + "errorInvalidConfigurationWorkspace": "Não é possível escrever nas configurações do espaço de trabalho. Por favor, abra as configurações do espaço de trabalho para corrigir erros/avisos no arquivo e tente novamente.", + "errorInvalidConfigurationFolder": "Não é possível escrever nas configurações de pasta. Por favor, abra as configurações da pasta '{0}' para corrigir erros/avisos e tente novamente.", "userTarget": "Configurações de Usuário", "workspaceTarget": "Configurações de Espaço de Trabalho", "folderTarget": "Configurações de pasta" diff --git a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..54475988a3a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedWindowSetting": "Essa configuração não pode ser aplicada agora. Será aplicada quando você abrir esta pasta diretamente." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json b/i18n/ptb/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json index f12b0743598..4dbdaaac4b5 100644 --- a/i18n/ptb/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/extensions/common/extensionsRegistry.i18n.json @@ -30,5 +30,6 @@ "vscode.extension.badges.description": "Descrição do emblema.", "vscode.extension.extensionDependencies": "Dependências para outras extensões. O identificador de uma extensão sempre é ${publisher}. ${nome}. Por exemplo: vscode.csharp.", "vscode.extension.scripts.prepublish": "Script a ser executado antes do pacote ser publicado como uma extensão VS Code.", + "vscode.extension.scripts.uninstall": "Desinstala o hook para a extensão do VS Code. O script que é executado quando a extensão é completamente desinstalada do VS Code e é quando o VS Code é reiniciado (desligar e iniciar) depois que a extensão for desinstalada. Somente scripts Node são suportados.", "vscode.extension.icon": "O caminho para um ícone de 128x128 pixels." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 34d4e413217..f274e33cf84 100644 --- a/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "Host de extensão foi encerrado inesperadamente.", "extensionHostProcess.unresponsiveCrash": "Host de extensão encerrado porque não foi responsivo.", - "devTools": "Ferramentas do Desenvolvedor", "restart": "Reinicie o Host de extensão", "overwritingExtension": "Sobrescrevendo extensão {0} por {1}.", "extensionUnderDevelopment": "Carregando extensão de desenvolvimento em {0}", diff --git a/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 36971b11ff8..f77f09d67b9 100644 --- a/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,10 +6,22 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "O Microsoft .NET Framework 4.5 é necessário. Por favor siga o link para instalá-lo.", "installNet": "Baixar o .NET Framework 4.5", "neverShowAgain": "Não mostrar novamente", - "netVersionError": "O Microsoft .NET Framework 4.5 é necessário. Por favor siga o link para instalá-lo.", "learnMore": "Instruções", + "fileInvalidPath": "Recurso de arquivo inválido ({0})", + "fileIsDirectoryError": "Arquivo é um diretório", + "fileNotModifiedError": "Arquivo não modificado desde", + "fileTooLargeError": "Arquivo muito grande para abrir", + "fileNotFoundError": "Arquivo não encontrado ({0})", + "fileBinaryError": "Arquivo parece ser binário e não pode ser aberto como texto", + "filePermission": "Permissão negada ao escrever no arquivo ({0})", + "fileExists": "Arquivo a ser criado já existe ({0})", + "fileModifiedError": "Arquivo Modificado Desde", + "fileReadOnlyError": "Arquivo é Somente Leitura", + "fileMoveConflict": "Não é possível mover/copiar. Arquivo já existe no destino.", + "unableToMoveCopyError": "Não é possível mover/copiar. Arquivo poderia substituir a pasta em que está contida.", "binFailed": "Falha ao mover '{0}' para a lixeira", "trashFailed": "Falha em mover '{0}' para a lixeira" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/ptb/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index a3887e88897..ea2af2d0060 100644 --- a/i18n/ptb/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Arquivo não encontrado ({0})", "fileIsDirectoryError": "Arquivo é um diretório", "fileNotModifiedError": "Arquivo não modificado desde", "fileBinaryError": "Arquivo parece ser binário e não pode ser aberto como texto" diff --git a/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index 7913d843913..a1c9ed8158f 100644 --- a/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -9,6 +9,7 @@ "schema.token.settings": "Cores e estilos para o token.", "schema.token.foreground": "Cor do primeiro plano para o token.", "schema.token.background.warning": "Atualmente as cores de fundo do token não são suportadas.", + "schema.token.fontStyle": "Estilo da fonte da regra: 'itálico', 'negrito', 'sublinhado' ou uma combinação. Cadeia de caracteres vazia desfaz configurações herdadas.", "schema.token.fontStyle.none": "Nenhum (limpar estilo herdado)", "schema.properties.name": "Descrição da regra.", "schema.properties.scope": "Seletor de escopo que bate com esta regra.", diff --git a/i18n/rus/extensions/css-language-features/package.i18n.json b/i18n/rus/extensions/css-language-features/package.i18n.json index c5c8a90070b..13b750e8b52 100644 --- a/i18n/rus/extensions/css-language-features/package.i18n.json +++ b/i18n/rus/extensions/css-language-features/package.i18n.json @@ -8,6 +8,7 @@ ], "displayName": "Возможности языка CSS", "description": "Предоставляет широкую поддержку языка для файлов CSS, LESS и SCSS.", + "css.title": "CSS", "css.lint.argumentsInColorFunction.desc": "Недопустимое число параметров", "css.lint.boxModel.desc": "Не использовать ширину или высоту при использовании поля или границы", "css.lint.compatibleVendorPrefixes.desc": "При использовании зависящего от поставщика префикса также указывайте все остальные свойства поставщика", diff --git a/i18n/rus/extensions/css/package.i18n.json b/i18n/rus/extensions/css/package.i18n.json index 35229bd6699..f94884afe4a 100644 --- a/i18n/rus/extensions/css/package.i18n.json +++ b/i18n/rus/extensions/css/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Основы языка CSS", + "description": "Предоставляет подсветку синтаксиса и выделение парных скобок в файлах CSS, LESS и SCSS." } \ No newline at end of file diff --git a/i18n/rus/extensions/emmet/package.i18n.json b/i18n/rus/extensions/emmet/package.i18n.json index b9e88e5f37b..c6570b949da 100644 --- a/i18n/rus/extensions/emmet/package.i18n.json +++ b/i18n/rus/extensions/emmet/package.i18n.json @@ -35,7 +35,6 @@ "emmetExtensionsPath": "Путь к папке, содержащей профили Emmet и фрагменты кода.", "emmetShowExpandedAbbreviation": "Отображает развернутые сокращения Emmet в виде предложений.\nПараметр \"inMarkupAndStylesheetFilesOnly\" применяется к html, haml, jade, slim, xml, xsl, css, scss, sass, less и stylus .\nПараметр \"always\" применяется ко всем частям файла независимо от разметки и стилей.", "emmetShowAbbreviationSuggestions": "Отображает возможные сокращения Emmet в виде предложений. Не применяется в таблицах стилей или если параметр emmet.showExpandedAbbreviation имеет значение \"never\".", - "emmetIncludeLanguages": "Включает сокращения Emmet в языках, которые не поддерживаются по умолчанию. Здесь можно указать связь между не поддерживаемым и поддерживаемым языками.\nПример: {\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}", "emmetVariables": "Переменные, которые будут использоваться во фрагментах Emmet", "emmetTriggerExpansionOnTab": "Если этот параметр установлен, сокращения Emmet разворачиваются при нажатии клавиши TAB.", "emmetPreferences": "Настройки, которые используются для изменения поведения некоторых действий и сопоставителей Emmet.", @@ -59,5 +58,6 @@ "emmetPreferencesCssWebkitProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"webkit\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"webkit\" никогда не подставлялся, установите в качестве этого параметра пустое значение.", "emmetPreferencesCssMozProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"moz\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"moz\" никогда не подставлялся, установите в качестве этого параметра пустое значение. ", "emmetPreferencesCssOProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"o\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"o\" никогда не подставлялся, установите в качестве этого параметра пустое значение. ", - "emmetPreferencesCssMsProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"ms\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"ms\" никогда не подставлялся, установите в качестве этого параметра пустое значение. " + "emmetPreferencesCssMsProperties": "Разделенный запятыми список свойств CSS, которые получают префикс разработчика \"ms\" при использовании в сокращениях Emmet, которые начинаются с \"-\". Чтобы префикс \"ms\" никогда не подставлялся, установите в качестве этого параметра пустое значение. ", + "emmetPreferencesCssFuzzySearchMinScore": "Минимальное количество очков для нечеткого соответствия сокращения (от 0 до 1). При указании более низких значений возможно увеличение числа ложных срабатываний, при указании более высоких значений - уменьшение числа возможных соответствий." } \ No newline at end of file diff --git a/i18n/rus/extensions/git/out/commands.i18n.json b/i18n/rus/extensions/git/out/commands.i18n.json index 5e347fa36d0..c7863b7c963 100644 --- a/i18n/rus/extensions/git/out/commands.i18n.json +++ b/i18n/rus/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "ОК", "push with tags success": "Файлы с тегами успешно отправлены.", "pick remote": "Выберите удаленный сервер, на котором нужно опубликовать ветвь \"{0}\":", + "sync is unpredictable": "Это действие отправляет фиксации в \"{0}/{1}\" и извлекает их из этого расположения.", "never again": "ОК, больше не показывать", "no remotes to publish": "Для вашего репозитория не настроены удаленные репозитории для публикации.", "no changes stash": "Отсутствуют изменения, которые необходимо спрятать.", diff --git a/i18n/rus/extensions/git/package.i18n.json b/i18n/rus/extensions/git/package.i18n.json index 9b69c39a76d..f033330e3d5 100644 --- a/i18n/rus/extensions/git/package.i18n.json +++ b/i18n/rus/extensions/git/package.i18n.json @@ -77,6 +77,7 @@ "config.showInlineOpenFileAction": "Определяет, должно ли отображаться интерактивное действие \"Открыть файл\" в представлении \"Изменения Git\".", "config.inputValidation": "Определяет, следует ли проверять введенные данные в сообщении фиксации.", "config.detectSubmodules": "Определяет, следует ли автоматически определять подмодули Git.", + "config.detectSubmodulesLimit": "Управляет ограничением на количество обнаруженных подмодулей Git.", "colors.modified": "Цвет измененных ресурсов.", "colors.deleted": "Цвет удаленных ресурсов.", "colors.untracked": "Цвет неотслеживаемых ресурсов.", diff --git a/i18n/rus/extensions/html/package.i18n.json b/i18n/rus/extensions/html/package.i18n.json index 35229bd6699..42837cfec9d 100644 --- a/i18n/rus/extensions/html/package.i18n.json +++ b/i18n/rus/extensions/html/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Основы языка HTML", + "description": "Обеспечивает подсветку синтаксиса, выделение парных скобок и сниппеты в HTML-файлах." } \ No newline at end of file diff --git a/i18n/rus/extensions/json-language-features/package.i18n.json b/i18n/rus/extensions/json-language-features/package.i18n.json index 762d0d1b54d..c12c7e1110d 100644 --- a/i18n/rus/extensions/json-language-features/package.i18n.json +++ b/i18n/rus/extensions/json-language-features/package.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "Возможности языка JSON", "description": "Предоставляет широкую поддержку языка для файлов JSON.", "json.schemas.desc": "Связь схем с JSON-файлами в текущем проекте", "json.schemas.url.desc": "URL-адрес схемы или относительный путь к ней в текущем каталоге", diff --git a/i18n/rus/extensions/json/package.i18n.json b/i18n/rus/extensions/json/package.i18n.json index 35229bd6699..85f61bdfc1a 100644 --- a/i18n/rus/extensions/json/package.i18n.json +++ b/i18n/rus/extensions/json/package.i18n.json @@ -5,5 +5,7 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "displayName": "Основы языка JSON", + "description": "Обеспечивает подсветку синтаксиса и выделение парных скобок в файлах JSON." } \ No newline at end of file diff --git a/i18n/rus/extensions/markdown-language-features/out/features/preview.i18n.json b/i18n/rus/extensions/markdown-language-features/out/features/preview.i18n.json index e3a2c915436..5788adc61fe 100644 --- a/i18n/rus/extensions/markdown-language-features/out/features/preview.i18n.json +++ b/i18n/rus/extensions/markdown-language-features/out/features/preview.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "lockedPreviewTitle": "[Предварительный просмотр] {0}" + "lockedPreviewTitle": "[Предварительный просмотр] {0}", + "previewTitle": "Открыть {0} для предварительного просмотра" } \ No newline at end of file diff --git a/i18n/rus/extensions/markdown-language-features/out/security.i18n.json b/i18n/rus/extensions/markdown-language-features/out/security.i18n.json index 0cab268e7a8..d51d2ea286d 100644 --- a/i18n/rus/extensions/markdown-language-features/out/security.i18n.json +++ b/i18n/rus/extensions/markdown-language-features/out/security.i18n.json @@ -6,7 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "strict.title": "Строгий", "strict.description": "Загружать только безопасное содержимое", + "insecureLocalContent.title": "Разрешить небезопасное локальное содержимое", + "insecureLocalContent.description": "Включить загрузку содержимого через HTTP из localhost", "insecureContent.title": "Разрешить небезопасное содержимое", "insecureContent.description": "Включить загрузку содержимого через HTTP", "disable.title": "Отключить", diff --git a/i18n/rus/extensions/markdown-language-features/package.i18n.json b/i18n/rus/extensions/markdown-language-features/package.i18n.json index 021c2c0fa8c..0c205858212 100644 --- a/i18n/rus/extensions/markdown-language-features/package.i18n.json +++ b/i18n/rus/extensions/markdown-language-features/package.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "displayName": "Возможности языка Markdown", "description": "Предоставляет широкую поддержку языка для Markdown.", "markdown.preview.breaks.desc": "Определяет, как переносы строк отображаются в области предварительного просмотра файла Markdown. Если установить этот параметр в значение 'true', <br>будут создаваться для каждой новой строки.", "markdown.preview.linkify": "Включить или отключить преобразование текста в URL для предварительного просмотра Markdown.", diff --git a/i18n/rus/extensions/php-language-features/package.i18n.json b/i18n/rus/extensions/php-language-features/package.i18n.json index e520e862551..b0eb11ff036 100644 --- a/i18n/rus/extensions/php-language-features/package.i18n.json +++ b/i18n/rus/extensions/php-language-features/package.i18n.json @@ -12,5 +12,7 @@ "configuration.validate.run": "Запускается ли анализатор кода при сохранении или при печати.", "configuration.title": "PHP", "commands.categroy.php": "PHP", - "command.untrustValidationExecutable": "Запретить исполняемый файл проверки PHP (определяется как параметр рабочей области)" + "command.untrustValidationExecutable": "Запретить исполняемый файл проверки PHP (определяется как параметр рабочей области)", + "displayName": "Функции языка PHP", + "description": "Предоставляет широкую поддержку возможностей языка для файлов PHP." } \ No newline at end of file diff --git a/i18n/rus/extensions/php/package.i18n.json b/i18n/rus/extensions/php/package.i18n.json index 5e16df11f06..f980f6e45a4 100644 --- a/i18n/rus/extensions/php/package.i18n.json +++ b/i18n/rus/extensions/php/package.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "Функции языка PHP" + "description": "Предоставляет подсветку синтаксиса и выделение парных скобок в файлах PHP." } \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/commands.i18n.json b/i18n/rus/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..c2ebfd19241 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Откройте папку в VS Code, чтобы использовать проект JavaScript или TypeScript.", + "typescript.projectConfigUnsupportedFile": "Не удалось определить проект TypeScript или JavaScript. Неподдерживаемый тип файла", + "typescript.projectConfigCouldNotGetInfo": "Не удалось определить проект TypeScript или JavaScript.", + "typescript.noTypeScriptProjectConfig": "Файл не является частью проекта TypeScript. Дополнительные сведения см. [здесь]({0}).", + "typescript.noJavaScriptProjectConfig": "Файл не является частью проекта JavaScript. Дополнительные сведения см. [здесь]({0}).", + "typescript.configureTsconfigQuickPick": "Настроить tsconfig.json", + "typescript.configureJsconfigQuickPick": "Настроить jsconfig.json" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..3df8eafb051 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Выберите применяемое действие кода", + "acquiringTypingsLabel": "Получение typings...", + "acquiringTypingsDetail": "Получение определений typings для IntelliSense.", + "autoImportLabel": "Автоматический импорт из {0}" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..3add3405e17 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Включает семантическую проверку в JavaScript файле. Необходимо расположить в самом начале файла.", + "ts-nocheck": "Отключает семантическую проверку в JavaScript файле. Необходимо расположить в самом начале файла.", + "ts-ignore": "Отключает вывод ошибок @ts-check для следующей строки файла." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..8f5e9d5ec4f --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 реализация", + "manyImplementationLabel": "Реализации {0}", + "implementationsErrorLabel": "Не удалось определить реализации." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..b4cad43043f --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "Комментарий JSDoc" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..1787a125fae --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "Организация импортов" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..72b696f9b0a --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (Исправить все в файле)" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..63583231cd7 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 ссылка", + "manyReferenceLabel": "Ссылок: {0}", + "referenceErrorLabel": "Не удалось определить ссылки." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..a641634e077 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "сборка – {0}", + "buildAndWatchTscLabel": "отслеживание – {0}" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/rus/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..0a42c8c6746 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "Путь {0} не указывает на допустимый файл программы установки tsserver. Выполняется откат до пакетной версии TypeScript.", + "serverCouldNotBeStarted": "Не удалось запустить языковой сервер TypeScript. Сообщение об ошибке: \"{0}\".", + "typescript.openTsServerLog.notSupported": "Для ведения журнала сервера TS требуется TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "Вход в TS Server отключен. Задайте \"typescript.tsserver.log\" и перезагрузите VS Code, чтобы включить ведение журнала", + "typescript.openTsServerLog.enableAndReloadOption": "Войдите и перезагрузите TS server", + "typescript.openTsServerLog.noLogFile": "Сервер TS не начал ведение журнала.", + "openTsServerLog.openFileFailedFailed": "Не удалось открыть файл журнала сервера TS", + "serverDiedAfterStart": "Языковая служба TypeScript пять раз завершила работу сразу после запуска. Служба не будет перезапущена.", + "serverDiedReportIssue": "Сообщить об ошибке", + "serverDied": "Языковая служба TypeScript пять раз непредвиденно завершила работу за последние пять минут." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/rus/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/rus/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/rus/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..54d1199165b --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "Чтобы включить языковые функции JavaScript/TypeScript IntelliSense во всем проекте, исключите папки с большим числом файлов, например: {0}.", + "hintExclude.generic": "Чтобы включить языковые функции JavaScript/TypeScript IntelliSense во всем проекте, исключите большие папки с исходными файлами, с которыми вы не работаете.", + "large.label": "Настройка исключений", + "hintExclude.tooltip": "Чтобы включить языковые функции JavaScript/TypeScript IntelliSense во всем проекте, исключите большие папки с исходными файлами, с которыми вы не работаете." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/rus/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..f5ffd76a57b --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Получение данных для повышения эффективности IntelliSense TypeScript", + "typesInstallerInitializationFailed.title": "Не удалось установить файлы типизации для языка JavaScript. Убедитесь, что NPM установлен или укажите путь к файлу 'typescript.npm' в параметрах среды пользователя. Дополнительные сведения см. [здесь]({0}).", + "typesInstallerInitializationFailed.doNotCheckAgain": "Больше не показывать" +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/rus/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..f475eb8cead --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "Использовать версию VS Code", + "useWorkspaceVersionOption": "Использовать версию рабочей области", + "learnMore": "Дополнительные сведения", + "selectTsVersion": "Выберите версию TypeScript, используемую для языковых функций JavaScript и TypeScript." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/rus/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..5de17783d56 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "Не удалось загрузить версию TypeScript по этому пути", + "noBundledServerFound": "Файл tsserver VSCode был удален другим приложением, например, в результате ошибочного срабатывания средства обнаружения вирусов. Переустановите VSCode." +} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript-language-features/package.i18n.json b/i18n/rus/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..52fae6d2583 --- /dev/null +++ b/i18n/rus/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,58 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "Возможности языков TypeScript и JavaScript", + "description": "Предоставляет широкую поддержку языка для JavaScript и TypeScript.", + "typescript.reloadProjects.title": "Перезагрузить проект", + "javascript.reloadProjects.title": "Перезагрузить проект", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Дополните функции сигнатурами их параметров.", + "typescript.tsdk.desc": "Указывает путь к папке, содержащей файлы tsserver и lib*.d.ts, которые необходимо использовать.", + "typescript.disableAutomaticTypeAcquisition": "Отключает автоматическое получение типов. Требуется TypeScript 2.0.6 и более поздней версии.", + "typescript.tsserver.log": "Включает ведение журнала для сервера TS. Этот журнал можно использовать для диагностики проблем сервера TS. В журнале могут содержаться пути к файлам, исходный код и другие сведения из вашего проекта, в том числе носящие конфиденциальный характер.", + "typescript.tsserver.trace": "Включает трассировку сообщений, отправляемых на сервер TS. Эту трассировку можно использовать для диагностики проблем сервера TS. Трассировка может содержать пути к файлам, исходный код и другие сведения из вашего проекта, в том числе конфиденциальные данные.", + "typescript.validate.enable": "Включение или отключение проверки TypeScript.", + "typescript.format.enable": "Включение или отключение модуля форматирования TypeScript по умолчанию.", + "javascript.format.enable": "Включение или отключение модуля форматирования JavaScript по умолчанию.", + "format.insertSpaceAfterCommaDelimiter": "Определяет метод обработки пробелов после разделителя-запятой.", + "format.insertSpaceAfterConstructor": "Определяет метод обработки пробелов после ключевого слова constructor. Требуется TypeScript 2.3.0 или более поздней версии.", + "format.insertSpaceAfterSemicolonInForStatements": " Определяет метод обработки пробелов после точки с запятой в операторе for.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Определяет метод обработки пробелов после двоичного оператора.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Определяет метод обработки пробелов после ключевых слов в операторе управления потоком выполнения.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Определяет метод обработки пробелов после ключевого слова function у анонимных функций.", + "format.insertSpaceBeforeFunctionParenthesis": "Определяет метод обработки пробелов перед скобками аргумента функции. Требует TypeScript >= 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Определяет метод обработки пробелов после открытия и до закрытия скобок в строке шаблона. Требуется TypeScript 2.0.6 или более поздней версии.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Определяет метод обработки пробелов после открытия и до закрытия скобок выражения JSX. Требуется TypeScript 2.0.6 или более поздней версии.", + "format.insertSpaceAfterTypeAssertion": "Определяет метод обработки пробелов после утверждений типа в TypeScript. Требуется TypeScript 2.4 или более поздней версии.", + "format.placeOpenBraceOnNewLineForFunctions": "Определяет, ставится ли открывающая фигурная скобка с новой строки в функциях.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Определяет, ставится ли открывающая фигурная скобка с новой строки в блоках управления.", + "javascript.validate.enable": "Включение или отключение проверки JavaScript.", + "typescript.goToProjectConfig.title": "Перейти к конфигурации проекта", + "javascript.goToProjectConfig.title": "Перейти к конфигурации проекта", + "javascript.referencesCodeLens.enabled": "Включить/отключить ссылки CodeLens для файлов JavaScript.", + "typescript.referencesCodeLens.enabled": "Включить/отключить ссылки CodeLens для файлов TypeScript. Требуется TypeScript версии 2.0.6 или более поздней версии.", + "typescript.implementationsCodeLens.enabled": "Включить или отключить CodeLens для реализаций. Требуется TypeScript >= 2.2.0.", + "typescript.openTsServerLog.title": "Открыть журнал сервера TS", + "typescript.restartTsServer": "Перезапустить сервер TS", + "typescript.selectTypeScriptVersion.title": "Выберите версию TypeScript.", + "typescript.reportStyleChecksAsWarnings": "Отображать ошибки при проверке стиля в виде предупреждений", + "jsDocCompletion.enabled": "Включить или отключить JSDoc коментарии", + "javascript.implicitProjectConfig.checkJs": "Включает/отключает семантическую проверку файлов JavaScript. Этот параметр может переопределяться в файле jsconfig.json или tsconfig.json. Требуется TypeScript 2.3.1 или более поздней версии.", + "typescript.npm": "Указывает путь к исполняемому файлу NPM, используемому для автоматического получения типа. Требуется TypeScript версии 2.3.4 или более поздней версии.", + "typescript.check.npmIsInstalled": "Проверяет, установлен ли NPM для автоматического получения типов.", + "javascript.nameSuggestions": "Включить/отключить использование уникальных имен из файла в списках предложений JavaScript.", + "typescript.tsc.autoDetect": "Управляет автоматическим обнаружением задач tsc. При указании значения 'off' эта функция отключается. При указании значения 'build' создаются задачи компиляции для однократного запуска. При указании значения 'watch' создаются только задачи компиляции и наблюдения. При указании значения 'on' создаются как задачи сборки, так и задачи наблюдения. По умолчанию используется значение 'on'.", + "typescript.problemMatchers.tsc.label": "Проблемы TypeScript", + "typescript.problemMatchers.tscWatch.label": "Проблемы TypeScript (режим наблюдения)", + "typescript.quickSuggestionsForPaths": "Включить/отключить краткие предложения при вводе пути импорта.", + "typescript.locale": "Устанавливает языковой стандарт, используемый для сообщений об ошибках TypeScript. Требуется TypeScript 2.6.0 или более поздней версии. Значение по умолчанию — 'null'. При указании значения null для сообщений об ошибках TypeScript используется языковой стандарт VS Code.", + "javascript.implicitProjectConfig.experimentalDecorators": "Включает/отключает параметр 'experimentalDecorators' для файлов JavaScript, которые не являются частью проекта. Этот параметр может переопределяться в файле jsconfig.json или tsconfig.json. Требуется TypeScript 2.3.1 или более поздней версии.", + "typescript.autoImportSuggestions.enabled": "Включить/отключить предложения автоматического импорта. Требуется TypeScript 2.6.1 или более поздней версии", + "typescript.experimental.syntaxFolding": "Включает/отключает маркеры свертывания с учетом синтаксиса.", + "taskDefinition.tsconfig.description": "Файл tsconfig, который определяет сборку TS." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/base/node/processes.i18n.json b/i18n/rus/src/vs/base/node/processes.i18n.json index 56d7d224726..35229bd6699 100644 --- a/i18n/rus/src/vs/base/node/processes.i18n.json +++ b/i18n/rus/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "Невозможно выполнить команду оболочки на диске UNC." + ] } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 36bef0368cd..12574bacd03 100644 --- a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -11,7 +11,6 @@ "similarIssues": "Похожие проблемы", "open": "Открыть", "closed": "Закрыто", - "noResults": "Результаты не найдены", "settingsSearchIssue": "Проблема с параметрами поиска", "bugReporter": "Отчет об ошибках", "featureRequest": "Запрос функции", diff --git a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 6954a9f7442..bda3982524f 100644 --- a/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/rus/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,9 @@ ], "completeInEnglish": "Заполните форму на английском языке.", "issueTypeLabel": "Это", + "vscode": "Visual Studio Code", + "disableExtensions": "отключение всех расширений и перезагрузка окна", + "chooseExtension": "Расширение", "issueTitleLabel": "Название", "issueTitleRequired": "Введите название.", "titleLengthValidation": "Название слишком длинное.", @@ -18,13 +21,6 @@ "extensions": "Мои расширения", "searchedExtensions": "Расширения, для которых выполнялся поиск", "settingsSearchDetails": "Сведения о параметрах поиска", - "tryDisablingExtensions": "Сохраняется ли проблема после отключения расширений?", - "yes": "Да", - "no": "Нет", - "disableExtensionsLabelText": "Попробуйте воспроизвести проблему после {0}.", - "disableExtensions": "отключение всех расширений и перезагрузка окна", - "showRunningExtensionsLabelText": "Если вы подозреваете, что проблема связана с расширениями, сообщите о проблеме с расширением с помощью {0}.", - "showRunningExtensions": "просмотр всех запущенных расширений", "details": "Укажите сведения.", "loadingData": "Загрузка данных..." } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..a3507419036 --- /dev/null +++ b/i18n/rus/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Имя" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/rus/src/vs/editor/browser/widget/diffReview.i18n.json index a40d32e1219..dfe5ffc5276 100644 --- a/i18n/rus/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/rus/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Закрыть", - "header": "Различие {0} из {1}; исходная версия: {2}, строки: {3}, измененная версия: {4}, строки: {5}", "blankLine": "пустой", "equalLine": "Исходная версия: {0}, измененная версия: {1}: {2}", "insertLine": "+ измененная версия: {0}: {1}", diff --git a/i18n/rus/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/rus/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json index 44453977d44..1acfd70b90b 100644 --- a/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -28,6 +28,9 @@ "warningBorder": "Цвет границ волнистой линии для выделения предупреждений в редакторе.", "infoForeground": "Цвет волнистой линии для выделения информационных сообщений в редакторе.", "infoBorder": "Цвет границ волнистой линии для выделения информационных сообщений в редакторе. ", + "hintForeground": "Цвет волнистой линии для выделения подсказок в редакторе.", + "hintBorder": "Цвет границ волнистой линии для выделения подсказок в редакторе. ", + "overviewRulerRangeHighlight": "Цвет метки линейки в окне просмотра для выделений диапазонов. Цвет должен быть прозрачным, чтобы не перекрывать основные знаки отличия.", "overviewRuleError": "Цвет метки линейки в окне просмотра для ошибок.", "overviewRuleWarning": "Цвет метки линейки в окне просмотра для предупреждений.", "overviewRuleInfo": "Цвет метки линейки в окне просмотра для информационных сообщений." diff --git a/i18n/rus/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/rus/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..8fa3a1ad468 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Показать исправления ({0})", + "quickFix": "Показать исправления", + "organizeImports.label": "Организация импортов" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/rus/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/snippet/snippetVariables.i18n.json b/i18n/rus/src/vs/editor/contrib/snippet/snippetVariables.i18n.json index 35229bd6699..5831d974e53 100644 --- a/i18n/rus/src/vs/editor/contrib/snippet/snippetVariables.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/snippet/snippetVariables.i18n.json @@ -5,5 +5,43 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "Sunday": "Воскресенье", + "Monday": "Понедельник", + "Tuesday": "Вторник", + "Wednesday": "Среда", + "Thursday": "Четверг", + "Friday": "Пятница", + "Saturday": "Суббота", + "SundayShort": "Вс", + "MondayShort": "Пн", + "TuesdayShort": "Вт", + "WednesdayShort": "Ср", + "ThursdayShort": "Чт", + "FridayShort": "Пт", + "SaturdayShort": "Сб", + "January": "Январь", + "February": "Февраль", + "March": "Март", + "April": "Апрель", + "May": "Май", + "June": "Июнь", + "July": "Июль", + "August": "Август", + "September": "Сентябрь", + "October": "Октябрь", + "November": "Ноябрь", + "December": "Декабрь", + "JanuaryShort": "Янв", + "FebruaryShort": "Фев", + "MarchShort": "Мар", + "AprilShort": "Апр", + "MayShort": "Май", + "JuneShort": "Июн", + "JulyShort": "Июл", + "AugustShort": "Авг", + "SeptemberShort": "Сен", + "OctoberShort": "Окт", + "NovemberShort": "Ноя", + "DecemberShort": "Дек" } \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json b/i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json index 89e24cb0c6f..5b31b385ffd 100644 --- a/i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/wordHighlighter/wordHighlighter.i18n.json @@ -10,6 +10,8 @@ "wordHighlightStrong": "Фон символа при доступе для записи, например при записи переменной. Цвет должен быть прозрачным чтобы не перекрывать основных знаков отличия.", "wordHighlightBorder": "Цвет границы символа при доступе на чтение, например, при считывании переменной.", "wordHighlightStrongBorder": "Цвет границы символа при доступе на запись, например, при записи переменной. ", + "overviewRulerWordHighlightForeground": "Цвет метки линейки в окне просмотра для выделения символов. Цвет не должен был прозрачным, чтобы не перекрывать основные знаки отличия.", + "overviewRulerWordHighlightStrongForeground": "Цвет метки линейки в окне просмотра для выделения символов с доступом на запись. Цвет не должен был прозрачным, чтобы не перекрывать основные знаки отличия.", "wordHighlight.next.label": "Перейти к следующему выделению символов", "wordHighlight.previous.label": "Перейти к предыдущему выделению символов" } \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/environment/node/argv.i18n.json b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json index 60e5e887ae4..d214cf140db 100644 --- a/i18n/rus/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "Запустите с включенной командой \"Developer: Startup Performance\".", "prof-startup": "Запустить профилировщик ЦП при запуске", "disableExtensions": "Отключить все установленные расширения.", - "inspect-extensions": "Разрешить отладку и профилирование расширений. Проверьте URI подключения для инструментов разработчика.", - "inspect-brk-extensions": "Разрешить отладку и профилирование расширений, когда узел расширения приостановлен после запуска. Проверьте URI подключения для инструментов разработчика. ", "disableGPU": "Отключить аппаратное ускорение GPU.", "uploadLogs": "Отправляет журналы из текущего сеанса в защищенную конечную точку.", "maxMemory": "Максимальный размер памяти для окна (в МБ).", diff --git a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 908048ebb5a..61b52ee878a 100644 --- a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -14,12 +14,15 @@ "errorInstallingDependencies": "Ошибка при установке зависимостей. {0}", "MarketPlaceDisabled": "Marketplace не включен", "removeError": "Ошибка при удалении расширения: {0}. Закройте и снова откройте VS Code, затем повторите попытку.", + "Not a Marketplace extension": "Можно переустановить только расширения из Marketplace", "notFoundCompatible": "Невозможно установить '{0}'; нет версии, совместимой с VS Code '{1}'.", "malicious extension": "Не удается установить расширение, так как оно помечено как проблемное.", "notFoundCompatibleDependency": "Не удается выполнить установку, так как не найдено зависимое расширение '{0}', совместимое с текущей версией VS Code '{1}'. ", "quitCode": "Невозможно установить расширение. Пожалуйста, выйдите и зайдите в VS Code перед переустановкой.", "exitCode": "Невозможно установить расширение. Пожалуйста, выйдите и зайдите в VS Code перед переустановкой.", "uninstallDependeciesConfirmation": "Вы хотите удалить \"{0}\" отдельно или вместе с зависимостями?", + "uninstallOnly": "Только расширение", + "uninstallAll": "Удалить все", "uninstallConfirmation": "Вы действительно хотите удалить \"{0}\"?", "ok": "ОК", "singleDependentError": "Не удается удалить расширение \"{0}\". От него зависит расширение \"{1}\".", diff --git a/i18n/rus/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/rus/src/vs/platform/extensions/node/extensionValidator.i18n.json index a7a3fc36a7d..6fc7fb30591 100644 --- a/i18n/rus/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/rus/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "Не удалось проанализировать значение engines.vscode {0}. Используйте, например, ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x и т. д.", "versionSpecificity1": "Версия, указанная в engines.vscode ({0}), недостаточно конкретная. Для версий vscode до 1.0.0 укажите по крайней мере основной и дополнительный номер версии. Например, 0.10.0, 0.10.x, 0.11.0 и т. д.", "versionSpecificity2": "Версия, указанная в engines.vscode ({0}), недостаточно конкретная. Для версий vscode после 1.0.0 укажите по крайней мере основной номер версии. Например, 1.10.0, 1.10.x, 1.x.x, 2.x.x и т. д.", "versionMismatch": "Расширение несовместимо с кодом \"{0}\". Расширению требуется: {1}." diff --git a/i18n/rus/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/rus/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index ccf4c0564b8..954eb473437 100644 --- a/i18n/rus/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/rus/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "Похоже, ваша установка {0} повреждена. Повторите установку.", "integrity.moreInformation": "Дополнительные сведения", - "integrity.dontShowAgain": "Больше не показывать", - "integrity.prompt": "Похоже, ваша установка {0} повреждена. Повторите установку." + "integrity.dontShowAgain": "Больше не показывать" } \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/list/browser/listService.i18n.json b/i18n/rus/src/vs/platform/list/browser/listService.i18n.json index a5965b1f141..b9fbce4eef3 100644 --- a/i18n/rus/src/vs/platform/list/browser/listService.i18n.json +++ b/i18n/rus/src/vs/platform/list/browser/listService.i18n.json @@ -12,5 +12,6 @@ "multiSelectModifier": "Модификатор, который будет использоваться для добавления элементов в деревьях и списках в элемент множественного выбора с помощью мыши (например, в проводнике, в открытых редакторах и в представлении scm). \"ctrlCmd\" соответствует клавише CTRL в Windows и Linux и клавише COMMAND в macOS. Жесты мыши \"Открыть сбоку\" (если они поддерживаются), будут изменены таким образом, чтобы они не конфликтовали с модификатором элемента множественного выбора.", "openMode.singleClick": "Открывает элемент одним щелчком мыши.", "openMode.doubleClick": "Открывает элемент двойным щелчком мыши.", - "openModeModifier": "Управляет тем, как открывать элементы в деревьях и списках с помощью мыши (если поддерживается). Укажите значение \"singleClick\", чтобы открывать элементы одним щелчком мыши, и \"doubleClick\", чтобы открывать их только двойным щелчком мыши. Для родительских элементов с дочерними элементами в деревьях этот параметр управляет тем, будет ли родительский элемент разворачиваться по одинарному или по двойному щелчку мыши. Обратите внимание, что этот параметр может игнорироваться в некоторых деревьях и списках, если он не применяется к ним. " + "openModeModifier": "Управляет тем, как открывать элементы в деревьях и списках с помощью мыши (если поддерживается). Укажите значение \"singleClick\", чтобы открывать элементы одним щелчком мыши, и \"doubleClick\", чтобы открывать их только двойным щелчком мыши. Для родительских элементов с дочерними элементами в деревьях этот параметр управляет тем, будет ли родительский элемент разворачиваться по одинарному или по двойному щелчку мыши. Обратите внимание, что этот параметр может игнорироваться в некоторых деревьях и списках, если он не применяется к ним. ", + "horizontalScrolling setting": "Определяет, поддерживают ли древа горизонтальную прокрутку в рабочей области." } \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json index 4fd13e76a7a..681bcf8d8ed 100644 --- a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -92,5 +92,7 @@ "mergeBorder": "Цвет границы заголовков и разделителя во внутренних конфликтах слияния.", "overviewRulerCurrentContentForeground": "Цвет переднего плана линейки текущего окна во внутренних конфликтах слияния.", "overviewRulerIncomingContentForeground": "Цвет переднего плана линейки входящего окна во внутренних конфликтах слияния.", - "overviewRulerCommonContentForeground": "Цвет переднего плана для обзорной линейки для общего предка во внутренних конфликтах слияния. " + "overviewRulerCommonContentForeground": "Цвет переднего плана для обзорной линейки для общего предка во внутренних конфликтах слияния. ", + "overviewRulerFindMatchForeground": "Цвет метки линейки в окне просмотра для результатов поиска. Цвет не должен был прозрачным, чтобы не перекрывать основные знаки отличия.", + "overviewRulerSelectionHighlightForeground": "Цвет метки линейки в окне просмотра для выделения. Цвет не должен был прозрачным, чтобы не перекрывать основные знаки отличия." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..5a602cb684a --- /dev/null +++ b/i18n/rus/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "свойство \"{0}\" является обязательным и должно иметь тип string", + "showViewlet": "Показать {0}", + "view": "Просмотр" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 99c3d895cf3..ea28349cd88 100644 --- a/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Добавляет представления в редактор", "views.explorer": "Представление проводника", "views.debug": "Представление отладки", - "locationId.invalid": "\"{0}\" не является допустимым расположением представления", "duplicateView1": "Не удается зарегистрировать несколько представлений с одинаковым идентификатором '{0}' в расположении '{1}'", "duplicateView2": "Представление с идентификатором '{0}' уже зарегистрировано в расположении '{1}'" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 37bcdaf055d..4e0cc0deeb3 100644 --- a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "Форматирование при сохранении прервано через {0} мс", + "timeout.onWillSave": "Событие onWillSaveTextDocument-event прервано по истечении 1750 мс", "saveParticipants": "Сохранение участников..." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 79967c51d9e..35229bd6699 100644 --- a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "webview.editor.label": "Редактор веб-представления" + ] } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/node/extHostProgress.i18n.json b/i18n/rus/src/vs/workbench/api/node/extHostProgress.i18n.json index 35229bd6699..06bdf111ede 100644 --- a/i18n/rus/src/vs/workbench/api/node/extHostProgress.i18n.json +++ b/i18n/rus/src/vs/workbench/api/node/extHostProgress.i18n.json @@ -5,5 +5,6 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ] + ], + "extensionSource": "{0} (расширение)" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 0b2da1baa17..f9f5adc30ce 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,7 +17,6 @@ "screenReaderDetectedExtra": "Если вы не используете средство чтения с экрана, измените значение параметра \"editor.accessibilitySupport\" на \"off\".", "disableTabMode": "Отключить режим специальных возможностей", "gotoLine": "Перейти к строке", - "indentation": "Отступ", "selectEncoding": "Выберите кодировку", "selectEOL": "Выберите последовательность конца строки", "selectLanguageMode": "Выберите языковой режим", diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 096f82a9a51..1bf380ec2e5 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,7 @@ "sizeMB": "{0} МБ", "sizeGB": "{0} ГБ", "sizeTB": "{0} ТБ", - "largeImageError": "Изображение имеет слишком большой размер для отображения в редакторе (более 1 МБ). ", "resourceOpenExternalButton": "Открыть изображение с помощью внешней программы?", - "nativeBinaryError": "Файл не будет отображен в редакторе, так как он двоичный, очень большой или использует неподдерживаемую кодировку текста.", "zoom.action.fit.label": "Все изображение", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json index a5d906fdd98..d6c896929e7 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/notifications/notificationsCenter.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "notificationsEmpty": "Новые уведомления отсутствуют", "notifications": "Уведомления", "notificationsToolbar": "Действия центра уведомлений", "notificationsList": "Список уведомлений" diff --git a/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..c7537efab64 --- /dev/null +++ b/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ok": "ОК" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json index 7a4ee2d7def..12656d83a09 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,10 +45,17 @@ "windowConfigurationTitle": "Окно", "window.openFilesInNewWindow.on": "Файлы будут открываться в новом окне.", "window.openFilesInNewWindow.off": "Файлы будут открываться в окне с открытой папкой файлов или последнем активном окне.", + "window.openFilesInNewWindow.defaultMac": "Файлы будут открыты в новом окне с открытой папкой файлов или в последнем активном окне, если они не были открыты с помощью панели Dock или поиска", + "window.openFilesInNewWindow.default": "Файлы будут открыты в новом окне, если они не были выбраны в приложении (например, из меню \"Файл\")", + "openFilesInNewWindowMac": "Определяет, будут ли файлы открываться в новом окне.\n- default: файлы будут открываться в окне с открытой папкой файлов или последнем активном окне, если они не открываются из панели Dock или системы поиска.\n- on: файлы будут открываться в новом окне.\n- off: файлы будут открываться в окне с открытой папкой файлов или последнем активном окне.\nОбратите внимание, что возможны случаи, когда этот параметр игнорируется (например, при использовании параметра командной строки -new-window или -reuse-window).", + "openFilesInNewWindow": "Определяет, будут ли файлы открываться в новом окне.\n- default: файлы будут открываться в новом окне, если они не выбраны в приложении (например, из меню \"Файл\").\n- on: файлы будут открываться в новом окне.\n- off: файлы будут открываться в окне с открытой папкой файлов или последнем активном окне.\nОбратите внимание, что возможны случаи, когда этот параметр игнорируется (например, при использовании параметра командной строки -new-window или -reuse-window).", "window.openFoldersInNewWindow.on": "Папки будут открываться в новом окне.", "window.openFoldersInNewWindow.off": "Папки будут заменять последнее активное окно.", "window.openFoldersInNewWindow.default": "Папки будут открываться в новом окне, если папка не выбрана в приложении (например, в меню \"Файл\").", "openFoldersInNewWindow": "Определяет, будут ли папки открываться в новом окне или заменять последнее активное окно.\n- default: папки будут открываться в новом окне, если папка не выбрана из приложения (например, из меню \"Файл\").\n- on: папки будут открываться в новом окне.\n- off: папки будут заменять последнее активное окно.\nОбратите внимание, что возможны случаи, когда этот параметр игнорируется (например, при использовании параметра командной строки -new-window или -reuse-window).", + "window.openWithoutArgumentsInNewWindow.on": "Открыть новое пустое окно", + "window.openWithoutArgumentsInNewWindow.off": "Перенести фокус на последний активный запущенный экземпляр", + "openWithoutArgumentsInNewWindow": "Определяет, следует ли открыть второй активный экземпляр без аргументов или перевести выделение на последний запущенный экземпляр.\n- on: открыть новое пустое окно.\n- off: перевести выделение на последний запущенный экземпляр.\nОбратите внимание, что возможны случаи, когда этот параметр игнорируется (например, при использовании параметра командной строки -new-window или -reuse-window).", "window.reopenFolders.all": "Повторно открыть все окна.", "window.reopenFolders.folders": "Повторно откройте все папки. Пустые рабочие области не будут восстановлены.", "window.reopenFolders.one": "Повторно открыть последнее активное окно.", @@ -56,6 +63,7 @@ "restoreWindows": "Управляет повторным открытием окон после перезапуска. Выберите 'none', чтобы всегда начинать с пустой рабочей области; 'one', чтобы открыть последнее окно, с которым вы работали; 'folders', чтобы открыть все окна с открытыми папками, и 'all', чтобы открыть все окна последнего сеанса.", "restoreFullscreen": "Определяет, должно ли окно восстанавливаться в полноэкранном режиме, если оно было закрыто в полноэкранном режиме.", "zoomLevel": "Настройте масштаб окна. Исходный размер равен 0. Увеличение или уменьшение значения на 1 означает увеличение или уменьшение окна на 20 %. Чтобы более точно задать масштаб, можно также ввести десятичное число.", + "title": "Определяет заголовок окна в зависимости от активного редактора. Подстановка переменных выполняется на основе контекста:\n${activeEditorShort}: имя файла (например, myFile.txt)\n${activeEditorMedium}: путь к файлу относительно папки рабочей области (например, myFolder/myFile.txt)\n${activeEditorLong}: полный путь к файлу (например, /Users/Development/myProject/myFolder/myFile.txt)\n${folderName}: имя папки рабочей области, в которой находится файл (например, myFolder)\n${folderPath}: путь к папке рабочей области, в которой находится файл (например, /Users/Development/myFolder)\n${rootName}: имя рабочей области (например, myFolder или myWorkspace)\n${rootPath}: путь к папке рабочей области (например, /Users/Development/myWorkspace)\n${appName}: например, VS Code\n${dirty}: индикатор изменения файла в активном редакторе\n${separator}: условный разделитель (\" - \"), который отображается, только если окружен переменными со значениями или статическим текстом", "window.newWindowDimensions.default": "Открывать новые окна в центре экрана.", "window.newWindowDimensions.inherit": "Открывать новые окна того же размера, что и последнее активное окно.", "window.newWindowDimensions.maximized": "Открывать новые окна в развернутом состоянии.", @@ -71,6 +79,7 @@ "autoDetectHighContrast": "Если включено, будет выполняться автоматический переход к высококонтрастной теме, если в Windows используется тема высокой контрастности, или к темной теме при выходе из темы высокой контрастности Windows.", "titleBarStyle": "Настройка внешнего вида заголовка окна. Чтобы применить изменения, потребуется полный перезапуск.", "window.nativeTabs": "Включает вкладки окна macOS Sierra. Обратите внимание, что для применения этих изменений потребуется полная перезагрузка, и что для всех внутренних вкладок будет отключен пользовательский стиль заголовка, если он был настроен.", + "window.smoothScrollingWorkaround": "Включите это обходное решение, если после восстановления свернутого окна кода VS Code прокрутка не выполняется плавно. Это обходное решение для проблемы (https://github.com/Microsoft/vscode/issues/13612), при которой возникают задержки прокрутки на устройствах с сенсорными панелями высокой точности, такими как устройства Surface от Майкрософт. Включение этого обходного решения может привести к небольшому дрожанию элементов окна во время восстановления, но не имеет других негативных последствий.", "zenModeConfigurationTitle": "Режим Zen", "zenMode.fullScreen": "Определяет, будет ли переключение в режим Zen переключать рабочее пространство в полноэкранный режим.", "zenMode.centerLayout": "Определяет, будет ли также выполняться выравнивание по центру при включении режима Zen.", diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 3a211dd7bc4..24e8426f8cc 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Изменить точку останова…", + "breakpoint": "Точка останова", "functionBreakpointsNotSupported": "Точки останова функций не поддерживаются в этом типе отладки", "functionBreakpointPlaceholder": "Функция, в которой производится останов", "functionBreakPointInputAriaLabel": "Введите точку останова в функции", @@ -14,6 +14,7 @@ "breakpointUnverifieddHover": "Непроверенная точка останова", "functionBreakpointUnsupported": "Точки останова функций не поддерживаются в этом типе отладки", "breakpointDirtydHover": "Непроверенная точка останова. Файл был изменен, перезапустите сеанс отладки.", + "logBreakpointUnsupported": "Точки журнала не поддерживаются для этого типа отладки", "conditionalBreakpointUnsupported": "Условные точки останова не поддерживаются этим типом отладки", "hitBreakpointUnsupported": "Останавливаться на условных точках останова, которые не поддерживаются этим типом отладки" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index 83f5638058a..63b8dbd0104 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "Отладка: переключить точку останова", "conditionalBreakpointEditorAction": "Отладка: добавить условную точку останова…", + "logPointEditorAction": "Отладка: Добавить точку журнала...", "runToCursor": "Выполнить до курсора", "debugEvaluate": "Отладка: вычисление", "debugAddToWatch": "Отладка: добавить контрольное значение", diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 93dc323939d..9324196d9e7 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,7 @@ ], "breakpointWidgetHitCountPlaceholder": "Прервать при определенном количестве обращений. Нажмите клавишу ВВОД, чтобы принять, или ESC для отмены.", "breakpointWidgetExpressionPlaceholder": "Прервать выполнение, если выражение равно true. Нажмите клавишу ВВОД, чтобы принять, или ESC для отмены.", - "breakpointWidgetHitCountAriaLabel": "Выполнение программы прервется в этом месте, только если достигнуто определенное количество обращений. Нажмите клавишу ВВОД для принятия или ESC для отмены.", - "breakpointWidgetAriaLabel": "Выполнение программы прервется в этом месте, только если условие выполнится. Нажмите клавишу ВВОД для принятия или ESC для отмены.", "expression": "Выражение", - "hitCount": "Количество обращений" + "hitCount": "Количество обращений", + "logMessage": "Сообщение журнала" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 718232647ac..cce426f1e59 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "Используйте уникальное имя конфигурации.", "app.launch.json.compound.folder": "Имя папки, в которой расположен составной объект.", "app.launch.json.compounds.configurations": "Имена конфигураций, которые будут запущены как часть этого составного объекта.", - "debugNoType": "Параметр type адаптера отладки не может быть опущен и должен иметь тип string.", "selectDebug": "Выбор среды", "DebugConfig.failed": "Не удается создать файл launch.json в папке .vscode ({0}).", "workspace": "рабочая область", diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index a53c820ee79..c00bc52781c 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Изменить точку останова…", - "disableBreakpoint": "Выключить точку останова", - "enableBreakpoint": "Включить точку останова", + "breakpoint": "Точка останова", "removeBreakpoints": "Удалить точки останова", "removeBreakpointOnColumn": "Удалить точку останова из столбца {0}", "removeLineBreakpoint": "Удалить точку останова из строки", @@ -21,6 +19,8 @@ "enableBreakpoints": "Включить точку останова в столбце {0}", "enableBreakpointOnLine": "Включить точку останова в строке", "addBreakpoint": "Добавить точку останова", - "conditionalBreakpoint": "Добавить условную точку останова…", + "addConditionalBreakpoint": "Добавить условную точку останова…", + "addLogPoint": "Добавить точку журнала...", + "cancel": "Отмена", "addConfiguration": "Добавить конфигурацию..." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 2f1cd08a60b..23eb63e486d 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -28,5 +28,7 @@ "preLaunchTaskExitCode": "Выполнение предварительной задачи \"{0}\" завершено с кодом выхода {1}.", "showErrors": "Показывать ошибки", "noFolderWorkspaceDebugError": "Нельзя выполнить отладку активного файла. Убедитесь, что файл сохранен на диске и установлено расширение отладки для этого типа файла.", - "cancel": "Отмена" + "cancel": "Отмена", + "DebugTaskNotFound": "Не удалось найти задачу \"{0}\".", + "taskNotTracked": "Не удается отследить задачу \"{0}\"." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 8fa346a7b25..b28b6560832 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "Подробнее", - "unableToLaunchDebugAdapter": "Не удается запустить адаптер отладки из \"{0}\".", - "unableToLaunchDebugAdapterNoArgs": "Не удается запустить адаптер отладки.", - "stoppingDebugAdapter": "{0}. Адаптер отладки останавливается.", "debugAdapterCrash": "Процесс адаптера отладки неожиданно завершился" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 352c6d32543..4d4a7ed83f0 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,18 +8,6 @@ ], "debugAdapterBinNotFound": "Исполняемый файл адаптера отладки \"{0}\" не существует.", "debugAdapterCannotDetermineExecutable": "Невозможно определить исполняемый файл для адаптера отладки \"{0}\".", - "launch.config.comment1": "Используйте IntelliSense, чтобы узнать о возможных атрибутах.", - "launch.config.comment2": "Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов.", - "launch.config.comment3": "Для получения дополнительной информации посетите: {0}", - "debugType": "Тип конфигурации.", - "debugTypeNotRecognised": "Не удается распознать тип отладки. Убедитесь, что соответствующее расширение отладки установлено и включено.", - "node2NotSupported": "Значение \"node2\" больше не поддерживается; используйте \"node\" и задайте для атрибута \"protocol\" значение \"inspector\".", - "debugName": "Имя конфигурации; отображается в раскрывающемся меню конфигурации запуска.", - "debugRequest": "Запросите тип конфигурации. Возможные типы: \"запуск\" и \"подключение\".", - "debugServer": "Только для разработки расширений отладки: если указан порт, VS Code пытается подключиться к адаптеру отладки, запущенному в режиме сервера.", - "debugPrelaunchTask": "Задача, выполняемая перед началом сеанса отладки.", - "debugWindowsConfiguration": "Атрибуты конфигурации запуска для Windows.", - "debugOSXConfiguration": "Атрибуты конфигурации запуска для OS X.", - "debugLinuxConfiguration": "Атрибуты конфигурации запуска для Linux.", - "deprecatedVariables": "\"env.\", \"config.\" и \"command.\" устарели, используйте \"env:\", \"config:\" и \"command:\"." + "unableToLaunchDebugAdapter": "Не удается запустить адаптер отладки из \"{0}\".", + "unableToLaunchDebugAdapterNoArgs": "Не удается запустить адаптер отладки." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..3ac477e5e53 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,24 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "Используйте IntelliSense, чтобы узнать о возможных атрибутах.", + "launch.config.comment2": "Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов.", + "launch.config.comment3": "Для получения дополнительной информации посетите: {0}", + "debugType": "Тип конфигурации.", + "debugTypeNotRecognised": "Не удается распознать тип отладки. Убедитесь, что соответствующее расширение отладки установлено и включено.", + "node2NotSupported": "Значение \"node2\" больше не поддерживается; используйте \"node\" и задайте для атрибута \"protocol\" значение \"inspector\".", + "debugName": "Имя конфигурации; отображается в раскрывающемся меню конфигурации запуска.", + "debugRequest": "Запросите тип конфигурации. Возможные типы: \"запуск\" и \"подключение\".", + "debugServer": "Только для разработки расширений отладки: если указан порт, VS Code пытается подключиться к адаптеру отладки, запущенному в режиме сервера.", + "debugPrelaunchTask": "Задача, выполняемая перед началом сеанса отладки.", + "debugPostDebugTask": "Задача, которая будет запущена после завершения сеанса отладки.", + "debugWindowsConfiguration": "Атрибуты конфигурации запуска для Windows.", + "debugOSXConfiguration": "Атрибуты конфигурации запуска для OS X.", + "debugLinuxConfiguration": "Атрибуты конфигурации запуска для Linux.", + "deprecatedVariables": "\"env.\", \"config.\" и \"command.\" устарели, используйте \"env:\", \"config:\" и \"command:\"." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..1402209c14c --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "Консоль VS Code", + "mac.terminal.script.failed": "Сбой скрипта \"{0}\" с кодом выхода {1}", + "mac.terminal.type.not.supported": "\"{0}\" не поддерживается", + "press.any.key": "Для продолжения нажмите любую клавишу...", + "linux.term.failed": "Сбой \"{0}\" с кодом выхода {1}" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index af8481a7c6b..bd475832dcf 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -58,6 +58,9 @@ "configureWorkspaceFolderRecommendedExtensions": "Настроить рекомендуемые расширения (папка рабочей области)", "malicious tooltip": "Это расширение помечено как проблемное.", "malicious": "Вредоносный", + "disabled": "Отключено", + "disabled globally": "Отключено", + "disabled workspace": "Отключено для этой рабочей области", "disableAll": "Отключить все установленные расширения", "disableAllWorkspace": "Отключить все установленные расширения для этой рабочей области", "enableAll": "Включить все расширения", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index 65c42dfa32b..9dfffd351b8 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -8,10 +8,12 @@ ], "name": "Имя расширения", "extension id": "Идентификатор расширений", + "preview": "Предварительный просмотр", "builtin": "Встроенное", "publisher": "Имя издателя", "install count": "Число установок", "rating": "Оценка", + "repository": "Репозиторий", "license": "Лицензия", "details": "Подробности", "contributions": "Вклады", @@ -32,15 +34,18 @@ "view id": "Идентификатор", "view name": "Имя", "view location": "Где", + "localizations": "Локализации ({0})", "localizations language id": "Идентификатор языка", - "localizations language name": "Название языка", - "localizations localized language name": "Название языка (локализованное)", + "colorThemes": "Цветовые темы ({0})", "iconThemes": "Темы значков ({0})", + "colors": "Цвета ({0})", + "colorId": "Идентификатор", "defaultDark": "Темная по умолчанию", "defaultLight": "Светлая по умолчанию", "defaultHC": "С высоким контрастом по умолчанию", "JSON Validation": "Проверка JSON ({0})", "fileMatch": "Сопоставление файла", + "schema": "Схема", "commands": "Команды ({0})", "command name": "Имя", "keyboard shortcuts": "Сочетания клавиш", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 885c2235791..fdfbc72c290 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "Это расширение рекомендуется пользователями текущей рабочей области.", "reallyRecommended2": "Для этого типа файлов рекомендуется использовать расширение '{0}'.", "reallyRecommendedExtensionPack": "Для этого типа файлов рекомендуется использовать пакет расширений '{0}'.", - "showRecommendations": "Показать рекомендации", "install": "Установить", + "showRecommendations": "Показать рекомендации", "showLanguageExtensions": "В Marketplace есть расширения для работы с файлами '.{0}'", "workspaceRecommended": "Эта рабочая область включает рекомендации по расширениям.", "installAll": "Установить все", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 3604f1b2e8d..dbb0453fcc6 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "Отключить другие раскладки клавиатуры ({0}), чтобы избежать конфликта между настраиваемыми сочетаниями клавиш?", "yes": "Да", - "no": "Нет", - "betterMergeDisabled": "В текущую версию встроено средство слияния с лучшей функциональностью. Установленное расширение было отключено и не может быть удалено.", - "uninstall": "Удаление" + "no": "Нет" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index fc2676c541b..8bb1f5d04bf 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,8 @@ "recommendedExtensions": "Рекомендуемое", "otherRecommendedExtensions": "Другие рекомендации", "workspaceRecommendedExtensions": "Рекомендации рабочей области", + "builtInExtensions": "Функции", + "builtInThemesExtensions": "Темы", "searchExtensions": "Поиск расширений в Marketplace", "sort by installs": "Сортировать по: числу установок", "sort by rating": "Сортировать по: рейтинг", diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index a22ecce0eb3..e5c218fb1d5 100644 --- a/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -27,12 +27,17 @@ "confirmMoveTrashMessageMultiple": "Вы действительно хотите удалить следующие файлы ({0})?", "confirmMoveTrashMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое?", "confirmMoveTrashMessageFile": "Вы действительно хотите удалить \"{0}\"?", + "undoBin": "Вы можете выполнить восстановление из корзины.", + "undoTrash": "Вы можете выполнить восстановление из корзины.", "doNotAskAgain": "Больше не спрашивать", "confirmDeleteMessageMultiple": "Вы действительно хотите удалить следующие файлы ({0}) без возможности восстановления?", "confirmDeleteMessageFolder": "Вы действительно хотите удалить папку \"{0}\" и ее содержимое без возможности восстановления?", "confirmDeleteMessageFile": "Вы действительно хотите удалить \"{0}\" без возможности восстановления?", "irreversible": "Это действие необратимо.", - "importFiles": "Импорт файлов", + "binFailed": "Не удалось выполнить удаление в корзину. Вы хотите выполнить удаление навсегда?", + "trashFailed": "Не удалось выполнить удаление в корзину. Вы действительно хотите выполнить удаление навсегда?", + "deletePermanentlyButtonLabel": "&&Удалить навсегда", + "retryButtonLabel": "&&Повторить", "confirmOverwrite": "Файл или папка с таким именем уже существует в конечной папке. Заменить их?", "replaceButtonLabel": "Заменить", "fileIsAncestor": "Файл для вставки является предком папки назначения", diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 7864917b59e..124b190523e 100644 --- a/i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -37,6 +37,7 @@ "defaultLanguage": "Режим языка по умолчанию, который назначается новым файлам.", "editorConfigurationTitle": "Редактор", "formatOnSave": "Форматирование файла при сохранении. Модуль форматирования должен быть доступен, файл не должен сохраняться автоматически, а работа редактора не должна завершаться.", + "formatOnSaveTimeout": "Время ожидания форматирования при сохранении. Указывает ограничение времени в миллисекундах для команд форматирования при сохранении. Команды, выполнение которых превышает указанное время ожидания, будут отменены.", "explorerConfigurationTitle": "Проводник", "openEditorsVisible": "Число редакторов, отображаемых на панели \"Открытые редакторы\".", "autoReveal": "Определяет, будет ли проводник автоматически отображать и выбирать файлы при их открытии.", diff --git a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index 4d9d86ce6f1..37cc4f97cc6 100644 --- a/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,13 +7,14 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Введите имя файла. Нажмите клавишу ВВОД, чтобы подтвердить введенные данные, или ESCAPE для отмены.", - "constructedPath": "Создать {0} в **{1}**", "filesExplorerViewerAriaLabel": "{0}, Проводник", "dropFolders": "Вы хотите действительно добавить папки в эту рабочую область?", "dropFolder": "Вы хотите действительно добавить папку в эту рабочую область?", "addFolders": "&&Добавить папки", "addFolder": "&&Добавить папку", + "confirmRootsMove": "Вы действительно хотите изменить порядок нескольких корневых папок в рабочей области?", "confirmMultiMove": "Вы действительно хотите переместить следующие файлы ({0})?", + "confirmRootMove": "Вы действительно хотите изменить порядок корневой папки \"{0}\" в рабочей области?", "confirmMove": "Вы действительно хотите переместить '{0}'?", "doNotAskAgain": "Больше не спрашивать", "moveButtonLabel": "&&Переместить", diff --git a/i18n/rus/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index fdff5585e45..a63d4097358 100644 --- a/i18n/rus/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,9 +6,10 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "Вы хотели бы изменить язык пользовательского интерфейса VS Code на {0} и перезапустить VS Code?", "yes": "Да", "no": "Нет", - "doNotAskAgain": "Больше не спрашивать", + "neverAgain": "Больше не показывать", "JsonSchema.locale": "Язык пользовательского интерфейса.", "vscode.extension.contributes.localizations": "Добавляет локализации в редактор", "vscode.extension.contributes.localizations.languageId": "Идентификатор языка, на который будут переведены отображаемые строки.", diff --git a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index 5c59b0255d7..8bfb35ec63c 100644 --- a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "Копировать", - "copyMarkerMessage": "Копировать сообщение" + "copyMessage": "Копировать сообщение" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 9f1e9238a73..44eeaa06f3b 100644 --- a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Всего проблем: {0}", - "filteredProblems": "Показано проблем: {0} из {1}" + "totalProblems": "Всего проблем: {0}" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 939ceca5ae7..e7a5379738c 100644 --- a/i18n/rus/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "Проблемы", "markers.panel.aria.label.problems.tree": "Проблемы, сгруппированные по файлам", "markers.panel.no.problems.build": "В рабочей области проблемы пока не обнаружены.", - "markers.panel.no.problems.filters": "Для указанного условия фильтра результаты не обнаружены", "markers.panel.action.filter": "Фильтр проблем", - "markers.panel.filter.placeholder": "Фильтровать по типу или тексту", + "markers.panel.filter.ariaLabel": "Фильтр проблем", "markers.panel.filter.errors": "ошибки", "markers.panel.filter.warnings": "предупреждения", "markers.panel.filter.infos": "сообщения", @@ -30,5 +29,15 @@ "markers.panel.multiple.unknowns.label": "Неизвестные: {0}", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "{0} с проблемами ({1})", + "problems.tree.aria.label.marker.relatedInformation": "У этой проблемы есть ссылки на несколько расположений ({0}).", + "problems.tree.aria.label.error.marker": "Ошибка выдана {0}: {1}, строка {2}, символ {3}.{4}", + "problems.tree.aria.label.error.marker.nosource": "Ошибка: {0}, строка {1}, символ {2}.{3}", + "problems.tree.aria.label.warning.marker": "Предупреждение выдано {0}: {1}, строка {2}, символ {3}.{4}", + "problems.tree.aria.label.warning.marker.nosource": "Предупреждение: {0}, строка {1}, символ {2}.{3} ", + "problems.tree.aria.label.info.marker": "Информационное сообщение выдано {0}: {1}, строка {2}, символ {3}.{4}", + "problems.tree.aria.label.info.marker.nosource": "Информационное сообщение: {0}, строка {1}, символ {2}.{3} ", + "problems.tree.aria.label.marker": "Проблема выдана {0}: {1}, строка {2}, символ {3}.{4}", + "problems.tree.aria.label.marker.nosource": "Проблема: {0}, строка {1}, символ {2}.{3} ", + "problems.tree.aria.label.relatedinfo.message": "{0}, строка {1}, символ {2} в {3}", "errors.warnings.show.label": "Показать ошибки и предупреждения" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/rus/src/vs/workbench/parts/output/browser/outputActions.i18n.json index 9cba91c70e4..67574542705 100644 --- a/i18n/rus/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "Переключить выходные данные", "clearOutput": "Очистить выходные данные", "toggleOutputScrollLock": "Включить/отключить SCROLL LOCK для вывода", - "switchToOutput.label": "Переключиться на выходные данные" + "switchToOutput.label": "Переключиться на выходные данные", + "openInLogViewer": "Открыть файл журнала" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json index e357345cb24..66e8e86a36d 100644 --- a/i18n/rus/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/output/electron-browser/output.contribution.i18n.json @@ -9,5 +9,6 @@ "output": "Вывод", "logViewer": "Средство просмотра журналов", "viewCategory": "Просмотр", - "clearOutput.label": "Очистить выходные данные" + "clearOutput.label": "Очистить выходные данные", + "openActiveLogOutputFile": "Просмотр: открыть активный выходной файл журнала" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 1199d8b1427..b1ff2f3c4a2 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Сочетания клавиш", + "showDefaultKeybindings": "Показать сочетания клавиш по умолчанию", + "showUserKeybindings": "Показать пользовательские сочетания клавиш", "SearchKeybindings.AriaLabel": "Поиск настраиваемых сочетаний клавиш", "SearchKeybindings.Placeholder": "Поиск настраиваемых сочетаний клавиш", "sortByPrecedene": "Сортировать по приоритету", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index b6e5dd2331c..301f65925ac 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Открыть исходные параметры по умолчанию", + "openSettings": "Открыть параметры", "openGlobalSettings": "Открыть пользовательские параметры", "openGlobalKeybindings": "Открыть сочетания клавиш", "openGlobalKeybindingsFile": "Открыть файл сочетаний клавиш", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index d1d27d53dda..b589e13bf13 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Параметры по умолчанию", "SearchSettingsWidget.AriaLabel": "Параметры поиска", "SearchSettingsWidget.Placeholder": "Параметры поиска", "noSettingsFound": "Нет результатов", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 1a2779a2e10..b457921fc6f 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "Показать расширение «{0}»", "editTtile": "Изменить", "replaceDefaultValue": "Заменить в параметрах", - "copyDefaultValue": "Копировать в параметры", - "unsupportedPHPExecutablePathSetting": "Этот параметр должен быть параметром пользователя. Чтобы настроить в рабочей области PHP, откройте PHP-файл и щелкните \"Путь PHP\" в строке состояния.", - "unsupportedWorkspaceSetting": "Этот параметр должен быть параметром пользователя.", - "unsupportedWorkbenchSetting": "Сейчас применить этот параметр нельзя. Он будет применен, когда вы откроете эту папку напрямую.", - "unsupportedWorkbenchSettingDevMode": "Сейчас применить этот параметр нельзя. Он будет применен, когда вы определите область параметра как 'resource' при регистрации или когда вы откроете эту папку напрямую." + "copyDefaultValue": "Копировать в параметры" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 53719eca157..6b3cd3ed9a8 100644 --- a/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "Установить дополнительных поставщиков SCM...", "no open repo": "Отсутствуют активные поставщики систем управления версиями.", "source control": "Система управления версиями", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "Скрыть" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json index e62c40fea26..769a0432529 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Показать следующий шаблон включения в поиск", "previousSearchIncludePattern": "Показать предыдущий шаблон включения в поиск ", + "nextSearchExcludePattern": "Показать следующий шаблон исключения из поиска", + "previousSearchExcludePattern": "Показать предыдущий шаблон исключения из поиска", "nextSearchTerm": "Показать следующее условие поиска", "previousSearchTerm": "Показать предыдущее условие поиска", - "showSearchViewlet": "Показать средство поиска", "findInFiles": "Найти в файлах", "replaceInFiles": "Заменить в файлах", "RefreshAction.label": "Обновить", diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/searchView.i18n.json index a577a42bfc0..b197ab3521e 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Переключить сведения о поиске", + "searchScope.includes": "включаемые файлы", + "label.includes": "Шаблоны включения в поиск", + "searchScope.excludes": "исключаемые файлы", + "label.excludes": "Шаблоны исключения из поиска", "replaceAll.confirmation.title": "Заменить все", "replaceAll.confirm.button": "Заменить", "replaceAll.occurrence.file.message": "Вхождение {0} заменено в {1} файле на \"{2}\".", diff --git a/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index f4733a91f5a..75cbba61a06 100644 --- a/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Поиск", + "copyMatchLabel": "Копировать", + "copyPathLabel": "Скопировать путь", + "copyAllLabel": "Копировать все", "findInFolder": "Найти в папке...", "findInWorkspace": "Найти в рабочей области...", "showTriggerActions": "Перейти к символу в рабочей области...", "name": "Поиск", - "search": "Поиск", "showSearchViewl": "Показать средство поиска", "view": "Просмотр", "findInFiles": "Найти в файлах", @@ -25,6 +28,5 @@ "search.quickOpen.includeSymbols": "Настройте для включения результатов поиска глобальных символов в файлы по запросу для Quick Open.", "search.followSymlinks": "Определяет, нужно ли следовать символическим ссылкам при поиске.", "search.smartCase": "Выполняет поиск без учета регистра, если шаблон состоит только из букв нижнего регистра; в противном случае выполняет поиск с учетом регистра", - "search.globalFindClipboard": "Определяет, должно ли представление поиска считывать или изменять общий буфер обмена поиска в macOS", - "search.location": "Предварительная версия: управляет тем, будет ли панель поиска отображаться в виде представления в боковой колонке или в виде панели в области панели для освобождения пространства по горизонтали. В следующем выпуске горизонтальное расположение поиска в панели будет улучшено, и этот параметр больше не будет находиться в предварительной версии." + "search.globalFindClipboard": "Определяет, должно ли представление поиска считывать или изменять общий буфер обмена поиска в macOS" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 7fdf8781d53..794340391f4 100644 --- a/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "Помогите нам улучшить поддержку {0}", "takeShortSurvey": "Пройдите краткий опрос", "remindLater": "Напомнить мне позже", - "neverAgain": "Больше не показывать", - "helpUs": "Помогите нам улучшить поддержку {0}" + "neverAgain": "Больше не показывать" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index e4287fa366a..ac0dc50d4a0 100644 --- a/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "Вас не затруднит пройти краткий опрос?", "takeSurvey": "Пройти опрос", "remindLater": "Напомнить мне позже", - "neverAgain": "Больше не показывать", - "surveyQuestion": "Вас не затруднит пройти краткий опрос?" + "neverAgain": "Больше не показывать" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index ccc1b54893d..9e1a9301226 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "Шаблон проблем либо имя добавленного или предопределенного шаблона проблем. Его можно опустить, если указано базовое значение.", "ProblemMatcherSchema.base": "Имя используемого базового сопоставителя проблем.", "ProblemMatcherSchema.owner": "Владелец проблемы в Code. Можно опустить, если указан элемент base. Если владелец опущен, а элемент base не указан, значение по умолчанию — \"внешний\".", + "ProblemMatcherSchema.source": "Строка, описывающая источник диагностических сведений, в удобном формате, например, \"typescript\" или \"super lint\".", "ProblemMatcherSchema.severity": "Серьезность по умолчанию для выявленных проблем. Используется, если в шаблоне не определена группа сопоставления для серьезности.", "ProblemMatcherSchema.applyTo": "Определяет, относится ли проблема, о которой сообщается для текстового документа, только к открытым, только к закрытым или ко всем документам.", "ProblemMatcherSchema.fileLocation": "Определяет способ интерпретации имен файлов, указываемых в шаблоне проблемы.", diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index e2928ed26bf..f9fa20a44cf 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,7 +28,14 @@ "JsonSchema.tasks.group.none": "Отменяет связь задачи со всеми группами", "JsonSchema.tasks.group": "Определяет, к какой группе выполнения принадлежит эта задача. Поддерживаемые значения: \"build\" для добавления задачи к группе сборки и \"test\" для добавления задачи к группе тестирования.", "JsonSchema.tasks.type": "Определяет, выполняется ли задача в виде процесса или в виде команды оболочки.", + "JsonSchema.command.quotedString.value": "Фактическое значение команды", + "JsonSchema.tasks.quoting.escape": "Экранирует символы с помощью escape-символа оболочки (например, \"`\" в PowerShell и\"\\\" в bash).", + "JsonSchema.tasks.quoting.strong": "Заключает аргумент в кавычки с использованием символа двойной кавычки (например, \" в PowerShell и bash).", + "JsonSchema.tasks.quoting.weak": "Заключает аргумент в кавычки с использованием символа одинарной кавычки (например, ' в PowerShell и bash).", + "JsonSchema.command.quotesString.quote": "Указывает, как значение команды должно быть заключено в кавычки.", "JsonSchema.command": "Выполняемая команда. Это может быть внешняя программа или команда оболочки.", + "JsonSchema.args.quotedString.value": "Фактическое значение аргумента.", + "JsonSchema.args.quotesString.quote": "Указывает, как значение аргумента должно быть заключено в кавычки.", "JsonSchema.tasks.args": "Аргументы, передаваемые в команду при вызове этой задачи.", "JsonSchema.tasks.label": "Метка пользовательского интерфейса задачи", "JsonSchema.version": "Номер версии конфигурации.", diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 9699d3ddc6b..874c52d41c7 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,7 +11,9 @@ "totalErrors": "Ошибок: {0}", "totalWarnings": "Предупреждения: {0}", "totalInfos": "Сообщения: {0}", + "problems": "Проблемы", "building": "Сборка...", + "manyProblems": "Более 10 тысяч", "runningTasks": "Показать выполняемые задачи", "tasks": "Задачи", "TaskSystem.noHotSwap": "Чтобы изменить подсистему выполнения задач, в которой запущена активная задача, необходимо перезагрузить окно", @@ -29,8 +31,8 @@ "selectProblemMatcher": "Выберите, на какие ошибки и предупреждения следует проверять выходные данные задачи", "customizeParseErrors": "В конфигурации текущей задачи есть ошибки. Исправьте ошибки перед изменением задачи.", "moreThanOneBuildTask": "В файле tasks.json определено несколько задач сборки. Выполняется первая задача.\n", - "TaskSystem.activeSame.background": "Задача '{0}' уже активна и находится в фоновом режиме. Чтобы завершить задачу, выберите \"Завершить задачу\" в меню \"Задачи\".", - "TaskSystem.activeSame.noBackground": "Задача '{0}' уже активна. Чтобы завершить задачу, выберите \"Завершить задачу\" из меню \"Задачи\".", + "terminateTask": "Завершить задачу", + "restartTask": "Перезапустить задачу", "TaskSystem.active": "Уже выполняется задача. Завершите ее, прежде чем выполнять другую задачу.", "TaskSystem.restartFailed": "Не удалось завершить и перезапустить задачу {0}", "TaskService.noConfiguration": "Ошибка: в определении задачи {0} не выявлена задача для следующей конфигурации:\n{1}\nЗадача будет проигнорирована.\n", @@ -47,8 +49,8 @@ "recentlyUsed": "недавно использованные задачи", "configured": "настроенные задачи", "detected": "обнаруженные задачи", - "TaskService.notAgain": "Больше не показывать", "TaskService.ignoredFolder": "Следующие папки рабочей области будут проигнорированы, так как в них используется версия задач 0.1.0: {0}", + "TaskService.notAgain": "Больше не показывать", "TaskService.pickRunTask": "Выберите задачу для запуска", "TaslService.noEntryToRun": "Задача для запуска не найдена. Настройте задачи...", "TaskService.fetchingBuildTasks": "Получение задач сборки...", diff --git a/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 76a6659cb9e..b7b348484d2 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "Предупреждение: options.cwd должен иметь тип string. Игнорируется значение {0}\n", + "ConfigurationParser.inValidArg": "Ошибка: аргумент команды должен представлять строку или строку в кавычках. Указанное значение:\n{0}", "ConfigurationParser.noargs": "Ошибка: аргументы команды должны представлять собой массив строк. Указанное значение:\n{0}", "ConfigurationParser.noShell": "Предупреждение: конфигурация оболочки поддерживается только при выполнении задач в терминале.", "ConfigurationParser.noName": "Ошибка: сопоставитель проблем в области объявления должен иметь имя:\n{0}\n", diff --git a/i18n/rus/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..aca12bf1061 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "Цвет фона терминала. С его помощью можно указать цвет терминала, отличный от цвета панели.", + "terminal.foreground": "Цвет переднего плана терминала.", + "terminalCursor.foreground": "Цвет переднего плана курсора терминала.", + "terminalCursor.background": "Цвет фона курсора терминала. Позволяет выбрать цвет символа, который перекрывается блочным курсором.", + "terminal.selectionBackground": "Цвет фона выделения терминала.", + "terminal.border": "Цвет границы, которая отделяет области в терминале. По умолчанию используется panel.border.", + "terminal.ansiColor": "Цвет ANSI \"{0}\" в терминале." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 17bf9786dc4..e484fadb360 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -51,5 +51,7 @@ "workbench.action.terminal.hideFindWidget": "Скрыть мини-приложение поиска", "nextTerminalFindTerm": "Показать следующий найденный термин", "previousTerminalFindTerm": "Показать предыдущий найденный термин", - "quickOpenTerm": "Переключить активный терминал" + "quickOpenTerm": "Переключить активный терминал", + "workbench.action.terminal.selectToPreviousCommand": "Выбрать предыдущую команду", + "workbench.action.terminal.selectToNextCommand": "Выбрать следующую команду" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index a9d5c44acd5..005e94e4f73 100644 --- a/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "Эта рабочая область содержит параметры, которые можно задать только в параметрах пользователя. ({0}) Дополнительные сведения см. [здесь]({1}).", "openWorkspaceSettings": "Открыть параметры рабочей области", - "dontShowAgain": "Больше не показывать", - "unsupportedWorkspaceSettings": "Эта рабочая область содержит параметры, которые можно задать только в параметрах пользователя. ({0}) Дополнительные сведения см. [здесь]({1})." + "dontShowAgain": "Больше не показывать" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/rus/src/vs/workbench/parts/update/electron-browser/update.i18n.json index f279da23009..c0275a6fc93 100644 --- a/i18n/rus/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "Позже", "releaseNotes": "Заметки о выпуске", "showReleaseNotes": "Показать заметки о выпуске", "read the release notes": "Вас приветствует {0} v{1}! Вы хотите прочитать заметки о выпуске?", @@ -16,13 +15,12 @@ "updateIsReady": "Доступно новое обновление {0}.", "noUpdatesAvailable": "Доступные обновления отсутствуют.", "ok": "ОК", - "download now": "Скачать сейчас", "thereIsUpdateAvailable": "Доступно обновление.", + "download now": "Скачать сейчас", + "later": "Позже", "installUpdate": "Установить обновление", - "updateAvailable": "Доступно обновление: {0} {1}", "updateInstalling": "{0} {1} устанавливается в фоновом режиме, мы сообщим вам о завершении.", "updateNow": "Обновить сейчас", - "updateAvailableAfterRestart": "{0} будет обновлен после перезапуска.", "commandPalette": "Палитра команд...", "settings": "Параметры", "keyboardShortcuts": "Сочетания клавиш", diff --git a/i18n/rus/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 79967c51d9e..dfb29cabd85 100644 --- a/i18n/rus/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "Редактор веб-представления" + "webview.editor.label": "Редактор веб-представления", + "developer": "Разработчик" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/rus/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..18d62a09459 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Открыть инструменты разработчика веб-представлений", + "refreshWebviewLabel": "Перезагрузить веб-представления" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index 5cafb4b89da..1f214477976 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Помогите улучшить VS Code, разрешив корпорации Майкрософт сбор данных об использовании. Прочтите наше [заявление о конфиденциальности]({0}) и узнайте, как [явно отказаться от него]({1}).", + "telemetryOptOut.optInNotice": "Помогите улучшить VS Code, разрешив корпорации Майкрософт сбор данных об использовании. Прочтите наше [заявление о конфиденциальности]({0}) и узнайте, как [его принять]({1}). ", "telemetryOptOut.readMore": "Подробнее" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 98a88920d3f..fd358ddceed 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "Средства и языки", "welcomePage.installExtensionPacksDescription": "Установить поддержку для {0} и {1}", "welcomePage.moreExtensions": "Еще", - "welcomePage.installKeymapDescription": "Установка сочетаний клавиш", - "welcomePage.installKeymapExtension": "Настроить сочетания клавиш для {0} и {1}", "welcomePage.others": "Другие", "welcomePage.colorTheme": "Цветовая тема", "welcomePage.colorThemeDescription": "Настройте редактор и код удобным образом.", diff --git a/i18n/rus/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/rus/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..c171e724326 --- /dev/null +++ b/i18n/rus/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedWindowSetting": "Сейчас применить этот параметр нельзя. Он будет применен, когда вы откроете эту папку напрямую." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 91121ed66f9..f7305a5fe40 100644 --- a/i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "Хост-процесс для расширений неожиданно завершил работу.", "extensionHostProcess.unresponsiveCrash": "Работа хост-процесса для расширений была завершена, так как он перестал отвечать на запросы.", - "devTools": "Средства разработчика", "restart": "Перезапустить хост-процесс для расширений", "overwritingExtension": "Идет перезапись расширения {0} на {1}.", "extensionUnderDevelopment": "Идет загрузка расширения разработки в {0}.", diff --git a/i18n/rus/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/rus/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index c3b0dd46f65..1e6d5f9b9b9 100644 --- a/i18n/rus/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,10 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Требуется платформа Microsoft .NET Framework 4.5. Нажмите ссылку, чтобы установить ее.", "installNet": "Скачать .NET Framework 4.5", "neverShowAgain": "Больше не показывать", - "netVersionError": "Требуется платформа Microsoft .NET Framework 4.5. Нажмите ссылку, чтобы установить ее.", + "enospcError": "{0} не удалось проследить изменения файлов в этой большой рабочей области. Для решения проблемы воспользуйтесь ссылкой на инструкции.", "learnMore": "Инструкции", + "fileInvalidPath": "Недопустимый ресурс файла ({0})", + "fileIsDirectoryError": "Файл является каталогом", + "fileNotModifiedError": "undefined", + "fileTooLargeError": "Не удается открыть файл, так как он имеет слишком большой размер", + "fileNotFoundError": "Файл не найден ({0})", + "fileBinaryError": "Похоже, файл является двоичным, и его нельзя открыть как текстовый.", + "filePermission": "Отсутствует разрешение на запись в файл ({0})", + "fileExists": "Создаваемый файл уже существует ({0})", + "fileModifiedError": "Файл изменен с", + "fileReadOnlyError": "Файл доступен только для чтения", + "fileMoveConflict": "Невозможно переместить или скопировать файл, так как он уже существует в папке назначения.", + "unableToMoveCopyError": "Невозможно переместить или скопировать файл, так как он заменил бы папку, в которой содержится.", "binFailed": "Не удалось переместить \"{0}\" в корзину", "trashFailed": "Не удалось переместить \"{0}\" в корзину." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index b754ce1af13..ca3f9e887a1 100644 --- a/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Файл не найден ({0})", "fileIsDirectoryError": "Файл является каталогом", "fileNotModifiedError": "undefined", "fileBinaryError": "Похоже, файл является двоичным, и его нельзя открыть как текстовый." diff --git a/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index 4ac6ac13d25..a51daf45d2b 100644 --- a/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -11,5 +11,6 @@ "vscode.extension.contributes.grammars.scopeName": "Имя области TextMate, используемое в файле tmLanguage.", "vscode.extension.contributes.grammars.path": "Путь к файлу tmLanguage. Путь указывается относительно папки расширения и обычно начинается с \"./syntaxes/\".", "vscode.extension.contributes.grammars.embeddedLanguages": "Сопоставление имени области и идентификатора языка, если грамматика содержит внедренные языки.", + "vscode.extension.contributes.grammars.tokenTypes": "Сопоставление имени области с типами маркеров.", "vscode.extension.contributes.grammars.injectTo": "Список имен языковых областей, в которые вставляется эта грамматика." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index 5b8cb3c808b..40ffdebf725 100644 --- a/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/rus/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "В contributes.{0}.path требуется строка. Указанное значение: {1}", "invalid.injectTo": "Недопустимое значение в \"contributes.{0}.injectTo\". Должен быть задан массив имен языковых областей. Указанное значение: {1}", "invalid.embeddedLanguages": "Недопустимое значение в \"contributes.{0}.embeddedLanguages\". Оно должно быть сопоставлением объекта между именем области и языком. Указанное значение: {1}.", + "invalid.tokenTypes": "Недопустимое значение в \"contributes.{0}.tokenTypes\". Необходимо указать сопоставление объекта между именем объекта и типом маркера. Указанное значение: {1}.", "invalid.path.1": "contributes.{0}.path ({1}) должен был быть включен в папку расширения ({2}). Это может сделать расширение непереносимым.", "no-tm-grammar": "Нет грамматики TM, зарегистрированной для этого языка." } \ No newline at end of file diff --git a/i18n/trk/extensions/css-language-features/package.i18n.json b/i18n/trk/extensions/css-language-features/package.i18n.json index 16d27b93d73..5a93ed1e786 100644 --- a/i18n/trk/extensions/css-language-features/package.i18n.json +++ b/i18n/trk/extensions/css-language-features/package.i18n.json @@ -17,7 +17,7 @@ "css.lint.float.desc": "'float' kullanmaktan kaçının. Float'lar, düzenin herhangi bir unsuru değiştiğinde kolayca bozulan kırılgan CSS ile sonuçlanır.", "css.lint.fontFaceProperties.desc": "@font-face kuralı 'src' ve 'font-family' özelliklerini tanımlamalıdır", "css.lint.hexColorLength.desc": "Onaltılık renkler üç veya altı onaltılık sayıdan oluşmalıdır", - "css.lint.idSelector.desc": "Bu kurallar HTML'ye çok sıkı bağlı olduğundan seçiciler kimlikleri içermemelidir.", + "css.lint.idSelector.desc": " ID'ler HTML'e çok sıkı bağlı olduğundan, seçiciler ID içermemelidir. ", "css.lint.ieHack.desc": "IE izinsiz girişleri yalnızca IE7 ve daha eski sürümler desteklenirken gereklidir", "css.lint.important.desc": "!important kullanmaktan kaçının. Tüm CSS'nin belirginlik düzeyi üzerindeki denetimin kaybedildiğinin ve yeniden düzenlenmesi gerektiğinin bir belirtisidir.", "css.lint.importStatement.desc": "İçe aktarma deyimleri paralel olarak yüklenmez", @@ -39,7 +39,7 @@ "less.lint.float.desc": "'float' kullanmaktan kaçının. Float'lar, düzenin herhangi bir unsuru değiştiğinde kolayca bozulan kırılgan CSS ile sonuçlanır.", "less.lint.fontFaceProperties.desc": "@font-face kuralı 'src' ve 'font-family' özelliklerini tanımlamalıdır", "less.lint.hexColorLength.desc": "Onaltılık renkler üç veya altı onaltılık sayıdan oluşmalıdır", - "less.lint.idSelector.desc": "Bu kurallar HTML'ye çok sıkı bağlı olduğundan seçiciler kimlikleri içermemelidir.", + "less.lint.idSelector.desc": " ID'ler HTML'e çok sıkı bağlı olduğundan, seçiciler ID içermemelidir. ", "less.lint.ieHack.desc": "IE izinsiz girişleri yalnızca IE7 ve daha eski sürümler desteklenirken gereklidir", "less.lint.important.desc": "!important kullanmaktan kaçının. Tüm CSS'nin belirginlik düzeyi üzerindeki denetimin kaybedildiğinin ve yeniden düzenlenmesi gerektiğinin bir belirtisidir.", "less.lint.importStatement.desc": "İçe aktarma deyimleri paralel olarak yüklenmez", @@ -60,7 +60,7 @@ "scss.lint.float.desc": "'float' kullanmaktan kaçının. Float'lar, düzenin herhangi bir unsuru değiştiğinde kolayca bozulan kırılgan CSS ile sonuçlanır.", "scss.lint.fontFaceProperties.desc": "@font-face kuralı 'src' ve 'font-family' özelliklerini tanımlamalıdır", "scss.lint.hexColorLength.desc": "Onaltılık renkler üç veya altı onaltılık sayıdan oluşmalıdır", - "scss.lint.idSelector.desc": "Bu kurallar HTML'ye çok sıkı bağlı olduğundan seçiciler kimlikleri içermemelidir.", + "scss.lint.idSelector.desc": " ID'ler HTML'e çok sıkı bağlı olduğundan, seçiciler ID içermemelidir. ", "scss.lint.ieHack.desc": "IE izinsiz girişleri yalnızca IE7 ve daha eski sürümler desteklenirken gereklidir", "scss.lint.important.desc": "!important kullanmaktan kaçının. Tüm CSS'nin belirginlik düzeyi üzerindeki denetimin kaybedildiğinin ve yeniden düzenlenmesi gerektiğinin bir belirtisidir.", "scss.lint.importStatement.desc": "İçe aktarma deyimleri paralel olarak yüklenmez", diff --git a/i18n/trk/extensions/emmet/package.i18n.json b/i18n/trk/extensions/emmet/package.i18n.json index f11753f3076..e3403b912e2 100644 --- a/i18n/trk/extensions/emmet/package.i18n.json +++ b/i18n/trk/extensions/emmet/package.i18n.json @@ -35,7 +35,6 @@ "emmetExtensionsPath": "Emmet profileri ve parçacıklarını içeren bir klasör yolu.'", "emmetShowExpandedAbbreviation": "Genişletilmiş Emmet kısaltmalarını öneriler olarak gösterir.\n\"inMarkupAndStylesheetFilesOnly\" seçeneği\" html, haml, jade, xml, xsl, css, scss, sass, less ve stylus'a uygulanır.\n\"always\" seçeneği işaretleme/css'den bağımsız olarak dosyanın tüm bölümlerine uygulanır.", "emmetShowAbbreviationSuggestions": "Olası Emmet kısaltmalarını öneriler olarak gösterir. Stil dosyalarında veya emmet.showExpandedAbbreviation, \"never\" olarak ayarlandığında uygulanamaz.", - "emmetIncludeLanguages": "Varsayılan olarak desteklenmeyen dillerde Emmet kısaltmalarını etkinleştirin. Burada dil ile desteklenen emmet destekli dil arasında eşleme ekleyin.", "emmetVariables": "Emmet parçacıklarında kullanılacak değişkenler", "emmetTriggerExpansionOnTab": "Etkinleştirildiğinde, Emmet kısaltmaları TAB tuşuna basıldığında genişletilir.", "emmetPreferences": "Emmet'in bazı eylemleri ve çözümleyicilerinin davranışını değiştirmek için kullanılacak tercihler.", @@ -59,5 +58,6 @@ "emmetPreferencesCssWebkitProperties": "`-` ile başlayan Emmet kısaltmasında kullanıldığında 'webkit' önekini alacak virgülle ayrılmış CSS özellikleri. 'webkit' önekinden her zaman kaçınmak için boş bir dize olarak ayarlayın.", "emmetPreferencesCssMozProperties": "`-` ile başlayan Emmet kısaltmasında kullanıldığında 'moz' önekini alacak virgülle ayrılmış CSS özellikleri. 'moz' önekinden her zaman kaçınmak için boş bir dize olarak ayarlayın.", "emmetPreferencesCssOProperties": "`-` ile başlayan Emmet kısaltmasında kullanıldığında 'o' önekini alacak virgülle ayrılmış CSS özellikleri. 'o' önekinden her zaman kaçınmak için boş bir dize olarak ayarlayın.", - "emmetPreferencesCssMsProperties": "`-` ile başlayan Emmet kısaltmasında kullanıldığında 'ms' önekini alacak virgülle ayrılmış CSS özellikleri. 'ms' önekinden her zaman kaçınmak için boş bir dize olarak ayarlayın." + "emmetPreferencesCssMsProperties": "`-` ile başlayan Emmet kısaltmasında kullanıldığında 'ms' önekini alacak virgülle ayrılmış CSS özellikleri. 'ms' önekinden her zaman kaçınmak için boş bir dize olarak ayarlayın.", + "emmetPreferencesCssFuzzySearchMinScore": "Bulanık eşleştirilmiş kısaltmaların elde etmesi gereken minimum puan (0'dan 1'e kadar). Düşük değerler birçok yanlış pozitif eşleşme oluşturabilir, daha yüksek değerler olası eşleşmeleri azaltabilir." } \ No newline at end of file diff --git a/i18n/trk/extensions/git/out/commands.i18n.json b/i18n/trk/extensions/git/out/commands.i18n.json index 1feaf1cddaf..2883a4dafdf 100644 --- a/i18n/trk/extensions/git/out/commands.i18n.json +++ b/i18n/trk/extensions/git/out/commands.i18n.json @@ -75,6 +75,7 @@ "ok": "Tamam", "push with tags success": "Başarılı bir şekilde etiketlerle gönderildi.", "pick remote": "'{0}' dalının yayınlanacağı bir uzak uçbirim seçin:", + "sync is unpredictable": "Bu eylem, '{0}/{1}' deposuna commitleri gönderecek ve alacaktır.", "never again": "Tamam, Tekrar Gösterme", "no remotes to publish": "Deponuzda yayınlamanın yapılacağı hiçbir uzak uçbirim yapılandırılmamış.", "no changes stash": "Geçici olarak saklanacak bir değişiklik yok.", diff --git a/i18n/trk/extensions/git/package.i18n.json b/i18n/trk/extensions/git/package.i18n.json index b96aca8151e..c440a7230c6 100644 --- a/i18n/trk/extensions/git/package.i18n.json +++ b/i18n/trk/extensions/git/package.i18n.json @@ -77,6 +77,7 @@ "config.showInlineOpenFileAction": "Git değişiklikleri görünümünde satır içi Dosyayı Aç eyleminin gösterilip gösterilmeyeceğini denetler.", "config.inputValidation": "Commit mesajı doğrulamasının ne zaman gösterileceğini kontrol eder.", "config.detectSubmodules": "Git alt modüllerin otomatik olarak tespit edilip edilmeyeceğini denetler.", + "config.detectSubmodulesLimit": "Algılanan git alt modüllerinin limitini denetler.", "colors.modified": "Değiştirilen kaynakların rengi.", "colors.deleted": "Silinen kaynakların rengi.", "colors.untracked": "İzlenmeyen kaynakların rengi.", diff --git a/i18n/trk/extensions/php/package.i18n.json b/i18n/trk/extensions/php/package.i18n.json index 002f7c0d2d7..20718b8a0e7 100644 --- a/i18n/trk/extensions/php/package.i18n.json +++ b/i18n/trk/extensions/php/package.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "displayName": "PHP Dil Özellikleri", "description": "PHP dosyaları için söz dizimi vurgulama ve ayraç eşleştirme sağlar." } \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/commands.i18n.json b/i18n/trk/extensions/typescript-language-features/out/commands.i18n.json new file mode 100644 index 00000000000..8893bf346b3 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/commands.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.projectConfigNoWorkspace": "Bir TypeScript veya JavaScript projesini kullanmak için lütfen bir klasör açın", + "typescript.projectConfigUnsupportedFile": "TypeScript mi yoksa JavaScript mi projesi olduğu tespit edilemedi. Desteklenmeyen dosya türü", + "typescript.projectConfigCouldNotGetInfo": "TypeScript mi yoksa JavaScript mi projesi olduğu tespit edilemedi", + "typescript.noTypeScriptProjectConfig": "Dosya bir TypeScript projesinin parçası değil. Daha fazla bilgi almak için [buraya]({0}) tıklayın.", + "typescript.noJavaScriptProjectConfig": "Dosya bir JavaScript projesinin parçası değil. Daha fazla bilgi almak için [buraya]({0}) tıklayın.", + "typescript.configureTsconfigQuickPick": "tsconfig.json'u yapılandır", + "typescript.configureJsconfigQuickPick": "jsconfig.json'u yapılandır" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..73c28f59b2d --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/completionItemProvider.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "selectCodeAction": "Uygulanacak kod eylemini seçin", + "acquiringTypingsLabel": "Tuşlamalar alınıyor...", + "acquiringTypingsDetail": "IntelliSense için tuşlama tanımları alınıyor...", + "autoImportLabel": "{0} kaynağından otomatik içe aktar" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..9125b191bf7 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ts-check": "Bir JavaScript dosyasının anlamsal kontrolünü etkinleştirir. Bir dosyanın en üstünde olmalıdır.", + "ts-nocheck": "Bir JavaScript dosyasının anlamsal kontrolünü devre dışı bırakır. Bir dosyanın en üstünde olmalıdır.", + "ts-ignore": "Bir dosyanın sonraki satırında @ts-check hatalarını bastırır." +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..3561a581bac --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneImplementationLabel": "1 uygulama", + "manyImplementationLabel": "{0} uygulama", + "implementationsErrorLabel": "Uygulamalar belirlenemedi" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..d6c29560283 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "typescript.jsDocCompletionItem.documentation": "JSDoc yorumu" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/organizeImports.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/organizeImports.i18n.json new file mode 100644 index 00000000000..4f692e9af12 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/organizeImports.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oraganizeImportsAction.title": "İçe Aktarımları Düzenle" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json new file mode 100644 index 00000000000..323d1a99391 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/quickFixProvider.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "fixAllInFileLabel": "{0} (Dosyadaki tümünü düzelt)" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..48ebde68477 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "oneReferenceLabel": "1 başvuru", + "manyReferenceLabel": "{0} başvuru", + "referenceErrorLabel": "Başvurular belirlenemedi" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/features/taskProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/features/taskProvider.i18n.json new file mode 100644 index 00000000000..e69846fe634 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/features/taskProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "buildTscLabel": "derleme - {0}", + "buildAndWatchTscLabel": "izleme - {0}" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json b/i18n/trk/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..d378e70d327 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/typescriptServiceClient.i18n.json @@ -0,0 +1,19 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "noServerFound": "{0} yolu geçerli bir tsserver kurulumuna işaret etmiyor. Paketlenmiş TypeScript sürümüne geri dönülüyor.", + "serverCouldNotBeStarted": "TypeScript dil sunucusu başlatılamadı. Hata mesajı: {0}", + "typescript.openTsServerLog.notSupported": "TS Sunucu günlüğü için TS 2.2.2+ gerekiyor", + "typescript.openTsServerLog.loggingNotEnabled": "TS Sunucu günlüğü kapalı. Lütfen `typescript.tsserver.log` ögesini ayarlayın ve günlüğe yazmayı etkinleştirmek için TS sunucusunu yeniden başlatın", + "typescript.openTsServerLog.enableAndReloadOption": "Günlüğe yazmayı etkinleştir ve TS sunucusunu yeniden başlat", + "typescript.openTsServerLog.noLogFile": "TS sunucu günlüğe yazmaya başlamadı.", + "openTsServerLog.openFileFailedFailed": "TS Sunucu günlük dosyası açılamadı", + "serverDiedAfterStart": "TypeScript dil hizmeti, başladıktan hemen sonra 5 kez kapandı. Hizmet yeniden başlatılmayacaktır.", + "serverDiedReportIssue": "Sorun Bildir", + "serverDied": "TypeScript dil hizmeti, son 5 dakikada 5 kez beklenmedik şekilde kapandı." +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/utils/api.i18n.json b/i18n/trk/extensions/typescript-language-features/out/utils/api.i18n.json new file mode 100644 index 00000000000..4a8a4fba715 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/utils/api.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "invalidVersion": "geçersiz sürüm" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/utils/logger.i18n.json b/i18n/trk/extensions/typescript-language-features/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8f5ef5415b9 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/utils/logger.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/utils/projectStatus.i18n.json b/i18n/trk/extensions/typescript-language-features/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..61c40dd9a35 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/utils/projectStatus.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "hintExclude": "Proje çapında JavaScript/TypeScript dil özelliklerini etkinleştirmek için, şunlar gibi birçok dosyaya sahip klasörleri hariç tutun: {0}", + "hintExclude.generic": "Proje çapında JavaScript/TypeScript dil özelliklerini etkinleştirmek için, üzerinde çalışmadığınız kaynak dosyalar içeren büyük klasörleri hariç tutun.", + "large.label": "Hariç Tutmaları Yapılandır", + "hintExclude.tooltip": "Proje çapında JavaScript/TypeScript dil özelliklerini etkinleştirmek için, üzerinde çalışmadığınız kaynak dosyalar içeren büyük klasörleri hariç tutun." +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json b/i18n/trk/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..6f7d1c56095 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "installingPackages": "Daha iyi TypeScript IntelliSense için veri alınıyor", + "typesInstallerInitializationFailed.title": "JavaScript dil özellikleri için tuşlama dosyaları yüklenemedi. Lütfen NPM'in yüklenmiş olduğundan emin olun veya kullanıcı ayarlarınızdaki 'typescript.npm' ögesini yapılandırın. Daha fazla bilgi almak için [buraya]({0}) tıklayın.", + "typesInstallerInitializationFailed.doNotCheckAgain": "Tekrar Gösterme" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/utils/versionPicker.i18n.json b/i18n/trk/extensions/typescript-language-features/out/utils/versionPicker.i18n.json new file mode 100644 index 00000000000..bbccc6cfbc1 --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/utils/versionPicker.i18n.json @@ -0,0 +1,13 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "useVSCodeVersionOption": "VS Code'un Sürümünü Kullan", + "useWorkspaceVersionOption": "Çalışma Alanı Sürümünü Kullan", + "learnMore": "Daha Fazla Bilgi Edin", + "selectTsVersion": "JavaScript ve TypeScript dil özellikleri için kullanılacak TypeScript sürümünü seçin" +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/out/utils/versionProvider.i18n.json b/i18n/trk/extensions/typescript-language-features/out/utils/versionProvider.i18n.json new file mode 100644 index 00000000000..86f606ebb3a --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/out/utils/versionProvider.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "couldNotLoadTsVersion": "Bu yolda TypeScript sürümü yüklenemedi", + "noBundledServerFound": "VS Code'un tsserver'ı hatalı bir virüs tespit aracı gibi bir uygulama tarafından silindi. Lütfen VS Code'u yeniden yükleyin." +} \ No newline at end of file diff --git a/i18n/trk/extensions/typescript-language-features/package.i18n.json b/i18n/trk/extensions/typescript-language-features/package.i18n.json new file mode 100644 index 00000000000..452869e59fe --- /dev/null +++ b/i18n/trk/extensions/typescript-language-features/package.i18n.json @@ -0,0 +1,58 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "displayName": "TypeScript ve JavaScript Dili Özellikleri", + "description": "JavaScript ve TypeScript için zengin dil desteği sağlar.", + "typescript.reloadProjects.title": "Projeyi Yeniden Yükle", + "javascript.reloadProjects.title": "Projeyi Yeniden Yükle", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "İşlevleri parametre imzalarıyla tamamlayın.", + "typescript.tsdk.desc": "Kullanılacak tsserver ve lib*.d.ts dosyalarını içeren klasör yolunu belirtir.", + "typescript.disableAutomaticTypeAcquisition": "Otomatik tür kazanımını devre dışı bırakır. TypeScript >= 2.0.6 gerektirir.", + "typescript.tsserver.log": "TS sunucusunun bir dosyaya günlük yazmasını etkinleştirir. Bu günlük, TS Sunucu sorunlarını teşhis etmek için kullanılabilir. Günlük dosya yollarını, kaynak kodunu ve projenizdeki diğer muhtemel hassas bilgileri içerebilir.", + "typescript.tsserver.trace": "TS sunucusuna gönderilen mesajları izlemeyi etkinleştirir. Bu izleme, TS Sunucu sorunlarını teşhis etmek için kullanılabilir. İzleme; dosya yollarını, kaynak kodunu ve projenizdeki diğer muhtemel hassas bilgileri içerebilir.", + "typescript.validate.enable": "TypeScript doğrulamasını etkinleştir veya devre dışı bırak.", + "typescript.format.enable": "Varsayılan TypeScript biçimlendiricisini etkinleştirin/devre dışı bırakın.", + "javascript.format.enable": "Varsayılan JavaScript biçimlendiricisini etkinleştir veya devre dışı bırak.", + "format.insertSpaceAfterCommaDelimiter": "Virgül sınırlayıcısından sonra boşluk eklenmesini tanımlar.", + "format.insertSpaceAfterConstructor": "Oluşturucu anahtar kelimesinden sonra boşluk eklenip eklenmeyeceğini tanımlar. TypeScript >= 2.3.0 gerektirir.", + "format.insertSpaceAfterSemicolonInForStatements": "Bir ifade için noktalı virgülden sonra boşluk eklenmesini tanımlar.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Bir ikili operatöründen sonra boşluk eklenmesini tanımlar.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Bir kontrol akışı ifadesi için anahtar kelimelerden sonra boşluk eklenmesini tanımlar.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Anonim fonksiyonlar için \"function\" anahtar kelimesinden sonra boşluk eklenmesini tanımlar.", + "format.insertSpaceBeforeFunctionParenthesis": "Fonksiyon argüman parantezlerinden önce boşluk eklenmesini tanımlar. TypeScript >= 2.1.5 gerektirir.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Şablon dizesi ayraçları açıldıktan sonra ve kapatılmadan önce boşluk eklenmesini tanımlar. TypeScript >= 2.0.6 gerektirir.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "JSX ifadesi ayraçları açıldıktan sonra ve kapatılmadan önce boşluk eklenmesini tanımlar. TypeScript >= 2.0.6 gerektirir.", + "format.insertSpaceAfterTypeAssertion": "TypeScript'te tür iddialarından sonra boşluk eklenip eklenmeyeceğini tanımlar. TypeScript >= 2.4 gerektirir.", + "format.placeOpenBraceOnNewLineForFunctions": "Fonksiyonlarda bir açılış ayracının yeni satıra koyulup koyulmayacağını tanımlar.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Kontrol bloklarında bir açılış ayracının yeni satıra koyulup koyulmayacağını tanımlar.", + "javascript.validate.enable": "JavaScript doğrulamasını etkinleştir veya devre dışı bırak.", + "typescript.goToProjectConfig.title": "Proje Yapılandırmasına Git", + "javascript.goToProjectConfig.title": "Proje Yapılandırmasına Git", + "javascript.referencesCodeLens.enabled": "JavaScript dosyalarında başvuru kod objektifini etkinleştir veya devre dışı bırak.", + "typescript.referencesCodeLens.enabled": "TypeScript dosyalarında başvuru kod objektifini etkinleştir veya devre dışı bırak. TypeScript >= 2.0.6 gerektirir.", + "typescript.implementationsCodeLens.enabled": "Uygulama kod objektifini etkinleştir veya devre dışı bırak. TypeScript >= 2.2.0 gerektirir.", + "typescript.openTsServerLog.title": "TS Sunucu günlüğünü aç", + "typescript.restartTsServer": "TS sunucusunu yeniden başlat", + "typescript.selectTypeScriptVersion.title": "TypeScript Sürümünü Seç", + "typescript.reportStyleChecksAsWarnings": "Stil kontrollerini uyarı olarak bildir", + "jsDocCompletion.enabled": "Otomatik JSDoc yorumlarını etkinleştir veya devre dışı bırak.", + "javascript.implicitProjectConfig.checkJs": "JavaScript dosyalarının anlamsal kontrolünü etkinleştir veya devre dışı bırak. Mevcut jsconfig.json veya tsconfig.json dosyaları bu ayarı geçersiz kılar. TypeScript >= 2.3.1 gerektirir.", + "typescript.npm": "Otomatik Tür Kazanımı için kullanılacak NPM yürütülebilir dosyasının yolunu belirtir. TypeScript >= 2.3.4 gerektirir.", + "typescript.check.npmIsInstalled": "Otomatik Tür Kazanımı için NPM'in yüklü olup olmadığını kontrol et.", + "javascript.nameSuggestions": "JavaScript öneri listelerindeki dosyadan benzersiz adları eklemeyi etkinleştir veya devre dışı bırak.", + "typescript.tsc.autoDetect": "tsc görevlerinin otomatik algılanmasını denetler. 'off' bu özelliği devre dışı bırakır. 'build' sadece bir kez çalışan derleme görevleri oluşturur. 'watch' sadece derleme ve izleme görevleri oluşturur. 'on' derleme ve izleme görevlerinin her ikisini de oluşturur. Varsayılan 'on'dur. ", + "typescript.problemMatchers.tsc.label": "TypeScript sorunları", + "typescript.problemMatchers.tscWatch.label": "TypeScript sorunları (izleme modu)", + "typescript.quickSuggestionsForPaths": "Bir içe aktarım yolu girerken hızlı önerileri etkinleştir/devre dışı bırak.", + "typescript.locale": "TypeScript hatalarını bildirirken kullanılarak dili(bölgeyi) ayarlar. TypeScript >= 2.6.0 gerektirir. 'null' varsayılanı, TypeScript hataları için VS Code'un dil(bölge) ayarlarını kullanır.", + "javascript.implicitProjectConfig.experimentalDecorators": "Bir projenin parçası olmayan JavaScript dosyaları için deneysel dekoratörler ('experimentalDecorators') özelliğini etkinleştir veya devre dışı bırak. Mevcut jsconfig.json veya tsconfig.json dosyaları bu ayarı geçersiz kılar. TypeScript >= 2.3.1 gerektirir.", + "typescript.autoImportSuggestions.enabled": "Otomatik içe aktarım önerilerini etkinleştir/devre dışı bırak. TypeScript >= 2.6.1 gerektirir.", + "typescript.experimental.syntaxFolding": "Sözdimine duyarlı katlama işaretleyicilerini etkinleştirin/devre dışı bırakın.", + "taskDefinition.tsconfig.description": "TS derlemesini tanımlayan tsconfig dosyası." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/base/node/processes.i18n.json b/i18n/trk/src/vs/base/node/processes.i18n.json index 0debe2b0adb..35229bd6699 100644 --- a/i18n/trk/src/vs/base/node/processes.i18n.json +++ b/i18n/trk/src/vs/base/node/processes.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "TaskRunner.UNC": "UNC sürücüsünde kabuk komutu yürütülemez." + ] } \ No newline at end of file diff --git a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json index 285e792d6c3..bfc5cc5845c 100644 --- a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json +++ b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterMain.i18n.json @@ -11,7 +11,6 @@ "similarIssues": "Benzer sorunlar", "open": "Aç", "closed": "Kapalı", - "noResults": "Sonuç bulunamadı", "settingsSearchIssue": "Ayar Arama Sorunu", "bugReporter": "Hata Raporu", "featureRequest": "Özellik İsteği", diff --git a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json index 0045409477d..48797829bb8 100644 --- a/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json +++ b/i18n/trk/src/vs/code/electron-browser/issue/issueReporterPage.i18n.json @@ -8,6 +8,9 @@ ], "completeInEnglish": "Lütfen formu İngilizce olarak doldurunuz.", "issueTypeLabel": "Bu bir", + "vscode": "Visual Studio Code", + "disableExtensions": "tüm eklentileri devre dışı bırakıp pencereyi yeniden yükleyin", + "chooseExtension": "Eklenti", "issueTitleLabel": "Başlık", "issueTitleRequired": "Lütfen bir başlık girin.", "titleLengthValidation": "Başlık çok uzun.", @@ -18,13 +21,6 @@ "extensions": "Eklentilerim", "searchedExtensions": "Aranan Eklentiler", "settingsSearchDetails": "Ayar Arama Detayları", - "tryDisablingExtensions": "Eklentiler devre dışı bırakıldığında sorun yeniden oluşturulabiliyor mu?", - "yes": "Evet", - "no": "Hayır", - "disableExtensionsLabelText": "Sorunu {0} sonrasında yeniden oluşturmaya çalışın.", - "disableExtensions": "tüm eklentileri devre dışı bırakıp pencereyi yeniden yükleyin", - "showRunningExtensionsLabelText": "Bunun bir eklenti sorunu olduğundan şüpheleniyorsanız, eklentideki sorunu bildirmek için {0}.", - "showRunningExtensions": "çalışan tüm eklentileri göster", "details": "Lütfen detayları giriniz.", "loadingData": "Veri yükleniyor..." } \ No newline at end of file diff --git a/i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json b/i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json new file mode 100644 index 00000000000..d79aea5296a --- /dev/null +++ b/i18n/trk/src/vs/code/electron-browser/processExplorer/processExplorerMain.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "name": "Adı" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/browser/widget/diffReview.i18n.json b/i18n/trk/src/vs/editor/browser/widget/diffReview.i18n.json index d8b434e3625..fb4e78feb3a 100644 --- a/i18n/trk/src/vs/editor/browser/widget/diffReview.i18n.json +++ b/i18n/trk/src/vs/editor/browser/widget/diffReview.i18n.json @@ -7,7 +7,6 @@ "Do not edit this file. It is machine generated." ], "label.close": "Kapat", - "header": "Farklılık {0}/{1}: orijinal {2}, {3} satırları, değiştirilen {4}, {5} satırları", "blankLine": "boş", "equalLine": "orijinal {0}, değiştirilen {1}: {2}", "insertLine": "+ değiştirilen {0}: {1}", diff --git a/i18n/trk/src/vs/editor/common/commonCodeEditor.i18n.json b/i18n/trk/src/vs/editor/common/commonCodeEditor.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/src/vs/editor/common/commonCodeEditor.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json b/i18n/trk/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json new file mode 100644 index 00000000000..26213ddb84d --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/codeAction/codeActionCommands.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "quickFixWithKb": "Düzeltmeleri Göster ({0})", + "quickFix": "Düzeltmeleri Göster", + "organizeImports.label": "İçe Aktarımları Düzenle" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/editor/contrib/message/messageController.i18n.json b/i18n/trk/src/vs/editor/contrib/message/messageController.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/src/vs/editor/contrib/message/messageController.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/src/vs/platform/environment/node/argv.i18n.json b/i18n/trk/src/vs/platform/environment/node/argv.i18n.json index de45d35b28e..66361e3eb27 100644 --- a/i18n/trk/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/trk/src/vs/platform/environment/node/argv.i18n.json @@ -29,8 +29,6 @@ "performance": "'Geliştirici: Başlangıç Performansı' komutu etkinleştirilmiş olarak başlat.", "prof-startup": "Başlangıç sırasında CPU profil oluşturucusunu çalıştır", "disableExtensions": "Yüklü tüm eklentileri devre dışı bırak.", - "inspect-extensions": "Eklentilerde hata ayıklama ve ayrımlamaya izin ver. Bağlantı URI'ı için geliştirici araçlarını kontrol edin.", - "inspect-brk-extensions": "Eklentilerde hata ayıklama ve ayrımlamaya eklenti sunucusu başladıktan hemen sonra duraklatılacak şekilde izin ver. Bağlantı URI'ı için geliştirici araçlarını kontrol edin.", "disableGPU": "GPU donanım hızlandırmasını devre dışı bırak.", "uploadLogs": "Geçerli oturumdaki günlükleri güvenli bir uçbirime yükler.", "maxMemory": "Bir pencere için maksimum bellek miktarı (Mbyte olarak).", diff --git a/i18n/trk/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/trk/src/vs/platform/extensions/node/extensionValidator.i18n.json index cbe0edea7ae..6060ac3a06c 100644 --- a/i18n/trk/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/trk/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "versionSyntax": "`engines.vscode` değeri {0} ayrıştırılamadı. Lütfen örnekte verilenlere benzer ifadeler kullanın: ^0.10.0, ^1.2.3, ^0.11.0, ^0.10.x, vb.", "versionSpecificity1": "`engines.vscode`da belirtilen sürüm ({0}) yeterince belirli değil. vscode 1.0.0'dan önceki sürümler için, lütfen istenecek minimum majör ve minör sürüm numarasını tanımlayın. Örneğin: ^0.10.0, 0.10.x, 0.11.0, vb.", "versionSpecificity2": "`engines.vscode`da belirtilen sürüm ({0}) yeterince belirli değil. vscode 1.0.0'dan sonraki sürümler için, lütfen istenecek minimum majör sürüm numarasını tanımlayın. Örneğin: ^1.10.0, 1.10.x, 1.x.x, 2.x.x, vb.", "versionMismatch": "Eklenti, Code {0} ile uyumlu değil. Gereken sürüm: {1}." diff --git a/i18n/trk/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/trk/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json index e6399c3a740..6cac235b96e 100644 --- a/i18n/trk/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json +++ b/i18n/trk/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "integrity.prompt": "{0} kurulumunuz bozuk görünüyor. Lütfen yeniden yükleyin.", "integrity.moreInformation": "Daha Fazla Bilgi", - "integrity.dontShowAgain": "Tekrar Gösterme", - "integrity.prompt": "{0} kurulumunuz bozuk görünüyor. Lütfen yeniden yükleyin." + "integrity.dontShowAgain": "Tekrar Gösterme" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json new file mode 100644 index 00000000000..dd01b6be52a --- /dev/null +++ b/i18n/trk/src/vs/workbench/api/browser/viewsContainersExtensionPoint.i18n.json @@ -0,0 +1,12 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "requirestring": "`{0}` özelliği zorunludur ve `string` türünde olmalıdır", + "showViewlet": "{0}'i Göster", + "view": "Görüntüle" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 5b6a365ee4b..0369e1260ea 100644 --- a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -15,7 +15,6 @@ "vscode.extension.contributes.views": "Görünümleri düzenleyiciye ekler.", "views.explorer": "Gezgin Görünümü", "views.debug": "Hata Ayıklama Görünümü", - "locationId.invalid": "`{0}` geçerli bir görünüm konumu değil", - "duplicateView1": "`{1}` konumunda aynı `{0}` kimliğine sahip birden çok görünüm kaydedilemiyor", - "duplicateView2": "`{0}` kimliğine sahip bir görünüm `{1}` konumunda zaten kayıtlı" + "duplicateView1": "`{1}` konumunda aynı `{0}` id'sine sahip birden çok görünüm kaydedilemiyor", + "duplicateView2": "`{0}` id'sine sahip bir görünüm `{1}` konumunda zaten kayıtlı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json b/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json index 77c86b9a0b6..3f98c05062b 100644 --- a/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json +++ b/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "timeout.formatOnSave": "Kaydederken biçimlendirme {0}ms sonrasında durduruldu", + "timeout.onWillSave": "onWillSaveTextDocument olayı 1750ms sonrasında durduruldu", "saveParticipants": "Katılımcıların Kaydedilmesi İşlemi Çalıştırılıyor..." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json b/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json index 4c6d2775a03..35229bd6699 100644 --- a/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json +++ b/i18n/trk/src/vs/workbench/api/electron-browser/mainThreadWebview.i18n.json @@ -5,6 +5,5 @@ "Licensed under the MIT License. See License.txt in the project root for license information.", "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." - ], - "webview.editor.label": "web görünümü düzenleyicisi" + ] } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/trk/src/vs/workbench/api/node/extHostTreeViews.i18n.json index d8a7f990546..45dce70f0b9 100644 --- a/i18n/trk/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/trk/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "treeView.notRegistered": "Kayıtlı '{0}' Id'li ağaç görünümü yok.", - "treeView.duplicateElement": "{0} kimliğine sahip bir öge zaten kayıtlı" + "treeView.duplicateElement": "{0} id'sine sahip bir öge zaten kayıtlı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index d89fb0f61b9..d7d8c7f9437 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -17,10 +17,9 @@ "screenReaderDetectedExtra": "Bir Ekran Okuyucu kullanmıyorsanız, lütfen `editor.accessibilitySupport` ayarını \"off\" olarak değiştirin", "disableTabMode": "Erişilebilirlik Modunu Devre Dışı Bırak", "gotoLine": "Satıra Git", - "indentation": "Girinti", "selectEncoding": "Kodlamayı Seç", "selectEOL": "Satır Sonu Sıralamasını Seç", - "selectLanguageMode": "Dil Modunu Seçin", + "selectLanguageMode": "Dil Modunu Seç", "fileInfo": "Dosya Bilgisi", "spacesSize": "Boşluk: {0}", "tabSize": "Sekme Boyutu: {0}", @@ -33,9 +32,9 @@ "configureModeSettings": "'{0}' dili tabanlı ayarları yapılandır...", "configureAssociationsExt": "'{0}' için Dosya İlişkilendirmesini Yapılandır...", "autoDetect": "Otomatik Algıla", - "pickLanguage": "Dil Modunu Seçin", + "pickLanguage": "Dil Modunu Seç", "currentAssociation": "Geçerli İlişkilendirme", - "pickLanguageToConfigure": " '{0}' ile İlişkilendirilecek Dil Modunu Seçin", + "pickLanguageToConfigure": "'{0}' ile İlişkilendirilecek Dil Modunu Seç", "changeIndentation": "Girintiyi Değiştir", "noWritableCodeEditor": "Aktif kod düzenleyici salt okunur.", "indentView": "görünümü değiştir", diff --git a/i18n/trk/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json index 4e305d89305..9428ff84bf5 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/editor/resourceViewer.i18n.json @@ -11,9 +11,7 @@ "sizeMB": "{0}MB", "sizeGB": "{0}GB", "sizeTB": "{0}TB", - "largeImageError": "Resim dosyası boyutu düzenleyicide görüntülemek için çok büyük (>1MB).", "resourceOpenExternalButton": "Harici program kullanarak resmi aç", - "nativeBinaryError": "Dosya ikili olduğu, çok büyük olduğu veya desteklenmeyen bir metin kodlaması kullandığı için düzenleyicide görüntülenemiyor.", "zoom.action.fit.label": "Resmin Tamamı", "imgMeta": "{0}x{1} {2}" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json new file mode 100644 index 00000000000..205a210e0cd --- /dev/null +++ b/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInput.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "ok": "Tamam" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/src/vs/workbench/browser/parts/quickinput/quickInputBox.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/common/views.i18n.json b/i18n/trk/src/vs/workbench/common/views.i18n.json index 08f2962090b..352d616cb23 100644 --- a/i18n/trk/src/vs/workbench/common/views.i18n.json +++ b/i18n/trk/src/vs/workbench/common/views.i18n.json @@ -6,5 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "duplicateId": "'{0}' kimliğine sahip bir görünüm '{1}' konumunda zaten kayıtlı" + "duplicateId": "'{0}' id'sine sahip bir görünüm '{1}' konumunda zaten kayıtlı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json index 8653d808605..f55bdf21090 100644 --- a/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -45,10 +45,17 @@ "windowConfigurationTitle": "Pencere", "window.openFilesInNewWindow.on": "Dosyalar yeni bir pencerede açılacak", "window.openFilesInNewWindow.off": "Dosyalar, dosyaların klasörünün olduğu pencerede veya son aktif pencerede açılacak", + "window.openFilesInNewWindow.defaultMac": "Dosyalar, Dock veya Finder'dan açılmadıkça, dosyaların klasörünün olduğu pencerede veya son aktif pencerede açılacak", + "window.openFilesInNewWindow.default": "Dosyalar, uygulama içinden seçilmedikçe (ör. Dosya menüsünden) yeni bir pencerede açılır", + "openFilesInNewWindowMac": "Dosyaların yeni bir pencerede açılıp açılmayacağını denetler.\n- default: dosyalar, Dock veya Finder'dan açılmadıkça, dosyaların klasörünün olduğu pencerede veya son aktif pencerede açılacak\n- on: dosyalar yeni bir pencerede açılacak\n- off: dosyalar, dosyaların klasörünün olduğu pencerede veya son aktif pencerede açılacak\nBu ayarın halen yok sayılacağı durumlar olabilir (ör. -new-window veya -reuse-window komut satırı seçenekleri kullanılırken).", + "openFilesInNewWindow": "Dosyaların yeni bir pencerede açılıp açılmayacağını denetler.\n- default: dosyalar, uygulama içinden seçilmedikçe (ör. Dosya menüsünden) yeni bir pencerede açılır\n- on: dosyalar yeni bir pencerede açılır\n- off: dosyalar, dosyaların klasörünün olduğu pencerede veya son aktif pencerede açılır\nBu ayarın halen yok sayılacağı durumlar olabilir (ör. -new-window veya -reuse-window komut satırı seçenekleri kullanılırken).", "window.openFoldersInNewWindow.on": "Klasörler yeni bir pencerede açılacak", "window.openFoldersInNewWindow.off": "Klasörler son aktif pencereyi değiştirir", "window.openFoldersInNewWindow.default": "Klasörler, bir klasör uygulama içinden seçilmedikçe (ör. Dosya menüsünden) yeni bir pencerede açılır", "openFoldersInNewWindow": "Klasörlerin yeni bir pencerede mi açılacağını yoksa son aktif pencereyi mi değiştireceğini denetler.\n- default: klasörler, bir klasör uygulama içinden seçilmedikçe (ör. Dosya menüsünden) yeni bir pencerede açılır\n- on: klasörler yeni bir pencerede açılır\n- off: klasörler son aktif pencereyi değiştirir\nBu ayarın halen yok sayılacağı durumlar olabilir (ör. -new-window veya -reuse-window komut satırı seçenekleri kullanılırken).", + "window.openWithoutArgumentsInNewWindow.on": "Yeni bir pencere aç", + "window.openWithoutArgumentsInNewWindow.off": "Son aktif çalışan örneğe odakla", + "openWithoutArgumentsInNewWindow": "Yeni bir örnek argümansız olarak başlatılırken boş bir yeni pencerenin açılıp açılmamasını veya son çalışan örneğe odaklanıp odaklanmamasını denetler.\n- on: boş bir yeni pencere aç\n- off: son çalışan örneğe odakla\nBu ayarın halen yok sayılacağı durumlar olabilir (ör. -new-window veya -reuse-window komut satırı seçenekleri kullanılırken).", "window.reopenFolders.all": "Tüm pencereleri yeniden aç.", "window.reopenFolders.folders": "Tüm klasörleri yeniden aç. Boş çalışma alanları geri yüklenmeyecektir.", "window.reopenFolders.one": "Son aktif pencereyi yeniden aç.", @@ -56,6 +63,7 @@ "restoreWindows": "Pencerelerin, bir yeniden başlatma sonrası nasıl yeniden açılacağını denetler. Her zaman boş bir çalışma alanı ile başlamak için 'none', üzerinde çalıştığınız son pencereyi yeniden açmak için 'one', açık klasör bulunduran tüm pencereleri yeniden açmak için 'folders' veya son oturumunuzdaki tüm pencereleri yeniden açmak için 'all' seçeneğini seçin.", "restoreFullscreen": "Bir pencere tam ekran modundayken çıkıldıysa, bu pencerenin tam ekran moduna geri dönüp dönmeyeceğini denetler.", "zoomLevel": "Pencerenin yakınlaştırma düzeyini ayarlayın. Orijinal boyut 0'dır ve üstündeki (ör. 1) veya altındaki (ör. -1) her artırma 20% daha fazla veya az yakınlaştırmayı temsil eder. Yakınlaştırma düzeyini daha ince ayrıntılarla ayarlamak için ondalık değerler de girebilirsiniz.", + "title": "Pencere başlığını aktif düzenleyiciye bağlı olarak denetler. Değişkenler, bağlama göre değiştirilir:\n${activeEditorShort}: dosyanın adı (ör. myFile.txt)\n${activeEditorMedium}: çalışma alanı klasörüne göreli dosyanın yolu (ör. myFolder/myFile.txt)\n${activeEditorLong}: dosyanın tam yolu (ör. /Users/Development/myProject/myFolder/myFile.txt)\n${folderName}: dosyayı içeren çalışma alanı klasörünün adı (ör. myFolder)\n${folderPath}: dosyayı içeren çalışma alanı klasörünün yolu (ör. /Users/Development/myFolder)\n${rootName}: çalışma alanının adı (ör. myFolder veya myWorkspace)\n${rootPath}: çalışma alanının yolu (ör. /Users/Development/myWorkspace)\n${appName}: ör. VS Code\n${dirty}: etkin düzenleyici kaydedilmemiş değişiklikler içeriyorsa, değişiklik göstergesi\n${separator}: şartlı ayırıcı (\" - \") yalnızca değer veya statik metin içeren değişkenlerle çevrili olduğunda gösterilir", "window.newWindowDimensions.default": "Yeni pencereleri ekranın ortasında açın.", "window.newWindowDimensions.inherit": "Yeni pencereleri son aktif pencere ile aynı ölçülerde açın.", "window.newWindowDimensions.maximized": "Yeni pencereleri ekranı kapla modunda açın.", @@ -71,6 +79,7 @@ "autoDetectHighContrast": "Etkinleştirilirse; eğer Windows bir yüksek karşıtlık teması kullanıyorsa, otomatik olarak yüksek karşıtlık temasına geçiş yapılır; ve Windows, yüksek karşıtlık temasını kullanmayı bıraktığında koyu temaya geçiş yapılır.", "titleBarStyle": "Pencere başlık çubuğunun görünümünü ayarlayın. Değişikliklerin uygulanması için tam yeniden başlatma gerekir.", "window.nativeTabs": "macOS Sierra pencere sekmelerini etkinleştirir. Değişikliklerin uygulanması için tam yeniden başlatma gerekeceğini ve yerel sekmelerin, eğer yapılandırılmışsa özel başlık çubuğu stilini devre dışı bıracağını unutmayın.", + "window.smoothScrollingWorkaround": "Simge durumuna küçültülmüş bir VS Code penceresini tekrar açtıktan sonra kaydırma artık pürüzsüz değilse bu geçici çözümü etkinleştirin. Bu, Microsoft'un Surface cihazları gibi hassas trackpad'ler içeren cihazlarda yaşanan kaydırma gecikmesi sorunu (https://github.com/Microsoft/vscode/issues/13612) için geçici bir çözümdür.", "zenModeConfigurationTitle": "Zen Modu", "zenMode.fullScreen": "Zen Moduna geçmenin ayrıca çalışma ekranını tam ekran moduna geçirip geçirmeyeceğini denetler.", "zenMode.centerLayout": "Zen Modu'nun aktif edilmesinin düzeni ortalayıp ortalamayacağını denetler.", diff --git a/i18n/trk/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json index 7be66e01426..8b50a979878 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/browser/breakpointsView.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editConditionalBreakpoint": "Kesme Noktasını Düzenle...", "functionBreakpointsNotSupported": "Fonksiyon kesme noktaları bu hata ayıklama türü tarafından desteklenmiyor", "functionBreakpointPlaceholder": "Mola verilecek fonksiyon", "functionBreakPointInputAriaLabel": "Fonksiyon kesme noktasını girin", @@ -14,6 +13,7 @@ "breakpointUnverifieddHover": "Doğrulanmamış kesme noktası", "functionBreakpointUnsupported": "Fonksiyon kesme noktaları bu hata ayıklama türü tarafından desteklenmiyor", "breakpointDirtydHover": "Doğrulanmamış Kesme Noktası Dosya düzenlendi, lütfen hata ayıklama oturumunu yeniden başlatın.", + "logBreakpointUnsupported": "Günlük noktaları bu hata ayıklama türü tarafından desteklenmiyor", "conditionalBreakpointUnsupported": "Koşullu kesme noktaları bu hata ayıklama türü tarafından desteklenmiyor", "hitBreakpointUnsupported": "Koşullu kesme noktalarına isabet etme bu hata ayıklama türü tarafından desteklenmiyor" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json index b06dcece797..015958ac4d9 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -8,6 +8,7 @@ ], "toggleBreakpointAction": "Hata Ayıklama: Kesme Noktası Ekle/Kaldır", "conditionalBreakpointEditorAction": "Hata Ayıklama: Koşullu Kesme Noktası Ekle...", + "logPointEditorAction": "Hata Ayıklama: Günlük Noktası Ekle...", "runToCursor": "İmlece Kadar Çalıştır", "debugEvaluate": "Hata Ayıklama: Değerlendir", "debugAddToWatch": "Hata Ayıklama: İzlemeye Ekle", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json index 30a355a88d6..d8d0b352bf7 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.i18n.json @@ -8,8 +8,6 @@ ], "breakpointWidgetHitCountPlaceholder": "İsabet sayısı koşulu sağlandığında mola ver. Kabul etmek için 'Enter', iptal etmek için 'Esc' tuşuna basın.", "breakpointWidgetExpressionPlaceholder": "İfade değerlendirmesi doğru olduğunda mola ver. Kabul etmek için 'Enter', iptal etmek için 'Esc' tuşuna basın.", - "breakpointWidgetHitCountAriaLabel": "Program, burada sadece isabet sayısı koşulu sağlandığında durur. Kabul etmek için Enter veya iptal etmek için Escape tuşuna basın. ", - "breakpointWidgetAriaLabel": "Program, burada sadece bu koşul doğruysa durur. Kabul etmek için Enter veya iptal etmek için Escape tuşuna basın. ", "expression": "İfade", "hitCount": "İsabet Sayısı", "logMessage": "Günlük Mesajı" diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index a8cf3c979b7..a208d169e68 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -35,7 +35,6 @@ "useUniqueNames": "Lütfen benzersiz yapılandırma adları kullanın.", "app.launch.json.compound.folder": "Bileşiğin bulunduğu klasörün adı.", "app.launch.json.compounds.configurations": "Bu bileşiğin parçası olarak başlatılacak yapılandırmaların adları.", - "debugNoType": "Hata ayıklama bağdaştırıcısının 'type' ögesi atlanabilir veya 'dize' türünde olmalıdır.", "selectDebug": "Ortam Seçin", "DebugConfig.failed": " '.vscode' klasörü içinde 'launch.json' dosyası oluşturulamıyor ({0}).", "workspace": "çalışma alanı", diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json index 05751eef2fe..ad2bc971edf 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -6,9 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "editBreakpoint": "Kesme Noktasını Düzenle...", - "disableBreakpoint": "Kesme Noktasını Devre Dışı Bırak", - "enableBreakpoint": "Kesme Noktasını Etkinleştir", "removeBreakpoints": "Kesme Noktalarını Kaldır", "removeBreakpointOnColumn": "{0}. Sütundaki Kesme Noktasını Kaldır", "removeLineBreakpoint": "Satır Kesme Noktasını Kaldır", @@ -21,6 +18,8 @@ "enableBreakpoints": "{0}. Sütundaki Kesme Noktasını Etkinleştir", "enableBreakpointOnLine": "Satır Kesme Noktasını Etkinleştir", "addBreakpoint": "Kesme Noktası Ekle", - "conditionalBreakpoint": "Koşullu Kesme Noktası Ekle...", + "addConditionalBreakpoint": "Koşullu Kesme Noktası Ekle...", + "addLogPoint": "Günlük Noktası Ekle...", + "cancel": "İptal", "addConfiguration": "Yapılandırma Ekle..." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 7a4c4a13ddb..3b4248d45e7 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -28,5 +28,7 @@ "preLaunchTaskExitCode": "'{0}' ön başlatma görevi {1} çıkış koduyla sonlandı.", "showErrors": "Hataları Göster", "noFolderWorkspaceDebugError": "Aktif dosyada hata ayıklama yapılamıyor. Lütfen, dosyanın diskte kayıtlı olduğundan ve bu dosya türü için hata ayıklama eklentinizin olduğundan emin olun.", - "cancel": "İptal" + "cancel": "İptal", + "DebugTaskNotFound": "'{0}' görevi bulunamadı.", + "taskNotTracked": "'{0}' görevi izlenemez." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json index 4a7eda0e464..9ae9577ae78 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -7,8 +7,5 @@ "Do not edit this file. It is machine generated." ], "moreInfo": "Daha Fazla Bilgi", - "unableToLaunchDebugAdapter": "'{0}' tarafından hata ayıklama bağdaştırıcısı başlatılamadı.", - "unableToLaunchDebugAdapterNoArgs": "Hata ayıklama bağdaştırıcısı başlatılamıyor.", - "stoppingDebugAdapter": "{0}. Hata ayıklama bağdaştırıcısı durduruluyor.", "debugAdapterCrash": "Hata ayıklama bağdaştırıcısı beklenmeyen biçimde sonlandırıldı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index cf227b35676..a61ef28f2c1 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -8,19 +8,6 @@ ], "debugAdapterBinNotFound": "Hata ayıklama bağdaştırıcısı yürütülebilir dosyası '{0}', mevcut değil.", "debugAdapterCannotDetermineExecutable": "Hata ayıklama bağdaştırıcısı yürütülebilir dosyası '{0}' belirlenemedi.", - "launch.config.comment1": "Olası öznitelikler hakkında bilgi edinmek için IntelliSense kullanın.", - "launch.config.comment2": "Mevcut özniteliklerin açıklamalarını görmek için fare ile üzerine gelin.", - "launch.config.comment3": "Daha fazla bilgi için ziyaret edin: {0}", - "debugType": "Yapılandırma türü.", - "debugTypeNotRecognised": "Hata ayıklama türü tanınmıyor. Karşılık gelen hata ayıklama uzantısı yüklemiş olduğunuzdan ve etkinleştirildiğinden emin olun.", - "node2NotSupported": "\"node2\" artık desteklenmiyor, bunun yerine \"node\" kullanın ve \"protocol\" özniteliğini \"inspector\" olarak ayarlayın.", - "debugName": "Yapılandırmanın adı; başlatma yapılandırması açılır kutu menüsünde görünür.", - "debugRequest": "Yapılandırmanın istek türü. \"launch\" veya \"attach\" olabilir.", - "debugServer": "Sadece eklenti geliştirme hata ayıklaması için: eğer port belirtildiyse; Vs Code, bir hata ayıklama bağdaştırıcısına sunucu modunda bağlanmayı dener", - "debugPrelaunchTask": "Hata ayıklama oturumu başlamadan önce çalıştırılacak görev.", - "debugPostDebugTask": "Hata ayıklama oturumu sona erdikten sonra çalıştırılacak görev.", - "debugWindowsConfiguration": "Windows'a özel başlangıç yapılandırması öznitelikleri.", - "debugOSXConfiguration": "OS X'e özel başlangıç yapılandırması öznitelikleri.", - "debugLinuxConfiguration": "Linux'a özel başlangıç yapılandırması öznitelikleri.", - "deprecatedVariables": "'env.', 'config.' ve 'command.' kullanım dışıdır, bunların yerine 'env:', 'config:' ve 'command:' kulanın." + "unableToLaunchDebugAdapter": "'{0}' tarafından hata ayıklama bağdaştırıcısı başlatılamadı.", + "unableToLaunchDebugAdapterNoArgs": "Hata ayıklama bağdaştırıcısı başlatılamıyor." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json new file mode 100644 index 00000000000..7c6fe0bcc31 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/debug/node/debugger.i18n.json @@ -0,0 +1,23 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "launch.config.comment1": "Olası öznitelikler hakkında bilgi edinmek için IntelliSense kullanın.", + "launch.config.comment2": "Mevcut özniteliklerin açıklamalarını görmek için fare ile üzerine gelin.", + "launch.config.comment3": "Daha fazla bilgi için ziyaret edin: {0}", + "debugType": "Yapılandırma türü.", + "debugTypeNotRecognised": "Hata ayıklama türü tanınmıyor. Karşılık gelen hata ayıklama uzantısı yüklemiş olduğunuzdan ve etkinleştirildiğinden emin olun.", + "node2NotSupported": "\"node2\" artık desteklenmiyor, bunun yerine \"node\" kullanın ve \"protocol\" özniteliğini \"inspector\" olarak ayarlayın.", + "debugName": "Yapılandırmanın adı; başlatma yapılandırması açılır kutu menüsünde görünür.", + "debugRequest": "Yapılandırmanın istek türü. \"launch\" veya \"attach\" olabilir.", + "debugServer": "Sadece eklenti geliştirme hata ayıklaması için: eğer port belirtildiyse; Vs Code, bir hata ayıklama bağdaştırıcısına sunucu modunda bağlanmayı dener", + "debugPrelaunchTask": "Hata ayıklama oturumu başlamadan önce çalıştırılacak görev.", + "debugWindowsConfiguration": "Windows'a özel başlangıç yapılandırması öznitelikleri.", + "debugOSXConfiguration": "OS X'e özel başlangıç yapılandırması öznitelikleri.", + "debugLinuxConfiguration": "Linux'a özel başlangıç yapılandırması öznitelikleri.", + "deprecatedVariables": "'env.', 'config.' ve 'command.' kullanım dışıdır, bunların yerine 'env:', 'config:' ve 'command:' kulanın." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/node/terminals.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/node/terminals.i18n.json new file mode 100644 index 00000000000..4fbca0dfa72 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/debug/node/terminals.i18n.json @@ -0,0 +1,14 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "console.title": "VS Code Konsolu", + "mac.terminal.script.failed": "'{0}' betiği, {1} çıkış koduyla başarısız oldu", + "mac.terminal.type.not.supported": "'{0}' desteklenmiyor", + "press.any.key": "Devam etmek için bir tuşa basın ...", + "linux.term.failed": "'{0}', {1} çıkış koduyla başarısız oldu" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index ef58948ca49..69722eca3ee 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -60,6 +60,7 @@ "malicious": "Kötü amaçlı", "disabled": "Devre Dışı", "disabled globally": "Devre Dışı", + "disabled workspace": "Bu Çalışma Alanı için Devre Dışı Bırakılmış", "disableAll": "Yüklü Tüm Eklentileri Devre Dışı Bırak", "disableAllWorkspace": "Bu Çalışma Alanı için Yüklü Tüm Eklentileri Devre Dışı Bırak", "enableAll": "Tüm Eklentileri Etkinleştir", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json index e72bf637256..dececc5e110 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.i18n.json @@ -35,13 +35,11 @@ "view name": "Adı", "view location": "Yeri", "localizations": "Çeviriler ({0})", - "localizations language id": "Dil Kimliği", - "localizations language name": "Dil Adı", - "localizations localized language name": "Dil Adı (Çevrilen Dilde)", + "localizations language id": "Dil Id'si", "colorThemes": "Renk Temaları ({0})", "iconThemes": "Simge Temaları ({0})", "colors": "Renkler ({0})", - "colorId": "Kimlik", + "colorId": "Id", "defaultDark": "Koyu Varsayılan", "defaultLight": "Açık Varsayılan", "defaultHC": "Yüksek Karşıtlık Varsayılan", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index f497a3c8bb1..61f68f56bb4 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -15,8 +15,8 @@ "workspaceRecommendation": "Bu eklenti geçerli çalışma alanı kullanıcıları tarafından tavsiye ediliyor.", "reallyRecommended2": "'{0}' eklentisi bu dosya türü için tavsiye edilir.", "reallyRecommendedExtensionPack": "'{0}' eklenti paketi bu dosya türü için tavsiye edilir.", - "showRecommendations": "Tavsiyeleri Göster", "install": "Yükle", + "showRecommendations": "Tavsiyeleri Göster", "showLanguageExtensions": "Markette '.{0}' dosyaları için yardımcı olabilecek eklentiler bulunuyor", "workspaceRecommended": "Bu çalışma alanı bazı eklentileri tavsiye ediyor.", "installAll": "Tümünü Yükle", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index f2540380575..30c88b423ce 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -8,7 +8,5 @@ ], "disableOtherKeymapsConfirmation": "Tuş bağlamlarında çakışmalardan kaçınmak için diğer tuş haritaları ({0}) devre dışı bırakılsın mı?", "yes": "Evet", - "no": "Hayır", - "betterMergeDisabled": "\"Better Merge\" artık yerleşik bir eklenti, yüklenen eklendi devre dışı bırakıldı ve kaldırılabilir.", - "uninstall": "Kaldır" + "no": "Hayır" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 8a7b64b5ad3..0a617d5d5c3 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -12,6 +12,8 @@ "recommendedExtensions": "Tavsiye Edilen", "otherRecommendedExtensions": "Diğer Tavsiyeler", "workspaceRecommendedExtensions": "Çalışma Alanı Tavsiyeleri", + "builtInExtensions": "Özellikler", + "builtInThemesExtensions": "Temalar", "searchExtensions": "Markette Eklenti Ara", "sort by installs": "Sırala: Yüklenme Sayısına Göre", "sort by rating": "Sırala: Derecelendirmeye Göre", diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json index e0b425c8efd..5867f17bd1f 100644 --- a/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/fileActions.i18n.json @@ -27,12 +27,17 @@ "confirmMoveTrashMessageMultiple": "Aşağıdaki {0} dosyayı silmek istediğinizden emin misiniz?", "confirmMoveTrashMessageFolder": "'{0}' ve içindekileri silmek istediğinizden emin misiniz?", "confirmMoveTrashMessageFile": "'{0}' öğesini silmek istediğinize emin misiniz?", + "undoBin": "Geri Dönüşüm Kutusu'ndan geri alabilirsiniz.", + "undoTrash": "Çöp Kutusu'ndan geri alabilirsiniz.", "doNotAskAgain": "Bir daha sorma", "confirmDeleteMessageMultiple": "Aşağıdaki {0} dosyayı kalıcı olarak silmek istediğinizden emin misiniz?", "confirmDeleteMessageFolder": "'{0}' öğesini ve içindekileri kalıcı olarak silmek istediğinizden emin misiniz?", "confirmDeleteMessageFile": "'{0}' öğesini kalıcı olarak silmek istediğinizden emin misiniz?", "irreversible": "Bu eylem geri döndürülemez!", - "importFiles": "Dosya İçe Aktar", + "binFailed": "Geri Dönüşüm Kutusu'nu kullanarak silme başarısız oldu. Bunun yerine, kalıcı olarak silmek ister misiniz?", + "trashFailed": "Çöp Kutusu'nu kullanarak silme başarısız oldu. Bunun yerine, kalıcı olarak silmek ister misiniz?", + "deletePermanentlyButtonLabel": "&&Kalıcı Olarak Sil", + "retryButtonLabel": "&&Yeniden Dene", "confirmOverwrite": "Hedef klasörde aynı ada sahip bir dosya veya klasör zaten var. Değiştirmek istiyor musunuz?", "replaceButtonLabel": "&&Değiştir", "fileIsAncestor": "Yapıştırılacak dosya hedef klasörün atalarından biridir", diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json index 16f13358790..b2f872d687b 100644 --- a/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/files.contribution.i18n.json @@ -37,6 +37,7 @@ "defaultLanguage": "Yeni dosyalara atanan varsayılan dil modu.", "editorConfigurationTitle": "Düzenleyici", "formatOnSave": "Dosyayı kaydederken biçimlendir. Bir biçimlendirici mevcut olmalıdır, dosya otomatik olarak kaydedilmemelidir, ve düzenleyici kapanmıyor olmalıdır.", + "formatOnSaveTimeout": "Dosyayı kaydederken biçimlendirme zaman aşımı. formatOnSave komutlarında kullanılacak milisaniye cinsinden zaman limiti. Belirtilen zaman aşımından daha uzun süren komutlar iptal edilecektir.", "explorerConfigurationTitle": "Dosya Gezgini", "openEditorsVisible": "Açık Düzenleyiciler bölmesinde gösterilen düzenleyici sayısı.", "autoReveal": "Gezginin dosyaları açarken, onları otomatik olarak ortaya çıkartmasını ve seçmesini denetler.", diff --git a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json index cc968719081..8953d418928 100644 --- a/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.i18n.json @@ -7,13 +7,14 @@ "Do not edit this file. It is machine generated." ], "fileInputAriaLabel": "Dosya adı girin. Onaylamak için Enter'a, iptal etmek için Escape tuşuna basın.", - "constructedPath": "**{1}** içinde {0} oluştur", "filesExplorerViewerAriaLabel": "{0}, Dosya Gezgini", "dropFolders": "Klasörleri çalışma alanına eklemek istiyor musunuz?", "dropFolder": "Klasörü çalışma alanına eklemek istiyor musunuz?", "addFolders": "Klasörleri &&Ekle", "addFolder": "Klasörü &&Ekle", + "confirmRootsMove": "Çalışma alanınızdaki birden çok kök dizinin sırasını değiştirmek istediğinizden emin misiniz?", "confirmMultiMove": "Aşağıdaki {0} dosyayı taşımak istediğinizden emin misiniz?", + "confirmRootMove": "Çalışma alanınızdaki '{0}' kök dizininin sırasını değiştirmek istediğinizden emin misiniz?", "confirmMove": "'{0}' ögesini taşımak istediğinizden emin misiniz?", "doNotAskAgain": "Bir daha sorma", "moveButtonLabel": "&&Taşı", diff --git a/i18n/trk/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json index 7fe7d2ea049..ea26bcd9db3 100644 --- a/i18n/trk/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/localizations/browser/localizations.contribution.i18n.json @@ -6,16 +6,17 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "updateLocale": "VS Code'un kullanıcı arayüzü dilini {0} olarak değiştirip yeniden başlatmak ister misiniz?", "yes": "Evet", "no": "Hayır", - "doNotAskAgain": "Bir daha sorma", + "neverAgain": "Tekrar Gösterme", "JsonSchema.locale": "Kullanılacak Kullanıcı Arayüzü Dili.", "vscode.extension.contributes.localizations": "Düzenleyiciye yerelleştirmeleri ekler", - "vscode.extension.contributes.localizations.languageId": "Görüntülenen dizelerin çevrileceği dilin kimliği.", + "vscode.extension.contributes.localizations.languageId": "Görüntülenen dizelerin çevrileceği dilin id'si.", "vscode.extension.contributes.localizations.languageName": "Dilin İngilizcedeki adı.", "vscode.extension.contributes.localizations.languageNameLocalized": "Dilin eklenen dildeki adı.", "vscode.extension.contributes.localizations.translations": "Bu dille ilişkili çevirilerin listesi.", - "vscode.extension.contributes.localizations.translations.id": "Bu çevirinin ekleneceği VS Code veya Eklenti kimliği. VS Code kimliği her zaman `vscode` şeklindedir ve eklenti ise `yayinciAdi.eklentiAdi` biçiminde olmalıdır.", - "vscode.extension.contributes.localizations.translations.id.pattern": "Kimlik, VS Code çevirisi için `vscode` olmalı veya eklenti çevirisi için `yayinciAdi.eklentiAdi` biçiminde olmalıdır.", + "vscode.extension.contributes.localizations.translations.id": "Bu çevirinin ekleneceği VS Code veya Eklenti id'si. VS Code id'si her zaman`vscode` şeklindedir ve eklenti `yayinciAdi.eklentiAdi` formatında olmalıdır.", + "vscode.extension.contributes.localizations.translations.id.pattern": "Id, VS Code çevirisi için `vscode` olmalı veya eklenti çevirisi için `yayinciAdi.eklentiAdi` biçiminde olmalıdır.", "vscode.extension.contributes.localizations.translations.path": "Dilin çevirilerini içeren dosyaya göreli yol." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json index 0bdba9b12bf..45570f731d6 100644 --- a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.contribution.i18n.json @@ -7,5 +7,5 @@ "Do not edit this file. It is machine generated." ], "copyMarker": "Kopyala", - "copyMarkerMessage": "Mesajı Kopyala" + "copyMessage": "Mesajı Kopyala" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json index 03c12e0efce..a84cf939af0 100644 --- a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markers.i18n.json @@ -6,6 +6,5 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "totalProblems": "Toplam {0} Sorun", - "filteredProblems": "{1} Sorundan {0} Tanesi Gösteriliyor" + "totalProblems": "Toplam {0} Sorun" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanel.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json new file mode 100644 index 00000000000..35229bd6699 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.i18n.json @@ -0,0 +1,9 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ] +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json index 8910520ca78..2835343e395 100644 --- a/i18n/trk/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/markers/electron-browser/messages.i18n.json @@ -14,9 +14,8 @@ "markers.panel.title.problems": "Sorunlar", "markers.panel.aria.label.problems.tree": "Dosyalara göre gruplandırılmış sorunlar", "markers.panel.no.problems.build": "Şu ana kadar çalışma alanında herhangi bir sorun tespit edilmedi.", - "markers.panel.no.problems.filters": "Belirtilen süzgeç ölçütleriyle sonuç bulunamadı", "markers.panel.action.filter": "Sorunları Süz", - "markers.panel.filter.placeholder": "Türe veya metne göre süz", + "markers.panel.filter.ariaLabel": "Sorunları Süz", "markers.panel.filter.errors": "hatalar", "markers.panel.filter.warnings": "uyarılar", "markers.panel.filter.infos": "bilgilendirmeler", @@ -30,5 +29,15 @@ "markers.panel.multiple.unknowns.label": "{0} Bilinmeyen", "markers.panel.at.ln.col.number": "({0}, {1})", "problems.tree.aria.label.resource": "{0} {1} sorun içeriyor", + "problems.tree.aria.label.marker.relatedInformation": "Bu sorun {0} konumla ilişkilidir.", + "problems.tree.aria.label.error.marker": "{0} tarafından oluşturulan hata: {2}. satırın {3}. karakterinde {1}.{4}", + "problems.tree.aria.label.error.marker.nosource": "Hata: {1}. satırın {2}. karakterinde {0}.{3}", + "problems.tree.aria.label.warning.marker": "{0} tarafından oluşturulan uyarı: {2}. satırın {3}. karakterinde {1}.{4}", + "problems.tree.aria.label.warning.marker.nosource": "Uyarı: {1}. satırın {2}. karakterinde {0}.{3}", + "problems.tree.aria.label.info.marker": "{0} tarafından oluşturulan bilgilendirme: {2}. satırın {3}. karakterinde {1}.{4}", + "problems.tree.aria.label.info.marker.nosource": "Bilgilendirme: {1}. satırın {2}. karakterinde {0}.{3}", + "problems.tree.aria.label.marker": "{0} tarafından oluşturulan sorun: {2}. satırın {3}. karakterinde {1}.{4}", + "problems.tree.aria.label.marker.nosource": "Sorun: {1}. satırın {2}. karakterinde {0}.{3}", + "problems.tree.aria.label.relatedinfo.message": "{3} dosyasının {1}. satırın {2}. karakterinde {0}", "errors.warnings.show.label": "Hataları ve Uyarıları Göster" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/trk/src/vs/workbench/parts/output/browser/outputActions.i18n.json index 4659e728e08..3d310c952c0 100644 --- a/i18n/trk/src/vs/workbench/parts/output/browser/outputActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -9,5 +9,6 @@ "toggleOutput": "Çıktıyı Aç/Kapat", "clearOutput": "Çıktıyı Temizle", "toggleOutputScrollLock": "Çıktı Kaydırma Kilidini Aç/Kapat", - "switchToOutput.label": "Çıktıya Geçiş Yap" + "switchToOutput.label": "Çıktıya Geçiş Yap", + "openInLogViewer": "Günlük Dosyasını Aç" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 1cd086b7e38..467358d0b9f 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -6,7 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "keybindingsInputName": "Klavye Kısayolları", + "showDefaultKeybindings": "Varsayılan Tuş Bağlarını Göster", + "showUserKeybindings": "Kullanıcı Tuş Bağlarını Göster", "SearchKeybindings.AriaLabel": "Tuş bağlarını ara", "SearchKeybindings.Placeholder": "Tuş bağlarını ara", "sortByPrecedene": "Önceliğe Göre Sırala", diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index be9fd552833..019d3ded95f 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "openRawDefaultSettings": "Ham Varsayılan Ayarları Aç", + "openSettings": "Ayarları Aç", "openGlobalSettings": "Kullanıcı Ayarlarını Aç", "openGlobalKeybindings": "Klavye Kısayollarını Aç", "openGlobalKeybindingsFile": "Klavye Kısayolları Dosyasını Aç", diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 5205b6b6f58..b660c1e4f87 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "settingsEditorName": "Varsayılan Ayarlar", "SearchSettingsWidget.AriaLabel": "Ayarları ara", "SearchSettingsWidget.Placeholder": "Ayarları Ara", "noSettingsFound": "Sonuç Yok", diff --git a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 22428848192..a0bd993aafd 100644 --- a/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -13,9 +13,5 @@ "newExtensionLabel": "\"{0}\" Eklentisini Göster", "editTtile": "Düzenle", "replaceDefaultValue": "Ayarlarda Değiştir", - "copyDefaultValue": "Ayarlara Kopyala", - "unsupportedPHPExecutablePathSetting": "Bu ayar, bir Kullanıcı Ayarı olmalıdır. PHP'yi çalışma alanı için yapılandırmak için bir PHP dosyasını açın ve durum çubuğundaki 'PHP Yolu'na tıklayın.", - "unsupportedWorkspaceSetting": "Bu ayar, bir Kullanıcı Ayarı olmalıdır.", - "unsupportedWorkbenchSetting": "Bu ayar şu an uygulanamıyor. Ayar, bu klasörü açtığınızda uygulanacaktır.", - "unsupportedWorkbenchSettingDevMode": "Bu ayar şu an uygulanamıyor. Ayar, kaydederken kapsamını 'resource' olarak tanımladığınızda veya bu klasörü direkt olarak açtığınızda uygulanacaktır." + "copyDefaultValue": "Ayarlara Kopyala" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 860dab87f7f..d7ca189ea44 100644 --- a/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -11,5 +11,6 @@ "installAdditionalSCMProviders": "Ek SCM Sağlayıcıları Yükle...", "no open repo": "Aktif bir kaynak kontrolü sağlayıcısı yok.", "source control": "Kaynak Kontrolü", - "viewletTitle": "{0}: {1}" + "viewletTitle": "{0}: {1}", + "hideView": "Gizle" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json index c9272a2cea6..79f2510cc1f 100644 --- a/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -8,9 +8,10 @@ ], "nextSearchIncludePattern": "Sonraki Aramaya Dahil Edilen Kalıbı Göster", "previousSearchIncludePattern": "Önceki Aramaya Dahil Edilen Kalıbı Göster", + "nextSearchExcludePattern": "Sonraki Aramada Hariç Tutulan Kalıbı Göster", + "previousSearchExcludePattern": "Önceki Aramada Hariç Tutulan Kalıbı Göster", "nextSearchTerm": "Sonraki Arama Terimini Göster", "previousSearchTerm": "Önceki Arama Terimini Göster", - "showSearchViewlet": "Aramayı Göster", "findInFiles": "Dosyalarda Bul", "replaceInFiles": "Dosyalardakileri Değiştir", "RefreshAction.label": "Yenile", diff --git a/i18n/trk/src/vs/workbench/parts/search/browser/searchView.i18n.json b/i18n/trk/src/vs/workbench/parts/search/browser/searchView.i18n.json index cb483fdd910..fc38590cc30 100644 --- a/i18n/trk/src/vs/workbench/parts/search/browser/searchView.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/browser/searchView.i18n.json @@ -7,6 +7,10 @@ "Do not edit this file. It is machine generated." ], "moreSearch": "Arama Detaylarını Aç/Kapat", + "searchScope.includes": "dahil edilecek dosyalar", + "label.includes": "Aramaya Dahil Edilen Kalıplar", + "searchScope.excludes": "hariç tutulacak klasörler", + "label.excludes": "Aramada Hariç Tutulan Kalıplar", "replaceAll.confirmation.title": "Tümünü Değiştir", "replaceAll.confirm.button": "&&Değiştir", "replaceAll.occurrence.file.message": "{1} dosyadaki {0} tekrarlama '{2}' ile değiştirildi.", diff --git a/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json index 63b497714c2..5042337767a 100644 --- a/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/search/electron-browser/search.contribution.i18n.json @@ -6,11 +6,14 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "search": "Ara", + "copyMatchLabel": "Kopyala", + "copyPathLabel": "Yolu Kopyala", + "copyAllLabel": "Tümünü Kopyala", "findInFolder": "Klasörde Bul...", "findInWorkspace": "Çalışma Alanında Bul...", "showTriggerActions": "Çalışma Alanında Sembole Git...", "name": "Ara", - "search": "Ara", "showSearchViewl": "Aramayı Göster", "view": "Görüntüle", "findInFiles": "Dosyalarda Bul", @@ -25,6 +28,5 @@ "search.quickOpen.includeSymbols": "Dosya sonuçlarındaki bir global sembol aramasının sonuçlarının Hızlı Aç'a dahil edilip edilmeyeceğini yapılandırın.", "search.followSymlinks": "Arama yaparken sembolik linklerin takip edilip edilmeyeceğini denetler.", "search.smartCase": "Örüntü tamamen küçük harflerden oluşuyorsa büyük küçük harf duyarlılığı olmadan arar, diğer durumda ise büyük küçük harf duyarlılığı ile arar", - "search.globalFindClipboard": "macOS'de arama görünümünün paylaşılan panoyu okuyup okumamasını veya değiştirip değiştirmemesini denetler", - "search.location": "Önizleme: aramanın kenar çubuğunda bir görünüm olarak mı yoksa daha fazla yatay boşluk için panel alanında bir panel olarak mı gösterileceğini denetler. Bir sonraki sürümde paneldeki arama, geliştirilmiş yatay düzene sahip olacak ve bu bir önizleme olmaktan çıkacaktır." + "search.globalFindClipboard": "macOS'de arama görünümünün paylaşılan panoyu okuyup okumamasını veya değiştirip değiştirmemesini denetler" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json index 6ad8b1e4112..bcad8d50b1f 100644 --- a/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "helpUs": "{0} için hizmetimizi iyileştirmemize yardımcı olun", "takeShortSurvey": "Kısa Ankete Katıl", "remindLater": "Daha Sonra Hatırlat", - "neverAgain": "Tekrar Gösterme", - "helpUs": "{0} için hizmetimizi iyileştirmemize yardımcı olun" + "neverAgain": "Tekrar Gösterme" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json index 8e3a8985829..eea9d76b733 100644 --- a/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.i18n.json @@ -6,8 +6,8 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "surveyQuestion": "Hızlı bir geri bildirim anketine katılmak ister misiniz?", "takeSurvey": "Ankete Katıl", "remindLater": "Daha Sonra Hatırlat", - "neverAgain": "Tekrar Gösterme", - "surveyQuestion": "Hızlı bir geri bildirim anketine katılmak ister misiniz?" + "neverAgain": "Tekrar Gösterme" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json index 8a3fbfaad65..02224d40eaf 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/common/problemMatcher.i18n.json @@ -45,6 +45,7 @@ "PatternTypeSchema.description": "Bir sorun modeli veya bir katkıda bulunulan veya ön tanımlı sorun modelinin adı. Temel model belirtildiyse atlanabilir.", "ProblemMatcherSchema.base": "Kullanılacak temel sorun eşleştiricisinin adı.", "ProblemMatcherSchema.owner": "Code'un içindeki sorunun sahibi. Temel model belirtildiyse atlanabilir. Atlanırsa ve temel belirtilmemişse 'external' varsayılır.", + "ProblemMatcherSchema.source": "Bu tanılama bilgilerinin kaynağını açıklayan insan tarafından okunabilir bir dize, ör. 'typescript' veya 'super lint'.", "ProblemMatcherSchema.severity": "Sorun yakalamanın varsayılan önem derecesi. Model, önem derecesi için bir eşleme grubu tanımlamazsa kullanılır.", "ProblemMatcherSchema.applyTo": "Bir metin belgesinde bildirilen bir sorunun sadece açık, kapalı veya tüm belgelere uygulanıp uygulanmadığını denetler.", "ProblemMatcherSchema.fileLocation": "Bir sorun modelinde bildirilen dosya adlarının nasıl yorumlanacağını tanımlar.", diff --git a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json index 5eeb3e4000b..2af5738ee5a 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -28,7 +28,14 @@ "JsonSchema.tasks.group.none": "Görevi grupsuz olarak atar", "JsonSchema.tasks.group": "Bu görevin ait olduğu çalıştırma grubunu tanımlar. Derleme grubuna eklemek için \"build\"ı ve test grubuna eklemek için \"test\"i destekler.", "JsonSchema.tasks.type": "Görevin bir işlem olarak veya bir kabukta komut olarak çalıştırılıp çalıştırılmayacağını tanımlar.", + "JsonSchema.command.quotedString.value": "Gerçek komut değeri", + "JsonSchema.tasks.quoting.escape": "Kaçış karakteri olarak kabuğun kaçış karakterini kullanır (ör. PowerShell için ` ve bash için \\).", + "JsonSchema.tasks.quoting.strong": "Argümanı kabuğun güçlü alıntı karakteri ile alıntı haline getirir (ör. PowerShell ve bash için \").", + "JsonSchema.tasks.quoting.weak": "Argümanı kabuğun zayıf alıntı karakteri ile alıntı haline getirir (ör. PowerShell ve bash için ').", + "JsonSchema.command.quotesString.quote": "Komut değerinin tırnak içine nasıl alınacağı.", "JsonSchema.command": "Çalıştırılacak komut. Harici bir program veya bir kabuk komutu olabilir.", + "JsonSchema.args.quotedString.value": "Gerçek argüman değeri", + "JsonSchema.args.quotesString.quote": "Gerçek argüman değerinin tırnak içine nasıl alınacağı.", "JsonSchema.tasks.args": "Bu görev çağrıldığında, komuta iletilecek argümanlar.", "JsonSchema.tasks.label": "Görevin kullanıcı arayüzü etiketi", "JsonSchema.version": "Yapılandırmanın sürüm numarası.", diff --git a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 88cc53075e4..19ebebef075 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -11,6 +11,7 @@ "totalErrors": "{0} Hata", "totalWarnings": "{0} Uyarı", "totalInfos": "{0} Bilgilendirme", + "problems": "Sorunlar", "building": "Derleniyor...", "manyProblems": "10b+", "runningTasks": "Çalışan Görevleri Göster", @@ -30,8 +31,8 @@ "selectProblemMatcher": "Görev çıktısında taranacak hata ve uyarı türlerini seçin", "customizeParseErrors": "Geçerli görev yapılandırmasında hatalar var. Lütfen, bir görevi özelleştirmeden önce ilk olarak hataları düzeltin.", "moreThanOneBuildTask": "tasks.json dosyasında tanımlı çok fazla derleme görevi var. İlk görev çalıştırılıyor.", - "TaskSystem.activeSame.background": "'{0}' görevi zaten aktif ve arka plan modunda. Görevi sonlandırmak için Görevler menüsünden 'Görevi Sonlandır...'ı kullanın.", - "TaskSystem.activeSame.noBackground": " '{0}' görevi zaten aktif. Görevi sonlandırmak için Görevler menüsünden 'Görevi Sonlandır...'ı kullanın. ", + "terminateTask": "Görevi Sonlandır", + "restartTask": "Görevi Yeniden Başlat", "TaskSystem.active": "Çalışan bir görev zaten var. Bir başkasını çalıştırmadan önce bu görevi sonlandırın.", "TaskSystem.restartFailed": "{0} görevini sonlandırma ve yeniden başlatma başarısız oldu", "TaskService.noConfiguration": "Hata: {0} görev algılaması aşağıdaki yapılandırma için bir görev eklemesi yapmıyor:\n{1}\nYapılandırma yok sayılacaktır.\n", @@ -48,8 +49,8 @@ "recentlyUsed": "yakınlarda kullanılan görevler", "configured": "yapılandırılmış görevler", "detected": "algılanan görevler", - "TaskService.notAgain": "Tekrar Gösterme", "TaskService.ignoredFolder": "0.1.0 görev sürümünü kullandıkları için şu çalışma alanı klasörleri yok sayıldı: {0}", + "TaskService.notAgain": "Tekrar Gösterme", "TaskService.pickRunTask": "Çalıştırılacak görevi seçin", "TaslService.noEntryToRun": "Çalıştırılacak hiçbir görev bulunamadı. Görevleri Yapılandır...", "TaskService.fetchingBuildTasks": "Derleme görevleri alınıyor...", diff --git a/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 707fc6758f4..22ab290691f 100644 --- a/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -7,6 +7,7 @@ "Do not edit this file. It is machine generated." ], "ConfigurationParser.invalidCWD": "Uyarı: options.cwd dize türünde olmalıdır. {0} değeri yok sayıldı.\n", + "ConfigurationParser.inValidArg": "Hata: komut argümanı bir dize veya tırnak içinde bir dize olmalıdır. Belirtilen değer:\n{0}", "ConfigurationParser.noargs": "Hata: komut argümanları dizelerden oluşan bir dizi olmalıdır. Belirtilen değer:\n{0}", "ConfigurationParser.noShell": "Uyarı: kabuk yapılandırması sadece görevler terminalde çalıştırılırken desteklenir.", "ConfigurationParser.noName": "Hata: Kapsam bildiriminde Sorun Eşleştirici'nin bir adı olmalıdır:\n{0}\n", diff --git a/i18n/trk/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json b/i18n/trk/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..9ae8066e173 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/terminal/common/terminalColorRegistry.i18n.json @@ -0,0 +1,16 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "terminal.background": "Terminalin arka plan rengi; bu, terminalin panelden farklı olarak renklendirilmesini sağlar.", + "terminal.foreground": "Terminalin ön plan rengi.", + "terminalCursor.foreground": "Terminal imlecinin ön plan rengi.", + "terminalCursor.background": "Terminal imlecinin arka plan rengi. Bir blok imlecinin kapladığı bir karakterin rengini özelleştirmeyi sağlar.", + "terminal.selectionBackground": "Terminalin seçim arkaplanı rengi.", + "terminal.border": "Terminaldeki bölmeleri ayıran kenarlığın rengi. panel.border bunun için varsayılan olarak kullanılır.", + "terminal.ansiColor": "Terminalde '{0}' ANSI rengi." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index fb23f3c189e..33c53ccb7b3 100644 --- a/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -51,5 +51,7 @@ "workbench.action.terminal.hideFindWidget": "Bulma Aracını Gizle", "nextTerminalFindTerm": "Sonraki Arama Terimini Göster", "previousTerminalFindTerm": "Önceki Arama Terimini Göster", - "quickOpenTerm": "Aktif Terminali Değiştir" + "quickOpenTerm": "Aktif Terminali Değiştir", + "workbench.action.terminal.selectToPreviousCommand": "Önceki Komuta Kadar Seç", + "workbench.action.terminal.selectToNextCommand": "Sonraki Komuta Kadar Seç" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json index ecea8c0b753..4ec7921beb2 100644 --- a/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -6,7 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "unsupportedWorkspaceSettings": "Bu çalışma alanı sadece Kullanıcı Ayarları'nda ayarlanabilen ayarlar içeriyor. ({0}). Daha fazla bilgi almak için [buraya]({0}) tıklayın.", "openWorkspaceSettings": "Çalışma Alanı Ayarlarını Aç", - "dontShowAgain": "Tekrar Gösterme", - "unsupportedWorkspaceSettings": "Bu çalışma alanı sadece Kullanıcı Ayarları'nda ayarlanabilen ayarlar içeriyor. ({0}). Daha fazla bilgi almak için [buraya]({0}) tıklayın." + "dontShowAgain": "Tekrar Gösterme" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/trk/src/vs/workbench/parts/update/electron-browser/update.i18n.json index c60ad91555b..f0af3fad62b 100644 --- a/i18n/trk/src/vs/workbench/parts/update/electron-browser/update.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -6,7 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "later": "Daha Sonra", "releaseNotes": "Sürüm Notları", "showReleaseNotes": "Sürüm Notlarını Göster", "read the release notes": "{0} v{1} uygulamasına hoş geldiniz! Sürüm Notları'nı okumak ister misiniz?", @@ -16,13 +15,12 @@ "updateIsReady": "Yeni {0} güncellemesi var.", "noUpdatesAvailable": "Şu anda mevcut herhangi bir güncelleme yok.", "ok": "Tamam", - "download now": "Şimdi İndir", "thereIsUpdateAvailable": "Bir güncelleştirme var.", + "download now": "Şimdi İndir", + "later": "Daha Sonra", "installUpdate": "Güncelleştirmeyi Yükle", - "updateAvailable": "Bir güncelleştirme var: {0} {1}", "updateInstalling": "{0} {1} arka planda yükleniyor, bittiğinde bilgi vereceğiz.", "updateNow": "Şimdi Güncelle", - "updateAvailableAfterRestart": "{0} yeniden başlatıldıktan sonra güncellenecektir.", "commandPalette": "Komut Paleti...", "settings": "Ayarlar", "keyboardShortcuts": "Klavye Kısayolları", diff --git a/i18n/trk/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json b/i18n/trk/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json index 4c6d2775a03..402fef291ee 100644 --- a/i18n/trk/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/webview/electron-browser/webview.contribution.i18n.json @@ -6,5 +6,6 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], - "webview.editor.label": "web görünümü düzenleyicisi" + "webview.editor.label": "web görünümü düzenleyicisi", + "developer": "Geliştirici" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json b/i18n/trk/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json new file mode 100644 index 00000000000..13712f3e4c5 --- /dev/null +++ b/i18n/trk/src/vs/workbench/parts/webview/electron-browser/webviewCommands.i18n.json @@ -0,0 +1,11 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "openToolsLabel": "Web Görünümü Geliştirici Araçlarını Aç", + "refreshWebviewLabel": "Web Görünümlerini Yeniden Yükle" +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json b/i18n/trk/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json index 271702f6cc6..06a856662b9 100644 --- a/i18n/trk/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.i18n.json @@ -6,5 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "telemetryOptOut.optOutNotice": "Microsoft'un kullanım verilerini toplamasına izin vererek VS Code'u geliştirin. [Gizlilik beyanımızı]({0}) okuyun ve nasıl [vazgeçebileceğinizi]({1}) öğrenin.", + "telemetryOptOut.optInNotice": "Microsoft'un kullanım verilerini toplamasına izin vererek VS Code'u geliştirin. [Gizlilik beyanımızı]({0}) okuyun ve nasıl [etkinleştirebileceğinizi]({1}) öğrenin.", "telemetryOptOut.readMore": "Devamını oku" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/trk/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index e8f3a223755..29463e7c351 100644 --- a/i18n/trk/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -27,8 +27,6 @@ "welcomePage.installExtensionPacks": "Araçlar ve diller", "welcomePage.installExtensionPacksDescription": "{0} ve {1} için destek yükle", "welcomePage.moreExtensions": "fazlası", - "welcomePage.installKeymapDescription": "Klavye kısayolları yükle", - "welcomePage.installKeymapExtension": "{0} ve {1} için klavye kısayolları yükle", "welcomePage.others": "diğerleri", "welcomePage.colorTheme": "Renk teması", "welcomePage.colorThemeDescription": "Düzenleyici ve kodlarınız sevdiğiniz şekilde görünsün", diff --git a/i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json b/i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json new file mode 100644 index 00000000000..67d3a3db217 --- /dev/null +++ b/i18n/trk/src/vs/workbench/services/configuration/node/configurationService.i18n.json @@ -0,0 +1,10 @@ +{ + "": [ + "--------------------------------------------------------------------------------------------", + "Copyright (c) Microsoft Corporation. All rights reserved.", + "Licensed under the MIT License. See License.txt in the project root for license information.", + "--------------------------------------------------------------------------------------------", + "Do not edit this file. It is machine generated." + ], + "unsupportedWindowSetting": "Bu ayar şu an uygulanamıyor. Ayar, bu klasörü açtığınızda uygulanacaktır." +} \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json b/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json index 9f88c4ae89e..4bd75567fec 100644 --- a/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/extensions/electron-browser/extensionService.i18n.json @@ -8,7 +8,6 @@ ], "extensionHostProcess.crash": "Eklenti sunucusu beklenmeyen biçimde sonlandırıldı.", "extensionHostProcess.unresponsiveCrash": "Eklenti sunucusu yanıt vermediğinden sonlandırıldı.", - "devTools": "Geliştirici Araçları", "restart": "Eklenti Sunucusunu Yeniden Başlat", "overwritingExtension": "{0} eklentisinin üzerine {1} yazılıyor.", "extensionUnderDevelopment": "{0} konumundaki geliştirme eklentisi yükleniyor", diff --git a/i18n/trk/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/trk/src/vs/workbench/services/files/electron-browser/fileService.i18n.json index 4d4a6d071a8..cb30de0b079 100644 --- a/i18n/trk/src/vs/workbench/services/files/electron-browser/fileService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -6,10 +6,23 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "netVersionError": "Microsoft .NET Framework 4.5 gerekli. Yüklemek için bağlantıyı izleyin.", "installNet": ".NET Framework 4.5'i İndir", "neverShowAgain": "Tekrar Gösterme", - "netVersionError": "Microsoft .NET Framework 4.5 gerekli. Yüklemek için bağlantıyı izleyin.", + "enospcError": "{0}, bu büyük çalışma alanındaki dosya değişikliklerini izleyemiyor. Bu sorunu çözmek için lütfen yönerge bağlantısını izleyin.", "learnMore": "Talimatlar", + "fileInvalidPath": "Geçersiz dosya kaynağı ({0})", + "fileIsDirectoryError": "Dosya bir dizindir", + "fileNotModifiedError": "Dosya şu tarihten beri değiştirilmemiş:", + "fileTooLargeError": "Dosya, açmak için çok büyük", + "fileNotFoundError": "Dosya bulunamadı ({0})", + "fileBinaryError": "Dosya ikili olarak görünüyor ve metin olarak açılamıyor", + "filePermission": "Dosya için yazma izni reddedildi ({0})", + "fileExists": "Oluşturulacak dosya zaten mevcut ({0})", + "fileModifiedError": "Dosya Şu Tarihten Beri Değiştiriliyor", + "fileReadOnlyError": "Dosya Salt Okunur", + "fileMoveConflict": "Taşıma/kopyalama yapılamadı. Dosya, hedefte zaten mevcut.", + "unableToMoveCopyError": "Taşıma/kopyalama yapılamadı. Dosya, içinde bulunduğu klasörü değiştiriyor.", "binFailed": "'{0}' geri dönüşüm kutusuna taşınamadı", "trashFailed": "'{0}' çöpe taşınamadı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json b/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json index 0233ec89011..7f8a2b8ad2c 100644 --- a/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json +++ b/i18n/trk/src/vs/workbench/services/files/electron-browser/remoteFileService.i18n.json @@ -6,6 +6,7 @@ "--------------------------------------------------------------------------------------------", "Do not edit this file. It is machine generated." ], + "fileNotFoundError": "Dosya bulunamadı ({0})", "fileIsDirectoryError": "Dosya bir dizindir", "fileNotModifiedError": "Dosya şu tarihten beri değiştirilmemiş:", "fileBinaryError": "Dosya ikili olarak görünüyor ve metin olarak açılamıyor" diff --git a/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json b/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json index 925be843a66..0de6a2517b4 100644 --- a/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json +++ b/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMGrammars.i18n.json @@ -10,6 +10,7 @@ "vscode.extension.contributes.grammars.language": "Bu söz diziminin ekleneceği dil tanımlayıcısı.", "vscode.extension.contributes.grammars.scopeName": "tmLanguage dosyası tarafından kullanılan Textmate kapsam adı.", "vscode.extension.contributes.grammars.path": "tmLanguage dosyasının yolu. Yol, eklenti klasörüne görecelidir ve genellikle './syntaxes/' ile başlar.", - "vscode.extension.contributes.grammars.embeddedLanguages": "Bu dil bilgisinin gömülü dilleri içermesi durumundaki bir dil kimliğinin kapsam adı haritası.", + "vscode.extension.contributes.grammars.embeddedLanguages": "Bu dil bilgisinin gömülü dilleri içermesi durumundaki bir dil id'sinin kapsam adı haritası.", + "vscode.extension.contributes.grammars.tokenTypes": "Kapsam adından anahtar türüne kadar olan bir harita.", "vscode.extension.contributes.grammars.injectTo": "Bu dil bilgisinin yerleştirileceği dil kapsam adları listesi." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json b/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json index ecc43c9f3f4..75eba1ee007 100644 --- a/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json +++ b/i18n/trk/src/vs/workbench/services/textMate/electron-browser/TMSyntax.i18n.json @@ -11,6 +11,7 @@ "invalid.path.0": "`contributes.{0}.path` ögesinde dize bekleniyor. Sağlanan değer: {1}", "invalid.injectTo": "`contributes.{0}.injectTo` ögesinde geçersiz değer. Dil kapsam adlarından oluşan bir dizi olmalıdır. Sağlanan değer: {1}", "invalid.embeddedLanguages": "`contributes.{0}.embeddedLanguages` ögesinde geçersiz değer. Kapsam adından dile kadar olan bir nesne haritası olmalıdır. Sağlanan değer: {1}", + "invalid.tokenTypes": "`contributes.{0}.tokenTypes` ögesinde geçersiz değer. Kapsam adından anahtar türüne kadar olan bir nesne haritası olmalıdır. Sağlanan değer: {1}", "invalid.path.1": "`contributes.{0}.path` ögesinin ({1}) eklentinin klasöründe ({2}) yer alması bekleniyor. Bu, eklentiyi taşınamaz yapabilir.", "no-tm-grammar": "Bu dil için kayıtlı bir TM Grameri yok." } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json index df63c933295..7c19d60efde 100644 --- a/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json +++ b/i18n/trk/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -8,7 +8,7 @@ ], "schema.folderExpanded": "Genişletilmiş klasörler için klasör simgesi. Genişletilmiş klasör simgesi isteğe bağlıdır. Ayarlanmazsa, klasör için tanımlanan simge gösterilir.", "schema.folder": "Daraltılmış klasörler için klasör simgesi; eğer folderExpanded ayarlanmamışsa, genişletilen klasörler için de kullanılır.", - "schema.file": "Varsayılan dosya simgesi, bir uzantı, dosya adı veya dil kimliği ile eşleşmeyen tüm dosyalar için gösterilir.", + "schema.file": "Varsayılan dosya simgesi, bir uzantı, dosya adı veya dil id'si ile eşleşmeyen tüm dosyalar için gösterilir.", "schema.folderNames": "Klasör adlarını simgelerle ilişkilendirir. Nesne anahtarı, herhangi bir yol parçası içermeyen klasör adıdır. Örüntüler veya joker karakterlere izin verilmez. Klasör adı eşleştirme büyük/küçük harfe duyarlı değildir.", "schema.folderName": "İlişkilendirilecek simge tanımı ID'si.", "schema.folderNamesExpanded": "Klasör adlarını genişletilmiş klasör simgeleriyle ilişkilendirir. Nesne anahtarı, herhangi bir yol parçası içermeyen klasör adıdır. Örüntüler veya joker karakterlere izin verilmez. Klasör adı eşleştirme büyük/küçük harfe duyarlı değildir.", @@ -17,7 +17,7 @@ "schema.fileExtension": "İlişkilendirilecek simge tanımı ID'si.", "schema.fileNames": "Dosya adlarını simgelerle ilişkilendirir. Nesne anahtarı, herhangi bir yol parçası içermeyen tam dosya adıdır. Dosya adı noktalar ve olası bir dosya uzantısı içerebilir. Örüntüler veya joker karakterlere izin verilmez. Dosya adı eşleştirme büyük/küçük harfe duyarlı değildir.", "schema.fileName": "İlişkilendirilecek simge tanımı ID'si.", - "schema.languageIds": "Dilleri simgelerle ilişkilendirir. Nesne anahtarı, dil ekleme noktasında tanımlanan dil kimliğidir.", + "schema.languageIds": "Dilleri simgelerle ilişkilendirir. Nesne anahtarı, dil ekleme noktasında tanımlanan dil id'sidir.", "schema.languageId": "İlişkilendirilecek simge tanımı ID'si.", "schema.fonts": "Simge tanımlarında kullanılacak yazı tipleri.", "schema.id": "Yazı tipinin ID'si.", @@ -33,7 +33,7 @@ "schema.fontCharacter": "Glif yazı tipi kullanırken: Kullanılacak yazı tipindeki karakter.", "schema.fontColor": "Glif yazı tipi kullanırken: Kullanılacak renk.", "schema.fontSize": "Yazı tipi kullanırken: Metin yazı tipi yüzdesine göre yazı tipi boyutu. Ayarlanmazsa, yazı tipi tanımındaki boyut kullanılır.", - "schema.fontId": "Yazı tipi kullanırken: Yazı tipinin kimliği. Ayarlanmazsa, ilk yazı tipi tanımı varsayılan olarak kullanılır.", + "schema.fontId": "Yazı tipi kullanırken: Yazı tipinin id'si. Ayarlanmazsa, ilk yazı tipi tanımı varsayılan olarak kullanılır.", "schema.light": "Açık renk temalarındaki dosya simgeleri için isteğe bağlı ilişkilendirmeler.", "schema.highContrast": "Yüksek karşıtlık renk temalarındaki dosya simgeleri için isteğe bağlı ilişkilendirmeler.", "schema.hidesExplorerArrows": "Bu tema aktif olduğunda dosya gezgini ok işaretlerinin gizli olup olmayacağını yapılandırır." From e866449e614334a04a1ead99387aeead016c3707 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Thu, 19 Apr 2018 17:38:08 -0700 Subject: [PATCH 557/710] Pick up TS 2.8.3 Fixes #48008 --- extensions/package.json | 2 +- extensions/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/package.json b/extensions/package.json index b0072fb9737..d3693f49712 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "2.8.3-insiders.20180407" + "typescript": "2.8.3" }, "scripts": { "postinstall": "node ./postinstall" diff --git a/extensions/yarn.lock b/extensions/yarn.lock index 63143439fba..504d8abd96d 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -2,6 +2,6 @@ # yarn lockfile v1 -typescript@2.8.3-insiders.20180407: - version "2.8.3-insiders.20180407" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3-insiders.20180407.tgz#915f010e258e51c9539bcf986cfd84d0271d8cab" +typescript@2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170" From dffaa5d295e4ba651dd0cba25dcad699ab0eb2f5 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Thu, 19 Apr 2018 18:50:23 -0700 Subject: [PATCH 558/710] Cancel ongoing provideSignatureHelp requests in some cases Part of #48237 Cancels on to call out to the extension host for `provideSignatureHelp` on: - provideSignatureHelp retriggered - curor changed using mouse - model changed - Language changes --- .../parameterHints/parameterHintsWidget.ts | 12 +- .../test/parameterHintsModel.test.ts | 103 ++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts diff --git a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts index 0724631045a..2c874d77fd5 100644 --- a/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/parameterHintsWidget.ts @@ -50,6 +50,7 @@ export class ParameterHintsModel extends Disposable { private triggerCharactersListeners: IDisposable[]; private active: boolean; private throttledDelayer: RunOnceScheduler; + private provideSignatureHelpRequest?: TPromise<boolean, any>; constructor(editor: ICodeEditor) { super(); @@ -80,6 +81,11 @@ export class ParameterHintsModel extends Disposable { if (!silent) { this._onCancel.fire(void 0); } + + if (this.provideSignatureHelpRequest) { + this.provideSignatureHelpRequest.cancel(); + this.provideSignatureHelpRequest = undefined; + } } trigger(delay = ParameterHintsModel.DELAY): void { @@ -92,7 +98,11 @@ export class ParameterHintsModel extends Disposable { } private doTrigger(): void { - provideSignatureHelp(this.editor.getModel(), this.editor.getPosition()) + if (this.provideSignatureHelpRequest) { + this.provideSignatureHelpRequest.cancel(); + } + + this.provideSignatureHelpRequest = provideSignatureHelp(this.editor.getModel(), this.editor.getPosition()) .then(null, onUnexpectedError) .then(result => { if (!result || !result.signatures || result.signatures.length === 0) { diff --git a/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts b/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts new file mode 100644 index 00000000000..4dce80655b2 --- /dev/null +++ b/src/vs/editor/contrib/parameterHints/test/parameterHintsModel.test.ts @@ -0,0 +1,103 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import URI from 'vs/base/common/uri'; +import { Position } from 'vs/editor/common/core/position'; +import { ITextModel } from 'vs/editor/common/model'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { SignatureHelp, SignatureHelpProvider, SignatureHelpProviderRegistry } from 'vs/editor/common/modes'; +import { MockScopeLocation, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; +import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; +import { IStorageService, NullStorageService } from 'vs/platform/storage/common/storage'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { ParameterHintsModel } from '../parameterHintsWidget'; + +function createMockEditor(model: TextModel): TestCodeEditor { + const contextKeyService = new MockContextKeyService(); + const telemetryService = NullTelemetryService; + const notificationService = new TestNotificationService(); + const instantiationService = new InstantiationService(new ServiceCollection( + [IContextKeyService, contextKeyService], + [ITelemetryService, telemetryService], + [IStorageService, NullStorageService], + [INotificationService, TestNotificationService] + )); + + const editor = new TestCodeEditor(new MockScopeLocation(), {}, false, instantiationService, contextKeyService, notificationService); + editor.setModel(model); + return editor; +} + + +suite('ParameterHintsModel', () => { + let disposables: IDisposable[] = []; + + + setup(function () { + disposables = dispose(disposables); + }); + + test('Should cancel existing request when new request comes in', () => { + const textModel = TextModel.createFromString('abc def', undefined, undefined, URI.parse('test:somefile.ttt')); + disposables.push(textModel); + + const editor = createMockEditor(textModel); + const hintsModel = new ParameterHintsModel(editor); + + let didRequestCancellationOf = -1; + let invokeCount = 0; + const longRunningProvider = new class implements SignatureHelpProvider { + signatureHelpTriggerCharacters: string[] = []; + + provideSignatureHelp(model: ITextModel, position: Position, token: CancellationToken): SignatureHelp | Thenable<SignatureHelp> { + const count = invokeCount++; + token.onCancellationRequested(() => { didRequestCancellationOf = count; }); + + // retrigger on first request + if (count === 0) { + hintsModel.trigger(0); + } + + return new Promise<SignatureHelp>(resolve => { + setTimeout(() => { + resolve({ + signatures: [{ + label: '' + count, + parameters: [] + }], + activeParameter: 0, + activeSignature: 0 + }); + }, 100); + }); + } + }; + + disposables.push(SignatureHelpProviderRegistry.register({ scheme: 'test' }, longRunningProvider)); + + hintsModel.trigger(0); + assert.strictEqual(-1, didRequestCancellationOf); + + return new Promise((resolve, reject) => + hintsModel.onHint(e => { + try { + assert.strictEqual(0, didRequestCancellationOf); + assert.strictEqual('1', e.hints.signatures[0].label); + resolve(); + } catch (e) { + reject(e); + } + })); + }); +}); From c1cd4378c5e5dc434ed959e13556d05240a8ca18 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Thu, 19 Apr 2018 20:40:52 -0700 Subject: [PATCH 559/710] Upstream bug fixes --- extensions/emmet/package.json | 2 +- extensions/emmet/yarn.lock | 6 +++--- extensions/html-language-features/server/package.json | 2 +- extensions/html-language-features/server/yarn.lock | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 42c78cfd9e4..024c94d10da 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -444,7 +444,7 @@ "@emmetio/html-matcher": "^0.3.3", "@emmetio/css-parser": "ramya-rao-a/css-parser#vscode", "@emmetio/math-expression": "^0.1.1", - "vscode-emmet-helper": "^1.2.5", + "vscode-emmet-helper": "^1.2.6", "vscode-languageserver-types": "^3.5.0", "image-size": "^0.5.2", "vscode-nls": "3.2.1" diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock index be7aedf9516..90db3c63673 100644 --- a/extensions/emmet/yarn.lock +++ b/extensions/emmet/yarn.lock @@ -2052,9 +2052,9 @@ vinyl@~2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vscode-emmet-helper@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.5.tgz#0931543db742a03f9ae65db3d66588643cdbe010" +vscode-emmet-helper@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.6.tgz#6cc7293765af7136d409d0d62ef17c66e8b9cf45" dependencies: "@emmetio/extract-abbreviation" "0.1.6" jsonc-parser "^1.0.0" diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 1ee90e635c3..395b66b65b5 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "vscode-css-languageservice": "^3.0.9-next.7", - "vscode-emmet-helper": "1.2.5", + "vscode-emmet-helper": "1.2.6", "vscode-html-languageservice": "^2.1.3-next.2", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 627e66f8462..8e5e816b1f5 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -25,9 +25,9 @@ vscode-css-languageservice@^3.0.9-next.7: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" -vscode-emmet-helper@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.5.tgz#0931543db742a03f9ae65db3d66588643cdbe010" +vscode-emmet-helper@1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.6.tgz#6cc7293765af7136d409d0d62ef17c66e8b9cf45" dependencies: "@emmetio/extract-abbreviation" "0.1.6" jsonc-parser "^1.0.0" From 45b1679035e347a376c0af35849f21d74d6ca027 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Thu, 19 Apr 2018 18:31:38 +0200 Subject: [PATCH 560/710] rename FileError to FileSystemError, #47475 --- src/vs/vscode.proposed.d.ts | 10 +++++----- src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- src/vs/workbench/api/node/extHostTypes.ts | 18 +++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 17164135bf9..3420fc070a6 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -101,12 +101,12 @@ declare module 'vscode' { /** * */ - export class FileError extends Error { + export class FileSystemError extends Error { - static EntryExists(message?: string): FileError; - static EntryNotFound(message?: string): FileError; - static EntryNotADirectory(message?: string): FileError; - static EntryIsADirectory(message?: string): FileError; + static EntryExists(message?: string): FileSystemError; + static EntryNotFound(message?: string): FileSystemError; + static EntryNotADirectory(message?: string): FileSystemError; + static EntryIsADirectory(message?: string): FileSystemError; constructor(message?: string); } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 33fb8a807b9..0d4cec6a261 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -692,7 +692,7 @@ export function createApiFactory( FileChangeType2: extHostTypes.FileChangeType2, FileType2: extHostTypes.FileType2, FileOpenFlags: files.FileOpenFlags, - FileError: extHostTypes.FileError, + FileSystemError: extHostTypes.FileSystemError, FoldingRange: extHostTypes.FoldingRange, FoldingRangeKind: extHostTypes.FoldingRangeKind }; diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index ae88f3ded82..313a5aa5a36 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1838,19 +1838,19 @@ export enum FileType2 { SymbolicLink = 4, } -export class FileError extends Error { +export class FileSystemError extends Error { - static EntryExists(message?: string): FileError { - return new FileError(message, 'EntryExists', FileError.EntryExists); + static EntryExists(message?: string): FileSystemError { + return new FileSystemError(message, 'EntryExists', FileSystemError.EntryExists); } - static EntryNotFound(message?: string): FileError { - return new FileError(message, 'EntryNotFound', FileError.EntryNotFound); + static EntryNotFound(message?: string): FileSystemError { + return new FileSystemError(message, 'EntryNotFound', FileSystemError.EntryNotFound); } - static EntryNotADirectory(message?: string): FileError { - return new FileError(message, 'EntryNotADirectory', FileError.EntryNotADirectory); + static EntryNotADirectory(message?: string): FileSystemError { + return new FileSystemError(message, 'EntryNotADirectory', FileSystemError.EntryNotADirectory); } - static EntryIsADirectory(message?: string): FileError { - return new FileError(message, 'EntryIsADirectory', FileError.EntryIsADirectory); + static EntryIsADirectory(message?: string): FileSystemError { + return new FileSystemError(message, 'EntryIsADirectory', FileSystemError.EntryIsADirectory); } constructor(message?: string, code?: string, hide?: Function) { From b0ede6c91bd6786c8589f062310a2dec9222fa48 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 09:45:41 +0200 Subject: [PATCH 561/710] allow file system providers to express that they are case-sensitive --- src/vs/platform/files/common/files.ts | 8 +++++--- src/vs/vscode.proposed.d.ts | 5 +++-- src/vs/workbench/api/node/extHost.api.impl.ts | 3 +++ src/vs/workbench/api/node/extHostFileSystem.ts | 15 +++++++++------ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 57e66accfa5..1841a20af7e 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -175,9 +175,11 @@ export interface IWatchOptions { } export enum FileSystemProviderCapabilities { - FileReadWrite = 0b1, - FileOpenReadWriteClose = 0b10, - FileFolderCopy = 0b100 + FileReadWrite = 1 << 1, + FileOpenReadWriteClose = 1 << 2, + FileFolderCopy = 1 << 3, + + PathCaseSensitive = 1 << 10 } export interface IFileSystemProvider { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 3420fc070a6..e38fba7ff9a 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -92,6 +92,7 @@ declare module 'vscode' { export namespace workspace { export function registerDeprecatedFileSystemProvider(scheme: string, provider: DeprecatedFileSystemProvider): Disposable; + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; } //#endregion @@ -146,7 +147,7 @@ declare module 'vscode' { */ export interface FileSystemProvider2 { - _version: 8; + _version: 9; /** * An event to signal that a resource has been created, changed, or deleted. This @@ -237,7 +238,7 @@ declare module 'vscode' { } export namespace workspace { - export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; + export function registerFileSystemProvider2(scheme: string, provider: FileSystemProvider2, options: { isCaseSensitive?: boolean }): Disposable; } //#endregion diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 0d4cec6a261..30019fca14a 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -546,6 +546,9 @@ export function createApiFactory( registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, newProvider?) => { return extHostFileSystem.registerFileSystemProvider(scheme, provider, newProvider); }), + registerFileSystemProvider2: proposedApiFunction(extension, (scheme, provider, options) => { + return extHostFileSystem.registerFileSystemProvider2(scheme, provider, options); + }), registerDeprecatedFileSystemProvider: proposedApiFunction(extension, (scheme, provider) => { return extHostFileSystem.registerDeprecatedFileSystemProvider(scheme, provider); }), diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 18b53fc9687..282c72ba611 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -59,7 +59,7 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { class FileSystemProviderShim implements vscode.FileSystemProvider2 { - _version: 8 = 8; + _version: 9 = 9; onDidChangeFile: vscode.Event<vscode.FileChange2[]>; @@ -185,20 +185,20 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider) { - return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); + return this.registerFileSystemProvider2(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); } registerFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 8) { - return this._doRegisterFileSystemProvider(scheme, newProvider); + if (newProvider && newProvider._version === 9) { + return this.registerFileSystemProvider2(scheme, newProvider, { isCaseSensitive: false }); } else if (provider) { - return this._doRegisterFileSystemProvider(scheme, new FileSystemProviderShim(provider)); + return this.registerFileSystemProvider2(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); } else { throw new Error('FAILED to register file system provider, the new provider does not meet the version-constraint and there is no old provider'); } } - private _doRegisterFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider2) { + registerFileSystemProvider2(scheme: string, provider: vscode.FileSystemProvider2, options: { isCaseSensitive?: boolean }) { if (this._usedSchemes.has(scheme)) { throw new Error(`a provider for the scheme '${scheme}' is already registered`); @@ -210,6 +210,9 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._fsProvider.set(handle, provider); let capabilites = files.FileSystemProviderCapabilities.FileReadWrite; + if (options.isCaseSensitive) { + capabilites += files.FileSystemProviderCapabilities.PathCaseSensitive; + } if (typeof provider.copy === 'function') { capabilites += files.FileSystemProviderCapabilities.FileFolderCopy; } From 9f752b989e9a4b13ff5e1eccbbeea21b5c4f26c9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 10:28:49 +0200 Subject: [PATCH 562/710] make ResourceMap always strict, #48258 --- src/vs/base/common/map.ts | 16 +++----- src/vs/base/test/common/map.test.ts | 38 +++++++++---------- .../configuration/common/configuration.ts | 4 +- .../common/configurationModels.ts | 14 +++---- .../api/node/extHostConfiguration.ts | 10 ++--- .../common/configurationModels.ts | 14 +++---- .../node/configurationService.ts | 10 ++--- .../test/common/configurationModels.test.ts | 6 +-- 8 files changed, 53 insertions(+), 59 deletions(-) diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index edd2f16345e..55e4fa20e9a 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -368,10 +368,12 @@ export class TernarySearchTree<E> { export class ResourceMap<T> { - protected map: Map<string, T>; + protected readonly map: Map<string, T>; + protected readonly ignoreCase?: boolean; - constructor(private ignoreCase?: boolean) { + constructor() { this.map = new Map<string, T>(); + this.ignoreCase = false; // in the future this should be an uri-comparator } public set(resource: URI, value: T): void { @@ -414,18 +416,10 @@ export class ResourceMap<T> { return key; } -} - -export class StrictResourceMap<T> extends ResourceMap<T> { - - constructor() { - super(); - } public keys(): URI[] { - return keys(this.map).map(key => URI.parse(key)); + return keys(this.map).map(URI.parse); } - } // We should fold BoundedMap and LinkedMap. See https://github.com/Microsoft/vscode/issues/28496 diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index 2d04f0174c8..33924f78f72 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -544,32 +544,32 @@ suite('Map', () => { assert.equal(map.get(uncFile), 'true'); }); - test('ResourceMap - files (ignorecase)', function () { - const map = new ResourceMap<any>(true); + // test('ResourceMap - files (ignorecase)', function () { + // const map = new ResourceMap<any>(true); - const fileA = URI.parse('file://some/filea'); - const fileB = URI.parse('some://some/other/fileb'); - const fileAUpper = URI.parse('file://SOME/FILEA'); + // const fileA = URI.parse('file://some/filea'); + // const fileB = URI.parse('some://some/other/fileb'); + // const fileAUpper = URI.parse('file://SOME/FILEA'); - map.set(fileA, 'true'); - assert.equal(map.get(fileA), 'true'); + // map.set(fileA, 'true'); + // assert.equal(map.get(fileA), 'true'); - assert.equal(map.get(fileAUpper), 'true'); + // assert.equal(map.get(fileAUpper), 'true'); - assert.ok(!map.get(fileB)); + // assert.ok(!map.get(fileB)); - map.set(fileAUpper, 'false'); - assert.equal(map.get(fileAUpper), 'false'); + // map.set(fileAUpper, 'false'); + // assert.equal(map.get(fileAUpper), 'false'); - assert.equal(map.get(fileA), 'false'); + // assert.equal(map.get(fileA), 'false'); - const windowsFile = URI.file('c:\\test with %25\\c#code'); - const uncFile = URI.file('\\\\shäres\\path\\c#\\plugin.json'); + // const windowsFile = URI.file('c:\\test with %25\\c#code'); + // const uncFile = URI.file('\\\\shäres\\path\\c#\\plugin.json'); - map.set(windowsFile, 'true'); - map.set(uncFile, 'true'); + // map.set(windowsFile, 'true'); + // map.set(uncFile, 'true'); - assert.equal(map.get(windowsFile), 'true'); - assert.equal(map.get(uncFile), 'true'); - }); + // assert.equal(map.get(windowsFile), 'true'); + // assert.equal(map.get(uncFile), 'true'); + // }); }); diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index 4f6407e4b39..6aa47675ddb 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -12,7 +12,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationRegistry, Extensions, OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry'; -import { StrictResourceMap } from 'vs/base/common/map'; +import { ResourceMap } from 'vs/base/common/map'; export const IConfigurationService = createDecorator<IConfigurationService>('configurationService'); @@ -47,7 +47,7 @@ export interface IConfigurationChangeEvent { // Following data is used for Extension host configuration event changedConfiguration: IConfigurationModel; - changedConfigurationByResource: StrictResourceMap<IConfigurationModel>; + changedConfigurationByResource: ResourceMap<IConfigurationModel>; } export interface IConfigurationService { diff --git a/src/vs/platform/configuration/common/configurationModels.ts b/src/vs/platform/configuration/common/configurationModels.ts index 9d8249577a3..9944e02325f 100644 --- a/src/vs/platform/configuration/common/configurationModels.ts +++ b/src/vs/platform/configuration/common/configurationModels.ts @@ -5,7 +5,7 @@ 'use strict'; import * as json from 'vs/base/common/json'; -import { StrictResourceMap } from 'vs/base/common/map'; +import { ResourceMap } from 'vs/base/common/map'; import * as arrays from 'vs/base/common/arrays'; import * as types from 'vs/base/common/types'; import * as objects from 'vs/base/common/objects'; @@ -278,15 +278,15 @@ export class ConfigurationModelParser { export class Configuration { private _workspaceConsolidatedConfiguration: ConfigurationModel = null; - private _foldersConsolidatedConfigurations: StrictResourceMap<ConfigurationModel> = new StrictResourceMap<ConfigurationModel>(); + private _foldersConsolidatedConfigurations: ResourceMap<ConfigurationModel> = new ResourceMap<ConfigurationModel>(); constructor( private _defaultConfiguration: ConfigurationModel, private _userConfiguration: ConfigurationModel, private _workspaceConfiguration: ConfigurationModel = new ConfigurationModel(), - private _folderConfigurations: StrictResourceMap<ConfigurationModel> = new StrictResourceMap<ConfigurationModel>(), + private _folderConfigurations: ResourceMap<ConfigurationModel> = new ResourceMap<ConfigurationModel>(), private _memoryConfiguration: ConfigurationModel = new ConfigurationModel(), - private _memoryConfigurationByResource: StrictResourceMap<ConfigurationModel> = new StrictResourceMap<ConfigurationModel>(), + private _memoryConfigurationByResource: ResourceMap<ConfigurationModel> = new ResourceMap<ConfigurationModel>(), private _freeze: boolean = true) { } @@ -394,7 +394,7 @@ export class Configuration { return this._workspaceConfiguration; } - protected get folders(): StrictResourceMap<ConfigurationModel> { + protected get folders(): ResourceMap<ConfigurationModel> { return this._folderConfigurations; } @@ -534,7 +534,7 @@ export class ConfigurationChangeEvent extends AbstractConfigurationChangeEvent i constructor( private _changedConfiguration: ConfigurationModel = new ConfigurationModel(), - private _changedConfigurationByResource: StrictResourceMap<ConfigurationModel> = new StrictResourceMap<ConfigurationModel>()) { + private _changedConfigurationByResource: ResourceMap<ConfigurationModel> = new ResourceMap<ConfigurationModel>()) { super(); } @@ -542,7 +542,7 @@ export class ConfigurationChangeEvent extends AbstractConfigurationChangeEvent i return this._changedConfiguration; } - get changedConfigurationByResource(): StrictResourceMap<IConfigurationModel> { + get changedConfigurationByResource(): ResourceMap<IConfigurationModel> { return this._changedConfigurationByResource; } diff --git a/src/vs/workbench/api/node/extHostConfiguration.ts b/src/vs/workbench/api/node/extHostConfiguration.ts index 0b4830a4c8a..aa831b81768 100644 --- a/src/vs/workbench/api/node/extHostConfiguration.ts +++ b/src/vs/workbench/api/node/extHostConfiguration.ts @@ -14,7 +14,7 @@ import { ConfigurationTarget as ExtHostConfigurationTarget } from './extHostType import { IConfigurationData, ConfigurationTarget, IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { Configuration, ConfigurationChangeEvent, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { WorkspaceConfigurationChangeEvent } from 'vs/workbench/services/configuration/common/configurationModels'; -import { StrictResourceMap } from 'vs/base/common/map'; +import { ResourceMap } from 'vs/base/common/map'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { isObject } from 'vs/base/common/types'; @@ -209,7 +209,7 @@ export class ExtHostConfiguration implements ExtHostConfigurationShape { private _toConfigurationChangeEvent(data: IWorkspaceConfigurationChangeEventData): vscode.ConfigurationChangeEvent { const changedConfiguration = new ConfigurationModel(data.changedConfiguration.contents, data.changedConfiguration.keys, data.changedConfiguration.overrides); - const changedConfigurationByResource: StrictResourceMap<ConfigurationModel> = new StrictResourceMap<ConfigurationModel>(); + const changedConfigurationByResource: ResourceMap<ConfigurationModel> = new ResourceMap<ConfigurationModel>(); for (const key of Object.keys(data.changedConfigurationByResource)) { const resource = URI.parse(key); const model = data.changedConfigurationByResource[key]; @@ -225,11 +225,11 @@ export class ExtHostConfiguration implements ExtHostConfigurationShape { const defaultConfiguration = ExtHostConfiguration.parseConfigurationModel(data.defaults); const userConfiguration = ExtHostConfiguration.parseConfigurationModel(data.user); const workspaceConfiguration = ExtHostConfiguration.parseConfigurationModel(data.workspace); - const folders: StrictResourceMap<ConfigurationModel> = Object.keys(data.folders).reduce((result, key) => { + const folders: ResourceMap<ConfigurationModel> = Object.keys(data.folders).reduce((result, key) => { result.set(URI.parse(key), ExtHostConfiguration.parseConfigurationModel(data.folders[key])); return result; - }, new StrictResourceMap<ConfigurationModel>()); - return new Configuration(defaultConfiguration, userConfiguration, workspaceConfiguration, folders, new ConfigurationModel(), new StrictResourceMap<ConfigurationModel>(), false); + }, new ResourceMap<ConfigurationModel>()); + return new Configuration(defaultConfiguration, userConfiguration, workspaceConfiguration, folders, new ConfigurationModel(), new ResourceMap<ConfigurationModel>(), false); } private static parseConfigurationModel(model: IConfigurationModel): ConfigurationModel { diff --git a/src/vs/workbench/services/configuration/common/configurationModels.ts b/src/vs/workbench/services/configuration/common/configurationModels.ts index d97bda0330e..90def0b9e15 100644 --- a/src/vs/workbench/services/configuration/common/configurationModels.ts +++ b/src/vs/workbench/services/configuration/common/configurationModels.ts @@ -11,7 +11,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, IConfigurationPropertySchema, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; import { Workspace } from 'vs/platform/workspace/common/workspace'; -import { StrictResourceMap } from 'vs/base/common/map'; +import { ResourceMap } from 'vs/base/common/map'; import URI from 'vs/base/common/uri'; export class WorkspaceConfigurationModelParser extends ConfigurationModelParser { @@ -125,9 +125,9 @@ export class Configuration extends BaseConfiguration { defaults: ConfigurationModel, user: ConfigurationModel, workspaceConfiguration: ConfigurationModel, - folders: StrictResourceMap<ConfigurationModel>, + folders: ResourceMap<ConfigurationModel>, memoryConfiguration: ConfigurationModel, - memoryConfigurationByResource: StrictResourceMap<ConfigurationModel>, + memoryConfigurationByResource: ResourceMap<ConfigurationModel>, private readonly _workspace: Workspace) { super(defaults, user, workspaceConfiguration, folders, memoryConfiguration, memoryConfigurationByResource); } @@ -235,8 +235,8 @@ export class AllKeysConfigurationChangeEvent extends AbstractConfigurationChange return this._changedConfiguration; } - get changedConfigurationByResource(): StrictResourceMap<IConfigurationModel> { - return new StrictResourceMap(); + get changedConfigurationByResource(): ResourceMap<IConfigurationModel> { + return new ResourceMap(); } get affectedKeys(): string[] { @@ -256,7 +256,7 @@ export class WorkspaceConfigurationChangeEvent implements IConfigurationChangeEv return this.configurationChangeEvent.changedConfiguration; } - get changedConfigurationByResource(): StrictResourceMap<IConfigurationModel> { + get changedConfigurationByResource(): ResourceMap<IConfigurationModel> { return this.configurationChangeEvent.changedConfigurationByResource; } @@ -286,4 +286,4 @@ export class WorkspaceConfigurationChangeEvent implements IConfigurationChangeEv return false; } -} \ No newline at end of file +} diff --git a/src/vs/workbench/services/configuration/node/configurationService.ts b/src/vs/workbench/services/configuration/node/configurationService.ts index 9bb5735fd44..99e62f15189 100644 --- a/src/vs/workbench/services/configuration/node/configurationService.ts +++ b/src/vs/workbench/services/configuration/node/configurationService.ts @@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { dirname, basename } from 'path'; import * as assert from 'vs/base/common/assert'; import { Event, Emitter } from 'vs/base/common/event'; -import { StrictResourceMap } from 'vs/base/common/map'; +import { ResourceMap } from 'vs/base/common/map'; import { equals, deepClone } from 'vs/base/common/objects'; import { Disposable } from 'vs/base/common/lifecycle'; import { Queue } from 'vs/base/common/async'; @@ -51,7 +51,7 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat private defaultConfiguration: DefaultConfigurationModel; private userConfiguration: UserConfiguration; private workspaceConfiguration: WorkspaceConfiguration; - private cachedFolderConfigs: StrictResourceMap<FolderConfiguration>; + private cachedFolderConfigs: ResourceMap<FolderConfiguration>; private workspaceEditingQueue: Queue<void>; @@ -453,18 +453,18 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat private loadConfiguration(): TPromise<void> { // reset caches - this.cachedFolderConfigs = new StrictResourceMap<FolderConfiguration>(); + this.cachedFolderConfigs = new ResourceMap<FolderConfiguration>(); const folders = this.workspace.folders; return this.loadFolderConfigurations(folders) .then((folderConfigurations) => { let workspaceConfiguration = this.getWorkspaceConfigurationModel(folderConfigurations); - const folderConfigurationModels = new StrictResourceMap<ConfigurationModel>(); + const folderConfigurationModels = new ResourceMap<ConfigurationModel>(); folderConfigurations.forEach((folderConfiguration, index) => folderConfigurationModels.set(folders[index].uri, folderConfiguration)); const currentConfiguration = this._configuration; - this._configuration = new Configuration(this.defaultConfiguration, this.userConfiguration.configurationModel, workspaceConfiguration, folderConfigurationModels, new ConfigurationModel(), new StrictResourceMap<ConfigurationModel>(), this.getWorkbenchState() !== WorkbenchState.EMPTY ? this.workspace : null); //TODO: Sandy Avoid passing null + this._configuration = new Configuration(this.defaultConfiguration, this.userConfiguration.configurationModel, workspaceConfiguration, folderConfigurationModels, new ConfigurationModel(), new ResourceMap<ConfigurationModel>(), this.getWorkbenchState() !== WorkbenchState.EMPTY ? this.workspace : null); //TODO: Sandy Avoid passing null if (currentConfiguration) { const changedKeys = this._configuration.compare(currentConfiguration); diff --git a/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts b/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts index 91b9b6d8529..2a397b9df49 100644 --- a/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts +++ b/src/vs/workbench/services/configuration/test/common/configurationModels.test.ts @@ -13,7 +13,7 @@ import URI from 'vs/base/common/uri'; import { ConfigurationChangeEvent, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { StrictResourceMap } from 'vs/base/common/map'; +import { ResourceMap } from 'vs/base/common/map'; suite('FolderSettingsModelParser', () => { @@ -194,7 +194,7 @@ suite('AllKeysConfigurationChangeEvent', () => { test('changeEvent affects keys for any resource', () => { const configuraiton = new Configuration(new ConfigurationModel({}, ['window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']), - new ConfigurationModel(), new ConfigurationModel(), new StrictResourceMap(), new ConfigurationModel(), new StrictResourceMap(), null); + new ConfigurationModel(), new ConfigurationModel(), new ResourceMap(), new ConfigurationModel(), new ResourceMap(), null); let testObject = new AllKeysConfigurationChangeEvent(configuraiton, ConfigurationTarget.USER, null); assert.deepEqual(testObject.affectedKeys, ['window.title', 'window.zoomLevel', 'window.restoreFullscreen', 'workbench.editor.enablePreview', 'window.restoreWindows']); @@ -234,4 +234,4 @@ suite('AllKeysConfigurationChangeEvent', () => { assert.ok(!testObject.affectsConfiguration('files')); assert.ok(!testObject.affectsConfiguration('files', URI.file('file1'))); }); -}); \ No newline at end of file +}); From bffdc6a15d0b592048e1346ac366bc99f36ad40a Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 10:39:44 +0200 Subject: [PATCH 563/710] a bit of error polish, #47475 --- src/vs/workbench/api/node/extHostTypes.ts | 2 +- .../services/files/electron-browser/remoteFileService.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 313a5aa5a36..fd4a26b9784 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1855,7 +1855,7 @@ export class FileSystemError extends Error { constructor(message?: string, code?: string, hide?: Function) { super(message); - this.name = code ? `FileError/${code}` : `FileError`; + this.name = code ? `${code} (FileSystemError)` : `FileSystemError`; if (typeof Error.captureStackTrace === 'function' && typeof hide === 'function') { // nice stack traces diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 254c3c9d18f..90661a63377 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -204,7 +204,7 @@ export class RemoteFileService extends FileService { if (!(err instanceof Error)) { return undefined; } - let match = /FileError\/(.+)$/.exec(err.name); + let match = /^(.+) \(FileSystemError\)$/.exec(err.name); if (!match) { return undefined; } @@ -219,7 +219,7 @@ export class RemoteFileService extends FileService { case 'EntryExists': case 'EntryNotADirectory': default: - // todo + // todo res = undefined; break; } From ebeeea79980bb35d40b403d473a0f6b15fa2ec13 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Fri, 20 Apr 2018 11:07:49 +0200 Subject: [PATCH 564/710] explorer: FileViewletState use an object map since ExplorerItem objects do not change and resources have a bad difference between rename and new child fixes #47474 --- .../files/electron-browser/views/explorerViewer.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts index 7fc664f81c4..1a418a43fc5 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts @@ -24,7 +24,6 @@ import { IDisposable, dispose, empty as EmptyDisposable } from 'vs/base/common/l import { IFilesConfiguration, SortOrder } from 'vs/workbench/parts/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { FileOperationError, FileOperationResult, IFileService, FileKind } from 'vs/platform/files/common/files'; -import { ResourceMap } from 'vs/base/common/map'; import { DuplicateFileAction, AddFilesAction, IEditableData, IFileViewletState, FileCopiedContext } from 'vs/workbench/parts/files/electron-browser/fileActions'; import { IDataSource, ITree, IAccessibilityProvider, IRenderer, ContextMenuEvent, ISorter, IFilter, IDragAndDropData, IDragOverReaction, DRAG_OVER_ACCEPT_BUBBLE_DOWN, DRAG_OVER_ACCEPT_BUBBLE_DOWN_COPY, DRAG_OVER_ACCEPT_BUBBLE_UP, DRAG_OVER_ACCEPT_BUBBLE_UP_COPY, DRAG_OVER_REJECT } from 'vs/base/parts/tree/browser/tree'; import { DesktopDragAndDropData, ExternalElementsDragAndDropData } from 'vs/base/parts/tree/browser/treeDnd'; @@ -147,24 +146,24 @@ export class FileDataSource implements IDataSource { } export class FileViewletState implements IFileViewletState { - private editableStats: ResourceMap<IEditableData>; + private editableStats: Map<ExplorerItem, IEditableData>; constructor() { - this.editableStats = new ResourceMap<IEditableData>(); + this.editableStats = new Map<ExplorerItem, IEditableData>(); } public getEditableData(stat: ExplorerItem): IEditableData { - return this.editableStats.get(stat.resource); + return this.editableStats.get(stat); } public setEditable(stat: ExplorerItem, editableData: IEditableData): void { if (editableData) { - this.editableStats.set(stat.resource, editableData); + this.editableStats.set(stat, editableData); } } public clearEditable(stat: ExplorerItem): void { - this.editableStats.delete(stat.resource); + this.editableStats.delete(stat); } } From 3c6836816b02797471f56ffff555773c1494552f Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 11:07:12 +0200 Subject: [PATCH 565/710] fix #48138 --- src/vs/platform/environment/node/argv.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index d4ffb88f8f9..7f14ec4ce06 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -154,7 +154,7 @@ const extensionsHelp: { [name: string]: string; } = { '--show-versions': localize('showVersions', "Show versions of installed extensions, when using --list-extension."), '--install-extension (<extension-id> | <extension-vsix-path>)': localize('installExtension', "Installs an extension."), '--uninstall-extension (<extension-id> | <extension-vsix-path>)': localize('uninstallExtension', "Uninstalls an extension."), - '--enable-proposed-api <extension-id>': localize('experimentalApis', "Enables proposed api features for an extension.") + '--enable-proposed-api <extension-id>': localize('experimentalApis', "Enables proposed API features for an extension.") }; const troubleshootingHelp: { [name: string]: string; } = { From 799bd3b6824d8261c9273068cf853f810ab6af96 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 11:08:21 +0200 Subject: [PATCH 566/710] fix #48210 --- src/vs/editor/common/config/commonEditorConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 2ae72c0dd17..62ebc3a17d9 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -573,7 +573,7 @@ const editorConfiguration: IConfigurationNode = { 'editor.codeLens': { 'type': 'boolean', 'default': EDITOR_DEFAULTS.contribInfo.codeLens, - 'description': nls.localize('codeLens', "Controls if the editor shows code lenses") + 'description': nls.localize('codeLens', "Controls if the editor shows CodeLens") }, 'editor.folding': { 'type': 'boolean', From fecd1ec677604f034db0f1847cc4815b1e0a8a84 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Fri, 20 Apr 2018 11:26:37 +0200 Subject: [PATCH 567/710] Migrate pinned states fix. Do not add new composistes if it is old data. --- .../workbench/browser/parts/compositebar/compositeBar.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index 19b667d8ceb..ac68fe3ff8e 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -527,12 +527,15 @@ export class CompositeBar implements ICompositeBar { private loadCompositesStates(): CompositeState[] { const storedStates = <Array<string | CompositeState>>JSON.parse(this.storageService.get(this.options.storageId, StorageScope.GLOBAL, '[]')); + const isOldData = storedStates && storedStates.length && typeof storedStates[0] === 'string'; const compositeStates = <CompositeState[]>storedStates.map(c => typeof c === 'string' /* migration from pinned states to composites states */ ? { id: c, pinned: true } : c); - const newComposites = this.options.composites.filter(c => compositeStates.every(s => s.id !== c.id)); - newComposites.sort((c1, c2) => c1.order < c2.order ? -1 : 1); - newComposites.forEach(c => compositeStates.push({ id: c.id, pinned: true /* new composites are pinned by default */ })); + if (!isOldData) { /* Add new composites only if it is new data */ + const newComposites = this.options.composites.filter(c => compositeStates.every(s => s.id !== c.id)); + newComposites.sort((c1, c2) => c1.order < c2.order ? -1 : 1); + newComposites.forEach(c => compositeStates.push({ id: c.id, pinned: true /* new composites are pinned by default */ })); + } return compositeStates; } From 54322a1ea1981f5c0c1afdb8b4f15daaa4291e1c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Fri, 20 Apr 2018 11:40:28 +0200 Subject: [PATCH 568/710] Fix #47180 --- .../node/extensionsWorkbenchService.ts | 125 +++++------------- 1 file changed, 30 insertions(+), 95 deletions(-) diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index cabf01e5411..89fc28f9bf0 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -323,36 +323,14 @@ class ExtensionDependencies implements IExtensionDependencies { } } -enum Operation { - Installing, - Updating, - Uninstalling -} - -interface IActiveExtension { - operation: Operation; - extension: Extension; - start: Date; -} - -function toTelemetryEventName(operation: Operation) { - switch (operation) { - case Operation.Installing: return 'extensionGallery:install'; - case Operation.Updating: return 'extensionGallery:update'; - case Operation.Uninstalling: return 'extensionGallery:uninstall'; - } - - return ''; -} - export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, IURLHandler { private static readonly SyncPeriod = 1000 * 60 * 60 * 12; // 12 hours _serviceBrand: any; private stateProvider: IExtensionStateProvider<ExtensionState>; - private installing: IActiveExtension[] = []; - private uninstalling: IActiveExtension[] = []; + private installing: Extension[] = []; + private uninstalling: Extension[] = []; private installed: Extension[] = []; private syncDelayer: ThrottledDelayer<void>; private autoUpdateDelayer: ThrottledDelayer<void>; @@ -405,8 +383,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, get local(): IExtension[] { const installing = this.installing - .filter(e => !this.installed.some(installed => installed.id === e.extension.id)) - .map(e => e.extension); + .filter(e => !this.installed.some(installed => installed.id === e.id)) + .map(e => e); return [...this.installed, ...installing]; } @@ -810,35 +788,22 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, extension.gallery = gallery; - const start = new Date(); - const operation = Operation.Installing; - this.installing.push({ operation, extension, start }); + this.installing.push(extension); this._onChange.fire(); } private onDidInstallExtension(event: DidInstallExtensionEvent): void { const { local, zipPath, error, gallery } = event; - const installingExtension = gallery ? this.installing.filter(e => areSameExtensions(e.extension, gallery.identifier))[0] : null; - const extension: Extension = installingExtension ? installingExtension.extension : zipPath ? new Extension(this.galleryService, this.stateProvider, null, null, this.telemetryService) : null; + const installingExtension = gallery ? this.installing.filter(e => areSameExtensions(e, gallery.identifier))[0] : null; + const extension: Extension = installingExtension ? installingExtension : zipPath ? new Extension(this.galleryService, this.stateProvider, null, null, this.telemetryService) : null; if (extension) { this.installing = installingExtension ? this.installing.filter(e => e !== installingExtension) : this.installing; - if (error) { - if (extension.gallery) { - // Updating extension can be only a gallery extension - const installed = this.installed.filter(e => e.id === extension.id)[0]; - if (installed && installingExtension) { - installingExtension.operation = Operation.Updating; - } - } - } else { + if (!error) { extension.local = local; const installed = this.installed.filter(e => e.id === extension.id)[0]; if (installed) { - if (installingExtension) { - installingExtension.operation = Operation.Updating; - } installed.local = local; } else { this.installed.push(extension); @@ -846,7 +811,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, } if (extension.gallery) { // Report telemetry only for gallery extensions - this.reportTelemetry(installingExtension, error); + this.reportExtensionRecommendationsTelemetry(installingExtension); } } this._onChange.fire(); @@ -861,10 +826,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, return; } - const start = new Date(); - const operation = Operation.Uninstalling; - const uninstalling = this.uninstalling.filter(e => e.extension.local.identifier.id === id)[0] || { id, operation, extension, start }; - this.uninstalling = [uninstalling, ...this.uninstalling.filter(e => e.extension.local.identifier.id !== id)]; + const uninstalling = this.uninstalling.filter(e => e.local.identifier.id === id)[0] || extension; + this.uninstalling = [uninstalling, ...this.uninstalling.filter(e => e.local.identifier.id !== id)]; this._onChange.fire(); } @@ -875,16 +838,12 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, this.installed = this.installed.filter(e => e.local.identifier.id !== id); } - const uninstalling = this.uninstalling.filter(e => e.extension.local.identifier.id === id)[0]; - this.uninstalling = this.uninstalling.filter(e => e.extension.local.identifier.id !== id); + const uninstalling = this.uninstalling.filter(e => e.local.identifier.id === id)[0]; + this.uninstalling = this.uninstalling.filter(e => e.local.identifier.id !== id); if (!uninstalling) { return; } - if (!error) { - this.reportTelemetry(uninstalling); - } - this._onChange.fire(); } @@ -900,11 +859,11 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, } private getExtensionState(extension: Extension): ExtensionState { - if (extension.gallery && this.installing.some(e => e.extension.gallery && areSameExtensions(e.extension.gallery.identifier, extension.gallery.identifier))) { + if (extension.gallery && this.installing.some(e => e.gallery && areSameExtensions(e.gallery.identifier, extension.gallery.identifier))) { return ExtensionState.Installing; } - if (this.uninstalling.some(e => e.extension.id === extension.id)) { + if (this.uninstalling.some(e => e.id === extension.id)) { return ExtensionState.Uninstalling; } @@ -912,46 +871,22 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, return local ? ExtensionState.Installed : ExtensionState.Uninstalled; } - private reportTelemetry(active: IActiveExtension, errorcode?: string): void { - const data = active.extension.telemetryData; - const duration = new Date().getTime() - active.start.getTime(); - const eventName = toTelemetryEventName(active.operation); + private reportExtensionRecommendationsTelemetry(extension: Extension): void { const extRecommendations = this.extensionTipsService.getAllRecommendationsWithReason() || {}; - const recommendationsData = extRecommendations[active.extension.id.toLowerCase()] ? { recommendationReason: extRecommendations[active.extension.id.toLowerCase()].reasonId } : {}; - /* __GDPR__ - "extensionGallery:install" : { - "success": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "errorcode": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "recommendationReason": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "${include}": [ - "${GalleryExtensionTelemetryData}" - ] - } - */ - /* __GDPR__ - "extensionGallery:update" : { - "success": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "errorcode": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "recommendationReason": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "${include}": [ - "${GalleryExtensionTelemetryData}" - ] - } - */ - /* __GDPR__ - "extensionGallery:uninstall" : { - "success": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "duration" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "isMeasurement": true }, - "errorcode": { "classification": "CallstackOrException", "purpose": "PerformanceAndHealth" }, - "recommendationReason": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "${include}": [ - "${GalleryExtensionTelemetryData}" - ] - } - */ - this.telemetryService.publicLog(eventName, assign(data, { success: !errorcode, duration, errorcode }, recommendationsData)); + const recommendationReason = extRecommendations[extension.id.toLowerCase()]; + if (recommendationReason) { + const recommendationsData = { recommendationReason: recommendationReason.reasonId }; + const data = extension.telemetryData; + /* __GDPR__ + "extensionGallery:install:recommendations" : { + "recommendationReason": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "${include}": [ + "${GalleryExtensionTelemetryData}" + ] + } + */ + this.telemetryService.publicLog('extensionGallery:install:recommendations', assign(data, recommendationsData)); + } } private onError(err: any): void { From bcfb7d4f16b6d064825651727bf4ddf056382e3e Mon Sep 17 00:00:00 2001 From: Dirk Baeumer <dirkb@microsoft.com> Date: Fri, 20 Apr 2018 11:48:11 +0200 Subject: [PATCH 569/710] Fixes 47563: Provide an API to fetch running task executions --- src/vs/vscode.proposed.d.ts | 24 ++++++++++- .../api/electron-browser/mainThreadTask.ts | 19 ++++++--- src/vs/workbench/api/node/extHost.api.impl.ts | 7 +++- src/vs/workbench/api/node/extHost.protocol.ts | 4 +- .../workbench/api/node/extHostApiCommands.ts | 2 +- src/vs/workbench/api/node/extHostTask.ts | 25 +++++++++-- src/vs/workbench/api/shared/tasks.ts | 5 +++ .../parts/tasks/common/taskService.ts | 7 +++- src/vs/workbench/parts/tasks/common/tasks.ts | 26 ------------ .../electron-browser/task.contribution.ts | 42 +++++++++++-------- 10 files changed, 103 insertions(+), 58 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index e38fba7ff9a..e563e3eccb1 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -567,14 +567,29 @@ declare module 'vscode' { execution: TaskExecution; } + export interface TaskFilter { + /** + * The task version as used in the tasks.json file. + * The string support the package.json semver notation. + */ + version?: string; + + /** + * The task type to return; + */ + type?: string; + } + export namespace workspace { /** * Fetches all task available in the systems. Thisweweb includes tasks * from `tasks.json` files as well as tasks from task providers * contributed through extensions. + * + * @param filter a filter to filter the return tasks. */ - export function fetchTasks(): Thenable<Task[]>; + export function fetchTasks(filter?: TaskFilter): Thenable<Task[]>; /** * Executes a task that is managed by VS Code. The returned @@ -584,6 +599,13 @@ declare module 'vscode' { */ export function executeTask(task: Task): Thenable<TaskExecution>; + /** + * The currently active task executions or an empty array. + * + * @readonly + */ + export let taskExecutions: TaskExecution[]; + /** * Fires when a task starts. */ diff --git a/src/vs/workbench/api/electron-browser/mainThreadTask.ts b/src/vs/workbench/api/electron-browser/mainThreadTask.ts index 1e052ee9e0e..cd32296c9da 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTask.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTask.ts @@ -19,17 +19,17 @@ import { ContributedTask, ExtensionTaskSourceTransfer, TaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind, PresentationOptions, CommandOptions, CommandConfiguration, RuntimeType, CustomTask, TaskScope, TaskSource, TaskSourceKind, ExtensionTaskSource, RevealKind, PanelKind } from 'vs/workbench/parts/tasks/common/tasks'; -import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; +import { ITaskService, TaskFilter } from 'vs/workbench/parts/tasks/common/taskService'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape, MainContext, IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; import { TaskDefinitionDTO, TaskExecutionDTO, ProcessExecutionOptionsDTO, TaskPresentationOptionsDTO, - ProcessExecutionDTO, ShellExecutionDTO, ShellExecutionOptionsDTO, TaskDTO, TaskSourceDTO, TaskHandleDTO + ProcessExecutionDTO, ShellExecutionDTO, ShellExecutionOptionsDTO, TaskDTO, TaskSourceDTO, TaskHandleDTO, TaskFilterDTO } from 'vs/workbench/api/shared/tasks'; -export { TaskDTO, TaskHandleDTO, TaskExecutionDTO }; +export { TaskDTO, TaskHandleDTO, TaskExecutionDTO, TaskFilterDTO }; namespace TaskExecutionDTO { export function from(value: TaskExecution): TaskExecutionDTO { @@ -330,6 +330,15 @@ namespace TaskDTO { } } +namespace TaskFilterDTO { + export function from(value: TaskFilter): TaskFilterDTO { + return value; + } + export function to(value: TaskFilterDTO): TaskFilter { + return value; + } +} + @extHostNamedCustomer(MainContext.MainThreadTask) export class MainThreadTask implements MainThreadTaskShape { @@ -387,8 +396,8 @@ export class MainThreadTask implements MainThreadTaskShape { return TPromise.wrap<void>(undefined); } - public $executeTaskProvider(): TPromise<TaskDTO[]> { - return this._taskService.tasks().then((tasks) => { + public $fetchTasks(filter?: TaskFilterDTO): TPromise<TaskDTO[]> { + return this._taskService.tasks(TaskFilterDTO.to(filter)).then((tasks) => { let result: TaskDTO[] = []; for (let task of tasks) { let item = TaskDTO.from(task); diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 30019fca14a..61c42dcad44 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -531,12 +531,15 @@ export function createApiFactory( registerTaskProvider: (type: string, provider: vscode.TaskProvider) => { return extHostTask.registerTaskProvider(extension, provider); }, - fetchTasks: proposedApiFunction(extension, (): Thenable<vscode.Task[]> => { - return extHostTask.executeTaskProvider(); + fetchTasks: proposedApiFunction(extension, (filter?: vscode.TaskFilter): Thenable<vscode.Task[]> => { + return extHostTask.fetchTasks(filter); }), executeTask: proposedApiFunction(extension, (task: vscode.Task): Thenable<vscode.TaskExecution> => { return extHostTask.executeTask(extension, task); }), + get taskExecutions(): vscode.TaskExecution[] { + return extHostTask.taskExecutions; + }, onDidStartTask: (listeners, thisArgs?, disposables?) => { return extHostTask.onDidStartTask(listeners, thisArgs, disposables); }, diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 798b71e2207..d05cabc9ae7 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -48,7 +48,7 @@ import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/ import { ISingleEditOperation } from 'vs/editor/common/model'; import { ILineMatch, IPatternInfo } from 'vs/platform/search/common/search'; import { LogLevel } from 'vs/platform/log/common/log'; -import { TaskExecutionDTO, TaskDTO, TaskHandleDTO } from 'vs/workbench/api/shared/tasks'; +import { TaskExecutionDTO, TaskDTO, TaskHandleDTO, TaskFilterDTO } from 'vs/workbench/api/shared/tasks'; export interface IEnvironment { isExtensionDevelopmentDebug: boolean; @@ -398,7 +398,7 @@ export interface MainThreadSearchShape extends IDisposable { export interface MainThreadTaskShape extends IDisposable { $registerTaskProvider(handle: number): TPromise<void>; - $executeTaskProvider(): TPromise<TaskDTO[]>; + $fetchTasks(filter?: TaskFilterDTO): TPromise<TaskDTO[]>; $executeTask(task: TaskHandleDTO | TaskDTO): TPromise<TaskExecutionDTO>; $terminateTask(id: string): TPromise<void>; $unregisterTaskProvider(handle: number): TPromise<void>; diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index 8c99eee403f..4fdd04533c5 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -520,7 +520,7 @@ export class ExtHostApiCommands { } private _executeTaskProvider(): Thenable<vscode.Task[]> { - return this._tasks.executeTaskProvider(); + return this._tasks.fetchTasks(); } } diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 7128c03fb41..024ad5f56b0 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -21,7 +21,7 @@ import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import * as vscode from 'vscode'; import { TaskDefinitionDTO, TaskExecutionDTO, TaskPresentationOptionsDTO, ProcessExecutionOptionsDTO, ProcessExecutionDTO, - ShellExecutionOptionsDTO, ShellExecutionDTO, TaskDTO, TaskHandleDTO + ShellExecutionOptionsDTO, ShellExecutionDTO, TaskDTO, TaskHandleDTO, TaskFilterDTO } from '../shared/tasks'; export { TaskExecutionDTO }; @@ -675,6 +675,19 @@ namespace TaskDTO { } } +namespace TaskFilterDTO { + export function from(value: vscode.TaskFilter): TaskFilterDTO { + return value; + } + + export function to(value: TaskFilterDTO): vscode.TaskFilter { + if (!value) { + return undefined; + } + return Objects.assign(Object.create(null), value); + } +} + class TaskExecutionImpl implements vscode.TaskExecution { constructor(readonly _id: string, private readonly _task: vscode.Task, private readonly _tasks: ExtHostTask) { } @@ -741,8 +754,8 @@ export class ExtHostTask implements ExtHostTaskShape { }); } - public executeTaskProvider(): Thenable<vscode.Task[]> { - return this._proxy.$executeTaskProvider().then((values) => { + public fetchTasks(filter?: vscode.TaskFilter): Thenable<vscode.Task[]> { + return this._proxy.$fetchTasks(TaskFilterDTO.from(filter)).then((values) => { let result: vscode.Task[] = []; for (let value of values) { let task = TaskDTO.to(value, this._extHostWorkspace); @@ -774,6 +787,12 @@ export class ExtHostTask implements ExtHostTaskShape { }); } + get taskExecutions(): vscode.TaskExecution[] { + let result: vscode.TaskExecution[] = []; + this._taskExecutions.forEach(value => result.push(value)); + return result; + } + get onDidStartTask(): Event<vscode.TaskStartEvent> { return this._onDidExecuteTask.event; } diff --git a/src/vs/workbench/api/shared/tasks.ts b/src/vs/workbench/api/shared/tasks.ts index 093fff83f06..7e070957c48 100644 --- a/src/vs/workbench/api/shared/tasks.ts +++ b/src/vs/workbench/api/shared/tasks.ts @@ -86,4 +86,9 @@ export interface TaskDTO { export interface TaskExecutionDTO { id: string; task: TaskDTO; +} + +export interface TaskFilterDTO { + version?: string; + type?: string; } \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/common/taskService.ts b/src/vs/workbench/parts/tasks/common/taskService.ts index 53aad958232..4a889b479eb 100644 --- a/src/vs/workbench/parts/tasks/common/taskService.ts +++ b/src/vs/workbench/parts/tasks/common/taskService.ts @@ -32,6 +32,11 @@ export interface CustomizationProperties { isBackground?: boolean; } +export interface TaskFilter { + version?: string; + type?: string; +} + export interface ITaskService { _serviceBrand: any; onDidStateChange: Event<TaskEvent>; @@ -45,7 +50,7 @@ export interface ITaskService { restart(task: Task): void; terminate(task: Task): TPromise<TaskTerminateResponse>; terminateAll(): TPromise<TaskTerminateResponse[]>; - tasks(): TPromise<Task[]>; + tasks(filter?: TaskFilter): TPromise<Task[]>; /** * @param alias The task's name, label or defined identifier. */ diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index 2dc2a15bbac..8fd3e0fc004 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -614,25 +614,6 @@ export namespace Task { } } - export function getTaskItem(task: Task): TaskItem { - let folder: IWorkspaceFolder = Task.getWorkspaceFolder(task); - let definition: TaskIdentifier; - if (ContributedTask.is(task)) { - definition = task.defines; - } else if (CustomTask.is(task) && task.command !== void 0) { - definition = CustomTask.getDefinition(task); - } else { - return undefined; - } - let result: TaskItem = { - id: task._id, - label: task._label, - definition: definition, - workspaceFolder: folder - }; - return result; - } - export function getTaskDefinition(task: Task): TaskIdentifier { if (ContributedTask.is(task)) { return task.defines; @@ -652,13 +633,6 @@ export namespace Task { } } -export interface TaskItem { - id: string; - label: string; - definition: TaskIdentifier; - workspaceFolder: IWorkspaceFolder; -} - export interface TaskExecution { id: string; task: Task; diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index da0905a8aef..64b8acbae0d 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -7,6 +7,7 @@ import 'vs/css!./media/task.contribution'; import * as nls from 'vs/nls'; +import * as semver from 'semver'; import { QuickOpenHandler } from 'vs/workbench/parts/tasks/browser/taskQuickOpen'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -73,9 +74,9 @@ import { ITaskSystem, ITaskResolver, ITaskSummary, TaskExecuteKind, TaskError, T import { Task, CustomTask, ConfiguringTask, ContributedTask, InMemoryTask, TaskEvent, TaskEventKind, TaskSet, TaskGroup, GroupType, ExecutionEngine, JsonSchemaVersion, TaskSourceKind, - TaskIdentifier, TaskSorter, TaskItem + TaskIdentifier, TaskSorter } from 'vs/workbench/parts/tasks/common/tasks'; -import { ITaskService, ITaskProvider, RunOptions, CustomizationProperties } from 'vs/workbench/parts/tasks/common/taskService'; +import { ITaskService, ITaskProvider, RunOptions, CustomizationProperties, TaskFilter } from 'vs/workbench/parts/tasks/common/taskService'; import { getTemplates as getTaskTemplates } from 'vs/workbench/parts/tasks/common/taskTemplates'; import * as TaskConfig from '../node/taskConfiguration'; @@ -580,19 +581,6 @@ class TaskService implements ITaskService { CommandsRegistry.registerCommand('workbench.action.tasks.showTasks', () => { this.runShowTasks(); }); - - CommandsRegistry.registerCommand('_executeTaskProvider', (accessor, args) => { - return this.tasks().then((tasks) => { - let result: TaskItem[] = []; - for (let task of tasks) { - let item = Task.getTaskItem(task); - if (item) { - result.push(item); - } - } - return result; - }); - }); } private get workspaceFolders(): IWorkspaceFolder[] { @@ -694,8 +682,28 @@ class TaskService implements ITaskService { }); } - public tasks(): TPromise<Task[]> { - return this.getGroupedTasks().then(result => result.all()); + public tasks(filter?: TaskFilter): TPromise<Task[]> { + let range = filter && filter.version ? filter.version : undefined; + let engine = this.executionEngine; + + if (range && ((semver.satisfies('0.1.0', range) && engine === ExecutionEngine.Terminal) || (semver.satisfies('2.0.0', range) && engine === ExecutionEngine.Process))) { + return TPromise.as<Task[]>([]); + } + return this.getGroupedTasks().then((map) => { + if (!filter || !filter.type) { + return map.all(); + } + let result: Task[] = []; + map.forEach((tasks) => { + for (let task of tasks) { + let definition = Task.getTaskDefinition(task); + if (definition && definition.type === filter.type) { + result.push(task); + } + } + }); + return result; + }); } public createSorter(): TaskSorter { From 6988c29d50b4d048d48444b3d6a1c820489b00c0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 11:58:23 +0200 Subject: [PATCH 570/710] less bitmasks, replace FileOpenFlags with FileOptions, #47475 --- src/vs/platform/files/common/files.ts | 36 +++++++++++++----- src/vs/vscode.proposed.d.ts | 38 ++++++++++++++----- .../electron-browser/mainThreadFileSystem.ts | 18 ++++----- src/vs/workbench/api/node/extHost.protocol.ts | 10 ++--- .../workbench/api/node/extHostFileSystem.ts | 20 +++++----- .../electron-browser/remoteFileService.ts | 27 ++++++------- .../files/electron-browser/streams.ts | 30 +++++++-------- 7 files changed, 105 insertions(+), 74 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 1841a20af7e..854ef646d75 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -156,11 +156,27 @@ export enum FileType2 { SymbolicLink = 4, } -export enum FileOpenFlags { - Read = 0b0001, - Write = 0b0010, - Create = 0b0100, - Exclusive = 0b1000 +export interface FileOptions { + /** + * Create a file when it doesn't exists. + */ + create?: boolean; + + /** + * In combination with [`create`](FileOptions.create) but + * the operation should fail when a file already exists. + */ + exclusive?: boolean; + + /** + * Open a file for reading. + */ + read?: boolean; + + /** + * Open a file for writing. + */ + write?: boolean; } export interface IStat { @@ -194,13 +210,13 @@ export interface IFileSystemProvider { readdir(resource: URI): TPromise<[string, IStat][]>; delete(resource: URI): TPromise<void>; - rename(from: URI, to: URI, opts: { flags: FileOpenFlags }): TPromise<IStat>; - copy?(from: URI, to: URI, opts: { flags: FileOpenFlags }): TPromise<IStat>; + rename(from: URI, to: URI, opts: FileOptions): TPromise<IStat>; + copy?(from: URI, to: URI, opts: FileOptions): TPromise<IStat>; - readFile?(resource: URI, opts: { flags: FileOpenFlags }): TPromise<Uint8Array>; - writeFile?(resource: URI, content: Uint8Array, opts: { flags: FileOpenFlags }): TPromise<void>; + readFile?(resource: URI, opts: FileOptions): TPromise<Uint8Array>; + writeFile?(resource: URI, content: Uint8Array, opts: FileOptions): TPromise<void>; - open?(resource: URI, opts: { flags: FileOpenFlags }): TPromise<number>; + open?(resource: URI, opts: FileOptions): TPromise<number>; close?(fd: number): TPromise<void>; read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise<number>; write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise<number>; diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index e563e3eccb1..d58beba09af 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -135,11 +135,31 @@ declare module 'vscode' { size: number; } - export enum FileOpenFlags { - Read = 0b0001, - Write = 0b0010, - Create = 0b0100, - Exclusive = 0b1000 + /** + * + */ + export interface FileOptions { + + /** + * Create a file when it doesn't exists + */ + create?: boolean; + + /** + * In combination with [`create`](FileOptions.create) but + * the operation should fail when a file already exists. + */ + exclusive?: boolean; + + /** + * Open a file for reading. + */ + read?: boolean; + + /** + * Open a file for writing. + */ + write?: boolean; } /** @@ -197,7 +217,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return A thenable that resolves to an array of bytes. */ - readFile(uri: Uri, options: { flags: FileOpenFlags }, token: CancellationToken): Uint8Array | Thenable<Uint8Array>; + readFile(uri: Uri, options: FileOptions, token: CancellationToken): Uint8Array | Thenable<Uint8Array>; /** * Write data to a file, replacing its entire contents. @@ -206,7 +226,7 @@ declare module 'vscode' { * @param content The new content of the file. * @param token A cancellation token. */ - writeFile(uri: Uri, content: Uint8Array, options: { flags: FileOpenFlags }, token: CancellationToken): void | Thenable<void>; + writeFile(uri: Uri, content: Uint8Array, options: FileOptions, token: CancellationToken): void | Thenable<void>; /** * Delete a file or folder from the underlying storage. @@ -224,7 +244,7 @@ declare module 'vscode' { * @param newUri The target location. * @param token A cancellation token. */ - rename(oldUri: Uri, newUri: Uri, options: { flags: FileOpenFlags }, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat2 | Thenable<FileStat2>; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -234,7 +254,7 @@ declare module 'vscode' { * @param target The target location. * @param token A cancellation token. */ - copy?(uri: Uri, target: Uri, options: { flags: FileOpenFlags }, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat2 | Thenable<FileStat2>; } export namespace workspace { diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index e2c1accca14..2f632a363e8 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -8,7 +8,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { FileOpenFlags, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files'; +import { FileOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions } from 'vs/platform/files/common/files'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; @@ -94,17 +94,17 @@ class RemoteFileSystemProvider implements IFileSystemProvider { }); } - readFile(resource: URI, opts: { flags: FileOpenFlags }): TPromise<Uint8Array, any> { - return this._proxy.$readFile(this._handle, resource, opts.flags).then(encoded => { + readFile(resource: URI, opts: FileOptions): TPromise<Uint8Array, any> { + return this._proxy.$readFile(this._handle, resource, opts).then(encoded => { return Buffer.from(encoded, 'base64'); }); } - writeFile(resource: URI, content: Uint8Array, opts: { flags: FileOpenFlags }): TPromise<void, any> { + writeFile(resource: URI, content: Uint8Array, opts: FileOptions): TPromise<void, any> { let encoded = Buffer.isBuffer(content) ? content.toString('base64') : Buffer.from(content.buffer, content.byteOffset, content.byteLength).toString('base64'); - return this._proxy.$writeFile(this._handle, resource, encoded, opts.flags); + return this._proxy.$writeFile(this._handle, resource, encoded, opts); } delete(resource: URI): TPromise<void, any> { @@ -119,11 +119,11 @@ class RemoteFileSystemProvider implements IFileSystemProvider { return this._proxy.$readdir(this._handle, resource); } - rename(resource: URI, target: URI, opts: { flags: FileOpenFlags }): TPromise<IStat, any> { - return this._proxy.$rename(this._handle, resource, target, opts.flags); + rename(resource: URI, target: URI, opts: FileOptions): TPromise<IStat, any> { + return this._proxy.$rename(this._handle, resource, target, opts); } - copy(resource: URI, target: URI, opts: { flags: FileOpenFlags }): TPromise<IStat, any> { - return this._proxy.$copy(this._handle, resource, target, opts.flags); + copy(resource: URI, target: URI, opts: FileOptions): TPromise<IStat, any> { + return this._proxy.$copy(this._handle, resource, target, opts); } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index d05cabc9ae7..a1c2dbdd980 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -42,7 +42,7 @@ import { ITreeItem } from 'vs/workbench/common/views'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SerializedError } from 'vs/base/common/errors'; -import { IStat, FileChangeType, FileOpenFlags, IWatchOptions, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { IStat, FileChangeType, IWatchOptions, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { CommentRule, CharacterPair, EnterAction } from 'vs/editor/common/modes/languageConfiguration'; import { ISingleEditOperation } from 'vs/editor/common/model'; @@ -572,10 +572,10 @@ export interface ExtHostWorkspaceShape { export interface ExtHostFileSystemShape { $stat(handle: number, resource: UriComponents): TPromise<IStat>; - $readFile(handle: number, resource: UriComponents, flags: FileOpenFlags): TPromise<string>; - $writeFile(handle: number, resource: UriComponents, base64Encoded: string, flags: FileOpenFlags): TPromise<void>; - $rename(handle: number, resource: UriComponents, target: UriComponents, flags: FileOpenFlags): TPromise<IStat>; - $copy(handle: number, resource: UriComponents, target: UriComponents, flags: FileOpenFlags): TPromise<IStat>; + $readFile(handle: number, resource: UriComponents, opts: FileOptions): TPromise<string>; + $writeFile(handle: number, resource: UriComponents, base64Encoded: string, opts: FileOptions): TPromise<void>; + $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOptions): TPromise<IStat>; + $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOptions): TPromise<IStat>; $mkdir(handle: number, resource: UriComponents): TPromise<IStat>; $readdir(handle: number, resource: UriComponents): TPromise<[string, IStat][]>; $delete(handle: number, resource: UriComponents): TPromise<void>; diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 282c72ba611..ae0e2689e4e 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -153,8 +153,8 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { return Buffer.concat(chunks); }); } - writeFile(resource: vscode.Uri, content: Uint8Array, options: { flags: vscode.FileOpenFlags }): Thenable<void> { - // if (options.flags & (files.FileOpenFlags.Exclusive) ) + + writeFile(resource: vscode.Uri, content: Uint8Array, options: files.FileOptions): Thenable<void> { return this._delegate.write(resource, content); } } @@ -258,28 +258,28 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { return asWinJsPromise(token => this._fsProvider.get(handle).readDirectory(URI.revive(resource), {}, token)); } - $readFile(handle: number, resource: UriComponents, flags: files.FileOpenFlags): TPromise<string> { + $readFile(handle: number, resource: UriComponents, opts: files.FileOptions): TPromise<string> { return asWinJsPromise(token => { - return this._fsProvider.get(handle).readFile(URI.revive(resource), { flags }, token); + return this._fsProvider.get(handle).readFile(URI.revive(resource), opts, token); }).then(data => { return Buffer.isBuffer(data) ? data.toString('base64') : Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString('base64'); }); } - $writeFile(handle: number, resource: UriComponents, base64Content: string, flags: files.FileOpenFlags): TPromise<void, any> { - return asWinJsPromise(token => this._fsProvider.get(handle).writeFile(URI.revive(resource), Buffer.from(base64Content, 'base64'), { flags }, token)); + $writeFile(handle: number, resource: UriComponents, base64Content: string, opts: files.FileOptions): TPromise<void, any> { + return asWinJsPromise(token => this._fsProvider.get(handle).writeFile(URI.revive(resource), Buffer.from(base64Content, 'base64'), opts, token)); } $delete(handle: number, resource: UriComponents): TPromise<void, any> { return asWinJsPromise(token => this._fsProvider.get(handle).delete(URI.revive(resource), {}, token)); } - $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, flags: files.FileOpenFlags): TPromise<files.IStat, any> { - return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), { flags }, token)); + $rename(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOptions): TPromise<files.IStat, any> { + return asWinJsPromise(token => this._fsProvider.get(handle).rename(URI.revive(oldUri), URI.revive(newUri), opts, token)); } - $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, flags: files.FileOpenFlags): TPromise<files.IStat, any> { - return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), { flags }, token)); + $copy(handle: number, oldUri: UriComponents, newUri: UriComponents, opts: files.FileOptions): TPromise<files.IStat, any> { + return asWinJsPromise(token => this._fsProvider.get(handle).copy(URI.revive(oldUri), URI.revive(newUri), opts, token)); } $mkdir(handle: number, resource: UriComponents): TPromise<files.IStat, any> { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 90661a63377..d3e66820572 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOpenFlags, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -353,7 +353,7 @@ export class RemoteFileService extends FileService { } }; - const readable = createReadableOfProvider(provider, resource, options.position || 0, FileOpenFlags.Read); + const readable = createReadableOfProvider(provider, resource, options.position || 0, { read: true }); return toDecodeStream(readable, decodeStreamOpts).then(data => { @@ -386,13 +386,8 @@ export class RemoteFileService extends FileService { } else { return this._withProvider(resource).then(provider => { - let flags = FileOpenFlags.Write | FileOpenFlags.Create; - if (options && options.overwrite === false) { - flags += FileOpenFlags.Exclusive; - } - const encoding = this.encoding.getWriteEncoding(resource); - return this._writeFile(provider, resource, new StringSnapshot(content), { encoding }, flags); + return this._writeFile(provider, resource, new StringSnapshot(content), encoding, { write: true, create: true, exclusive: !(options && options.overwrite) }); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); @@ -414,16 +409,16 @@ export class RemoteFileService extends FileService { } return this._withProvider(resource).then(provider => { const snapshot = typeof value === 'string' ? new StringSnapshot(value) : value; - return this._writeFile(provider, resource, snapshot, options || {}, FileOpenFlags.Write); + return this._writeFile(provider, resource, snapshot, options && options.encoding, { write: true }); }); } } - private _writeFile(provider: IFileSystemProvider, resource: URI, snapshot: ITextSnapshot, options: IUpdateContentOptions, fags: FileOpenFlags): TPromise<IFileStat> { + private _writeFile(provider: IFileSystemProvider, resource: URI, snapshot: ITextSnapshot, preferredEncoding: string, options: FileOptions): TPromise<IFileStat> { const readable = createReadableOfSnapshot(snapshot); - const encoding = this.encoding.getWriteEncoding(resource, options.encoding); + const encoding = this.encoding.getWriteEncoding(resource, preferredEncoding); const decoder = decodeStream(encoding); - const target = createWritableOfProvider(provider, resource, FileOpenFlags.Write); + const target = createWritableOfProvider(provider, resource, options); return new TPromise<IFileStat>((resolve, reject) => { readable.pipe(decoder).pipe(target); target.once('error', err => reject(err)); @@ -525,7 +520,7 @@ export class RemoteFileService extends FileService { : TPromise.as(null); return prepare.then(() => this._withProvider(source)).then(provider => { - return provider.rename(source, target, { flags: 0 /*todo@remote -> RENAME_NOREPLACE */ }).then(stat => { + return provider.rename(source, target, { create: true, exclusive: !overwrite }).then(stat => { return toIFileStat(provider, [target, stat]); }).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat)); @@ -554,7 +549,7 @@ export class RemoteFileService extends FileService { if (source.scheme === target.scheme && (provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy)) { // good: provider supports copy withing scheme - return provider.copy(source, target, { flags: 0 }).then(stat => toIFileStat(provider, [target, stat])); + return provider.copy(source, target, { create: true, exclusive: !overwrite }).then(stat => toIFileStat(provider, [target, stat])); } const prepare = overwrite @@ -569,8 +564,8 @@ export class RemoteFileService extends FileService { return this._writeFile( provider, target, new StringSnapshot(content.value), - { encoding: content.encoding }, - FileOpenFlags.Create | FileOpenFlags.Write + content.encoding, + { write: true, create: true, exclusive: !overwrite } ).then(fileStat => { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat)); return fileStat; diff --git a/src/vs/workbench/services/files/electron-browser/streams.ts b/src/vs/workbench/services/files/electron-browser/streams.ts index ce1f4e50d54..583166be2cc 100644 --- a/src/vs/workbench/services/files/electron-browser/streams.ts +++ b/src/vs/workbench/services/files/electron-browser/streams.ts @@ -7,20 +7,20 @@ import { Readable, Writable } from 'stream'; import { UTF8 } from 'vs/base/node/encoding'; import URI from 'vs/base/common/uri'; -import { IFileSystemProvider, ITextSnapshot, FileSystemProviderCapabilities, FileOpenFlags } from 'vs/platform/files/common/files'; +import { IFileSystemProvider, ITextSnapshot, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; import { illegalArgument } from 'vs/base/common/errors'; -export function createWritableOfProvider(provider: IFileSystemProvider, resource: URI, flags: FileOpenFlags): Writable { +export function createWritableOfProvider(provider: IFileSystemProvider, resource: URI, opts: FileOptions): Writable { if (provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose) { - return createWritable(provider, resource, flags); + return createWritable(provider, resource, opts); } else if (provider.capabilities & FileSystemProviderCapabilities.FileReadWrite) { - return createSimpleWritable(provider, resource, flags); + return createSimpleWritable(provider, resource, opts); } else { throw illegalArgument(); } } -function createSimpleWritable(provider: IFileSystemProvider, resource: URI, flags: FileOpenFlags): Writable { +function createSimpleWritable(provider: IFileSystemProvider, resource: URI, opts: FileOptions): Writable { return new class extends Writable { _chunks: Buffer[] = []; constructor(opts?) { @@ -32,7 +32,7 @@ function createSimpleWritable(provider: IFileSystemProvider, resource: URI, flag } end() { // todo@joh - end might have another chunk... - provider.writeFile(resource, Buffer.concat(this._chunks), { flags }).then(_ => { + provider.writeFile(resource, Buffer.concat(this._chunks), opts).then(_ => { super.end(); }, err => { this.emit('error', err); @@ -41,7 +41,7 @@ function createSimpleWritable(provider: IFileSystemProvider, resource: URI, flag }; } -function createWritable(provider: IFileSystemProvider, resource: URI, flags: FileOpenFlags): Writable { +function createWritable(provider: IFileSystemProvider, resource: URI, opts: FileOptions): Writable { return new class extends Writable { _fd: number; _pos: number; @@ -51,7 +51,7 @@ function createWritable(provider: IFileSystemProvider, resource: URI, flags: Fil async _write(chunk: Buffer, encoding, callback: Function) { try { if (typeof this._fd !== 'number') { - this._fd = await provider.open(resource, { flags }); + this._fd = await provider.open(resource, opts); } let bytesWritten = await provider.write(this._fd, this._pos, chunk, 0, chunk.length); this._pos += bytesWritten; @@ -70,17 +70,17 @@ function createWritable(provider: IFileSystemProvider, resource: URI, flags: Fil }; } -export function createReadableOfProvider(provider: IFileSystemProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { +export function createReadableOfProvider(provider: IFileSystemProvider, resource: URI, position: number, opts: FileOptions): Readable { if (provider.capabilities & FileSystemProviderCapabilities.FileOpenReadWriteClose) { - return createReadable(provider, resource, position, flags); + return createReadable(provider, resource, position, opts); } else if (provider.capabilities & FileSystemProviderCapabilities.FileReadWrite) { - return createSimpleReadable(provider, resource, position, flags); + return createSimpleReadable(provider, resource, position, opts); } else { throw illegalArgument(); } } -function createReadable(provider: IFileSystemProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { +function createReadable(provider: IFileSystemProvider, resource: URI, position: number, opts: FileOptions): Readable { return new class extends Readable { _fd: number; _pos: number = position; @@ -96,7 +96,7 @@ function createReadable(provider: IFileSystemProvider, resource: URI, position: this._reading = true; try { if (typeof this._fd !== 'number') { - this._fd = await provider.open(resource, { flags }); + this._fd = await provider.open(resource, opts); } let buffer = Buffer.allocUnsafe(64 * 1024); while (this._reading) { @@ -124,14 +124,14 @@ function createReadable(provider: IFileSystemProvider, resource: URI, position: }; } -function createSimpleReadable(provider: IFileSystemProvider, resource: URI, position: number, flags: FileOpenFlags): Readable { +function createSimpleReadable(provider: IFileSystemProvider, resource: URI, position: number, opts: FileOptions): Readable { return new class extends Readable { _readOperation: Thenable<any>; _read(size?: number): void { if (this._readOperation) { return; } - this._readOperation = provider.readFile(resource, { flags }).then(data => { + this._readOperation = provider.readFile(resource, opts).then(data => { this.push(data.slice(position)); this.push(null); }, err => { From fac18e5ba8ec04982ed616cd599979fc6ecf4f41 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Fri, 20 Apr 2018 12:03:37 +0200 Subject: [PATCH 571/710] Fix #46609 --- .../electron-browser/main.contribution.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 26d69e90739..eb578183a03 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -9,7 +9,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import * as nls from 'vs/nls'; import product from 'vs/platform/node/product'; import * as os from 'os'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; @@ -17,9 +17,11 @@ import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, OpenTipsAndTricksUrlAction, OpenIssueReporterAction, ReportPerformanceIssueUsingReporterAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseWorkspaceAction, CloseCurrentWindowAction, SwitchWindow, NewWindowAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction, QuickSwitchWindow, QuickOpenRecentAction, inRecentFilesPickerContextKey, ShowAboutDialogAction, InspectContextKeysAction, OpenProcessExplorer } from 'vs/workbench/electron-browser/actions'; import { registerCommands } from 'vs/workbench/electron-browser/commands'; import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, OpenFolderAsWorkspaceInNewWindowAction, OpenFileFolderAction, OpenFileAction, OpenFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ContextKeyExpr, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; // Contribute Commands registerCommands(); @@ -103,9 +105,19 @@ workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(AddRoo workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalRemoveRootFolderAction, GlobalRemoveRootFolderAction.ID, GlobalRemoveRootFolderAction.LABEL), 'Workspaces: Remove Folder from Workspace...', workspacesCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceAction, OpenWorkspaceAction.ID, OpenWorkspaceAction.LABEL), 'Workspaces: Open Workspace...', workspacesCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(SaveWorkspaceAsAction, SaveWorkspaceAsAction.ID, SaveWorkspaceAsAction.LABEL), 'Workspaces: Save Workspace As...', workspacesCategory); -workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceConfigFileAction, OpenWorkspaceConfigFileAction.ID, OpenWorkspaceConfigFileAction.LABEL), 'Workspaces: Open Workspace Configuration File', workspacesCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenFolderAsWorkspaceInNewWindowAction, OpenFolderAsWorkspaceInNewWindowAction.ID, OpenFolderAsWorkspaceInNewWindowAction.LABEL), 'Workspaces: Open Folder as Workspace in New Window', workspacesCategory); +CommandsRegistry.registerCommand(OpenWorkspaceConfigFileAction.ID, serviceAccessor => { + serviceAccessor.get(IInstantiationService).createInstance(OpenWorkspaceConfigFileAction, OpenWorkspaceConfigFileAction.ID, OpenWorkspaceConfigFileAction.LABEL).run(); +}); +MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id: OpenWorkspaceConfigFileAction.ID, + title: `${workspacesCategory}: ${OpenWorkspaceConfigFileAction.LABEL}`, + }, + when: new RawContextKey<string>('workbenchState', '').isEqualTo('workspace') +}); + // Developer related actions const developerCategory = nls.localize('developer', "Developer"); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowStartupPerformance, ShowStartupPerformance.ID, ShowStartupPerformance.LABEL), 'Developer: Startup Performance', developerCategory); From 3569b1d3850a4565ac6024497d138cfbab4b22d9 Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Fri, 20 Apr 2018 12:03:38 +0200 Subject: [PATCH 572/710] improve error handling in variableResolver --- .../node/variableResolver.ts | 111 ++++++++++-------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts index edc0d4c0752..76c5a423113 100644 --- a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts @@ -72,6 +72,7 @@ export class VariableResolver { } switch (variable) { + case 'env': if (argument) { if (isWindows) { @@ -84,104 +85,112 @@ export class VariableResolver { // For `env` we should do the same as a normal shell does - evaluates missing envs to an empty string #46436 return ''; } - throw new Error(localize('missingEnvVarName', "'{0}' can not be resolved because no environment variable is given.", match)); + throw new Error(localize('missingEnvVarName', "'{0}' can not be resolved because no environment variable name is given.", match)); case 'config': if (argument) { const config = this.accessor.getConfigurationValue(folderUri, argument); - if (!types.isUndefinedOrNull(config) && !types.isObject(config)) { - return config; + if (types.isUndefinedOrNull(config)) { + throw new Error(localize('configNotFound', "'{0}' can not be resolved because setting '{1}' not found.", match, argument)); } - throw new Error(localize('configNoString', "'{0}' can not be resolved because '{1}' is a structured value.", match, argument)); + if (types.isObject(config)) { + throw new Error(localize('configNoString', "'{0}' can not be resolved because '{1}' is a structured value.", match, argument)); + } + return config; } throw new Error(localize('missingConfigName', "'{0}' can not be resolved because no settings name is given.", match)); default: { - if (argument) { - const folder = this.accessor.getFolderUri(argument); - if (folder) { - folderUri = folder; - } + // common error handling for all variables that require an open folder and accept a folder name argument + switch (variable) { + case 'workspaceRoot': + case 'workspaceFolder': + case 'workspaceRootFolderName': + case 'workspaceFolderBasename': + case 'relativeFile': + if (argument) { + const folder = this.accessor.getFolderUri(argument); + if (folder) { + folderUri = folder; + } else { + throw new Error(localize('canNotFindFolder', "'{0}' can not be resolved. No such folder '{1}'.", match, argument)); + } + } + if (!folderUri) { + if (this.accessor.getWorkspaceFolderCount() > 1) { + throw new Error(localize('canNotResolveWorkspaceFolderMultiRoot', "'{0}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.", match)); + } + throw new Error(localize('canNotResolveWorkspaceFolder', "'{0}' can not be resolved. Please open a folder.", match)); + } + break; + default: + break; + } + + // common error handling for all variables that require an open file + switch (variable) { + case 'file': + case 'relativeFile': + case 'fileDirname': + case 'fileExtname': + case 'fileBasename': + case 'fileBasenameNoExtension': + if (!filePath) { + throw new Error(localize('canNotResolveFile', "'{0}' can not be resolved. Please open an editor.", match)); + } + break; + default: + break; } switch (variable) { case 'workspaceRoot': case 'workspaceFolder': - if (folderUri) { - return normalizeDriveLetter(folderUri.fsPath); - } - if (this.accessor.getWorkspaceFolderCount() > 1) { - throw new Error(localize('canNotResolveWorkspaceFolderMultiRoot', "'{0}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.", match)); - } - throw new Error(localize('canNotResolveWorkspaceFolder', "'{0}' can not be resolved. Please open a folder.", match)); + return normalizeDriveLetter(folderUri.fsPath); case 'cwd': return folderUri ? normalizeDriveLetter(folderUri.fsPath) : process.cwd(); case 'workspaceRootFolderName': case 'workspaceFolderBasename': - if (folderUri) { - return paths.basename(folderUri.fsPath); - } - if (this.accessor.getWorkspaceFolderCount() > 1) { - throw new Error(localize('canNotResolveFolderBasenameMultiRoot', "'{0}' can not be resolved in a multi folder workspace. Scope this variable using ':' and a workspace folder name.", match)); - } - throw new Error(localize('canNotResolveFolderBasename', "'{0}' can not be resolved. Please open a folder.", match)); + return paths.basename(folderUri.fsPath); case 'lineNumber': const lineNumber = this.accessor.getLineNumber(); if (lineNumber) { return lineNumber; } - throw new Error(localize('canNotResolveLineNumber', "'{0}' can not be resolved. Please open an editor.", match)); + throw new Error(localize('canNotResolveLineNumber', "'{0}' can not be resolved. Make sure to have a line selected in the active editor.", match)); case 'selectedText': const selectedText = this.accessor.getSelectedText(); if (selectedText) { return selectedText; } - throw new Error(localize('canNotResolveSelectedText', "'{0}' can not be resolved. Please open an editor and select some text.", match)); + throw new Error(localize('canNotResolveSelectedText', "'{0}' can not be resolved. Make sure to have some text selected in the active editor.", match)); case 'file': - if (filePath) { - return filePath; - } - throw new Error(localize('canNotResolveFile', "'{0}' can not be resolved. Please open an editor.", match)); + return filePath; case 'relativeFile': - if (folderUri && filePath) { + if (folderUri) { return paths.normalize(relative(folderUri.fsPath, filePath)); } - if (filePath) { - return filePath; - } - throw new Error(localize('canNotResolveRelativeFile', "'{0}' can not be resolved. Please open an editor.", match)); + return filePath; case 'fileDirname': - if (filePath) { - return paths.dirname(filePath); - } - throw new Error(localize('canNotResolveFileDirname', "'{0}' can not be resolved. Please open an editor.", match)); + return paths.dirname(filePath); case 'fileExtname': - if (filePath) { - return paths.extname(filePath); - } - throw new Error(localize('canNotResolveFileExtname', "'{0}' can not be resolved. Please open an editor.", match)); + return paths.extname(filePath); case 'fileBasename': - if (filePath) { - return paths.basename(filePath); - } - throw new Error(localize('canNotResolveFileBasename', "'{0}' can not be resolved. Please open an editor.", match)); + return paths.basename(filePath); case 'fileBasenameNoExtension': - if (filePath) { - const basename = paths.basename(filePath); - return basename.slice(0, basename.length - paths.extname(basename).length); - } - throw new Error(localize('canNotResolveFileBasenameNoExtension', "'{0}' can not be resolved. Please open an editor.", match)); + const basename = paths.basename(filePath); + return basename.slice(0, basename.length - paths.extname(basename).length); case 'execPath': return this.accessor.getEnvironmentService('execPath'); From 2d9528ab55e083ee590ddb61fb85cbf932117cf0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 12:34:12 +0200 Subject: [PATCH 573/710] only allow events from a provider's scheme, #47475 --- src/vs/workbench/api/node/extHostFileSystem.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index ae0e2689e4e..417d3f3e8a1 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -7,7 +7,7 @@ import URI, { UriComponents } from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Event, mapEvent } from 'vs/base/common/event'; -import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystemShape } from './extHost.protocol'; +import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystemShape, IFileChangeDto } from './extHost.protocol'; import * as vscode from 'vscode'; import * as files from 'vs/platform/files/common/files'; import * as path from 'path'; @@ -220,8 +220,13 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { this._proxy.$registerFileSystemProvider(handle, scheme, capabilites); const subscription = provider.onDidChangeFile(event => { - let newEvent = event.map(e => { + let mapped: IFileChangeDto[] = []; + for (const e of event) { let { uri: resource, type } = e; + if (resource.scheme !== scheme) { + // dropping events for wrong scheme + continue; + } let newType: files.FileChangeType; switch (type) { case FileChangeType2.Changed: @@ -234,9 +239,9 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { newType = files.FileChangeType.DELETED; break; } - return { resource, type: newType }; - }); - this._proxy.$onFileSystemChange(handle, newEvent); + mapped.push({ resource, type: newType }); + } + this._proxy.$onFileSystemChange(handle, mapped); }); return { From a877d74d3e5d06f0582b2040f24428830f91cd20 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 12:36:05 +0200 Subject: [PATCH 574/710] fix compile error --- src/vs/workbench/api/node/extHost.api.impl.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 61c42dcad44..36de938e154 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -57,7 +57,6 @@ import { ExtensionActivatedByAPI } from 'vs/workbench/api/node/extHostExtensionA import { OverviewRulerLane } from 'vs/editor/common/model'; import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview'; -import * as files from 'vs/platform/files/common/files'; import { ExtHostSearch } from './extHostSearch'; export interface IExtensionApiFactory { @@ -697,7 +696,6 @@ export function createApiFactory( DeprecatedFileType: extHostTypes.FileType, FileChangeType2: extHostTypes.FileChangeType2, FileType2: extHostTypes.FileType2, - FileOpenFlags: files.FileOpenFlags, FileSystemError: extHostTypes.FileSystemError, FoldingRange: extHostTypes.FoldingRange, FoldingRangeKind: extHostTypes.FoldingRangeKind From 4cce36adf59fbc0f950d608ca187949ac768913c Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Fri, 20 Apr 2018 12:54:22 +0200 Subject: [PATCH 575/710] eh debug: Do not end process on initial attach fixes #43516 --- .../parts/debug/electron-browser/debugService.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index afa634c5d1c..d24ae70b037 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -153,11 +153,17 @@ export class DebugService implements debug.IDebugService { const session = <RawDebugSession>process.session; if (broadcast.channel === EXTENSION_ATTACH_BROADCAST_CHANNEL) { - this.onSessionEnd(session); - + const initialAttach = process.configuration.request === 'launch'; process.configuration.request = 'attach'; process.configuration.port = broadcast.payload.port; - this.doCreateProcess(process.session.root, process.configuration, process.getId()); + // Do not end process on initial attach (since the request is still 'launch') + if (initialAttach) { + session.attach(process.configuration); + } else { + this.onSessionEnd(session); + this.doCreateProcess(process.session.root, process.configuration, process.getId()); + } + return; } From cf44fd649891e852e6ebaf96477acda20d855c91 Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Fri, 20 Apr 2018 13:17:59 +0200 Subject: [PATCH 576/710] remove getEnvironmentService from IVariableAccessor --- src/vs/workbench/api/node/extHostDebugService.ts | 5 ++--- .../electron-browser/configurationResolverService.ts | 4 ++-- .../configurationResolver/node/variableResolver.ts | 8 ++++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index 2ae91c279e1..b969522ba5e 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -547,8 +547,8 @@ export class ExtHostVariableResolverService implements IConfigurationResolverSer getConfigurationValue: (folderUri: URI, section: string) => { return configuration.getConfiguration(undefined, folderUri).get<string>(section); }, - getEnvironmentService: (name: string): string => { - return undefined; + getExecPath: (): string | undefined => { + return undefined; // does not exist in EH }, getFilePath: (): string | undefined => { const activeEditor = editors.activeEditor(); @@ -561,7 +561,6 @@ export class ExtHostVariableResolverService implements IConfigurationResolverSer return undefined; }, getSelectedText: (): string | undefined => { - debugger; const activeEditor = editors.activeEditor(); if (activeEditor && !activeEditor.selection.isEmpty) { return activeEditor.document.getText(activeEditor.selection); diff --git a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts index 26c6ee9cf95..080f600ce81 100644 --- a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts @@ -45,8 +45,8 @@ export class ConfigurationResolverService implements IConfigurationResolverServi getConfigurationValue: (folderUri: uri, suffix: string) => { return configurationService.getValue<string>(suffix, folderUri ? { resource: folderUri } : undefined); }, - getEnvironmentService: (name: string) => { - return environmentService[name]; + getExecPath: () => { + return environmentService['execPath']; }, getFilePath: (): string | undefined => { let input = editorService.getActiveEditorInput(); diff --git a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts index 76c5a423113..a8fc1e8b982 100644 --- a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts @@ -17,7 +17,7 @@ export interface IVariableAccessor { getFolderUri(folderName: string): uri | undefined; getWorkspaceFolderCount(): number; getConfigurationValue(folderUri: uri, section: string): string | undefined; - getEnvironmentService(name: string): string | undefined; + getExecPath(): string | undefined; getFilePath(): string | undefined; getSelectedText(): string | undefined; getLineNumber(): string; @@ -193,7 +193,11 @@ export class VariableResolver { return basename.slice(0, basename.length - paths.extname(basename).length); case 'execPath': - return this.accessor.getEnvironmentService('execPath'); + const ep = this.accessor.getExecPath(); + if (ep) { + return ep; + } + throw new Error(localize('canNotResolveExecPath', "'{0}' can not be resolved.", match)); default: return match; From d6b38359e61f0f392afc5b79c56b9709217b9b08 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Fri, 20 Apr 2018 13:24:23 +0200 Subject: [PATCH 577/710] proposed open url api --- build/lib/i18n.resources.json | 6 +- src/vs/vscode.proposed.d.ts | 16 +++++ .../extensionHost.contribution.ts | 1 + .../api/electron-browser/mainThreadUrls.ts | 68 +++++++++++++++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 5 ++ src/vs/workbench/api/node/extHost.protocol.ts | 11 +++ src/vs/workbench/api/node/extHostUrls.ts | 46 +++++++++++++ .../url/electron-browser/url.contribution.ts | 39 +++++++++++ src/vs/workbench/workbench.main.ts | 1 + 9 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 src/vs/workbench/api/electron-browser/mainThreadUrls.ts create mode 100644 src/vs/workbench/api/node/extHostUrls.ts create mode 100644 src/vs/workbench/parts/url/electron-browser/url.contribution.ts diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index 18567d3f995..4cf0bc4cf6a 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -130,6 +130,10 @@ "name": "vs/workbench/parts/update", "project": "vscode-workbench" }, + { + "name": "vs/workbench/parts/url", + "project": "vscode-workbench" + }, { "name": "vs/workbench/parts/watermark", "project": "vscode-workbench" @@ -215,4 +219,4 @@ "project": "vscode-preferences" } ] -} +} \ No newline at end of file diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index d58beba09af..a0ce8f7b2e3 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -657,4 +657,20 @@ declare module 'vscode' { } //#endregion + + //#region URLs + + export interface UrlHandler { + handleUrl(uri: Uri): void; + } + + export namespace window { + + /** + * Registers a URL handler. + */ + export function registerUrlHandler(handler: UrlHandler): Disposable; + } + + //#endregion } diff --git a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts index 13d824066d0..73eabaddf52 100644 --- a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts @@ -49,6 +49,7 @@ import './mainThreadTerminalService'; import './mainThreadTreeViews'; import './mainThreadLogService'; import './mainThreadWebview'; +import './mainThreadUrls'; import './mainThreadWindow'; import './mainThreadWorkspace'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts new file mode 100644 index 00000000000..64d74d4f23e --- /dev/null +++ b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts @@ -0,0 +1,68 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ExtHostContext, IExtHostContext, MainContext, MainThreadUrlsShape, ExtHostUrlsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from './extHostCustomers'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; +import URI from 'vs/base/common/uri'; +import { IDisposable } from 'vs/base/common/lifecycle'; + +class ExtensionUrlHandler implements IURLHandler { + + constructor( + private readonly proxy: ExtHostUrlsShape, + private readonly handle: number, + private readonly extensionId: string + ) { } + + handleURL(uri: URI): TPromise<boolean> { + if (uri.authority !== this.extensionId) { + return TPromise.as(false); + } + + return this.proxy.$handleUrl(this.handle, uri).then(() => true); + } +} + +@extHostNamedCustomer(MainContext.MainThreadUrls) +export class MainThreadUrls implements MainThreadUrlsShape { + + private readonly proxy: ExtHostUrlsShape; + + private handlers = new Map<number, IDisposable>(); + + constructor( + context: IExtHostContext, + @IURLService private urlService: IURLService + ) { + this.proxy = context.getProxy(ExtHostContext.ExtHostUrls); + } + + $registerUrlHandler(handle: number, extensionId: string): TPromise<void> { + const handler = new ExtensionUrlHandler(this.proxy, handle, extensionId); + const disposable = this.urlService.registerHandler(handler); + this.handlers.set(handle, disposable); + + return TPromise.as(null); + } + + $unregisterUrlHandler(handle: number): TPromise<void> { + const disposable = this.handlers.get(handle); + + if (!disposable) { + return TPromise.as(null); + } + + disposable.dispose(); + this.handlers.delete(handle); + + return TPromise.as(null); + } + + dispose(): void { + + } +} diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 36de938e154..aa7f6ee3094 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -58,6 +58,7 @@ import { OverviewRulerLane } from 'vs/editor/common/model'; import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview'; import { ExtHostSearch } from './extHostSearch'; +import { ExtHostUrls } from './extHostUrls'; export interface IExtensionApiFactory { (extension: IExtensionDescription): typeof vscode; @@ -98,6 +99,7 @@ export function createApiFactory( const extHostHeapService = rpcProtocol.set(ExtHostContext.ExtHostHeapService, new ExtHostHeapService()); const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, new ExtHostDecorations(rpcProtocol)); const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol)); + const extHostUrls = rpcProtocol.set(ExtHostContext.ExtHostUrls, new ExtHostUrls(rpcProtocol)); const extHostDocumentsAndEditors = rpcProtocol.set(ExtHostContext.ExtHostDocumentsAndEditors, new ExtHostDocumentsAndEditors(rpcProtocol)); const extHostDocuments = rpcProtocol.set(ExtHostContext.ExtHostDocuments, new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors)); const extHostDocumentContentProviders = rpcProtocol.set(ExtHostContext.ExtHostDocumentContentProviders, new ExtHostDocumentContentProvider(rpcProtocol, extHostDocumentsAndEditors, extHostLogService)); @@ -431,6 +433,9 @@ export function createApiFactory( }), registerWebviewPanelSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviews.registerWebviewPanelSerializer(viewType, serializer); + }), + registerUrlHandler: proposedApiFunction(extension, (handler: vscode.UrlHandler) => { + return extHostUrls.registerUrlHandler(extension.id, handler); }) }; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index a1c2dbdd980..9c1906697da 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -372,6 +372,15 @@ export interface ExtHostWebviewsShape { $serializeWebviewPanel(webviewHandle: WebviewPanelHandle): Thenable<any>; } +export interface MainThreadUrlsShape extends IDisposable { + $registerUrlHandler(handle: number, extensionId: string): TPromise<void>; + $unregisterUrlHandler(handle: number): TPromise<void>; +} + +export interface ExtHostUrlsShape { + $handleUrl(handle: number, uri: UriComponents): TPromise<void>; +} + export interface MainThreadWorkspaceShape extends IDisposable { $startSearch(includePattern: string, includeFolder: string, excludePatternOrDisregardExcludes: string | false, maxResults: number, requestId: number): Thenable<UriComponents[]>; $cancelSearch(requestId: number): Thenable<boolean>; @@ -873,6 +882,7 @@ export const MainContext = { MainThreadTelemetry: createMainId<MainThreadTelemetryShape>('MainThreadTelemetry'), MainThreadTerminalService: createMainId<MainThreadTerminalServiceShape>('MainThreadTerminalService'), MainThreadWebviews: createMainId<MainThreadWebviewsShape>('MainThreadWebviews'), + MainThreadUrls: createMainId<MainThreadUrlsShape>('MainThreadUrls'), MainThreadWorkspace: createMainId<MainThreadWorkspaceShape>('MainThreadWorkspace'), MainThreadFileSystem: createMainId<MainThreadFileSystemShape>('MainThreadFileSystem'), MainThreadExtensionService: createMainId<MainThreadExtensionServiceShape>('MainThreadExtensionService'), @@ -908,5 +918,6 @@ export const ExtHostContext = { ExtHostWorkspace: createExtId<ExtHostWorkspaceShape>('ExtHostWorkspace'), ExtHostWindow: createExtId<ExtHostWindowShape>('ExtHostWindow'), ExtHostWebviews: createExtId<ExtHostWebviewsShape>('ExtHostWebviews'), + ExtHostUrls: createExtId<ExtHostUrlsShape>('ExtHostUrls'), ExtHostProgress: createMainId<ExtHostProgressShape>('ExtHostProgress') }; diff --git a/src/vs/workbench/api/node/extHostUrls.ts b/src/vs/workbench/api/node/extHostUrls.ts new file mode 100644 index 00000000000..a9e946c0c6d --- /dev/null +++ b/src/vs/workbench/api/node/extHostUrls.ts @@ -0,0 +1,46 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { MainContext, IMainContext, ExtHostUrlsShape, MainThreadUrlsShape } from './extHost.protocol'; +import URI, { UriComponents } from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { toDisposable } from 'vs/base/common/lifecycle'; + +export class ExtHostUrls implements ExtHostUrlsShape { + + private static HandlePool = 0; + private readonly _proxy: MainThreadUrlsShape; + + private handlers = new Map<number, vscode.UrlHandler>(); + + constructor( + mainContext: IMainContext + ) { + this._proxy = mainContext.getProxy(MainContext.MainThreadUrls); + } + + registerUrlHandler(extensionId: string, handler: vscode.UrlHandler): vscode.Disposable { + const handle = ExtHostUrls.HandlePool++; + this.handlers.set(handle, handler); + this._proxy.$registerUrlHandler(handle, extensionId); + + return toDisposable(() => { + this.handlers.delete(handle); + this._proxy.$unregisterUrlHandler(handle); + }); + } + + $handleUrl(handle: number, uri: UriComponents): TPromise<void> { + const handler = this.handlers.get(handle); + + if (!handler) { + return TPromise.as(null); + } + + handler.handleUrl(URI.revive(uri)); + return TPromise.as(null); + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/url/electron-browser/url.contribution.ts b/src/vs/workbench/parts/url/electron-browser/url.contribution.ts new file mode 100644 index 00000000000..edbcc48c138 --- /dev/null +++ b/src/vs/workbench/parts/url/electron-browser/url.contribution.ts @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { localize } from 'vs/nls'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; +import { IURLService } from 'vs/platform/url/common/url'; +import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; +import URI from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { Action } from 'vs/base/common/actions'; + +export class OpenUrlAction extends Action { + + static readonly ID = 'workbench.action.url.openUrl'; + static readonly LABEL = localize('openUrl', "Open URL"); + + constructor( + id: string, + label: string, + @IURLService private urlService: IURLService, + @IQuickOpenService private quickOpenService: IQuickOpenService, + ) { + super(id, label); + } + + async run(): TPromise<any> { + const input = await this.quickOpenService.input({ prompt: 'URL to open' }); + const uri = URI.parse(input); + + this.urlService.open(uri); + } +} + +Registry.as<IWorkbenchActionRegistry>(ActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(OpenUrlAction, OpenUrlAction.ID, OpenUrlAction.LABEL), 'OpenUrl', localize('developer', "Developer")); \ No newline at end of file diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index dee2fb5336f..f9cf799d7fe 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -68,6 +68,7 @@ import 'vs/workbench/parts/markers/electron-browser/markers.contribution'; import 'vs/workbench/parts/html/electron-browser/html.contribution'; +import 'vs/workbench/parts/url/electron-browser/url.contribution'; import 'vs/workbench/parts/webview/electron-browser/webview.contribution'; import 'vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution'; From 21e0fa81034db341cf7a18cd847454809a83abf5 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Fri, 20 Apr 2018 13:42:51 +0200 Subject: [PATCH 578/710] expose scm view location --- src/vs/workbench/api/browser/viewsExtensionPoint.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 0fda4bcaa1a..2931cf6e8dd 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -79,6 +79,12 @@ namespace schema { type: 'array', items: viewDescriptor, default: [] + }, + 'scm': { + description: localize('views.scm', "Contributes views to SCM container in the Activity bar"), + type: 'array', + items: viewDescriptor, + default: [] } }, additionalProperties: { @@ -94,6 +100,7 @@ function getViewLocation(value: string): ViewLocation { switch (value) { case 'explorer': return ViewLocation.Explorer; case 'debug': return ViewLocation.Debug; + case 'scm': return ViewLocation.SCM; default: return ViewLocation.get(`workbench.view.extension.${value}`) || ViewLocation.Explorer; } } From 80759012c000e210b2a1a7770b6c77a8b7921e1a Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 13:37:08 +0200 Subject: [PATCH 579/710] remote - one todo less --- .../common/textModelResolverService.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index dcb3faa86c3..c7617a56e68 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -17,6 +17,7 @@ import * as network from 'vs/base/common/network'; import { ITextModelService, ITextModelContentProvider, ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; +import { IFileService } from 'vs/platform/files/common/files'; class ResourceModelCollection extends ReferenceCollection<TPromise<ITextEditorModel>> { @@ -24,19 +25,15 @@ class ResourceModelCollection extends ReferenceCollection<TPromise<ITextEditorMo constructor( @IInstantiationService private instantiationService: IInstantiationService, - @ITextFileService private textFileService: ITextFileService + @ITextFileService private textFileService: ITextFileService, + @IFileService private fileService: IFileService ) { super(); } public createReferencedObject(key: string): TPromise<ITextEditorModel> { const resource = URI.parse(key); - - if (resource.scheme === network.Schemas.file) { - return this.textFileService.models.loadOrCreate(resource); - } - if (!this.providers[resource.scheme]) { - // TODO@remote + if (this.fileService.canHandleResource(resource)) { return this.textFileService.models.loadOrCreate(resource); } return this.resolveTextModelContent(key).then(() => this.instantiationService.createInstance(ResourceEditorModel, resource)); From 9bcb7a0cfe23a34bbb9293aab85a8c283b6e3e03 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 13:53:23 +0200 Subject: [PATCH 580/710] remote, todo update, #48269 --- src/vs/workbench/api/node/extHostDocumentData.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostDocumentData.ts b/src/vs/workbench/api/node/extHostDocumentData.ts index 2be3ac6908d..d42afcf7ba0 100644 --- a/src/vs/workbench/api/node/extHostDocumentData.ts +++ b/src/vs/workbench/api/node/extHostDocumentData.ts @@ -68,8 +68,7 @@ export class ExtHostDocumentData extends MirrorTextModel { this._document = { get uri() { return data._uri; }, get fileName() { return data._uri.fsPath; }, - // todo@remote - // documents from other fs-provider must not be untitled + // todo@remote -> https://github.com/Microsoft/vscode/issues/48269 get isUntitled() { return data._uri.scheme !== 'file'; }, get languageId() { return data._languageId; }, get version() { return data._versionId; }, From 4a27ac849831caf068cc00228579339e49ad636d Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 14:11:34 +0200 Subject: [PATCH 581/710] inline`FileType2` as booleans into IStat, #47475 --- src/vs/platform/files/common/files.ts | 4 +++- src/vs/vscode.proposed.d.ts | 10 +++------- src/vs/workbench/api/node/extHost.api.impl.ts | 1 - src/vs/workbench/api/node/extHostFileSystem.ts | 14 ++++++++------ src/vs/workbench/api/node/extHostTypes.ts | 6 ------ .../files/electron-browser/remoteFileService.ts | 8 ++++---- 6 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 854ef646d75..6b57656c76e 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -180,9 +180,11 @@ export interface FileOptions { } export interface IStat { + isFile: boolean; + isDirectory: boolean; + isSymbolicLink: boolean; mtime: number; size: number; - type: FileType2; } export interface IWatchOptions { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index a0ce8f7b2e3..8158008cd85 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -123,14 +123,10 @@ declare module 'vscode' { uri: Uri; } - export enum FileType2 { - File = 0b001, - Directory = 0b010, - SymbolicLink = 0b100, - } - export interface FileStat2 { - type: FileType2; + isFile: boolean; + isDirectory: boolean; + isSymbolicLink: boolean; mtime: number; size: number; } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index aa7f6ee3094..054977f834d 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -700,7 +700,6 @@ export function createApiFactory( DeprecatedFileChangeType: extHostTypes.FileChangeType, DeprecatedFileType: extHostTypes.FileType, FileChangeType2: extHostTypes.FileChangeType2, - FileType2: extHostTypes.FileType2, FileSystemError: extHostTypes.FileSystemError, FoldingRange: extHostTypes.FoldingRange, FoldingRangeKind: extHostTypes.FoldingRangeKind diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 417d3f3e8a1..0a1264901fa 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; import { asWinJsPromise } from 'vs/base/common/async'; import { values } from 'vs/base/common/map'; -import { Range, FileType, FileChangeType, FileChangeType2, FileType2 } from 'vs/workbench/api/node/extHostTypes'; +import { Range, FileType, FileChangeType, FileChangeType2 } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; import { Schemas } from 'vs/base/common/network'; @@ -91,21 +91,23 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { private static _modernizeFileStat(stat: vscode.DeprecatedFileStat): vscode.FileStat2 { let { mtime, size, type } = stat; - let newType: vscode.FileType2; + let isFile = false; + let isDirectory = false; + let isSymbolicLink = false; // no support for bitmask, effectively no support for symlinks switch (type) { case FileType.Dir: - newType = FileType2.Directory; + isDirectory = true; break; case FileType.File: - newType = FileType2.File; + isFile = true; break; case FileType.Symlink: - newType = FileType2.SymbolicLink; + isSymbolicLink = true; break; } - return { mtime, size, type: newType }; + return { mtime, size, isFile, isDirectory, isSymbolicLink }; } private static _modernizeFileChange(e: vscode.DeprecatedFileChange): vscode.FileChange2 { diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index fd4a26b9784..f75c83dbe18 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1832,12 +1832,6 @@ export enum FileType { Symlink = 2 } -export enum FileType2 { - File = 1, - Directory = 2, - SymbolicLink = 4, -} - export class FileSystemError extends Error { static EntryExists(message?: string): FileSystemError { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index d3e66820572..b3c74b82694 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -16,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileType2, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -28,10 +28,10 @@ import { createReadableOfProvider, createReadableOfSnapshot, createWritableOfPro function toIFileStat(provider: IFileSystemProvider, tuple: [URI, IStat], recurse?: (tuple: [URI, IStat]) => boolean): TPromise<IFileStat> { const [resource, stat] = tuple; const fileStat: IFileStat = { - isDirectory: (stat.type & FileType2.Directory) !== 0, - isSymbolicLink: (stat.type & FileType2.SymbolicLink) !== 0, - resource: resource, + resource, name: posix.basename(resource.path), + isDirectory: stat.isDirectory, + isSymbolicLink: stat.isSymbolicLink, mtime: stat.mtime, size: stat.size, etag: stat.mtime.toString(29) + stat.size.toString(31), From 32ef7f32586733b384bc746093222373f5eab262 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 14:51:14 +0200 Subject: [PATCH 582/710] remote - only remember last known schemes, not all known schemes --- .../electron-browser/remoteFileService.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index b3c74b82694..324c228af58 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -5,9 +5,9 @@ 'use strict'; import { posix } from 'path'; -import { distinct, flatten, isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { flatten, isFalsyOrEmpty } from 'vs/base/common/arrays'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { TernarySearchTree } from 'vs/base/common/map'; +import { TernarySearchTree, keys } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -145,8 +145,8 @@ class WorkspaceWatchLogic { export class RemoteFileService extends FileService { - private readonly _provider = new Map<string, IFileSystemProvider>(); - private _supportedSchemes: string[]; + private readonly _provider: Map<string, IFileSystemProvider>; + private readonly _lastKnownSchemes: string[]; constructor( @IExtensionService private readonly _extensionService: IExtensionService, @@ -168,7 +168,8 @@ export class RemoteFileService extends FileService { notificationService ); - this._supportedSchemes = JSON.parse(this._storageService.get('remote_schemes', undefined, '[]')); + this._provider = new Map<string, IFileSystemProvider>(); + this._lastKnownSchemes = JSON.parse(this._storageService.get('remote_schemes', undefined, '[]')); this.toDispose.push(new WorkspaceWatchLogic(this, configurationService, contextService)); } @@ -177,10 +178,9 @@ export class RemoteFileService extends FileService { throw new Error('a provider for that scheme is already registered'); } - this._supportedSchemes.push(scheme); - this._storageService.store('remote_schemes', JSON.stringify(distinct(this._supportedSchemes))); - this._provider.set(scheme, provider); + this._storageService.store('remote_schemes', JSON.stringify(keys(this._provider))); + const reg = provider.onDidChangeFile(changes => { // forward change events this._onFileChanges.fire(new FileChangesEvent(changes)); @@ -197,7 +197,7 @@ export class RemoteFileService extends FileService { return resource.scheme === Schemas.file || this._provider.has(resource.scheme) // TODO@remote - || this._supportedSchemes.indexOf(resource.scheme) >= 0; + || this._lastKnownSchemes.indexOf(resource.scheme) >= 0; } private _tryParseFileOperationResult(err: any): FileOperationResult { From 914ba60c0eff65037aae185f9c89a9b7c807f445 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 15:17:07 +0200 Subject: [PATCH 583/710] add registration change event, #48275 --- src/vs/platform/files/common/files.ts | 11 +++++++++++ .../files/electron-browser/remoteFileService.ts | 8 +++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 6b57656c76e..65fe656c755 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -41,6 +41,11 @@ export interface IFileService { */ onAfterOperation: Event<FileOperationEvent>; + /** + * An event that is fired when a file system provider is added or removed + */ + onDidChangeFileSystemProviderRegistrations?: Event<IFileSystemProviderRegistrationEvent>; + /** * Registeres a file system provider for a certain scheme. */ @@ -224,6 +229,12 @@ export interface IFileSystemProvider { write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): TPromise<number>; } +export interface IFileSystemProviderRegistrationEvent { + added: boolean; + scheme: string; + provider?: IFileSystemProvider; +} + export enum FileOperation { CREATE, DELETE, diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 324c228af58..112fd4ac534 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -6,6 +6,7 @@ import { posix } from 'path'; import { flatten, isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TernarySearchTree, keys } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; @@ -16,7 +17,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, FileSystemProviderCapabilities, FileOptions } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IFileSystemProviderRegistrationEvent } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -147,6 +148,9 @@ export class RemoteFileService extends FileService { private readonly _provider: Map<string, IFileSystemProvider>; private readonly _lastKnownSchemes: string[]; + private readonly _onDidChangeFileSystemProviderRegistrations = new Emitter<IFileSystemProviderRegistrationEvent>(); + + readonly onDidChangeFileSystemProviderRegistrations: Event<IFileSystemProviderRegistrationEvent> = this._onDidChangeFileSystemProviderRegistrations.event; constructor( @IExtensionService private readonly _extensionService: IExtensionService, @@ -179,6 +183,7 @@ export class RemoteFileService extends FileService { } this._provider.set(scheme, provider); + this._onDidChangeFileSystemProviderRegistrations.fire({ added: true, scheme, provider }); this._storageService.store('remote_schemes', JSON.stringify(keys(this._provider))); const reg = provider.onDidChangeFile(changes => { @@ -187,6 +192,7 @@ export class RemoteFileService extends FileService { }); return { dispose: () => { + this._onDidChangeFileSystemProviderRegistrations.fire({ added: false, scheme, provider }); this._provider.delete(scheme); reg.dispose(); } From b7e8a4f43e5ba38c781437b293444e230c2ab381 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 15:43:36 +0200 Subject: [PATCH 584/710] add dev-warning, adjust FileEditorInputFactory-deserialization, #48275 --- .../electron-browser/files.contribution.ts | 2 +- .../electron-browser/remoteFileService.ts | 21 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts b/src/vs/workbench/parts/files/electron-browser/files.contribution.ts index 1da4ee90a94..48906d6533e 100644 --- a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/electron-browser/files.contribution.ts @@ -136,7 +136,7 @@ class FileEditorInputFactory implements IEditorInputFactory { const resource = !!fileInput.resourceJSON ? URI.revive(fileInput.resourceJSON) : URI.parse(fileInput.resource); const encoding = fileInput.encoding; - return accessor.get(IWorkbenchEditorService).createInput({ resource, encoding }) as FileEditorInput; + return accessor.get(IInstantiationService).createInstance(FileEditorInput, resource, encoding); }); } } diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 112fd4ac534..e4f9af2233f 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -155,16 +155,16 @@ export class RemoteFileService extends FileService { constructor( @IExtensionService private readonly _extensionService: IExtensionService, @IStorageService private readonly _storageService: IStorageService, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, @IConfigurationService configurationService: IConfigurationService, @IWorkspaceContextService contextService: IWorkspaceContextService, - @IEnvironmentService environmentService: IEnvironmentService, @ILifecycleService lifecycleService: ILifecycleService, @INotificationService notificationService: INotificationService, @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService, ) { super( contextService, - environmentService, + _environmentService, textResourceConfigurationService, configurationService, lifecycleService, @@ -200,10 +200,19 @@ export class RemoteFileService extends FileService { } canHandleResource(resource: URI): boolean { - return resource.scheme === Schemas.file - || this._provider.has(resource.scheme) - // TODO@remote - || this._lastKnownSchemes.indexOf(resource.scheme) >= 0; + if (resource.scheme === Schemas.file || this._provider.has(resource.scheme)) { + return true; + } + // TODO@remote + // this needs to go, but this already went viral + // https://github.com/Microsoft/vscode/issues/48275 + if (this._lastKnownSchemes.indexOf(resource.scheme) < 0) { + return false; + } + if (!this._environmentService.isBuilt) { + console.warn('[remote] cache information required for ' + resource.toString()); + } + return true; } private _tryParseFileOperationResult(err: any): FileOperationResult { From 11cb1c381470a767f723576db30cc50cd81f0dda Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Fri, 20 Apr 2018 15:53:05 +0200 Subject: [PATCH 585/710] remote - pushing down more methods to the IFileService interface --- src/vs/platform/files/common/files.ts | 6 +++--- .../services/files/electron-browser/fileService.ts | 13 ++++++++++++- .../files/electron-browser/remoteFileService.ts | 6 +----- src/vs/workbench/test/workbenchTestServices.ts | 6 ++++++ 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 65fe656c755..e9f5c6e78d6 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -44,17 +44,17 @@ export interface IFileService { /** * An event that is fired when a file system provider is added or removed */ - onDidChangeFileSystemProviderRegistrations?: Event<IFileSystemProviderRegistrationEvent>; + onDidChangeFileSystemProviderRegistrations: Event<IFileSystemProviderRegistrationEvent>; /** * Registeres a file system provider for a certain scheme. */ - registerProvider?(scheme: string, provider: IFileSystemProvider): IDisposable; + registerProvider(scheme: string, provider: IFileSystemProvider): IDisposable; /** * Checks if this file service can handle the given resource. */ - canHandleResource?(resource: URI): boolean; + canHandleResource(resource: URI): boolean; /** * Resolve the properties of a file identified by the resource. diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index b6619cd0664..f1be736dffc 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -10,7 +10,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as crypto from 'crypto'; import * as assert from 'assert'; -import { isParent, FileOperation, FileOperationEvent, IContent, IFileService, IResolveFileOptions, IResolveFileResult, IResolveContentOptions, IFileStat, IStreamContent, FileOperationError, FileOperationResult, IUpdateContentOptions, FileChangeType, FileChangesEvent, ICreateFileOptions, IContentData, ITextSnapshot, IFilesConfiguration } from 'vs/platform/files/common/files'; +import { isParent, FileOperation, FileOperationEvent, IContent, IFileService, IResolveFileOptions, IResolveFileResult, IResolveContentOptions, IFileStat, IStreamContent, FileOperationError, FileOperationResult, IUpdateContentOptions, FileChangeType, FileChangesEvent, ICreateFileOptions, IContentData, ITextSnapshot, IFilesConfiguration, IFileSystemProviderRegistrationEvent, IFileSystemProvider } from 'vs/platform/files/common/files'; import { MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/platform/files/node/files'; import { isEqualOrParent } from 'vs/base/common/paths'; import { ResourceMap } from 'vs/base/common/map'; @@ -92,6 +92,7 @@ export class FileService implements IFileService { protected readonly _onFileChanges: Emitter<FileChangesEvent>; protected readonly _onAfterOperation: Emitter<FileOperationEvent>; + protected readonly _onDidChangeFileSystemProviderRegistrations = new Emitter<IFileSystemProviderRegistrationEvent>(); protected toDispose: IDisposable[]; @@ -240,6 +241,16 @@ export class FileService implements IFileService { } } + public readonly onDidChangeFileSystemProviderRegistrations: Event<IFileSystemProviderRegistrationEvent> = this._onDidChangeFileSystemProviderRegistrations.event; + + public registerProvider(scheme: string, provider: IFileSystemProvider): IDisposable { + throw new Error('not implemented'); + } + + public canHandleResource(resource: uri): boolean { + return resource.scheme === Schemas.file; + } + public resolveFile(resource: uri, options?: IResolveFileOptions): TPromise<IFileStat> { return this.resolve(resource, options); } diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index e4f9af2233f..4cb7cde1d24 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -6,7 +6,6 @@ import { posix } from 'path'; import { flatten, isFalsyOrEmpty } from 'vs/base/common/arrays'; -import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { TernarySearchTree, keys } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; @@ -17,7 +16,7 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IFileSystemProviderRegistrationEvent } from 'vs/platform/files/common/files'; +import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -148,9 +147,6 @@ export class RemoteFileService extends FileService { private readonly _provider: Map<string, IFileSystemProvider>; private readonly _lastKnownSchemes: string[]; - private readonly _onDidChangeFileSystemProviderRegistrations = new Emitter<IFileSystemProviderRegistrationEvent>(); - - readonly onDidChangeFileSystemProviderRegistrations: Event<IFileSystemProviderRegistrationEvent> = this._onDidChangeFileSystemProviderRegistrations.event; constructor( @IExtensionService private readonly _extensionService: IExtensionService, diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 18b929cfb78..5acfb8aab9e 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -773,6 +773,12 @@ export class TestFileService implements IFileService { return TPromise.as(null); } + onDidChangeFileSystemProviderRegistrations = Event.None; + + registerProvider(scheme: string, provider) { + return { dispose() { } }; + } + canHandleResource(resource: URI): boolean { return resource.scheme === 'file'; } From de661083ebdc436f527647d35748089f0b9c9b06 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Fri, 20 Apr 2018 16:21:58 +0200 Subject: [PATCH 586/710] Fixes #20050: Handle the case where dragging over a view zone which is outside the viewport --- .../editor/browser/controller/mouseHandler.ts | 55 ++++++++++++++----- .../editor/browser/controller/mouseTarget.ts | 15 +++-- 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts index a6ac118cbdf..6657158e914 100644 --- a/src/vs/editor/browser/controller/mouseHandler.ts +++ b/src/vs/editor/browser/controller/mouseHandler.ts @@ -11,7 +11,7 @@ import * as dom from 'vs/base/browser/dom'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; -import { MouseTarget, MouseTargetFactory, IViewZoneData } from 'vs/editor/browser/controller/mouseTarget'; +import { MouseTarget, MouseTargetFactory, IViewZoneData, HitTestContext } from 'vs/editor/browser/controller/mouseTarget'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { TimeoutTimer, RunOnceScheduler } from 'vs/base/common/async'; import { ViewContext } from 'vs/editor/common/view/viewContext'; @@ -424,12 +424,30 @@ class MouseDownOperation extends Disposable { const mouseColumn = this._getMouseColumn(e); if (e.posy < editorContent.y) { - let aboveLineNumber = viewLayout.getLineNumberAtVerticalOffset(Math.max(viewLayout.getCurrentScrollTop() - (editorContent.y - e.posy), 0)); + const verticalOffset = Math.max(viewLayout.getCurrentScrollTop() - (editorContent.y - e.posy), 0); + const viewZoneData = HitTestContext.getZoneAtCoord(this._context, verticalOffset); + if (viewZoneData) { + const newPosition = this._helpPositionJumpOverViewZone(viewZoneData); + if (newPosition) { + return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, newPosition); + } + } + + let aboveLineNumber = viewLayout.getLineNumberAtVerticalOffset(verticalOffset); return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(aboveLineNumber, 1)); } if (e.posy > editorContent.y + editorContent.height) { - let belowLineNumber = viewLayout.getLineNumberAtVerticalOffset(viewLayout.getCurrentScrollTop() + (e.posy - editorContent.y)); + const verticalOffset = viewLayout.getCurrentScrollTop() + (e.posy - editorContent.y); + const viewZoneData = HitTestContext.getZoneAtCoord(this._context, verticalOffset); + if (viewZoneData) { + const newPosition = this._helpPositionJumpOverViewZone(viewZoneData); + if (newPosition) { + return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, newPosition); + } + } + + let belowLineNumber = viewLayout.getLineNumberAtVerticalOffset(verticalOffset); return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(belowLineNumber, model.getLineMaxColumn(belowLineNumber))); } @@ -459,24 +477,31 @@ class MouseDownOperation extends Disposable { } if (t.type === editorBrowser.MouseTargetType.CONTENT_VIEW_ZONE || t.type === editorBrowser.MouseTargetType.GUTTER_VIEW_ZONE) { - // Force position on view zones to go above or below depending on where selection started from - let selectionStart = new Position(this._currentSelection.selectionStartLineNumber, this._currentSelection.selectionStartColumn); - let viewZoneData = <IViewZoneData>t.detail; - let positionBefore = viewZoneData.positionBefore; - let positionAfter = viewZoneData.positionAfter; - - if (positionBefore && positionAfter) { - if (positionBefore.isBefore(selectionStart)) { - return new MouseTarget(t.element, t.type, t.mouseColumn, positionBefore, null, t.detail); - } else { - return new MouseTarget(t.element, t.type, t.mouseColumn, positionAfter, null, t.detail); - } + const newPosition = this._helpPositionJumpOverViewZone(<IViewZoneData>t.detail); + if (newPosition) { + return new MouseTarget(t.element, t.type, t.mouseColumn, newPosition, null, t.detail); } } return t; } + private _helpPositionJumpOverViewZone(viewZoneData: IViewZoneData): Position { + // Force position on view zones to go above or below depending on where selection started from + let selectionStart = new Position(this._currentSelection.selectionStartLineNumber, this._currentSelection.selectionStartColumn); + let positionBefore = viewZoneData.positionBefore; + let positionAfter = viewZoneData.positionAfter; + + if (positionBefore && positionAfter) { + if (positionBefore.isBefore(selectionStart)) { + return positionBefore; + } else { + return positionAfter; + } + } + return null; + } + private _dispatchMouse(position: MouseTarget, inSelectionMode: boolean): void { this._viewController.dispatchMouse({ position: position.position, diff --git a/src/vs/editor/browser/controller/mouseTarget.ts b/src/vs/editor/browser/controller/mouseTarget.ts index 942f7f67493..bab014e28eb 100644 --- a/src/vs/editor/browser/controller/mouseTarget.ts +++ b/src/vs/editor/browser/controller/mouseTarget.ts @@ -16,6 +16,7 @@ import { PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPa import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { EditorLayoutInfo } from 'vs/editor/common/config/editorOptions'; import { ViewLine } from 'vs/editor/browser/viewParts/lines/viewLine'; +import { HorizontalRange } from 'vs/editor/common/view/renderingContext'; export interface IViewZoneData { viewZoneId: number; @@ -222,7 +223,7 @@ class ElementPath { } } -class HitTestContext { +export class HitTestContext { public readonly model: IViewModel; public readonly layoutInfo: EditorLayoutInfo; @@ -246,12 +247,16 @@ class HitTestContext { } public getZoneAtCoord(mouseVerticalOffset: number): IViewZoneData { + return HitTestContext.getZoneAtCoord(this._context, mouseVerticalOffset); + } + + public static getZoneAtCoord(context: ViewContext, mouseVerticalOffset: number): IViewZoneData { // The target is either a view zone or the empty space after the last view-line - let viewZoneWhitespace = this._context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset); + let viewZoneWhitespace = context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset); if (viewZoneWhitespace) { let viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2, - lineCount = this._context.model.getLineCount(), + lineCount = context.model.getLineCount(), positionBefore: Position = null, position: Position, positionAfter: Position = null; @@ -262,7 +267,7 @@ class HitTestContext { } if (viewZoneWhitespace.afterLineNumber > 0) { // There are more lines above this view zone - positionBefore = new Position(viewZoneWhitespace.afterLineNumber, this._context.model.getLineMaxColumn(viewZoneWhitespace.afterLineNumber)); + positionBefore = new Position(viewZoneWhitespace.afterLineNumber, context.model.getLineMaxColumn(viewZoneWhitespace.afterLineNumber)); } if (positionAfter === null) { @@ -338,7 +343,7 @@ class HitTestContext { return this._viewHelper.getLineWidth(lineNumber); } - public visibleRangeForPosition2(lineNumber: number, column: number) { + public visibleRangeForPosition2(lineNumber: number, column: number): HorizontalRange { return this._viewHelper.visibleRangeForPosition2(lineNumber, column); } From 996c55e4a178d9439751ca3e297a4f305957173b Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Fri, 20 Apr 2018 16:26:44 +0200 Subject: [PATCH 587/710] Fixes #48281 --- .../extensions/electron-browser/runtimeExtensionsEditor.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts index 802cc4d1615..6109aabca2c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -312,7 +312,12 @@ export class RuntimeExtensionsEditor extends BaseEditor { let language = activationTimes.activationEvent.substr('onLanguage:'.length); title = nls.localize('languageActivation', "Activated because you opened a {0} file", language); } else { - title = nls.localize('workspaceGenericActivation', "Activated on {0}", activationTimes.activationEvent); + title = nls.localize({ + key: 'workspaceGenericActivation', + comment: [ + 'The {0} placeholder will be an activation event, like e.g. \'language:typescript\', \'debug\', etc.' + ] + }, "Activated on {0}", activationTimes.activationEvent); } data.activationTime.title = title; if (!isFalsyOrEmpty(element.status.runtimeErrors)) { From 01169b16171dd381816f08daec793792be7d9151 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Fri, 20 Apr 2018 16:32:04 +0200 Subject: [PATCH 588/710] Fixes #48280 --- .../electron-browser/runtimeExtensionsEditor.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts index 6109aabca2c..e51d6079969 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -304,9 +304,19 @@ export class RuntimeExtensionsEditor extends BaseEditor { } else if (/^workspaceContains:/.test(activationTimes.activationEvent)) { let fileNameOrGlob = activationTimes.activationEvent.substr('workspaceContains:'.length); if (fileNameOrGlob.indexOf('*') >= 0 || fileNameOrGlob.indexOf('?') >= 0) { - title = nls.localize('workspaceContainsGlobActivation', "Activated because a file matching {0} exists in your workspace", fileNameOrGlob); + title = nls.localize({ + key: 'workspaceContainsGlobActivation', + comment: [ + '{0} will be a glob pattern' + ] + }, "Activated because a file matching {0} exists in your workspace", fileNameOrGlob); } else { - title = nls.localize('workspaceContainsFileActivation', "Activated because file {0} exists in your workspace", fileNameOrGlob); + title = nls.localize({ + key: 'workspaceContainsFileActivation', + comment: [ + '{0} will be a file name' + ] + }, "Activated because file {0} exists in your workspace", fileNameOrGlob); } } else if (/^onLanguage:/.test(activationTimes.activationEvent)) { let language = activationTimes.activationEvent.substr('onLanguage:'.length); From 1ecc9b31b302af14a9772f5d991805b35c076c16 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Fri, 20 Apr 2018 16:58:34 +0200 Subject: [PATCH 589/710] fix #48209 --- src/vs/platform/theme/common/colorRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 0c86fecab82..dcd84b72179 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -180,7 +180,7 @@ export const inputPlaceholderForeground = registerColor('input.placeholderForegr export const inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hc: Color.black }, nls.localize('inputValidationInfoBackground', "Input validation background color for information severity.")); export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#007acc', light: '#007acc', hc: contrastBorder }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); -export const inputValidationWarningBackground = registerColor('inputValidation.warningBackground', { dark: '#352A05', light: '#F6F5D2', hc: Color.black }, nls.localize('inputValidationWarningBackground', "Input validation background color for information warning.")); +export const inputValidationWarningBackground = registerColor('inputValidation.warningBackground', { dark: '#352A05', light: '#F6F5D2', hc: Color.black }, nls.localize('inputValidationWarningBackground', "Input validation background color for warning severity.")); export const inputValidationWarningBorder = registerColor('inputValidation.warningBorder', { dark: '#B89500', light: '#B89500', hc: contrastBorder }, nls.localize('inputValidationWarningBorder', "Input validation border color for warning severity.")); export const inputValidationErrorBackground = registerColor('inputValidation.errorBackground', { dark: '#5A1D1D', light: '#F2DEDE', hc: Color.black }, nls.localize('inputValidationErrorBackground', "Input validation background color for error severity.")); export const inputValidationErrorBorder = registerColor('inputValidation.errorBorder', { dark: '#BE1100', light: '#BE1100', hc: contrastBorder }, nls.localize('inputValidationErrorBorder', "Input validation border color for error severity.")); From 97aaae1277fd5c062a54b1bc540dcc6be86d9640 Mon Sep 17 00:00:00 2001 From: Pradeep Murugesan <pradeepmurugesan@outlook.com> Date: Fri, 20 Apr 2018 17:17:30 +0200 Subject: [PATCH 590/710] fix for deleting multiple directory message 47892 (#47956) * fix for deleting multiple directory message 47892 * 47892 code review comments --- .../files/electron-browser/fileActions.ts | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 93d95cffa90..33b52811caa 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -645,9 +645,8 @@ class BaseDeleteFileAction extends BaseFileAction { // Confirm for moving to trash else if (this.useTrash) { - const message = distinctElements.length > 1 ? getConfirmMessage(nls.localize('confirmMoveTrashMessageMultiple', "Are you sure you want to delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)) - : distinctElements[0].isDirectory ? nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", distinctElements[0].name) - : nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", distinctElements[0].name); + const message = this.getMoveToTrashMessage(distinctElements); + confirmDeletePromise = this.dialogService.confirm({ message, detail: isWindows ? nls.localize('undoBin', "You can restore from the Recycle Bin.") : nls.localize('undoTrash', "You can restore from the Trash."), @@ -661,9 +660,7 @@ class BaseDeleteFileAction extends BaseFileAction { // Confirm for deleting permanently else { - const message = distinctElements.length > 1 ? getConfirmMessage(nls.localize('confirmDeleteMessageMultiple', "Are you sure you want to permanently delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)) - : distinctElements[0].isDirectory ? nls.localize('confirmDeleteMessageFolder', "Are you sure you want to permanently delete '{0}' and its contents?", distinctElements[0].name) - : nls.localize('confirmDeleteMessageFile', "Are you sure you want to permanently delete '{0}'?", distinctElements[0].name); + const message = this.getDeleteMessage(distinctElements); confirmDeletePromise = this.dialogService.confirm({ message, detail: nls.localize('irreversible', "This action is irreversible!"), @@ -736,6 +733,56 @@ class BaseDeleteFileAction extends BaseFileAction { }); }); } + + private getMoveToTrashMessage(distinctElements: ExplorerItem[]): string { + if (this.containsBothDirectoryAndFile(distinctElements)) { + return getConfirmMessage(nls.localize('confirmMoveTrashMessageFilesAndDirectories', "Are you sure you want to delete the following {0} files/directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + } + + let message: string = ''; + if (distinctElements.length > 1) { + if (distinctElements[0].isDirectory) { + message = getConfirmMessage(nls.localize('confirmMoveTrashMessageMultipleDirectories', "Are you sure you want to delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + } else { + message = getConfirmMessage(nls.localize('confirmMoveTrashMessageMultiple', "Are you sure you want to delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); + } + } else { + if (distinctElements[0].isDirectory) { + message = nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", distinctElements[0].name); + } else { + message = nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", distinctElements[0].name); + } + } + return message; + } + + private getDeleteMessage(distinctElements: ExplorerItem[]): string { + if (this.containsBothDirectoryAndFile(distinctElements)) { + return getConfirmMessage(nls.localize('confirmDeleteMessageFilesAndDirectories', "Are you sure you want to permanently delete the following {0} files/directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + } + + let message: string = ''; + if (distinctElements.length > 1) { + if (distinctElements[0].isDirectory) { + message = getConfirmMessage(nls.localize('confirmDeleteMessageMultipleDirectories', "Are you sure you want to permanently delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + } else { + message = getConfirmMessage(nls.localize('confirmDeleteMessageMultiple', "Are you sure you want to permanently delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); + } + } else { + if (distinctElements[0].isDirectory) { + message = nls.localize('confirmDeleteMessageFolder', "Are you sure you want to permanently delete '{0}' and its contents?", distinctElements[0].name); + } else { + message = nls.localize('confirmDeleteMessageFile', "Are you sure you want to permanently delete '{0}'?", distinctElements[0].name); + } + } + return message; + } + + private containsBothDirectoryAndFile(distinctElements: ExplorerItem[]) { + const directories = distinctElements.filter(element => element.isDirectory); + const files = distinctElements.filter(element => !element.isDirectory); + return directories.length > 0 && files.length > 0; + } } /* Add File */ From 8617a38a5d026ab60577ea04b4bc60ffe00be65d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Fri, 20 Apr 2018 17:21:34 +0200 Subject: [PATCH 591/710] :lipstick: --- .../files/electron-browser/fileActions.ts | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 33b52811caa..5e58cd18646 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -739,21 +739,19 @@ class BaseDeleteFileAction extends BaseFileAction { return getConfirmMessage(nls.localize('confirmMoveTrashMessageFilesAndDirectories', "Are you sure you want to delete the following {0} files/directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); } - let message: string = ''; if (distinctElements.length > 1) { if (distinctElements[0].isDirectory) { - message = getConfirmMessage(nls.localize('confirmMoveTrashMessageMultipleDirectories', "Are you sure you want to delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); - } else { - message = getConfirmMessage(nls.localize('confirmMoveTrashMessageMultiple', "Are you sure you want to delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); - } - } else { - if (distinctElements[0].isDirectory) { - message = nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", distinctElements[0].name); - } else { - message = nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", distinctElements[0].name); + return getConfirmMessage(nls.localize('confirmMoveTrashMessageMultipleDirectories', "Are you sure you want to delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); } + + return getConfirmMessage(nls.localize('confirmMoveTrashMessageMultiple', "Are you sure you want to delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); } - return message; + + if (distinctElements[0].isDirectory) { + return nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", distinctElements[0].name); + } + + return nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", distinctElements[0].name); } private getDeleteMessage(distinctElements: ExplorerItem[]): string { @@ -761,26 +759,25 @@ class BaseDeleteFileAction extends BaseFileAction { return getConfirmMessage(nls.localize('confirmDeleteMessageFilesAndDirectories', "Are you sure you want to permanently delete the following {0} files/directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); } - let message: string = ''; if (distinctElements.length > 1) { if (distinctElements[0].isDirectory) { - message = getConfirmMessage(nls.localize('confirmDeleteMessageMultipleDirectories', "Are you sure you want to permanently delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); - } else { - message = getConfirmMessage(nls.localize('confirmDeleteMessageMultiple', "Are you sure you want to permanently delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); - } - } else { - if (distinctElements[0].isDirectory) { - message = nls.localize('confirmDeleteMessageFolder', "Are you sure you want to permanently delete '{0}' and its contents?", distinctElements[0].name); - } else { - message = nls.localize('confirmDeleteMessageFile', "Are you sure you want to permanently delete '{0}'?", distinctElements[0].name); + return getConfirmMessage(nls.localize('confirmDeleteMessageMultipleDirectories', "Are you sure you want to permanently delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); } + + return getConfirmMessage(nls.localize('confirmDeleteMessageMultiple', "Are you sure you want to permanently delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); } - return message; + + if (distinctElements[0].isDirectory) { + return nls.localize('confirmDeleteMessageFolder', "Are you sure you want to permanently delete '{0}' and its contents?", distinctElements[0].name); + } + + return nls.localize('confirmDeleteMessageFile', "Are you sure you want to permanently delete '{0}'?", distinctElements[0].name); } - private containsBothDirectoryAndFile(distinctElements: ExplorerItem[]) { + private containsBothDirectoryAndFile(distinctElements: ExplorerItem[]): boolean { const directories = distinctElements.filter(element => element.isDirectory); const files = distinctElements.filter(element => !element.isDirectory); + return directories.length > 0 && files.length > 0; } } From 1aa0bb83bca1b712a2042854629b93848cbc5114 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Fri, 20 Apr 2018 16:04:20 +0200 Subject: [PATCH 592/710] Revert "Require gtk 3 on Linux" This reverts commit 2e6a761f8c225ae7aad144c071414bb080916ad9. --- resources/linux/debian/control.template | 2 +- resources/linux/rpm/dependencies.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/linux/debian/control.template b/resources/linux/debian/control.template index 821c542b520..57f7c2075ff 100644 --- a/resources/linux/debian/control.template +++ b/resources/linux/debian/control.template @@ -1,7 +1,7 @@ Package: @@NAME@@ Version: @@VERSION@@ Section: devel -Depends: libnotify4, libnss3, gnupg, apt, libxkbfile1, libgconf-2-4, libsecret-1-0, libgtk-3-0 (>= 3.10.0) +Depends: libnotify4, libnss3, gnupg, apt, libxkbfile1, libgconf-2-4, libsecret-1-0 Priority: optional Architecture: @@ARCHITECTURE@@ Maintainer: Microsoft Corporation <vscode-linux@microsoft.com> diff --git a/resources/linux/rpm/dependencies.json b/resources/linux/rpm/dependencies.json index c2ae8b8fe31..e78bf4f85ca 100644 --- a/resources/linux/rpm/dependencies.json +++ b/resources/linux/rpm/dependencies.json @@ -4,7 +4,7 @@ "libpthread.so.0(GLIBC_2.2.5)(64bit)", "libpthread.so.0(GLIBC_2.3.2)(64bit)", "libpthread.so.0(GLIBC_2.3.3)(64bit)", - "libgtk-3.so.0()(64bit)", + "libgtk-x11-2.0.so.0()(64bit)", "libgdk-x11-2.0.so.0()(64bit)", "libatk-1.0.so.0()(64bit)", "libgio-2.0.so.0()(64bit)", @@ -114,7 +114,7 @@ "libglib-2.0.so.0", "libgmodule-2.0.so.0", "libgobject-2.0.so.0", - "libgtk-3.so.0", + "libgtk-x11-2.0.so.0", "libm.so.6", "libm.so.6(GLIBC_2.0)", "libm.so.6(GLIBC_2.1)", From 6cb06b7cb57bf4c1470fbc413031fa779791aa24 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Fri, 20 Apr 2018 16:05:52 +0200 Subject: [PATCH 593/710] Revert "Electron v2.0.0 (#47289)" This reverts commit f7ec491c3ed5cea258e144da873504a98582b7de. --- .yarnrc | 2 +- scripts/code-cli.bat | 2 +- scripts/code-cli.sh | 2 +- scripts/code.sh | 5 +- scripts/test.sh | 5 +- src/typings/electron.d.ts | 1209 +-- src/typings/node.d.ts | 9570 ++++++----------- .../processExplorer/processExplorerMain.ts | 2 +- src/vs/code/electron-main/app.ts | 116 +- src/vs/code/electron-main/window.ts | 22 + .../electron-main/updateService.darwin.ts | 2 +- .../parts/activitybar/activitybarPart.ts | 31 +- src/vs/workbench/electron-browser/shell.ts | 60 +- src/vs/workbench/node/extensionHostProcess.ts | 20 +- .../node/configurationService.ts | 16 +- .../electron-browser/contextmenuService.ts | 34 +- .../electron-browser/extensionHost.ts | 10 +- 17 files changed, 3757 insertions(+), 7351 deletions(-) diff --git a/.yarnrc b/.yarnrc index fefa6adbb94..42f08fa0c02 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "2.0.0-beta.7" +target "1.7.12" runtime "electron" diff --git a/scripts/code-cli.bat b/scripts/code-cli.bat index 7bca260314d..f08ddb744e0 100644 --- a/scripts/code-cli.bat +++ b/scripts/code-cli.bat @@ -29,7 +29,7 @@ set ELECTRON_ENABLE_LOGGING=1 set ELECTRON_ENABLE_STACK_DUMPING=1 :: Launch Code -%CODE% --inspect=5874 out\cli.js . %* +%CODE% --debug=5874 out\cli.js . %* popd endlocal diff --git a/scripts/code-cli.sh b/scripts/code-cli.sh index ba2121d9bb9..89e518322fc 100755 --- a/scripts/code-cli.sh +++ b/scripts/code-cli.sh @@ -32,7 +32,7 @@ function code() { VSCODE_DEV=1 \ ELECTRON_ENABLE_LOGGING=1 \ ELECTRON_ENABLE_STACK_DUMPING=1 \ - "$CODE" --inspect=5874 "$ROOT/out/cli.js" . "$@" + "$CODE" --debug=5874 "$ROOT/out/cli.js" . "$@" } code "$@" diff --git a/scripts/code.sh b/scripts/code.sh index 26332faea6c..f6d103ceda5 100755 --- a/scripts/code.sh +++ b/scripts/code.sh @@ -3,10 +3,6 @@ if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } ROOT=$(dirname "$(dirname "$(realpath "$0")")") - - # On Linux with Electron 2.0.x running out of a VM causes - # a freeze so we only enable this flag on macOS - export ELECTRON_ENABLE_LOGGING=1 else ROOT=$(dirname "$(dirname "$(readlink -f $0)")") fi @@ -44,6 +40,7 @@ function code() { export NODE_ENV=development export VSCODE_DEV=1 export VSCODE_CLI=1 + export ELECTRON_ENABLE_LOGGING=1 export ELECTRON_ENABLE_STACK_DUMPING=1 # Launch Code diff --git a/scripts/test.sh b/scripts/test.sh index ac96627846f..d88a28c5e2d 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -4,10 +4,6 @@ if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } ROOT=$(dirname $(dirname $(realpath "$0"))) - - # On Linux with Electron 2.0.x running out of a VM causes - # a freeze so we only enable this flag on macOS - export ELECTRON_ENABLE_LOGGING=1 else ROOT=$(dirname $(dirname $(readlink -f $0))) fi @@ -29,6 +25,7 @@ test -d node_modules || yarn node build/lib/electron.js || ./node_modules/.bin/gulp electron # Unit Tests +export ELECTRON_ENABLE_LOGGING=1 if [[ "$OSTYPE" == "darwin"* ]]; then cd $ROOT ; ulimit -n 4096 ; \ "$CODE" \ diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index 4b6644aff88..daf41dbc736 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Electron 2.0.0-beta.2 +// Type definitions for Electron 1.7.9 // Project: http://electron.atom.io/ // Definitions by: The Electron Team <https://github.com/electron/electron> // Definitions: https://github.com/electron/electron-typescript-definitions @@ -58,7 +58,6 @@ declare namespace Electron { dialog: Dialog; DownloadItem: typeof DownloadItem; globalShortcut: GlobalShortcut; - inAppPurchase: InAppPurchase; IncomingMessage: typeof IncomingMessage; ipcMain: IpcMain; Menu: typeof Menu; @@ -95,7 +94,6 @@ declare namespace Electron { const desktopCapturer: DesktopCapturer; const dialog: Dialog; const globalShortcut: GlobalShortcut; - const inAppPurchase: InAppPurchase; const ipcMain: IpcMain; const ipcRenderer: IpcRenderer; type nativeImage = NativeImage; @@ -159,46 +157,6 @@ declare namespace Electron { hasVisibleWindows: boolean) => void): this; removeListener(event: 'activate', listener: (event: Event, hasVisibleWindows: boolean) => void): this; - /** - * Emitted during Handoff after an activity from this device was successfully - * resumed on another one. - */ - on(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; - once(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; - addListener(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; - removeListener(event: 'activity-was-continued', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; /** * Emitted before the application starts closing its windows. Calling * event.preventDefault() will prevent the default behaviour, which is terminating @@ -328,46 +286,6 @@ declare namespace Electron { * Contains app-specific state stored by the activity on another device. */ userInfo: any) => void): this; - /** - * Emitted during Handoff when an activity from a different device fails to be - * resumed. - */ - on(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; - once(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; - addListener(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; - removeListener(event: 'continue-activity-error', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * A string with the error's localized description. - */ - error: string) => void): this; /** * Emitted when the gpu process crashes or is killed. */ @@ -492,49 +410,6 @@ declare namespace Electron { url: string, certificateList: Certificate[], callback: (certificate?: Certificate) => void) => void): this; - /** - * Emitted when Handoff is about to be resumed on another device. If you need to - * update the state to be transferred, you should call event.preventDefault() - * immediately, construct a new userInfo dictionary and call - * app.updateCurrentActiviy() in a timely manner. Otherwise the operation will fail - * and continue-activity-error will be called. - */ - on(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; - once(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; - addListener(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; - removeListener(event: 'update-activity-state', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string, - /** - * Contains app-specific state stored by the activity. - */ - userInfo: any) => void): this; /** * Emitted when a new webContents is created. */ @@ -546,31 +421,6 @@ declare namespace Electron { webContents: WebContents) => void): this; removeListener(event: 'web-contents-created', listener: (event: Event, webContents: WebContents) => void): this; - /** - * Emitted during Handoff before an activity from a different device wants to be - * resumed. You should call event.preventDefault() if you want to handle this - * event. - */ - on(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string) => void): this; - once(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string) => void): this; - addListener(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string) => void): this; - removeListener(event: 'will-continue-activity', listener: (event: Event, - /** - * A string identifying the activity. Maps to . - */ - type: string) => void): this; /** * Emitted when the application has finished basic startup. On Windows and Linux, * the will-finish-launching event is the same as the ready event; on macOS, this @@ -632,7 +482,7 @@ declare namespace Electron { */ enableMixedSandbox(): void; /** - * Exits immediately with exitCode. exitCode defaults to 0. All windows will be + * Exits immediately with exitCode. exitCode defaults to 0. All windows will be * closed immediately without asking user and the before-quit and will-quit events * will not be emitted. */ @@ -642,6 +492,7 @@ declare namespace Electron { * the active app. On Windows, focuses on the application's first window. */ focus(): void; + getAppMemoryInfo(): ProcessMetric[]; getAppMetrics(): ProcessMetric[]; getAppPath(): string; getBadgeCount(): number; @@ -650,12 +501,12 @@ declare namespace Electron { * Fetches a path's associated icon. On Windows, there a 2 kinds of icons: On Linux * and macOS, icons depend on the application associated with file mime type. */ - getFileIcon(path: string, callback: (error: Error, icon: NativeImage) => void): void; + getFileIcon(path: string, options: FileIconOptions, callback: (error: Error, icon: NativeImage) => void): void; /** * Fetches a path's associated icon. On Windows, there a 2 kinds of icons: On Linux * and macOS, icons depend on the application associated with file mime type. */ - getFileIcon(path: string, options: FileIconOptions, callback: (error: Error, icon: NativeImage) => void): void; + getFileIcon(path: string, callback: (error: Error, icon: NativeImage) => void): void; getGPUFeatureStatus(): GPUFeatureStatus; getJumpListSettings(): JumpListSettings; /** @@ -666,7 +517,8 @@ declare namespace Electron { getLocale(): string; /** * If you provided path and args options to app.setLoginItemSettings then you need - * to pass the same arguments here for openAtLogin to be set correctly. + * to pass the same arguments here for openAtLogin to be set correctly. Note: This + * API has no effect on MAS builds. */ getLoginItemSettings(options?: LoginItemSettingsOptions): LoginItemSettings; /** @@ -692,10 +544,6 @@ declare namespace Electron { * net_error_list. */ importCertificate(options: ImportCertificateOptions, callback: (result: number) => void): void; - /** - * Invalidates the current Handoff user activity. - */ - invalidateCurrentActivity(type: string): void; isAccessibilitySupportEnabled(): boolean; /** * This method checks if the current executable is the default handler for a @@ -707,7 +555,6 @@ declare namespace Electron { * the Windows Registry and LSCopyDefaultHandlerForURLScheme internally. */ isDefaultProtocolClient(protocol: string, path?: string, args?: string[]): boolean; - isInApplicationsFolder(): boolean; isReady(): boolean; isUnityRunning(): boolean; /** @@ -731,15 +578,6 @@ declare namespace Electron { * instance starts: */ makeSingleInstance(callback: (argv: string[], workingDirectory: string) => void): boolean; - /** - * No confirmation dialog will be presented by default, if you wish to allow the - * user to confirm the operation you may do so using the dialog API. NOTE: This - * method throws errors if anything other than the user causes the move to fail. - * For instance if the user cancels the authorization dialog this method returns - * false. If we fail to perform the copy then this method will throw an error. The - * message in the error should be informative and tell you exactly what went wrong - */ - moveToApplicationsFolder(): boolean; /** * Try to close all windows. The before-quit event will be emitted first. If all * windows are successfully closed, the will-quit event will be emitted and by @@ -777,15 +615,6 @@ declare namespace Electron { * .plist file. See the Apple docs for more details. */ setAboutPanelOptions(options: AboutPanelOptionsOptions): void; - /** - * Manually enables Chrome's accessibility support, allowing to expose - * accessibility switch to users in application settings. - * https://www.chromium.org/developers/design-documents/accessibility for more - * details. Disabled by default. Note: Rendering accessibility tree can - * significantly affect the performance of your app. It should not be enabled by - * default. - */ - setAccessibilitySupportEnabled(enabled: boolean): void; /** * Changes the Application User Model ID to id. */ @@ -831,7 +660,8 @@ declare namespace Electron { /** * Set the app's login item settings. To work with Electron's autoUpdater on * Windows, which uses Squirrel, you'll want to set the launch path to Update.exe, - * and pass arguments that specify your application name. For example: + * and pass arguments that specify your application name. For example: Note: This + * API has no effect on MAS builds. */ setLoginItemSettings(settings: Settings): void; /** @@ -864,18 +694,6 @@ declare namespace Electron { * them. */ show(): void; - /** - * Start accessing a security scoped resource. With this method electron - * applications that are packaged for the Mac App Store may reach outside their - * sandbox to access files chosen by the user. See Apple's documentation for a - * description of how this system works. - */ - startAccessingSecurityScopedResource(bookmarkData: string): Function; - /** - * Updates the current activity if its type matches type, merging the entries from - * userInfo into its current userInfo dictionary. - */ - updateCurrentActivity(type: string, userInfo: any): void; commandLine: CommandLine; dock: Dock; } @@ -945,18 +763,16 @@ declare namespace Electron { getFeedURL(): string; /** * Restarts the app and installs the update after it has been downloaded. It should - * only be called after update-downloaded has been emitted. Under the hood calling - * autoUpdater.quitAndInstall() will close all application windows first, and - * automatically call app.quit() after all windows have been closed. Note: If the - * application is quit without calling this API after the update-downloaded event - * has been emitted, the application will still be replaced by the updated one on - * the next run. + * only be called after update-downloaded has been emitted. Note: + * autoUpdater.quitAndInstall() will close all application windows first and only + * emit before-quit event on app after that. This is different from the normal quit + * event sequence. */ quitAndInstall(): void; /** * Sets the url and initialize the auto updater. */ - setFeedURL(options: FeedURLOptions): void; + setFeedURL(url: string, requestHeaders?: any): void; } interface BluetoothDevice { @@ -973,8 +789,6 @@ declare namespace Electron { constructor(options?: BrowserViewConstructorOptions); static fromId(id: number): BrowserView; - static fromWebContents(webContents: WebContents): BrowserView | null; - static getAllViews(): BrowserView[]; setAutoResize(options: AutoResizeOptions): void; setBackgroundColor(color: string): void; /** @@ -1017,11 +831,7 @@ declare namespace Electron { * cancel the close. Usually you would want to use the beforeunload handler to * decide whether the window should be closed, which will also be called when the * window is reloaded. In Electron, returning any value other than undefined would - * cancel the close. For example: Note: There is a subtle difference between the - * behaviors of window.onbeforeunload = handler and - * window.addEventListener('beforeunload', handler). It is recommended to always - * set the event.returnValue explicitly, instead of just returning a value, as the - * former works more consistently within Electron. + * cancel the close. For example: */ on(event: 'close', listener: (event: Event) => void): this; once(event: 'close', listener: (event: Event) => void): this; @@ -1246,7 +1056,6 @@ declare namespace Electron { * This API cannot be called before the ready event of the app module is emitted. */ static addExtension(path: string): void; - static fromBrowserView(browserView: BrowserView): BrowserWindow | null; static fromId(id: number): BrowserWindow; static fromWebContents(webContents: WebContents): BrowserWindow; static getAllWindows(): BrowserWindow[]; @@ -1271,10 +1080,6 @@ declare namespace Electron { * ready event of the app module is emitted. */ static removeExtension(name: string): void; - /** - * Adds a window as a tab on this window, after the tab for the window instance. - */ - addTabbedWindow(browserWindow: BrowserWindow): void; /** * Removes focus from the window. */ @@ -1318,11 +1123,6 @@ declare namespace Electron { focus(): void; focusOnWebView(): void; getBounds(): Rectangle; - /** - * Note: The BrowserView API is currently experimental and may change or be removed - * in future Electron releases. - */ - getBrowserView(): BrowserView | null; getChildWindows(): BrowserWindow[]; getContentBounds(): Rectangle; getContentSize(): number[]; @@ -1333,7 +1133,6 @@ declare namespace Electron { * (unsigned long) on Linux. */ getNativeWindowHandle(): Buffer; - getOpacity(): number; getParentWindow(): BrowserWindow; getPosition(): number[]; getRepresentedFilename(): string; @@ -1385,18 +1184,12 @@ declare namespace Electron { */ isMovable(): boolean; isResizable(): boolean; - isSimpleFullScreen(): boolean; isVisible(): boolean; /** * Note: This API always returns false on Windows. */ isVisibleOnAllWorkspaces(): boolean; isWindowMessageHooked(message: number): boolean; - /** - * Same as webContents.loadFile, filePath should be a path to an HTML file relative - * to the root of your application. See the webContents docs for more information. - */ - loadFile(filePath: string): void; /** * Same as webContents.loadURL(url[, options]). The url can be a remote address * (e.g. http://) or a path to a local HTML file using the file:// protocol. To @@ -1410,21 +1203,11 @@ declare namespace Electron { * being displayed already. */ maximize(): void; - /** - * Merges all windows into one window with multiple tabs when native tabs are - * enabled and there is more than one open window. - */ - mergeAllWindows(): void; /** * Minimizes the window. On some platforms the minimized window will be shown in * the Dock. */ minimize(): void; - /** - * Moves the current tab into a new window if native tabs are enabled and there is - * more than one tab in the current window. - */ - moveTabToNewWindow(): void; /** * Uses Quick Look to preview a file at a given path. */ @@ -1437,16 +1220,6 @@ declare namespace Electron { * Restores the window from minimized state to its previous state. */ restore(): void; - /** - * Selects the next tab when native tabs are enabled and there are other tabs in - * the window. - */ - selectNextTab(): void; - /** - * Selects the previous tab when native tabs are enabled and there are other tabs - * in the window. - */ - selectPreviousTab(): void; /** * Sets whether the window should show always on top of other windows. After * setting this, the window is still a normal window, not a toolbox window which @@ -1488,6 +1261,10 @@ declare namespace Electron { * Resizes and moves the window to the supplied bounds */ setBounds(bounds: Rectangle, animate?: boolean): void; + /** + * Note: The BrowserView API is currently experimental and may change or be removed + * in future Electron releases. + */ setBrowserView(browserView: BrowserView): void; /** * Sets whether the window can be manually closed by user. On Linux does nothing. @@ -1513,10 +1290,6 @@ declare namespace Electron { * bar will become gray when set to true. */ setDocumentEdited(edited: boolean): void; - /** - * Disable or enable the window. - */ - setEnabled(enable: boolean): void; /** * Changes whether the window can be focused. */ @@ -1543,7 +1316,7 @@ declare namespace Electron { * window will be passed to the window below this window, but if this window has * focus, it will still receive keyboard events. */ - setIgnoreMouseEvents(ignore: boolean, options?: IgnoreMouseEventsOptions): void; + setIgnoreMouseEvents(ignore: boolean): void; /** * Enters or leaves the kiosk mode. */ @@ -1580,10 +1353,6 @@ declare namespace Electron { * Sets whether the window can be moved by user. On Linux does nothing. */ setMovable(movable: boolean): void; - /** - * Sets the opacity of the window. On Linux does nothing. - */ - setOpacity(opacity: number): void; /** * Sets a 16 x 16 pixel overlay onto the current taskbar icon, usually used to * convey some sort of application status or to passively notify the user. @@ -1624,11 +1393,6 @@ declare namespace Electron { * HTML-rendered toolbar. For example: */ setSheetOffset(offsetY: number, offsetX?: number): void; - /** - * Enters or leaves simple fullscreen mode. Simple fullscreen mode emulates the - * native fullscreen behavior found in versions of Mac OS X prior to Lion (10.7). - */ - setSimpleFullScreen(flag: boolean): void; /** * Resizes the window to width and height. */ @@ -1692,11 +1456,6 @@ declare namespace Electron { * Shows the window but doesn't focus on it. */ showInactive(): void; - /** - * Toggles the visibility of the tab bar if native tabs are enabled and there is - * only one tab in the current window. - */ - toggleTabBar(): void; /** * Unhooks all of the window messages. */ @@ -1930,7 +1689,7 @@ declare namespace Electron { * An object representing the HTTP response message. */ response: IncomingMessage) => void): this; - constructor(options: 'method' | 'url' | 'session' | 'partition' | 'protocol' | 'host' | 'hostname' | 'port' | 'path' | 'redirect'); + constructor(options: any | string); /** * Cancels an ongoing HTTP transaction. If the request has already emitted the * close event, the abort operation will have no effect. Otherwise an ongoing event @@ -2158,7 +1917,7 @@ declare namespace Electron { */ on(event: 'changed', listener: (event: Event, /** - * The cookie that was changed. + * The cookie that was changed */ cookie: Cookie, /** @@ -2171,7 +1930,7 @@ declare namespace Electron { removed: boolean) => void): this; once(event: 'changed', listener: (event: Event, /** - * The cookie that was changed. + * The cookie that was changed */ cookie: Cookie, /** @@ -2184,7 +1943,7 @@ declare namespace Electron { removed: boolean) => void): this; addListener(event: 'changed', listener: (event: Event, /** - * The cookie that was changed. + * The cookie that was changed */ cookie: Cookie, /** @@ -2197,7 +1956,7 @@ declare namespace Electron { removed: boolean) => void): this; removeListener(event: 'changed', listener: (event: Event, /** - * The cookie that was changed. + * The cookie that was changed */ cookie: Cookie, /** @@ -2213,8 +1972,8 @@ declare namespace Electron { */ flushStore(callback: Function): void; /** - * Sends a request to get all cookies matching filter, callback will be called with - * callback(error, cookies) on complete. + * Sends a request to get all cookies matching details, callback will be called + * with callback(error, cookies) on complete. */ get(filter: Filter, callback: (error: Error, cookies: Cookie[]) => void): void; /** @@ -2235,7 +1994,7 @@ declare namespace Electron { /** * The number of average idle cpu wakeups per second since the last call to - * getCPUUsage. First call returns 0. Will always return 0 on Windows. + * getCPUUsage. First call returns 0. */ idleWakeupsPerSecond: number; /** @@ -2248,31 +2007,19 @@ declare namespace Electron { // Docs: http://electron.atom.io/docs/api/structures/crash-report - date: Date; - id: string; + date: string; + ID: number; } interface CrashReporter extends EventEmitter { // Docs: http://electron.atom.io/docs/api/crash-reporter - /** - * Set an extra parameter to be sent with the crash report. The values specified - * here will be sent in addition to any values set via the extra option when start - * was called. This API is only available on macOS, if you need to add/update extra - * parameters on Linux and Windows after your first call to start you can call - * start again with the updated extra options. - */ - addExtraParameter(key: string, value: string): void; /** * Returns the date and ID of the last crash report. If no crash reports have been * sent or the crash reporter has not been started, null is returned. */ getLastCrashReport(): CrashReport; - /** - * See all of the current parameters being passed to the crash reporter. - */ - getParameters(): void; /** * Returns all uploaded crash reports. Each report contains the date and uploaded * ID. @@ -2283,10 +2030,13 @@ declare namespace Electron { */ getUploadToServer(): boolean; /** - * Remove a extra parameter from the current set of parameters so that it will not - * be sent with the crash report. + * Set an extra parameter to be sent with the crash report. The values specified + * here will be sent in addition to any values set via the extra option when start + * was called. This API is only available on macOS, if you need to add/update extra + * parameters on Linux and Windows after your first call to start you can call + * start again with the updated extra options. */ - removeExtraParameter(key: string): void; + setExtraParameter(key: string, value: string): void; /** * This would normally be controlled by user preferences. This has no effect if * called before start is called. Note: This API can only be called from the main @@ -2307,7 +2057,7 @@ declare namespace Electron { * well. This will start the process that will monitor and send the crash reports. * Replace submitURL, productName and crashesDirectory with appropriate values. * Note: If you need send additional/updated extra parameters after your first call - * start you can call addExtraParameter on macOS or call start again with the + * start you can call setExtraParameter on macOS or call start again with the * new/updated extra parameters on Linux and Windows. Note: On macOS, Electron uses * a new crashpad client for crash collection and reporting. If you want to enable * crash reporting, initializing crashpad from the main process using @@ -2475,7 +2225,7 @@ declare namespace Electron { /** * Displays a modal dialog that shows an error message. This API can be called * safely before the ready event the app module emits, it is usually used to report - * errors in early stage of startup. If called before the app readyevent on Linux, + * errors in early stage of startup. If called before the app readyevent on Linux, * the message will be emitted to stderr, and no GUI dialog will appear. */ showErrorBox(title: string, content: string): void; @@ -2503,11 +2253,11 @@ declare namespace Electron { * dots (e.g. 'png' is good but '.png' and '*.png' are bad). To show all files, use * the '*' wildcard (no other wildcard is supported). If a callback is passed, the * API call will be asynchronous and the result will be passed via - * callback(filenames). Note: On Windows and Linux an open dialog can not be both a + * callback(filenames) Note: On Windows and Linux an open dialog can not be both a * file selector and a directory selector, so if you set properties to ['openFile', * 'openDirectory'] on these platforms, a directory selector will be shown. */ - showOpenDialog(browserWindow: BrowserWindow, options: OpenDialogOptions, callback?: (filePaths: string[], bookmarks: string[]) => void): string[]; + showOpenDialog(browserWindow: BrowserWindow, options: OpenDialogOptions, callback?: (filePaths: string[]) => void): string[]; /** * The browserWindow argument allows the dialog to attach itself to a parent * window, making it modal. The filters specifies an array of file types that can @@ -2516,27 +2266,27 @@ declare namespace Electron { * dots (e.g. 'png' is good but '.png' and '*.png' are bad). To show all files, use * the '*' wildcard (no other wildcard is supported). If a callback is passed, the * API call will be asynchronous and the result will be passed via - * callback(filenames). Note: On Windows and Linux an open dialog can not be both a + * callback(filenames) Note: On Windows and Linux an open dialog can not be both a * file selector and a directory selector, so if you set properties to ['openFile', * 'openDirectory'] on these platforms, a directory selector will be shown. */ - showOpenDialog(options: OpenDialogOptions, callback?: (filePaths: string[], bookmarks: string[]) => void): string[]; + showOpenDialog(options: OpenDialogOptions, callback?: (filePaths: string[]) => void): string[]; /** * The browserWindow argument allows the dialog to attach itself to a parent * window, making it modal. The filters specifies an array of file types that can * be displayed, see dialog.showOpenDialog for an example. If a callback is passed, * the API call will be asynchronous and the result will be passed via - * callback(filename). + * callback(filename) */ - showSaveDialog(browserWindow: BrowserWindow, options: SaveDialogOptions, callback?: (filename: string, bookmark: string) => void): string; + showSaveDialog(browserWindow: BrowserWindow, options: SaveDialogOptions, callback?: (filename: string) => void): string; /** * The browserWindow argument allows the dialog to attach itself to a parent * window, making it modal. The filters specifies an array of file types that can * be displayed, see dialog.showOpenDialog for an example. If a callback is passed, * the API call will be asynchronous and the result will be passed via - * callback(filename). + * callback(filename) */ - showSaveDialog(options: SaveDialogOptions, callback?: (filename: string, bookmark: string) => void): string; + showSaveDialog(options: SaveDialogOptions, callback?: (filename: string) => void): string; } interface Display { @@ -2575,54 +2325,33 @@ declare namespace Electron { * download that can't be resumed. The state can be one of following: */ on(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; + state: string) => void): this; once(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; + state: string) => void): this; addListener(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; + state: string) => void): this; removeListener(event: 'done', listener: (event: Event, - /** - * Can be `completed`, `cancelled` or `interrupted`. - */ - state: ('completed' | 'cancelled' | 'interrupted')) => void): this; + state: string) => void): this; /** * Emitted when the download has been updated and is not done. The state can be one * of following: */ on(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; + state: string) => void): this; once(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; + state: string) => void): this; addListener(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; + state: string) => void): this; removeListener(event: 'updated', listener: (event: Event, - /** - * Can be `progressing` or `interrupted`. - */ - state: ('progressing' | 'interrupted')) => void): this; + state: string) => void): this; /** * Cancels the download operation. */ cancel(): void; - canResume(): boolean; + /** + * Resumes Boolean - Whether the download can resume. + */ + canResume(): void; getContentDisposition(): string; getETag(): string; /** @@ -2762,38 +2491,6 @@ declare namespace Electron { webgl2: string; } - interface InAppPurchase extends EventEmitter { - - // Docs: http://electron.atom.io/docs/api/in-app-purchase - - /** - * Emitted when one or more transactions have been updated. - */ - on(event: 'transactions-updated', listener: (event: Event, - /** - * Array of transactions. - */ - transactions: Transaction[]) => void): this; - once(event: 'transactions-updated', listener: (event: Event, - /** - * Array of transactions. - */ - transactions: Transaction[]) => void): this; - addListener(event: 'transactions-updated', listener: (event: Event, - /** - * Array of transactions. - */ - transactions: Transaction[]) => void): this; - removeListener(event: 'transactions-updated', listener: (event: Event, - /** - * Array of transactions. - */ - transactions: Transaction[]) => void): this; - canMakePayments(): boolean; - getReceiptURL(): string; - purchaseProduct(productID: string, quantity?: number, callback?: (isProductValid: boolean) => void): void; - } - class IncomingMessage extends EventEmitter { // Docs: http://electron.atom.io/docs/api/incoming-message @@ -2927,7 +2624,7 @@ declare namespace Electron { /** * Removes all listeners, or those of the specified channel. */ - removeAllListeners(channel: string): this; + removeAllListeners(channel?: string): this; /** * Removes the specified listener from the listener array for the specified * channel. @@ -2949,10 +2646,6 @@ declare namespace Electron { * renderer process, unless you know what you are doing you should never use it. */ sendSync(channel: string, ...args: any[]): any; - /** - * Sends a message to a window with windowid via channel. - */ - sendTo(windowId: number, channel: string, ...args: any[]): void; /** * Like ipcRenderer.send but the event will be sent to the <webview> element in the * host page instead of the main process. @@ -3067,20 +2760,6 @@ declare namespace Electron { // Docs: http://electron.atom.io/docs/api/menu - /** - * Emitted when a popup is closed either manually or with menu.closePopup(). - */ - on(event: 'menu-will-close', listener: (event: Event) => void): this; - once(event: 'menu-will-close', listener: (event: Event) => void): this; - addListener(event: 'menu-will-close', listener: (event: Event) => void): this; - removeListener(event: 'menu-will-close', listener: (event: Event) => void): this; - /** - * Emitted when menu.popup() is called. - */ - on(event: 'menu-will-show', listener: (event: Event) => void): this; - once(event: 'menu-will-show', listener: (event: Event) => void): this; - addListener(event: 'menu-will-show', listener: (event: Event) => void): this; - removeListener(event: 'menu-will-show', listener: (event: Event) => void): this; constructor(); /** * Generally, the template is just an array of options for constructing a MenuItem. @@ -3093,7 +2772,7 @@ declare namespace Electron { * Note: The returned Menu instance doesn't support dynamic addition or removal of * menu items. Instance properties can still be dynamically modified. */ - static getApplicationMenu(): Menu | null; + static getApplicationMenu(): Menu; /** * Sends the action to the first responder of application. This is used for * emulating default macOS menu behaviors. Usually you would just use the role @@ -3107,7 +2786,7 @@ declare namespace Electron { * Windows and Linux but has no effect on macOS. Note: This API has to be called * after the ready event of app module. */ - static setApplicationMenu(menu: Menu | null): void; + static setApplicationMenu(menu: Menu): void; /** * Appends the menuItem to the menu. */ @@ -3116,15 +2795,14 @@ declare namespace Electron { * Closes the context menu in the browserWindow. */ closePopup(browserWindow?: BrowserWindow): void; - getMenuItemById(id: string): MenuItem; /** * Inserts the menuItem to the pos position of the menu. */ insert(pos: number, menuItem: MenuItem): void; /** - * Pops up this menu as a context menu in the BrowserWindow. + * Pops up this menu as a context menu in the browserWindow. */ - popup(options: PopupOptions): void; + popup(browserWindow?: BrowserWindow, options?: PopupOptions): void; items: MenuItem[]; } @@ -3170,13 +2848,6 @@ declare namespace Electron { * Creates a new NativeImage instance from dataURL. */ static createFromDataURL(dataURL: string): NativeImage; - /** - * Creates a new NativeImage instance from the NSImage that maps to the given image - * name. See NSImageName for a list of possible values. The hslShift is applied to - * the image with the following rules This means that [-1, 0, 1] will make the - * image completely white and [-1, 1, 0] will make the image completely black. - */ - static createFromNamedImage(imageName: string, hslShift: number[]): NativeImage; /** * Creates a new NativeImage instance from a file located at path. This method * returns an empty image if the path does not exist, cannot be read, or is not a @@ -3240,22 +2911,22 @@ declare namespace Electron { on(event: 'action', listener: (event: Event, /** - * The index of the action that was activated. + * The index of the action that was activated */ index: number) => void): this; once(event: 'action', listener: (event: Event, /** - * The index of the action that was activated. + * The index of the action that was activated */ index: number) => void): this; addListener(event: 'action', listener: (event: Event, /** - * The index of the action that was activated. + * The index of the action that was activated */ index: number) => void): this; removeListener(event: 'action', listener: (event: Event, /** - * The index of the action that was activated. + * The index of the action that was activated */ index: number) => void): this; /** @@ -3267,7 +2938,7 @@ declare namespace Electron { removeListener(event: 'click', listener: (event: Event) => void): this; /** * Emitted when the notification is closed by manual intervention from the user. - * This event is not guaranteed to be emitted in all cases where the notification + * This event is not guarunteed to be emitted in all cases where the notification * is closed. */ on(event: 'close', listener: (event: Event) => void): this; @@ -3280,22 +2951,22 @@ declare namespace Electron { */ on(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field. + * The string the user entered into the inline reply field */ reply: string) => void): this; once(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field. + * The string the user entered into the inline reply field */ reply: string) => void): this; addListener(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field. + * The string the user entered into the inline reply field */ reply: string) => void): this; removeListener(event: 'reply', listener: (event: Event, /** - * The string the user entered into the inline reply field. + * The string the user entered into the inline reply field */ reply: string) => void): this; /** @@ -3309,17 +2980,11 @@ declare namespace Electron { removeListener(event: 'show', listener: (event: Event) => void): this; constructor(options: NotificationConstructorOptions); static isSupported(): boolean; - /** - * Dismisses the notification. - */ - close(): void; /** * Immediately shows the notification to the user, please note this means unlike * the HTML5 Notification implementation, simply instantiating a new Notification * does not immediately show it to the user, you need to call this method before - * the OS will display it. If the notification has been shown before, this method - * will dismiss the previously shown notification and create a new one with - * identical properties. + * the OS will display it. */ show(): void; } @@ -3371,16 +3036,6 @@ declare namespace Electron { once(event: 'resume', listener: Function): this; addListener(event: 'resume', listener: Function): this; removeListener(event: 'resume', listener: Function): this; - /** - * Emitted when the system is about to reboot or shut down. If the event handler - * invokes e.preventDefault(), Electron will attempt to delay system shutdown in - * order for the app to exit cleanly. If e.preventDefault() is called, the app - * should exit as soon as possible by calling something like app.quit(). - */ - on(event: 'shutdown', listener: Function): this; - once(event: 'shutdown', listener: Function): this; - addListener(event: 'shutdown', listener: Function): this; - removeListener(event: 'shutdown', listener: Function): this; /** * Emitted when the system is suspending. */ @@ -3463,11 +3118,6 @@ declare namespace Electron { * sends a new HTTP request as a response. */ interceptHttpProtocol(scheme: string, handler: (request: InterceptHttpProtocolRequest, callback: (redirectRequest: RedirectRequest) => void) => void, completion?: (error: Error) => void): void; - /** - * Same as protocol.registerStreamProtocol, except that it replaces an existing - * protocol handler. - */ - interceptStreamProtocol(scheme: string, handler: (request: InterceptStreamProtocolRequest, callback: (stream?: ReadableStream | StreamProtocolResponse) => void) => void, completion?: (error: Error) => void): void; /** * Intercepts scheme protocol and uses handler as the protocol's new handler which * sends a String as a response. @@ -3528,15 +3178,6 @@ declare namespace Electron { * the ready event of the app module gets emitted. */ registerStandardSchemes(schemes: string[], options?: RegisterStandardSchemesOptions): void; - /** - * Registers a protocol of scheme that will send a Readable as a response. The - * usage is similar to the other register{Any}Protocol, except that the callback - * should be called with either a Readable object or an object that has the data, - * statusCode, and headers properties. Example: It is possible to pass any object - * that implements the readable stream API (emits data/end/error events). For - * example, here's how a file could be returned: - */ - registerStreamProtocol(scheme: string, handler: (request: RegisterStreamProtocolRequest, callback: (stream?: ReadableStream | StreamProtocolResponse) => void) => void, completion?: (error: Error) => void): void; /** * Registers a protocol of scheme that will send a String as a response. The usage * is the same with registerFileProtocol, except that the callback should be called @@ -3739,7 +3380,7 @@ declare namespace Electron { * options, you have to ensure the Session with the partition has never been used * before. There is no way to change the options of an existing Session object. */ - static fromPartition(partition: string, options?: FromPartitionOptions): Session; + static fromPartition(partition: string, options: FromPartitionOptions): Session; /** * A Session object, the default session object of the app. */ @@ -3803,12 +3444,11 @@ declare namespace Electron { * Writes any unwritten DOMStorage data to disk. */ flushStorageData(): void; - getBlobData(identifier: string, callback: (result: Buffer) => void): void; + getBlobData(identifier: string, callback: (result: Buffer) => void): Blob; /** * Callback is invoked with the session's current cache size. */ getCacheSize(callback: (size: number) => void): void; - getPreloads(): string[]; getUserAgent(): string; /** * Resolves the proxy information for url. The callback will be called with @@ -3831,14 +3471,9 @@ declare namespace Electron { /** * Sets the handler which can be used to respond to permission requests for the * session. Calling callback(true) will allow the permission and callback(false) - * will reject it. To clear the handler, call setPermissionRequestHandler(null). + * will reject it. */ - setPermissionRequestHandler(handler: (webContents: WebContents, permission: string, callback: (permissionGranted: boolean) => void, details: PermissionRequestHandlerDetails) => void | null): void; - /** - * Adds scripts that will be executed on ALL web contents that are associated with - * this session just before normal preload scripts run. - */ - setPreloads(preloads: string[]): void; + setPermissionRequestHandler(handler: (webContents: WebContents, permission: string, callback: (permissionGranted: boolean) => void) => void): void; /** * Sets the proxy settings. When pacScript and proxyRules are provided together, * the proxyRules option is ignored and pacScript configuration is applied. The @@ -3943,24 +3578,6 @@ declare namespace Electron { width: number; } - interface StreamProtocolResponse { - - // Docs: http://electron.atom.io/docs/api/structures/stream-protocol-response - - /** - * A Node.js readable stream representing the response body - */ - data: ReadableStream; - /** - * An object containing the response headers - */ - headers: Headers; - /** - * The HTTP response code - */ - statusCode: number; - } - interface SystemPreferences extends EventEmitter { // Docs: http://electron.atom.io/docs/api/system-preferences @@ -4016,7 +3633,7 @@ declare namespace Electron { getAccentColor(): string; getColor(color: '3d-dark-shadow' | '3d-face' | '3d-highlight' | '3d-light' | '3d-shadow' | 'active-border' | 'active-caption' | 'active-caption-gradient' | 'app-workspace' | 'button-text' | 'caption-text' | 'desktop' | 'disabled-text' | 'highlight' | 'highlight-text' | 'hotlight' | 'inactive-border' | 'inactive-caption' | 'inactive-caption-gradient' | 'inactive-caption-text' | 'info-background' | 'info-text' | 'menu' | 'menu-highlight' | 'menubar' | 'menu-text' | 'scrollbar' | 'window' | 'window-frame' | 'window-text'): string; /** - * Some popular key and types are: + * This API uses NSUserDefaults on macOS. Some popular key and types are: */ getUserDefault(key: string, type: 'string' | 'boolean' | 'integer' | 'float' | 'double' | 'url' | 'array' | 'dictionary'): any; /** @@ -4038,22 +3655,14 @@ declare namespace Electron { */ postNotification(event: string, userInfo: any): void; /** - * Add the specified defaults to your application's NSUserDefaults. - */ - registerDefaults(defaults: any): void; - /** - * Removes the key in NSUserDefaults. This can be used to restore the default or - * global value of a key previously set with setUserDefault. - */ - removeUserDefault(key: string): void; - /** - * Set the value of key in NSUserDefaults. Note that type should match actual type - * of value. An exception is thrown if they don't. Some popular key and types are: + * Set the value of key in system preferences. Note that type should match actual + * type of value. An exception is thrown if they don't. This API uses + * NSUserDefaults on macOS. Some popular key and types are: */ setUserDefault(key: string, type: string, value: string): void; /** * Same as subscribeNotification, but uses NSNotificationCenter for local defaults. - * This is necessary for events such as NSUserDefaultsDidChangeNotification. + * This is necessary for events such as NSUserDefaultsDidChangeNotification */ subscribeLocalNotification(event: string, callback: (event: string, userInfo: any) => void): void; /** @@ -4221,7 +3830,7 @@ declare namespace Electron { // Docs: http://electron.atom.io/docs/api/touch-bar constructor(options: TouchBarConstructorOptions); - escapeItem: (TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer | null); + escapeItem: any; static TouchBarButton: typeof TouchBarButton; static TouchBarColorPicker: typeof TouchBarColorPicker; static TouchBarGroup: typeof TouchBarGroup; @@ -4233,23 +3842,6 @@ declare namespace Electron { static TouchBarSpacer: typeof TouchBarSpacer; } - interface Transaction { - - // Docs: http://electron.atom.io/docs/api/structures/transaction - - errorCode: number; - errorMessage: string; - originalTransactionIdentifier: string; - payment: Payment; - transactionDate: string; - transactionIdentifier: string; - /** - * The transaction sate ("purchasing", "purchased", "failed", "restored", or - * "deferred") - */ - transactionState: string; - } - class Tray extends EventEmitter { // Docs: http://electron.atom.io/docs/api/tray @@ -4281,61 +3873,45 @@ declare namespace Electron { */ on(event: 'click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ - bounds: Rectangle, - /** - * The position of the event. - */ - position: Point) => void): this; + bounds: Rectangle) => void): this; once(event: 'click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ - bounds: Rectangle, - /** - * The position of the event. - */ - position: Point) => void): this; + bounds: Rectangle) => void): this; addListener(event: 'click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ - bounds: Rectangle, - /** - * The position of the event. - */ - position: Point) => void): this; + bounds: Rectangle) => void): this; removeListener(event: 'click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ - bounds: Rectangle, - /** - * The position of the event. - */ - position: Point) => void): this; + bounds: Rectangle) => void): this; /** * Emitted when the tray icon is double clicked. */ on(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; once(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; addListener(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; removeListener(event: 'double-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; /** @@ -4394,22 +3970,22 @@ declare namespace Electron { */ on(event: 'drop-text', listener: (event: Event, /** - * the dropped text string. + * the dropped text string */ text: string) => void): this; once(event: 'drop-text', listener: (event: Event, /** - * the dropped text string. + * the dropped text string */ text: string) => void): this; addListener(event: 'drop-text', listener: (event: Event, /** - * the dropped text string. + * the dropped text string */ text: string) => void): this; removeListener(event: 'drop-text', listener: (event: Event, /** - * the dropped text string. + * the dropped text string */ text: string) => void): this; /** @@ -4417,22 +3993,22 @@ declare namespace Electron { */ on(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event. + * The position of the event */ position: Point) => void): this; once(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event. + * The position of the event */ position: Point) => void): this; addListener(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event. + * The position of the event */ position: Point) => void): this; removeListener(event: 'mouse-enter', listener: (event: Event, /** - * The position of the event. + * The position of the event */ position: Point) => void): this; /** @@ -4440,45 +4016,22 @@ declare namespace Electron { */ on(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event. + * The position of the event */ position: Point) => void): this; once(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event. + * The position of the event */ position: Point) => void): this; addListener(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event. + * The position of the event */ position: Point) => void): this; removeListener(event: 'mouse-leave', listener: (event: Event, /** - * The position of the event. - */ - position: Point) => void): this; - /** - * Emitted when the mouse moves in the tray icon. - */ - on(event: 'mouse-move', listener: (event: Event, - /** - * The position of the event. - */ - position: Point) => void): this; - once(event: 'mouse-move', listener: (event: Event, - /** - * The position of the event. - */ - position: Point) => void): this; - addListener(event: 'mouse-move', listener: (event: Event, - /** - * The position of the event. - */ - position: Point) => void): this; - removeListener(event: 'mouse-move', listener: (event: Event, - /** - * The position of the event. + * The position of the event */ position: Point) => void): this; /** @@ -4486,22 +4039,22 @@ declare namespace Electron { */ on(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; once(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; addListener(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; removeListener(event: 'right-click', listener: (event: Event, /** - * The bounds of tray icon. + * The bounds of tray icon */ bounds: Rectangle) => void): this; constructor(image: NativeImage | string); @@ -4543,8 +4096,7 @@ declare namespace Electron { */ setPressedImage(image: NativeImage): void; /** - * Sets the title displayed aside of the tray icon in the status bar (Support ANSI - * colors). + * Sets the title displayed aside of the tray icon in the status bar. */ setTitle(title: string): void; /** @@ -4598,7 +4150,7 @@ declare namespace Electron { */ length: number; /** - * Last Modification time in number of seconds since the UNIX epoch. + * Last Modification time in number of seconds sine the UNIX epoch. */ modificationTime: number; /** @@ -4624,7 +4176,7 @@ declare namespace Electron { */ length: number; /** - * Last Modification time in number of seconds since the UNIX epoch. + * Last Modification time in number of seconds sine the UNIX epoch. */ modificationTime: number; /** @@ -4665,22 +4217,22 @@ declare namespace Electron { */ on(event: 'before-input-event', listener: (event: Event, /** - * Input properties. + * Input properties */ input: Input) => void): this; once(event: 'before-input-event', listener: (event: Event, /** - * Input properties. + * Input properties */ input: Input) => void): this; addListener(event: 'before-input-event', listener: (event: Event, /** - * Input properties. + * Input properties */ input: Input) => void): this; removeListener(event: 'before-input-event', listener: (event: Event, /** - * Input properties. + * Input properties */ input: Input) => void): this; /** @@ -4690,7 +4242,7 @@ declare namespace Electron { on(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code. + * The error code */ error: string, certificate: Certificate, @@ -4698,7 +4250,7 @@ declare namespace Electron { once(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code. + * The error code */ error: string, certificate: Certificate, @@ -4706,7 +4258,7 @@ declare namespace Electron { addListener(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code. + * The error code */ error: string, certificate: Certificate, @@ -4714,31 +4266,11 @@ declare namespace Electron { removeListener(event: 'certificate-error', listener: (event: Event, url: string, /** - * The error code. + * The error code */ error: string, certificate: Certificate, callback: (isTrusted: boolean) => void) => void): this; - /** - * Emitted when the associated window logs a console message. Will not be emitted - * for windows with offscreen rendering enabled. - */ - on(event: 'console-message', listener: (level: number, - message: string, - line: number, - sourceId: string) => void): this; - once(event: 'console-message', listener: (level: number, - message: string, - line: number, - sourceId: string) => void): this; - addListener(event: 'console-message', listener: (level: number, - message: string, - line: number, - sourceId: string) => void): this; - removeListener(event: 'console-message', listener: (level: number, - message: string, - line: number, - sourceId: string) => void): this; /** * Emitted when there is a new context menu that needs to be handled. */ @@ -4768,69 +4300,69 @@ declare namespace Electron { * nwse-resize, col-resize, row-resize, m-panning, e-panning, n-panning, * ne-panning, nw-panning, s-panning, se-panning, sw-panning, w-panning, move, * vertical-text, cell, context-menu, alias, progress, nodrop, copy, none, - * not-allowed, zoom-in, zoom-out, grab, grabbing or custom. If the type parameter - * is custom, the image parameter will hold the custom cursor image in a - * NativeImage, and scale, size and hotspot will hold additional information about - * the custom cursor. + * not-allowed, zoom-in, zoom-out, grab, grabbing, custom. If the type parameter is + * custom, the image parameter will hold the custom cursor image in a NativeImage, + * and scale, size and hotspot will hold additional information about the custom + * cursor. */ on(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor. + * scaling factor for the custom cursor */ scale?: number, /** - * the size of the `image`. + * the size of the `image` */ size?: Size, /** - * coordinates of the custom cursor's hotspot. + * coordinates of the custom cursor's hotspot */ hotspot?: Point) => void): this; once(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor. + * scaling factor for the custom cursor */ scale?: number, /** - * the size of the `image`. + * the size of the `image` */ size?: Size, /** - * coordinates of the custom cursor's hotspot. + * coordinates of the custom cursor's hotspot */ hotspot?: Point) => void): this; addListener(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor. + * scaling factor for the custom cursor */ scale?: number, /** - * the size of the `image`. + * the size of the `image` */ size?: Size, /** - * coordinates of the custom cursor's hotspot. + * coordinates of the custom cursor's hotspot */ hotspot?: Point) => void): this; removeListener(event: 'cursor-changed', listener: (event: Event, type: string, image?: NativeImage, /** - * scaling factor for the custom cursor. + * scaling factor for the custom cursor */ scale?: number, /** - * the size of the `image`. + * the size of the `image` */ size?: Size, /** - * coordinates of the custom cursor's hotspot. + * coordinates of the custom cursor's hotspot */ hotspot?: Point) => void): this; /** @@ -4868,53 +4400,14 @@ declare namespace Electron { once(event: 'devtools-reload-page', listener: Function): this; addListener(event: 'devtools-reload-page', listener: Function): this; removeListener(event: 'devtools-reload-page', listener: Function): this; - /** - * Emitted when a <webview> has been attached to this web contents. - */ - on(event: 'did-attach-webview', listener: (event: Event, - /** - * The guest web contents that is used by the `<webview>`. - */ - webContents: WebContents) => void): this; - once(event: 'did-attach-webview', listener: (event: Event, - /** - * The guest web contents that is used by the `<webview>`. - */ - webContents: WebContents) => void): this; - addListener(event: 'did-attach-webview', listener: (event: Event, - /** - * The guest web contents that is used by the `<webview>`. - */ - webContents: WebContents) => void): this; - removeListener(event: 'did-attach-webview', listener: (event: Event, - /** - * The guest web contents that is used by the `<webview>`. - */ - webContents: WebContents) => void): this; /** * Emitted when a page's theme color changes. This is usually due to encountering a * meta tag: */ - on(event: 'did-change-theme-color', listener: (event: Event, - /** - * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. - */ - color: string | null) => void): this; - once(event: 'did-change-theme-color', listener: (event: Event, - /** - * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. - */ - color: string | null) => void): this; - addListener(event: 'did-change-theme-color', listener: (event: Event, - /** - * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. - */ - color: string | null) => void): this; - removeListener(event: 'did-change-theme-color', listener: (event: Event, - /** - * Theme color is in format of '#rrggbb'. It is `null` when no theme color is set. - */ - color: string | null) => void): this; + on(event: 'did-change-theme-color', listener: Function): this; + once(event: 'did-change-theme-color', listener: Function): this; + addListener(event: 'did-change-theme-color', listener: Function): this; + removeListener(event: 'did-change-theme-color', listener: Function): this; /** * This event is like did-finish-load but emitted when the load failed or was * cancelled, e.g. window.stop() is invoked. The full list of error codes and their @@ -5150,7 +4643,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new . + * The options which will be used for creating the new `BrowserWindow`. */ options: any, /** @@ -5167,7 +4660,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new . + * The options which will be used for creating the new `BrowserWindow`. */ options: any, /** @@ -5184,7 +4677,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new . + * The options which will be used for creating the new `BrowserWindow`. */ options: any, /** @@ -5201,7 +4694,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'), /** - * The options which will be used for creating the new . + * The options which will be used for creating the new `BrowserWindow`. */ options: any, /** @@ -5214,22 +4707,22 @@ declare namespace Electron { */ on(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs. + * Array of URLs */ favicons: string[]) => void): this; once(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs. + * Array of URLs */ favicons: string[]) => void): this; addListener(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs. + * Array of URLs */ favicons: string[]) => void): this; removeListener(event: 'page-favicon-updated', listener: (event: Event, /** - * Array of URLs. + * Array of URLs */ favicons: string[]) => void): this; /** @@ -5278,8 +4771,8 @@ declare namespace Electron { /** * Emitted when bluetooth device needs to be selected on call to * navigator.bluetooth.requestDevice. To use navigator.bluetooth api webBluetooth - * should be enabled. If event.preventDefault is not called, first available device - * will be selected. callback should be called with deviceId to be selected, + * should be enabled. If event.preventDefault is not called, first available + * device will be selected. callback should be called with deviceId to be selected, * passing empty string to callback will cancel the request. */ on(event: 'select-bluetooth-device', listener: (event: Event, @@ -5442,13 +4935,13 @@ declare namespace Electron { * called with callback(image). The image is an instance of NativeImage that stores * data of the snapshot. Omitting rect will capture the whole visible page. */ - capturePage(callback: (image: NativeImage) => void): void; + capturePage(rect: Rectangle, callback: (image: NativeImage) => void): void; /** * Captures a snapshot of the page within rect. Upon completion callback will be * called with callback(image). The image is an instance of NativeImage that stores * data of the snapshot. Omitting rect will capture the whole visible page. */ - capturePage(rect: Rectangle, callback: (image: NativeImage) => void): void; + capturePage(callback: (image: NativeImage) => void): void; /** * Clears the navigation history. */ @@ -5495,15 +4988,16 @@ declare namespace Electron { * requestFullScreen can only be invoked by a gesture from the user. Setting * userGesture to true will remove this limitation. If the result of the executed * code is a promise the callback result will be the resolved value of the promise. - * We recommend that you use the returned Promise to handle code that results in a + * We recommend that you use the returned Promise to handle code that results in a * Promise. */ executeJavaScript(code: string, userGesture?: boolean, callback?: (result: any) => void): Promise<any>; /** - * Starts a request to find all matches for the text in the web page. The result of - * the request can be obtained by subscribing to found-in-page event. + * Starts a request to find all matches for the text in the web page and returns an + * Integer representing the request id used for the request. The result of the + * request can be obtained by subscribing to found-in-page event. */ - findInPage(text: string, options?: FindInPageOptions): number; + findInPage(text: string, options?: FindInPageOptions): void; /** * Focuses the web page. */ @@ -5582,12 +5076,6 @@ declare namespace Electron { isOffscreen(): boolean; isPainting(): boolean; isWaitingForResponse(): boolean; - /** - * Loads the given file in the window, filePath should be a path to an HTML file - * relative to the root of your application. For instance an app structure like - * this: Would require code like this - */ - loadFile(filePath: string): void; /** * Loads the url in the window. The url must contain the protocol prefix, e.g. the * http:// or file://. If the load should bypass http cache then use the pragma @@ -5595,9 +5083,7 @@ declare namespace Electron { */ loadURL(url: string, options?: LoadURLOptions): void; /** - * Opens the devtools. When contents is a <webview> tag, the mode would be detach - * by default, explicitly passing an empty mode can force using last used dock - * state. + * Opens the devtools. */ openDevTools(options?: OpenDevToolsOptions): void; /** @@ -5615,7 +5101,7 @@ declare namespace Electron { * webContents.print({silent: false, printBackground: false, deviceName: ''}). Use * page-break-before: always; CSS style to force to print to a new page. */ - print(options?: PrintOptions, callback?: (success: boolean) => void): void; + print(options?: PrintOptions): void; /** * Prints window's web page as PDF with Chromium's preview printing custom * settings. The callback will be called with callback(error, data) on completion. @@ -5674,19 +5160,6 @@ declare namespace Electron { * Mute the audio on the current web page. */ setAudioMuted(muted: boolean): void; - /** - * Uses the devToolsWebContents as the target WebContents to show devtools. The - * devToolsWebContents must not have done any navigation, and it should not be used - * for other purposes after the call. By default Electron manages the devtools by - * creating an internal WebContents with native view, which developers have very - * limited control of. With the setDevToolsWebContents method, developers can use - * any WebContents to show the devtools in it, including BrowserWindow, BrowserView - * and <webview> tag. Note that closing the devtools does not destroy the - * devToolsWebContents, it is caller's responsibility to destroy - * devToolsWebContents. An example of showing devtools in a <webview> tag: An - * example of showing devtools in a BrowserWindow: - */ - setDevToolsWebContents(devToolsWebContents: WebContents): void; /** * If offscreen rendering is enabled sets the frame rate to the specified number. * Only values between 1 and 60 are accepted. @@ -5714,7 +5187,7 @@ declare namespace Electron { setVisualZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; /** * Setting the WebRTC IP handling policy allows you to control which IPs are - * exposed via WebRTC. See BrowserLeaks for more details. + * exposed via WebRTC. See BrowserLeaks for more details. */ setWebRTCIPHandlingPolicy(policy: 'default' | 'default_public_interface_only' | 'default_public_and_private_interfaces' | 'disable_non_proxied_udp'): void; /** @@ -5725,10 +5198,14 @@ declare namespace Electron { /** * Changes the zoom level to the specified level. The original size is 0 and each * increment above or below represents zooming 20% larger or smaller to default - * limits of 300% and 50% of original size, respectively. The formula for this is - * scale := 1.2 ^ level. + * limits of 300% and 50% of original size, respectively. */ setZoomLevel(level: number): void; + /** + * Deprecated: Call setVisualZoomLevelLimits instead to set the visual zoom level + * limits. This method will be removed in Electron 2.0. + */ + setZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; /** * Shows pop-up dictionary that searches the selected word on the page. */ @@ -5799,10 +5276,6 @@ declare namespace Electron { * userGesture to true will remove this limitation. */ executeJavaScript(code: string, userGesture?: boolean, callback?: (result: any) => void): Promise<any>; - /** - * Work like executeJavaScript but evaluates scripts in isolated context. - */ - executeJavaScriptInIsolatedWorld(worldId: number, scripts: WebSource[], userGesture?: boolean, callback?: (result: any) => void): void; /** * Returns an object describing usage information of Blink's internal memory * caches. This will generate: @@ -5832,18 +5305,6 @@ declare namespace Electron { * cannot be corrupted by active network attackers. */ registerURLSchemeAsSecure(scheme: string): void; - /** - * Set the content security policy of the isolated world. - */ - setIsolatedWorldContentSecurityPolicy(worldId: number, csp: string): void; - /** - * Set the name of the isolated world. Useful in devtools. - */ - setIsolatedWorldHumanReadableName(worldId: number, name: string): void; - /** - * Set the security origin of the isolated world. - */ - setIsolatedWorldSecurityOrigin(worldId: number, securityOrigin: string): void; /** * Sets the maximum and minimum layout-based (i.e. non-visual) zoom level. */ @@ -5869,28 +5330,22 @@ declare namespace Electron { * limits of 300% and 50% of original size, respectively. */ setZoomLevel(level: number): void; + /** + * Deprecated: Call setVisualZoomLevelLimits instead to set the visual zoom level + * limits. This method will be removed in Electron 2.0. + */ + setZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; } class WebRequest extends EventEmitter { // Docs: http://electron.atom.io/docs/api/web-request - /** - * The listener will be called with listener(details) when a server initiated - * redirect is about to occur. - */ - onBeforeRedirect(listener: (details: OnBeforeRedirectDetails) => void): void; /** * The listener will be called with listener(details) when a server initiated * redirect is about to occur. */ onBeforeRedirect(filter: OnBeforeRedirectFilter, listener: (details: OnBeforeRedirectDetails) => void): void; - /** - * The listener will be called with listener(details, callback) when a request is - * about to occur. The uploadData is an array of UploadData objects. The callback - * has to be called with an response object. - */ - onBeforeRequest(listener: (details: OnBeforeRequestDetails, callback: (response: Response) => void) => void): void; /** * The listener will be called with listener(details, callback) when a request is * about to occur. The uploadData is an array of UploadData objects. The callback @@ -5904,25 +5359,10 @@ declare namespace Electron { * has to be called with an response object. */ onBeforeSendHeaders(filter: OnBeforeSendHeadersFilter, listener: Function): void; - /** - * The listener will be called with listener(details, callback) before sending an - * HTTP request, once the request headers are available. This may occur after a TCP - * connection is made to the server, but before any http data is sent. The callback - * has to be called with an response object. - */ - onBeforeSendHeaders(listener: Function): void; /** * The listener will be called with listener(details) when a request is completed. */ onCompleted(filter: OnCompletedFilter, listener: (details: OnCompletedDetails) => void): void; - /** - * The listener will be called with listener(details) when a request is completed. - */ - onCompleted(listener: (details: OnCompletedDetails) => void): void; - /** - * The listener will be called with listener(details) when an error occurs. - */ - onErrorOccurred(listener: (details: OnErrorOccurredDetails) => void): void; /** * The listener will be called with listener(details) when an error occurs. */ @@ -5933,18 +5373,6 @@ declare namespace Electron { * response object. */ onHeadersReceived(filter: OnHeadersReceivedFilter, listener: Function): void; - /** - * The listener will be called with listener(details, callback) when HTTP response - * headers of a request have been received. The callback has to be called with an - * response object. - */ - onHeadersReceived(listener: Function): void; - /** - * The listener will be called with listener(details) when first byte of the - * response body is received. For HTTP requests, this means that the status line - * and response headers are available. - */ - onResponseStarted(listener: (details: OnResponseStartedDetails) => void): void; /** * The listener will be called with listener(details) when first byte of the * response body is received. For HTTP requests, this means that the status line @@ -5957,24 +5385,6 @@ declare namespace Electron { * response are visible by the time this listener is fired. */ onSendHeaders(filter: OnSendHeadersFilter, listener: (details: OnSendHeadersDetails) => void): void; - /** - * The listener will be called with listener(details) just before a request is - * going to be sent to the server, modifications of previous onBeforeSendHeaders - * response are visible by the time this listener is fired. - */ - onSendHeaders(listener: (details: OnSendHeadersDetails) => void): void; - } - - interface WebSource { - - // Docs: http://electron.atom.io/docs/api/structures/web-source - - code: string; - /** - * Default is 1. - */ - startLine?: number; - url?: string; } interface WebviewTag extends HTMLElement { @@ -6165,10 +5575,6 @@ declare namespace Electron { */ addEventListener(event: 'devtools-focused', listener: (event: Event) => void, useCapture?: boolean): this; removeEventListener(event: 'devtools-focused', listener: (event: Event) => void): this; - addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void; - addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; - removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, useCapture?: boolean): void; - removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; canGoBack(): boolean; canGoForward(): boolean; canGoToOffset(offset: number): boolean; @@ -6207,12 +5613,13 @@ declare namespace Electron { * context in the page. HTML APIs like requestFullScreen, which require user * action, can take advantage of this option for automation. */ - executeJavaScript(code: string, userGesture?: boolean, callback?: (result: any) => void): void; + executeJavaScript(code: string, userGesture: boolean, callback?: (result: any) => void): void; /** - * Starts a request to find all matches for the text in the web page. The result of - * the request can be obtained by subscribing to found-in-page event. + * Starts a request to find all matches for the text in the web page and returns an + * Integer representing the request id used for the request. The result of the + * request can be obtained by subscribing to found-in-page event. */ - findInPage(text: string, options?: FindInPageOptions): number; + findInPage(text: string, options?: FindInPageOptions): void; getTitle(): string; getURL(): string; getUserAgent(): string; @@ -6655,10 +6062,6 @@ declare namespace Electron { * is true. */ fullscreenable?: boolean; - /** - * Use pre-Lion fullscreen on macOS. Default is false. - */ - simpleFullscreen?: boolean; /** * Whether to show the window in taskbar. Default is false. */ @@ -6712,7 +6115,7 @@ declare namespace Electron { */ enableLargerThanScreen?: boolean; /** - * Window's background color as a hexadecimal value, like #66CD00 or #FFF or + * Window's background color as Hexadecimal value, like #66CD00 or #FFF or * #80FFFFFF (alpha is supported). Default is #FFF (white). */ backgroundColor?: string; @@ -6721,11 +6124,6 @@ declare namespace Electron { * is true. */ hasShadow?: boolean; - /** - * Set the initial opacity of the window, between 0.0 (fully transparent) and 1.0 - * (fully opaque). This is only implemented on Windows and macOS. - */ - opacity?: number; /** * Forces using dark theme for the window, only works on some GTK+3 desktop * environments. Default is false. @@ -6742,9 +6140,9 @@ declare namespace Electron { /** * The style of window title bar. Default is default. Possible values are: */ - titleBarStyle?: ('default' | 'hidden' | 'hiddenInset' | 'customButtonsOnHover'); + titleBarStyle?: ('default' | 'hidden' | 'hidden-inset' | 'hiddenInset' | 'customButtonsOnHover'); /** - * Shows the title in the title bar in full screen mode on macOS for all + * Shows the title in the tile bar in full screen mode on macOS for all * titleBarStyle options. Default is false. */ fullscreenWindowTitle?: boolean; @@ -6798,11 +6196,7 @@ declare namespace Electron { /** * Verification result from chromium. */ - verificationResult: string; - /** - * Error code. - */ - errorCode: number; + error: string; } interface ClearStorageDataOptions { @@ -6812,7 +6206,7 @@ declare namespace Electron { origin?: string; /** * The types of storages to clear, can contain: appcache, cookies, filesystem, - * indexdb, localstorage, shadercache, websql, serviceworkers. + * indexdb, localstorage, shadercache, websql, serviceworkers */ storages?: string[]; /** @@ -6859,11 +6253,11 @@ declare namespace Electron { interface ContextMenuParams { /** - * x coordinate. + * x coordinate */ x: number; /** - * y coordinate. + * y coordinate */ y: number; /** @@ -6923,8 +6317,8 @@ declare namespace Electron { */ inputFieldType: string; /** - * Input source that invoked the context menu. Can be none, mouse, keyboard, touch - * or touchMenu. + * Input source that invoked the context menu. Can be none, mouse, keyboard, touch, + * touchMenu. */ menuSourceType: ('none' | 'mouse' | 'keyboard' | 'touch' | 'touchMenu'); /** @@ -6961,10 +6355,9 @@ declare namespace Electron { * properties are sent correctly. Nested objects are not supported and the property * names and values must be less than 64 characters long. */ - extra?: Extra; + extra?: any; /** - * Directory to store the crashreports temporarily (only used when the crash - * reporter is started via process.crashReporter.start). + * Only used when the crash reporter is used in a forked process (macOS only). */ crashesDirectory?: string; } @@ -7109,12 +6502,9 @@ declare namespace Electron { } interface DisplayBalloonOptions { - /** - * - - */ icon?: NativeImage | string; - title: string; - content: string; + title?: string; + content?: string; } interface Dock { @@ -7179,18 +6569,6 @@ declare namespace Electron { interface Extensions { } - interface FeedURLOptions { - url: string; - /** - * HTTP request headers. - */ - headers?: Headers; - /** - * Either json or default, see the README for more information. - */ - serverType?: string; - } - interface FileIconOptions { size: ('small' | 'normal' | 'large'); } @@ -7206,7 +6584,7 @@ declare namespace Electron { */ name?: string; /** - * Retrieves cookies whose domains match or are subdomains of domains. + * Retrieves cookies whose domains match or are subdomains of domains */ domain?: string; /** @@ -7266,18 +6644,6 @@ declare namespace Electron { name: string; } - interface Headers { - } - - interface IgnoreMouseEventsOptions { - /** - * If true, forwards mouse move messages to Chromium, enabling mouse related events - * such as mouseleave. Only used when ignore is true. If ignore is false, - * forwarding is always disabled regardless of this value. - */ - forward?: boolean; - } - interface ImportCertificateOptions { /** * Path for the pkcs12 file. @@ -7291,35 +6657,35 @@ declare namespace Electron { interface Input { /** - * Either keyUp or keyDown. + * Either keyUp or keyDown */ type: string; /** - * Equivalent to . + * Equivalent to */ key: string; /** - * Equivalent to . + * Equivalent to */ code: string; /** - * Equivalent to . + * Equivalent to */ isAutoRepeat: boolean; /** - * Equivalent to . + * Equivalent to */ shift: boolean; /** - * Equivalent to . + * Equivalent to */ control: boolean; /** - * Equivalent to . + * Equivalent to */ alt: boolean; /** - * Equivalent to . + * Equivalent to */ meta: boolean; } @@ -7345,14 +6711,6 @@ declare namespace Electron { uploadData: UploadData[]; } - interface InterceptStreamProtocolRequest { - url: string; - headers: Headers; - referrer: string; - method: string; - uploadData: UploadData[]; - } - interface InterceptStringProtocolRequest { url: string; referrer: string; @@ -7409,9 +6767,6 @@ declare namespace Electron { * Extra headers separated by "\n" */ extraHeaders?: string; - /** - * - - */ postData?: UploadRawData[] | UploadFile[] | UploadFileSystem[] | UploadBlob[]; /** * Base url (with trailing path separator) for files to be loaded by the data url. @@ -7428,25 +6783,25 @@ declare namespace Electron { */ openAtLogin: boolean; /** - * true if the app is set to open as hidden at login. This setting is not available - * on . + * true if the app is set to open as hidden at login. This setting is only + * supported on macOS. */ openAsHidden: boolean; /** - * true if the app was opened at login automatically. This setting is not available - * on . + * true if the app was opened at login automatically. This setting is only + * supported on macOS. */ wasOpenedAtLogin: boolean; /** * true if the app was opened as a hidden login item. This indicates that the app - * should not open any windows at startup. This setting is not available on . + * should not open any windows at startup. This setting is only supported on macOS. */ wasOpenedAsHidden: boolean; /** * true if the app was opened as a login item that should restore the state from * the previous session. This indicates that the app should restore the windows - * that were open the last time the app was closed. This setting is not available - * on . + * that were open the last time the app was closed. This setting is only supported + * on macOS. */ restoreState: boolean; } @@ -7472,7 +6827,7 @@ declare namespace Electron { * Define the action of the menu item, when specified the click property will be * ignored. See . */ - role?: string; + role?: MenuItemRole; /** * Can be normal, separator, submenu, checkbox or radio. */ @@ -7495,7 +6850,7 @@ declare namespace Electron { checked?: boolean; /** * Should be specified for submenu type menu items. If submenu is specified, the - * type: 'submenu' can be omitted. If the value is not a then it will be + * type: 'submenu' can be omitted. If the value is not a Menu then it will be * automatically converted to one using Menu.buildFromTemplate. */ submenu?: MenuItemConstructorOptions[] | Menu; @@ -7585,7 +6940,7 @@ declare namespace Electron { */ disposition: ('default' | 'foreground-tab' | 'background-tab' | 'new-window' | 'save-to-disk' | 'other'); /** - * The options which should be used for creating the new . + * The options which should be used for creating the new `BrowserWindow`. */ options: Options; } @@ -7593,7 +6948,7 @@ declare namespace Electron { interface NotificationConstructorOptions { /** * A title for the notification, which will be shown at the top of the notification - * window when it is shown. + * window when it is shown */ title: string; /** @@ -7602,17 +6957,17 @@ declare namespace Electron { subtitle?: string; /** * The body text of the notification, which will be displayed below the title or - * subtitle. + * subtitle */ body: string; /** - * Whether or not to emit an OS notification noise when showing the notification. + * Whether or not to emit an OS notification noise when showing the notification */ silent?: boolean; /** - * An icon to use in the notification. + * An icon to use in the notification */ - icon?: string | NativeImage; + icon?: NativeImage; /** * Whether or not to add an inline reply option to the notification. */ @@ -7627,21 +6982,15 @@ declare namespace Electron { sound?: string; /** * Actions to add to the notification. Please read the available actions and - * limitations in the NotificationAction documentation. + * limitations in the NotificationAction documentation */ actions?: NotificationAction[]; - /** - * A custom title for the close button of an alert. An empty string will cause the - * default localized text to be used. - */ - closeButtonText?: string; } interface OnBeforeRedirectDetails { - id: number; + id: string; url: string; method: string; - webContentsId?: number; resourceType: string; timestamp: number; redirectURL: string; @@ -7666,7 +7015,6 @@ declare namespace Electron { id: number; url: string; method: string; - webContentsId?: number; resourceType: string; timestamp: number; uploadData: UploadData[]; @@ -7692,7 +7040,6 @@ declare namespace Electron { id: number; url: string; method: string; - webContentsId?: number; resourceType: string; timestamp: number; responseHeaders: ResponseHeaders; @@ -7713,7 +7060,6 @@ declare namespace Electron { id: number; url: string; method: string; - webContentsId?: number; resourceType: string; timestamp: number; fromCache: boolean; @@ -7743,7 +7089,6 @@ declare namespace Electron { id: number; url: string; method: string; - webContentsId?: number; resourceType: string; timestamp: number; responseHeaders: ResponseHeaders; @@ -7767,7 +7112,6 @@ declare namespace Electron { id: number; url: string; method: string; - webContentsId?: number; resourceType: string; timestamp: number; requestHeaders: RequestHeaders; @@ -7808,10 +7152,6 @@ declare namespace Electron { * Message to display above input boxes. */ message?: string; - /** - * Create when packaged for the Mac App Store. - */ - securityScopedBookmarks?: boolean; } interface OpenExternalOptions { @@ -7835,56 +7175,50 @@ declare namespace Electron { interface Parameters { /** - * Specify the screen type to emulate (default: desktop): + * Specify the screen type to emulate (default: desktop) */ screenPosition: ('desktop' | 'mobile'); /** - * Set the emulated screen size (screenPosition == mobile). + * Set the emulated screen size (screenPosition == mobile) */ screenSize: Size; /** * Position the view on the screen (screenPosition == mobile) (default: {x: 0, y: - * 0}). + * 0}) */ viewPosition: Point; /** * Set the device scale factor (if zero defaults to original device scale factor) - * (default: 0). + * (default: 0) */ deviceScaleFactor: number; /** * Set the emulated view size (empty means no override) */ viewSize: Size; + /** + * Whether emulated view should be scaled down if necessary to fit into available + * space (default: false) + */ + fitToView: boolean; + /** + * Offset of the emulated view inside available space (not in fit to view mode) + * (default: {x: 0, y: 0}) + */ + offset: Point; /** * Scale of emulated view inside available space (not in fit to view mode) - * (default: 1). + * (default: 1) */ scale: number; } - interface Payment { - productIdentifier: string; - quantity: number; - } - - interface PermissionRequestHandlerDetails { - /** - * The url of the openExternal request. - */ - externalURL: string; - } - interface PluginCrashedEvent extends Event { name: string; version: string; } interface PopupOptions { - /** - * Default is the focused window. - */ - window?: BrowserWindow; /** * Default is the current mouse cursor position. Must be declared if y is declared. */ @@ -7893,15 +7227,16 @@ declare namespace Electron { * Default is the current mouse cursor position. Must be declared if x is declared. */ y?: number; + /** + * Set to true to have this method return immediately called, false to return after + * the menu has been selected or closed. Defaults to false. + */ + async?: boolean; /** * The index of the menu item to be positioned under the mouse cursor at the * specified coordinates. Default is -1. */ positioningItem?: number; - /** - * Called when menu is closed. - */ - callback?: () => void; } interface PrintOptions { @@ -7960,7 +7295,7 @@ declare namespace Electron { privateBytes: number; /** * The amount of memory shared between processes, typically memory consumed by the - * Electron code itself. + * Electron code itself */ sharedBytes: number; } @@ -7974,7 +7309,7 @@ declare namespace Electron { interface Provider { /** - * Returns Boolean. + * Returns Boolean */ spellCheck: (text: string) => void; } @@ -8019,14 +7354,6 @@ declare namespace Electron { secure?: boolean; } - interface RegisterStreamProtocolRequest { - url: string; - headers: Headers; - referrer: string; - method: string; - uploadData: UploadData[]; - } - interface RegisterStringProtocolRequest { url: string; referrer: string; @@ -8074,7 +7401,7 @@ declare namespace Electron { */ width?: number; /** - * Defaults to the image's height. + * Defaults to the image's height */ height?: number; /** @@ -8145,11 +7472,6 @@ declare namespace Electron { * Show the tags input box, defaults to true. */ showsTagField?: boolean; - /** - * Create a when packaged for the Mac App Store. If this option is enabled and the - * file doesn't already exist a blank file will be created at the chosen path. - */ - securityScopedBookmarks?: boolean; } interface Settings { @@ -8162,7 +7484,7 @@ declare namespace Electron { * true to open the app as hidden. Defaults to false. The user can edit this * setting from the System Preferences so * app.getLoginItemStatus().wasOpenedAsHidden should be checked when the app is - * opened to know the current value. This setting is not available on . + * opened to know the current value. This setting is only supported on macOS. */ openAsHidden?: boolean; /** @@ -8263,7 +7585,7 @@ declare namespace Electron { /** * Can be left, right or overlay. */ - iconPosition?: ('left' | 'right' | 'overlay'); + iconPosition: ('left' | 'right' | 'overlay'); /** * Function to call when the button is clicked. */ @@ -8286,8 +7608,8 @@ declare namespace Electron { } interface TouchBarConstructorOptions { - items: Array<TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer>; - escapeItem?: TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer | null; + items: (TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer)[]; + escapeItem?: TouchBarButton | TouchBarColorPicker | TouchBarGroup | TouchBarLabel | TouchBarPopover | TouchBarScrubber | TouchBarSegmentedControl | TouchBarSlider | TouchBarSpacer; } interface TouchBarGroupConstructorOptions { @@ -8330,15 +7652,15 @@ declare namespace Electron { interface TouchBarScrubberConstructorOptions { /** - * An array of items to place in this scrubber. + * An array of items to place in this scrubber */ items: ScrubberItem[]; /** - * Called when the user taps an item that was not the last tapped item. + * Called when the user taps an item that was not the last tapped item */ select: (selectedIndex: number) => void; /** - * Called when the user taps any item. + * Called when the user taps any item */ highlight: (highlightedIndex: number) => void; /** @@ -8382,7 +7704,7 @@ declare namespace Electron { */ selectedIndex?: number; /** - * Called when the user selects a new segment. + * Called when the user selects a new segment */ change: (selectedIndex: number, isSelected: boolean) => void; } @@ -8487,6 +7809,9 @@ declare namespace Electron { finalUpdate: boolean; } + interface Headers { + } + interface MediaFlags { /** * Whether the media element has crashed. @@ -8586,15 +7911,6 @@ declare namespace Electron { * session. */ partition?: string; - /** - * When specified, web pages with the same affinity will run in the same renderer - * process. Note that due to reusing the renderer process, certain webPreferences - * options will also be shared between the web pages even when you specified - * different values for them, including but not limited to preload, sandbox and - * nodeIntegration. So it is suggested to use exact same webPreferences for web - * pages with the same affinity. - */ - affinity?: string; /** * The default zoom factor of the page, 3.0 represents 300%. Default is 1.0. */ @@ -8678,7 +7994,7 @@ declare namespace Electron { defaultEncoding?: string; /** * Whether to throttle animations and timers when the page becomes background. This - * also affects the . Defaults to true. + * also affects the [Page Visibility API][#page-visibility]. Defaults to true. */ backgroundThrottling?: boolean; /** @@ -8715,12 +8031,6 @@ declare namespace Electron { * alter the <webview>'s initial settings. */ webviewTag?: boolean; - /** - * A list of strings that will be appended to process.argv in the renderer process - * of this app. Useful for passing small bits of data down to renderer process - * preload scripts. - */ - additionArguments?: string[]; } interface DefaultFontFamily { @@ -8798,7 +8108,6 @@ declare namespace NodeJS { // Docs: http://electron.atom.io/docs/api/process - // ### BEGIN VSCODE MODIFICATION ### // /** // * Emitted when Electron has loaded its internal initialization script and is // * beginning to load the web page or the main script. It can be used by the preload @@ -8809,8 +8118,6 @@ declare namespace NodeJS { // once(event: 'loaded', listener: Function): this; // addListener(event: 'loaded', listener: Function): this; // removeListener(event: 'loaded', listener: Function): this; - // ### END VSCODE MODIFICATION ### - /** * Causes the main thread of the current process crash. */ @@ -8853,8 +8160,8 @@ declare namespace NodeJS { noAsar?: boolean; /** * A Boolean that controls whether or not deprecation warnings are printed to - * stderr. Setting this to true will silence deprecation warnings. This property is - * used instead of the --no-deprecation command line flag. + * stderr. Setting this to true will silence deprecation warnings. This property + * is used instead of the --no-deprecation command line flag. */ noDeprecation?: boolean; /** @@ -8863,21 +8170,21 @@ declare namespace NodeJS { resourcesPath?: string; /** * A Boolean that controls whether or not deprecation warnings will be thrown as - * exceptions. Setting this to true will throw errors for deprecations. This + * exceptions. Setting this to true will throw errors for deprecations. This * property is used instead of the --throw-deprecation command line flag. */ throwDeprecation?: boolean; /** * A Boolean that controls whether or not deprecations printed to stderr include - * their stack trace. Setting this to true will print stack traces for + * their stack trace. Setting this to true will print stack traces for * deprecations. This property is instead of the --trace-deprecation command line * flag. */ traceDeprecation?: boolean; /** * A Boolean that controls whether or not process warnings printed to stderr - * include their stack trace. Setting this to true will print stack traces for - * process warnings (including deprecations). This property is instead of the + * include their stack trace. Setting this to true will print stack traces for + * process warnings (including deprecations). This property is instead of the * --trace-warnings command line flag. */ traceProcessWarnings?: boolean; diff --git a/src/typings/node.d.ts b/src/typings/node.d.ts index a1c8edf9d48..1b6661edd71 100644 --- a/src/typings/node.d.ts +++ b/src/typings/node.d.ts @@ -1,62 +1,41 @@ -// Type definitions for Node.js 8.9.x +// Type definitions for Node.js v7.x // Project: http://nodejs.org/ // Definitions by: Microsoft TypeScript <http://typescriptlang.org> // DefinitelyTyped <https://github.com/DefinitelyTyped/DefinitelyTyped> // Parambir Singh <https://github.com/parambirs> +// Roberto Desideri <https://github.com/RobDesideri> // Christian Vaagland Tellnes <https://github.com/tellnes> // Wilco Bakker <https://github.com/WilcoBakker> -// Nicolas Voigt <https://github.com/octo-sniffle> -// Chigozirim C. <https://github.com/smac89> -// Flarna <https://github.com/Flarna> -// Mariusz Wiktorczyk <https://github.com/mwiktorczyk> -// wwwy3y3 <https://github.com/wwwy3y3> -// Deividas Bakanas <https://github.com/DeividasBakanas> -// Kelvin Jin <https://github.com/kjin> -// Alvis HT Tang <https://github.com/alvis> -// Oliver Joseph Ash <https://github.com/OliverJAsh> -// Sebastian Silbermann <https://github.com/eps1lon> -// Hannes Magnusson <https://github.com/Hannes-Magnusson-CK> -// Alberto Schiabel <https://github.com/jkomyno> -// Huw <https://github.com/hoo29> +// Daniel Imms <https://github.com/Tyriar> // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped -// TypeScript Version: 2.1 -// ### BEGIN VSCODE MODIFICATION ### -// /** inspector module types */ -// /// <reference path="./inspector.d.ts" /> -// ### BEGIN VSCODE MODIFICATION ### +/************************************************ +* * +* Node.js v7.x API * +* * +************************************************/ // This needs to be global to avoid TS2403 in case lib.dom.d.ts is present in the same build interface Console { - Console: NodeJS.ConsoleConstructor; - assert(value: any, message?: string, ...optionalParams: any[]): void; - dir(obj: any, options?: NodeJS.InspectOptions): void; - error(message?: any, ...optionalParams: any[]): void; - info(message?: any, ...optionalParams: any[]): void; - log(message?: any, ...optionalParams: any[]): void; - time(label: string): void; - timeEnd(label: string): void; - trace(message?: any, ...optionalParams: any[]): void; - warn(message?: any, ...optionalParams: any[]): void; + Console: NodeJS.ConsoleConstructor; + assert(value: any, message?: string, ...optionalParams: any[]): void; + dir(obj: any, options?: NodeJS.InspectOptions): void; + error(message?: any, ...optionalParams: any[]): void; + info(message?: any, ...optionalParams: any[]): void; + log(message?: any, ...optionalParams: any[]): void; + time(label: string): void; + timeEnd(label: string): void; + trace(message?: any, ...optionalParams: any[]): void; + warn(message?: any, ...optionalParams: any[]): void; } interface Error { - stack?: string; + stack?: string; } -// Declare "static" methods in Error interface ErrorConstructor { - /** Create .stack property on a target object */ - captureStackTrace(targetObject: Object, constructorOpt?: Function): void; - - /** - * Optional override for formatting stack traces - * - * @see https://github.com/v8/v8/wiki/Stack%20Trace%20API#customizing-stack-traces - */ - prepareStackTrace?: (err: Error, stackTraces: NodeJS.CallSite[]) => any; - - stackTraceLimit: number; + captureStackTrace(targetObject: Object, constructorOpt?: Function): void; + stackTraceLimit: number; } // compat for TypeScript 1.8 @@ -70,85 +49,55 @@ interface WeakSetConstructor { } // Forward-declare needed types from lib.es2015.d.ts (in case users are using `--lib es5`) interface Iterable<T> { } interface Iterator<T> { - next(value?: any): IteratorResult<T>; + next(value?: any): IteratorResult<T>; } interface IteratorResult<T> { } interface SymbolConstructor { - readonly iterator: symbol; + readonly iterator: symbol; } declare var Symbol: SymbolConstructor; -// Node.js ESNEXT support -interface String { - /** Removes whitespace from the left end of a string. */ - trimLeft(): string; - /** Removes whitespace from the right end of a string. */ - trimRight(): string; -} - /************************************************ * * * GLOBAL * * * ************************************************/ declare var process: NodeJS.Process; -declare var global: NodeJS.Global; +declare var global: any; declare var console: Console; -// ### BEGIN VSCODE MODIFICATION ### +// Don't use these!! :) // declare var __filename: string; // declare var __dirname: string; // declare function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; -// declare namespace setTimeout { -// export function __promisify__(ms: number): Promise<void>; -// export function __promisify__<T>(ms: number, value: T): Promise<T>; -// } // declare function clearTimeout(timeoutId: NodeJS.Timer): void; // declare function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; // declare function clearInterval(intervalId: NodeJS.Timer): void; -// ### END VSCODE MODIFICATION ### - declare function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; -declare namespace setImmediate { - export function __promisify__(): Promise<void>; - export function __promisify__<T>(value: T): Promise<T>; -} declare function clearImmediate(immediateId: any): void; -// TODO: change to `type NodeRequireFunction = (id: string) => any;` in next mayor version. interface NodeRequireFunction { - /* tslint:disable-next-line:callable-types */ - (id: string): any; + (id: string): any; } -// ### BEGIN VSCODE MODIFICATION ### // interface NodeRequire extends NodeRequireFunction { // resolve(id: string): string; // cache: any; -// extensions: NodeExtensions; +// extensions: any; // main: NodeModule | undefined; // } -// interface NodeExtensions { -// '.js': (m: NodeModule, filename: string) => any; -// '.json': (m: NodeModule, filename: string) => any; -// '.node': (m: NodeModule, filename: string) => any; -// [ext: string]: (m: NodeModule, filename: string) => any; -// } - // declare var require: NodeRequire; -// ### END VSCODE MODIFICATION ### interface NodeModule { - exports: any; - require: NodeRequireFunction; - id: string; - filename: string; - loaded: boolean; - parent: NodeModule | null; - children: NodeModule[]; - paths: string[]; + exports: any; + require: NodeRequireFunction; + id: string; + filename: string; + loaded: boolean; + parent: NodeModule | null; + children: NodeModule[]; } declare var module: NodeModule; @@ -156,16 +105,17 @@ declare var module: NodeModule; // Same as module.exports declare var exports: any; declare var SlowBuffer: { - new(str: string, encoding?: string): Buffer; - new(size: number): Buffer; - new(size: Uint8Array): Buffer; - new(array: any[]): Buffer; - prototype: Buffer; - isBuffer(obj: any): boolean; - byteLength(string: string, encoding?: string): number; - concat(list: Buffer[], totalLength?: number): Buffer; + new(str: string, encoding?: string): Buffer; + new(size: number): Buffer; + new(size: Uint8Array): Buffer; + new(array: any[]): Buffer; + prototype: Buffer; + isBuffer(obj: any): boolean; + byteLength(string: string, encoding?: string): number; + concat(list: Buffer[], totalLength?: number): Buffer; }; + // Buffer class type BufferEncoding = "ascii" | "utf8" | "utf16le" | "ucs2" | "base64" | "latin1" | "binary" | "hex"; interface Buffer extends NodeBuffer { } @@ -182,19 +132,19 @@ declare var Buffer: { * @param str String to store in buffer. * @param encoding encoding to use, optional. Default is 'utf8' */ - new(str: string, encoding?: string): Buffer; + new(str: string, encoding?: string): Buffer; /** * Allocates a new buffer of {size} octets. * * @param size count of octets to allocate. */ - new(size: number): Buffer; + new(size: number): Buffer; /** * Allocates a new buffer containing the given {array} of octets. * * @param array The octets to store. */ - new(array: Uint8Array): Buffer; + new(array: Uint8Array): Buffer; /** * Produces a Buffer backed by the same allocated memory as * the given {ArrayBuffer}. @@ -202,24 +152,26 @@ declare var Buffer: { * * @param arrayBuffer The ArrayBuffer with which to share memory. */ - new(arrayBuffer: ArrayBuffer): Buffer; + new(arrayBuffer: ArrayBuffer): Buffer; /** * Allocates a new buffer containing the given {array} of octets. * * @param array The octets to store. */ - new(array: any[]): Buffer; + new(array: any[]): Buffer; /** * Copies the passed {buffer} data onto a new {Buffer} instance. * * @param buffer The buffer to copy. */ - new(buffer: Buffer): Buffer; - prototype: Buffer; + new(buffer: Buffer): Buffer; + prototype: Buffer; /** * Allocates a new Buffer using an {array} of octets. + * + * @param array */ - from(array: any[]): Buffer; + from(array: any[]): Buffer; /** * When passed a reference to the .buffer property of a TypedArray instance, * the newly created Buffer will share the same allocated memory as the TypedArray. @@ -227,39 +179,45 @@ declare var Buffer: { * within the {arrayBuffer} that will be shared by the Buffer. * * @param arrayBuffer The .buffer property of a TypedArray or a new ArrayBuffer() + * @param byteOffset + * @param length */ - from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; + from(arrayBuffer: ArrayBuffer, byteOffset?: number, length?: number): Buffer; /** * Copies the passed {buffer} data onto a new Buffer instance. + * + * @param buffer */ - from(buffer: Buffer): Buffer; + from(buffer: Buffer): Buffer; /** * Creates a new Buffer containing the given JavaScript string {str}. * If provided, the {encoding} parameter identifies the character encoding. * If not provided, {encoding} defaults to 'utf8'. + * + * @param str */ - from(str: string, encoding?: string): Buffer; + from(str: string, encoding?: string): Buffer; /** * Returns true if {obj} is a Buffer * * @param obj object to test. */ - isBuffer(obj: any): obj is Buffer; + isBuffer(obj: any): obj is Buffer; /** * Returns true if {encoding} is a valid encoding argument. * Valid string encodings in Node 0.12: 'ascii'|'utf8'|'utf16le'|'ucs2'(alias of 'utf16le')|'base64'|'binary'(deprecated)|'hex' * * @param encoding string to test. */ - isEncoding(encoding: string): boolean; + isEncoding(encoding: string): boolean; /** * Gives the actual byte length of a string. encoding defaults to 'utf8'. * This is not the same as String.prototype.length since that returns the number of characters in a string. * - * @param string string to test. (TypedArray is also allowed, but it is only available starting ES2017) + * @param string string to test. * @param encoding encoding used to evaluate (defaults to 'utf8') */ - byteLength(string: string | Buffer | DataView | ArrayBuffer, encoding?: string): number; + byteLength(string: string, encoding?: string): number; /** * Returns a buffer which is the result of concatenating all the buffers in the list together. * @@ -271,11 +229,11 @@ declare var Buffer: { * @param totalLength Total length of the buffers when concatenated. * If totalLength is not provided, it is read from the buffers in the list. However, this adds an additional loop to the function, so it is faster to provide the length explicitly. */ - concat(list: Buffer[], totalLength?: number): Buffer; + concat(list: Buffer[], totalLength?: number): Buffer; /** * The same as buf1.compare(buf2). */ - compare(buf1: Buffer, buf2: Buffer): number; + compare(buf1: Buffer, buf2: Buffer): number; /** * Allocates a new buffer of {size} octets. * @@ -284,25 +242,21 @@ declare var Buffer: { * If parameter is omitted, buffer will be filled with zeros. * @param encoding encoding used for call to buf.fill while initalizing */ - alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; + alloc(size: number, fill?: string | Buffer | number, encoding?: string): Buffer; /** * Allocates a new buffer of {size} octets, leaving memory not initialized, so the contents * of the newly created Buffer are unknown and may contain sensitive data. * * @param size count of octets to allocate */ - allocUnsafe(size: number): Buffer; + allocUnsafe(size: number): Buffer; /** * Allocates a new non-pooled buffer of {size} octets, leaving memory not initialized, so the contents * of the newly created Buffer are unknown and may contain sensitive data. * * @param size count of octets to allocate */ - allocUnsafeSlow(size: number): Buffer; - /** - * This is the number of bytes used to determine the size of pre-allocated, internal Buffer instances used for pooling. This value may be modified. - */ - poolSize: number; + allocUnsafeSlow(size: number): Buffer; }; /************************************************ @@ -311,501 +265,273 @@ declare var Buffer: { * * ************************************************/ declare namespace NodeJS { - export interface InspectOptions { - showHidden?: boolean; - depth?: number | null; - colors?: boolean; - customInspect?: boolean; - showProxy?: boolean; - maxArrayLength?: number | null; - breakLength?: number; - } + export interface InspectOptions { + showHidden?: boolean; + depth?: number | null; + colors?: boolean; + customInspect?: boolean; + showProxy?: boolean; + maxArrayLength?: number | null; + breakLength?: number; + } - export interface ConsoleConstructor { - prototype: Console; - new(stdout: WritableStream, stderr?: WritableStream): Console; - } + export interface ConsoleConstructor { + prototype: Console; + new(stdout: WritableStream, stderr?: WritableStream): Console; + } - export interface CallSite { - /** - * Value of "this" - */ - getThis(): any; + export interface ErrnoException extends Error { + errno?: number; + code?: string; + path?: string; + syscall?: string; + stack?: string; + } - /** - * Type of "this" as a string. - * This is the name of the function stored in the constructor field of - * "this", if available. Otherwise the object's [[Class]] internal - * property. - */ - getTypeName(): string | null; + export class EventEmitter { + addListener(event: string | symbol, listener: Function): this; + on(event: string | symbol, listener: Function): this; + once(event: string | symbol, listener: Function): this; + removeListener(event: string | symbol, listener: Function): this; + removeAllListeners(event?: string | symbol): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + listeners(event: string | symbol): Function[]; + emit(event: string | symbol, ...args: any[]): boolean; + listenerCount(type: string | symbol): number; + // Added in Node 6... + prependListener(event: string | symbol, listener: Function): this; + prependOnceListener(event: string | symbol, listener: Function): this; + eventNames(): (string | symbol)[]; + } - /** - * Current function - */ - getFunction(): Function | undefined; + export interface ReadableStream extends EventEmitter { + readable: boolean; + read(size?: number): string | Buffer; + setEncoding(encoding: string | null): this; + pause(): this; + resume(): this; + isPaused(): boolean; + pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T; + unpipe<T extends WritableStream>(destination?: T): this; + unshift(chunk: string): void; + unshift(chunk: Buffer): void; + wrap(oldStream: ReadableStream): ReadableStream; + } - /** - * Name of the current function, typically its name property. - * If a name property is not available an attempt will be made to try - * to infer a name from the function's context. - */ - getFunctionName(): string | null; + export interface WritableStream extends EventEmitter { + writable: boolean; + write(buffer: Buffer | string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + } - /** - * Name of the property [of "this" or one of its prototypes] that holds - * the current function - */ - getMethodName(): string | null; + export interface ReadWriteStream extends ReadableStream, WritableStream { } - /** - * Name of the script [if this function was defined in a script] - */ - getFileName(): string | null; + export interface Events extends EventEmitter { } - /** - * Current line number [if this function was defined in a script] - */ - getLineNumber(): number | null; + export interface Domain extends Events { + run(fn: Function): void; + add(emitter: Events): void; + remove(emitter: Events): void; + bind(cb: (err: Error, data: any) => any): any; + intercept(cb: (data: any) => any): any; + dispose(): void; - /** - * Current column number [if this function was defined in a script] - */ - getColumnNumber(): number | null; + addListener(event: string, listener: Function): this; + on(event: string, listener: Function): this; + once(event: string, listener: Function): this; + removeListener(event: string, listener: Function): this; + removeAllListeners(event?: string): this; + } - /** - * A call site object representing the location where eval was called - * [if this function was created using a call to eval] - */ - getEvalOrigin(): string | undefined; + export interface MemoryUsage { + rss: number; + heapTotal: number; + heapUsed: number; + } - /** - * Is this a toplevel invocation, that is, is "this" the global object? - */ - isToplevel(): boolean; + export interface CpuUsage { + user: number; + system: number; + } - /** - * Does this call take place in code defined by a call to eval? - */ - isEval(): boolean; + export interface ProcessVersions { + http_parser: string; + node: string; + v8: string; + ares: string; + uv: string; + zlib: string; + modules: string; + openssl: string; + } - /** - * Is this call in native V8 code? - */ - isNative(): boolean; + type Platform = 'aix' + | 'android' + | 'darwin' + | 'freebsd' + | 'linux' + | 'openbsd' + | 'sunos' + | 'win32'; - /** - * Is this a constructor call? - */ - isConstructor(): boolean; - } + export interface Socket extends ReadWriteStream { + isTTY?: true; + } - export interface ErrnoException extends Error { - errno?: number; - code?: string; - path?: string; - syscall?: string; - stack?: string; - } + export interface WriteStream extends Socket { + columns?: number; + rows?: number; + } + export interface ReadStream extends Socket { + isRaw?: boolean; + setRawMode?(mode: boolean): void; + } - export class EventEmitter { - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - removeAllListeners(event?: string | symbol): this; - setMaxListeners(n: number): this; - getMaxListeners(): number; - listeners(event: string | symbol): Function[]; - emit(event: string | symbol, ...args: any[]): boolean; - listenerCount(type: string | symbol): number; - // Added in Node 6... - prependListener(event: string | symbol, listener: (...args: any[]) => void): this; - prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; - eventNames(): Array<string | symbol>; - } + export interface Process extends EventEmitter { + stdout: WriteStream; + stderr: WriteStream; + stdin: ReadStream; + openStdin(): Socket; + argv: string[]; + argv0: string; + execArgv: string[]; + execPath: string; + abort(): void; + chdir(directory: string): void; + cwd(): string; + emitWarning(warning: string | Error, name?: string, ctor?: Function): void; + env: any; + exit(code?: number): void; + exitCode: number; + getgid(): number; + setgid(id: number): void; + setgid(id: string): void; + getuid(): number; + setuid(id: number): void; + setuid(id: string): void; + version: string; + versions: ProcessVersions; + config: { + target_defaults: { + cflags: any[]; + default_configuration: string; + defines: string[]; + include_dirs: string[]; + libraries: string[]; + }; + variables: { + clang: number; + host_arch: string; + node_install_npm: boolean; + node_install_waf: boolean; + node_prefix: string; + node_shared_openssl: boolean; + node_shared_v8: boolean; + node_shared_zlib: boolean; + node_use_dtrace: boolean; + node_use_etw: boolean; + node_use_openssl: boolean; + target_arch: string; + v8_no_strict_aliasing: number; + v8_use_snapshot: boolean; + visibility: string; + }; + }; + kill(pid: number, signal?: string | number): void; + pid: number; + title: string; + arch: string; + platform: Platform; + mainModule?: NodeModule; + memoryUsage(): MemoryUsage; + cpuUsage(previousValue?: CpuUsage): CpuUsage; + nextTick(callback: Function, ...args: any[]): void; + umask(mask?: number): number; + uptime(): number; + hrtime(time?: [number, number]): [number, number]; + domain: Domain; - export interface ReadableStream extends EventEmitter { - readable: boolean; - read(size?: number): string | Buffer; - setEncoding(encoding: string): this; - pause(): this; - resume(): this; - isPaused(): boolean; - pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T; - unpipe<T extends WritableStream>(destination?: T): this; - unshift(chunk: string): void; - unshift(chunk: Buffer): void; - wrap(oldStream: ReadableStream): this; - } + // Worker + send?(message: any, sendHandle?: any): void; + disconnect(): void; + connected: boolean; + } - export interface WritableStream extends EventEmitter { - writable: boolean; - write(buffer: Buffer | string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - end(cb?: Function): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - } + export interface Global { + Array: typeof Array; + ArrayBuffer: typeof ArrayBuffer; + Boolean: typeof Boolean; + Buffer: typeof Buffer; + DataView: typeof DataView; + Date: typeof Date; + Error: typeof Error; + EvalError: typeof EvalError; + Float32Array: typeof Float32Array; + Float64Array: typeof Float64Array; + Function: typeof Function; + GLOBAL: Global; + Infinity: typeof Infinity; + Int16Array: typeof Int16Array; + Int32Array: typeof Int32Array; + Int8Array: typeof Int8Array; + Intl: typeof Intl; + JSON: typeof JSON; + Map: MapConstructor; + Math: typeof Math; + NaN: typeof NaN; + Number: typeof Number; + Object: typeof Object; + Promise: Function; + RangeError: typeof RangeError; + ReferenceError: typeof ReferenceError; + RegExp: typeof RegExp; + Set: SetConstructor; + String: typeof String; + Symbol: Function; + SyntaxError: typeof SyntaxError; + TypeError: typeof TypeError; + URIError: typeof URIError; + Uint16Array: typeof Uint16Array; + Uint32Array: typeof Uint32Array; + Uint8Array: typeof Uint8Array; + Uint8ClampedArray: Function; + WeakMap: WeakMapConstructor; + WeakSet: WeakSetConstructor; + clearImmediate: (immediateId: any) => void; + clearInterval: (intervalId: NodeJS.Timer) => void; + clearTimeout: (timeoutId: NodeJS.Timer) => void; + console: typeof console; + decodeURI: typeof decodeURI; + decodeURIComponent: typeof decodeURIComponent; + encodeURI: typeof encodeURI; + encodeURIComponent: typeof encodeURIComponent; + escape: (str: string) => string; + eval: typeof eval; + global: Global; + isFinite: typeof isFinite; + isNaN: typeof isNaN; + parseFloat: typeof parseFloat; + parseInt: typeof parseInt; + process: Process; + root: Global; + setImmediate: (callback: (...args: any[]) => void, ...args: any[]) => any; + setInterval: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; + setTimeout: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; + undefined: typeof undefined; + unescape: (str: string) => string; + gc: () => void; + v8debug?: any; + } - export interface ReadWriteStream extends ReadableStream, WritableStream { } - - export interface Events extends EventEmitter { } - - export interface Domain extends Events { - run(fn: Function): void; - add(emitter: Events): void; - remove(emitter: Events): void; - bind(cb: (err: Error, data: any) => any): any; - intercept(cb: (data: any) => any): any; - dispose(): void; - - addListener(event: string, listener: (...args: any[]) => void): this; - on(event: string, listener: (...args: any[]) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - removeListener(event: string, listener: (...args: any[]) => void): this; - removeAllListeners(event?: string): this; - } - - export interface MemoryUsage { - rss: number; - heapTotal: number; - heapUsed: number; - } - - export interface CpuUsage { - user: number; - system: number; - } - - export interface ProcessVersions { - http_parser: string; - node: string; - v8: string; - ares: string; - uv: string; - zlib: string; - modules: string; - openssl: string; - } - - type Platform = 'aix' - | 'android' - | 'darwin' - | 'freebsd' - | 'linux' - | 'openbsd' - | 'sunos' - | 'win32' - | 'cygwin'; - - type Signals = - "SIGABRT" | "SIGALRM" | "SIGBUS" | "SIGCHLD" | "SIGCONT" | "SIGFPE" | "SIGHUP" | "SIGILL" | "SIGINT" | "SIGIO" | - "SIGIOT" | "SIGKILL" | "SIGPIPE" | "SIGPOLL" | "SIGPROF" | "SIGPWR" | "SIGQUIT" | "SIGSEGV" | "SIGSTKFLT" | - "SIGSTOP" | "SIGSYS" | "SIGTERM" | "SIGTRAP" | "SIGTSTP" | "SIGTTIN" | "SIGTTOU" | "SIGUNUSED" | "SIGURG" | - "SIGUSR1" | "SIGUSR2" | "SIGVTALRM" | "SIGWINCH" | "SIGXCPU" | "SIGXFSZ" | "SIGBREAK" | "SIGLOST" | "SIGINFO"; - - type BeforeExitListener = (code: number) => void; - type DisconnectListener = () => void; - type ExitListener = (code: number) => void; - type RejectionHandledListener = (promise: Promise<any>) => void; - type UncaughtExceptionListener = (error: Error) => void; - type UnhandledRejectionListener = (reason: any, promise: Promise<any>) => void; - type WarningListener = (warning: Error) => void; - type MessageListener = (message: any, sendHandle: any) => void; - type SignalsListener = () => void; - type NewListenerListener = (type: string | symbol, listener: (...args: any[]) => void) => void; - type RemoveListenerListener = (type: string | symbol, listener: (...args: any[]) => void) => void; - - export interface Socket extends ReadWriteStream { - isTTY?: true; - } - - export interface ProcessEnv { - [key: string]: string | undefined; - } - - export interface WriteStream extends Socket { - columns?: number; - rows?: number; - _write(chunk: any, encoding: string, callback: Function): void; - _destroy(err: Error, callback: Function): void; - _final(callback: Function): void; - setDefaultEncoding(encoding: string): this; - cork(): void; - uncork(): void; - destroy(error?: Error): void; - } - export interface ReadStream extends Socket { - isRaw?: boolean; - setRawMode?(mode: boolean): void; - _read(size: number): void; - _destroy(err: Error, callback: Function): void; - push(chunk: any, encoding?: string): boolean; - destroy(error?: Error): void; - } - - export interface Process extends EventEmitter { - stdout: WriteStream; - stderr: WriteStream; - stdin: ReadStream; - openStdin(): Socket; - argv: string[]; - argv0: string; - execArgv: string[]; - execPath: string; - abort(): void; - chdir(directory: string): void; - cwd(): string; - emitWarning(warning: string | Error, name?: string, ctor?: Function): void; - env: ProcessEnv; - exit(code?: number): never; - exitCode: number; - getgid(): number; - setgid(id: number | string): void; - getuid(): number; - setuid(id: number | string): void; - geteuid(): number; - seteuid(id: number | string): void; - getegid(): number; - setegid(id: number | string): void; - getgroups(): number[]; - setgroups(groups: Array<string | number>): void; - version: string; - versions: ProcessVersions; - config: { - target_defaults: { - cflags: any[]; - default_configuration: string; - defines: string[]; - include_dirs: string[]; - libraries: string[]; - }; - variables: { - clang: number; - host_arch: string; - node_install_npm: boolean; - node_install_waf: boolean; - node_prefix: string; - node_shared_openssl: boolean; - node_shared_v8: boolean; - node_shared_zlib: boolean; - node_use_dtrace: boolean; - node_use_etw: boolean; - node_use_openssl: boolean; - target_arch: string; - v8_no_strict_aliasing: number; - v8_use_snapshot: boolean; - visibility: string; - }; - }; - kill(pid: number, signal?: string | number): void; - pid: number; - title: string; - arch: string; - platform: Platform; - mainModule?: NodeModule; - memoryUsage(): MemoryUsage; - cpuUsage(previousValue?: CpuUsage): CpuUsage; - nextTick(callback: Function, ...args: any[]): void; - umask(mask?: number): number; - uptime(): number; - hrtime(time?: [number, number]): [number, number]; - domain: Domain; - - // Worker - send?(message: any, sendHandle?: any): void; - disconnect(): void; - connected: boolean; - - /** - * EventEmitter - * 1. beforeExit - * 2. disconnect - * 3. exit - * 4. message - * 5. rejectionHandled - * 6. uncaughtException - * 7. unhandledRejection - * 8. warning - * 9. message - * 10. <All OS Signals> - * 11. newListener/removeListener inherited from EventEmitter - */ - addListener(event: "beforeExit", listener: BeforeExitListener): this; - addListener(event: "disconnect", listener: DisconnectListener): this; - addListener(event: "exit", listener: ExitListener): this; - addListener(event: "rejectionHandled", listener: RejectionHandledListener): this; - addListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; - addListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - addListener(event: "warning", listener: WarningListener): this; - addListener(event: "message", listener: MessageListener): this; - addListener(event: Signals, listener: SignalsListener): this; - addListener(event: "newListener", listener: NewListenerListener): this; - addListener(event: "removeListener", listener: RemoveListenerListener): this; - - emit(event: "beforeExit", code: number): boolean; - emit(event: "disconnect"): boolean; - emit(event: "exit", code: number): boolean; - emit(event: "rejectionHandled", promise: Promise<any>): boolean; - emit(event: "uncaughtException", error: Error): boolean; - emit(event: "unhandledRejection", reason: any, promise: Promise<any>): boolean; - emit(event: "warning", warning: Error): boolean; - emit(event: "message", message: any, sendHandle: any): this; - emit(event: Signals): boolean; - emit(event: "newListener", eventName: string | symbol, listener: (...args: any[]) => void): this; - emit(event: "removeListener", eventName: string, listener: (...args: any[]) => void): this; - - on(event: "beforeExit", listener: BeforeExitListener): this; - on(event: "disconnect", listener: DisconnectListener): this; - on(event: "exit", listener: ExitListener): this; - on(event: "rejectionHandled", listener: RejectionHandledListener): this; - on(event: "uncaughtException", listener: UncaughtExceptionListener): this; - on(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - on(event: "warning", listener: WarningListener): this; - on(event: "message", listener: MessageListener): this; - on(event: Signals, listener: SignalsListener): this; - on(event: "newListener", listener: NewListenerListener): this; - on(event: "removeListener", listener: RemoveListenerListener): this; - - once(event: "beforeExit", listener: BeforeExitListener): this; - once(event: "disconnect", listener: DisconnectListener): this; - once(event: "exit", listener: ExitListener): this; - once(event: "rejectionHandled", listener: RejectionHandledListener): this; - once(event: "uncaughtException", listener: UncaughtExceptionListener): this; - once(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - once(event: "warning", listener: WarningListener): this; - once(event: "message", listener: MessageListener): this; - once(event: Signals, listener: SignalsListener): this; - once(event: "newListener", listener: NewListenerListener): this; - once(event: "removeListener", listener: RemoveListenerListener): this; - - prependListener(event: "beforeExit", listener: BeforeExitListener): this; - prependListener(event: "disconnect", listener: DisconnectListener): this; - prependListener(event: "exit", listener: ExitListener): this; - prependListener(event: "rejectionHandled", listener: RejectionHandledListener): this; - prependListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; - prependListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - prependListener(event: "warning", listener: WarningListener): this; - prependListener(event: "message", listener: MessageListener): this; - prependListener(event: Signals, listener: SignalsListener): this; - prependListener(event: "newListener", listener: NewListenerListener): this; - prependListener(event: "removeListener", listener: RemoveListenerListener): this; - - prependOnceListener(event: "beforeExit", listener: BeforeExitListener): this; - prependOnceListener(event: "disconnect", listener: DisconnectListener): this; - prependOnceListener(event: "exit", listener: ExitListener): this; - prependOnceListener(event: "rejectionHandled", listener: RejectionHandledListener): this; - prependOnceListener(event: "uncaughtException", listener: UncaughtExceptionListener): this; - prependOnceListener(event: "unhandledRejection", listener: UnhandledRejectionListener): this; - prependOnceListener(event: "warning", listener: WarningListener): this; - prependOnceListener(event: "message", listener: MessageListener): this; - prependOnceListener(event: Signals, listener: SignalsListener): this; - prependOnceListener(event: "newListener", listener: NewListenerListener): this; - prependOnceListener(event: "removeListener", listener: RemoveListenerListener): this; - - listeners(event: "beforeExit"): BeforeExitListener[]; - listeners(event: "disconnect"): DisconnectListener[]; - listeners(event: "exit"): ExitListener[]; - listeners(event: "rejectionHandled"): RejectionHandledListener[]; - listeners(event: "uncaughtException"): UncaughtExceptionListener[]; - listeners(event: "unhandledRejection"): UnhandledRejectionListener[]; - listeners(event: "warning"): WarningListener[]; - listeners(event: "message"): MessageListener[]; - listeners(event: Signals): SignalsListener[]; - listeners(event: "newListener"): NewListenerListener[]; - listeners(event: "removeListener"): RemoveListenerListener[]; - } - - export interface Global { - Array: typeof Array; - ArrayBuffer: typeof ArrayBuffer; - Boolean: typeof Boolean; - Buffer: typeof Buffer; - DataView: typeof DataView; - Date: typeof Date; - Error: typeof Error; - EvalError: typeof EvalError; - Float32Array: typeof Float32Array; - Float64Array: typeof Float64Array; - Function: typeof Function; - GLOBAL: Global; - Infinity: typeof Infinity; - Int16Array: typeof Int16Array; - Int32Array: typeof Int32Array; - Int8Array: typeof Int8Array; - Intl: typeof Intl; - JSON: typeof JSON; - Map: MapConstructor; - Math: typeof Math; - NaN: typeof NaN; - Number: typeof Number; - Object: typeof Object; - Promise: Function; - RangeError: typeof RangeError; - ReferenceError: typeof ReferenceError; - RegExp: typeof RegExp; - Set: SetConstructor; - String: typeof String; - Symbol: Function; - SyntaxError: typeof SyntaxError; - TypeError: typeof TypeError; - URIError: typeof URIError; - Uint16Array: typeof Uint16Array; - Uint32Array: typeof Uint32Array; - Uint8Array: typeof Uint8Array; - Uint8ClampedArray: Function; - WeakMap: WeakMapConstructor; - WeakSet: WeakSetConstructor; - clearImmediate: (immediateId: any) => void; - clearInterval: (intervalId: NodeJS.Timer) => void; - clearTimeout: (timeoutId: NodeJS.Timer) => void; - console: typeof console; - decodeURI: typeof decodeURI; - decodeURIComponent: typeof decodeURIComponent; - encodeURI: typeof encodeURI; - encodeURIComponent: typeof encodeURIComponent; - escape: (str: string) => string; - eval: typeof eval; - global: Global; - isFinite: typeof isFinite; - isNaN: typeof isNaN; - parseFloat: typeof parseFloat; - parseInt: typeof parseInt; - process: Process; - root: Global; - setImmediate: (callback: (...args: any[]) => void, ...args: any[]) => any; - setInterval: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; - setTimeout: (callback: (...args: any[]) => void, ms: number, ...args: any[]) => NodeJS.Timer; - undefined: typeof undefined; - unescape: (str: string) => string; - gc: () => void; - v8debug?: any; - } - - export interface Timer { - ref(): void; - unref(): void; - } - - class Module { - static runMain(): void; - static wrap(code: string): string; - - static Module: typeof Module; - - exports: any; - require: NodeRequireFunction; - id: string; - filename: string; - loaded: boolean; - parent: Module | null; - children: Module[]; - paths: string[]; - - constructor(id: string, parent?: Module); - } + export interface Timer { + ref(): void; + unref(): void; + } } interface IterableIterator<T> { } @@ -814,59 +540,59 @@ interface IterableIterator<T> { } * @deprecated */ interface NodeBuffer extends Uint8Array { - write(string: string, offset?: number, length?: number, encoding?: string): number; - toString(encoding?: string, start?: number, end?: number): string; - toJSON(): { type: 'Buffer', data: any[] }; - equals(otherBuffer: Buffer): boolean; - compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; - copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; - slice(start?: number, end?: number): Buffer; - writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; - readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; - readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; - readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; - readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; - readUInt8(offset: number, noAssert?: boolean): number; - readUInt16LE(offset: number, noAssert?: boolean): number; - readUInt16BE(offset: number, noAssert?: boolean): number; - readUInt32LE(offset: number, noAssert?: boolean): number; - readUInt32BE(offset: number, noAssert?: boolean): number; - readInt8(offset: number, noAssert?: boolean): number; - readInt16LE(offset: number, noAssert?: boolean): number; - readInt16BE(offset: number, noAssert?: boolean): number; - readInt32LE(offset: number, noAssert?: boolean): number; - readInt32BE(offset: number, noAssert?: boolean): number; - readFloatLE(offset: number, noAssert?: boolean): number; - readFloatBE(offset: number, noAssert?: boolean): number; - readDoubleLE(offset: number, noAssert?: boolean): number; - readDoubleBE(offset: number, noAssert?: boolean): number; - swap16(): Buffer; - swap32(): Buffer; - swap64(): Buffer; - writeUInt8(value: number, offset: number, noAssert?: boolean): number; - writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; - writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; - writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; - writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; - writeInt8(value: number, offset: number, noAssert?: boolean): number; - writeInt16LE(value: number, offset: number, noAssert?: boolean): number; - writeInt16BE(value: number, offset: number, noAssert?: boolean): number; - writeInt32LE(value: number, offset: number, noAssert?: boolean): number; - writeInt32BE(value: number, offset: number, noAssert?: boolean): number; - writeFloatLE(value: number, offset: number, noAssert?: boolean): number; - writeFloatBE(value: number, offset: number, noAssert?: boolean): number; - writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; - writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; - fill(value: any, offset?: number, end?: number): this; - indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; - lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; - entries(): IterableIterator<[number, number]>; - includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; - keys(): IterableIterator<number>; - values(): IterableIterator<number>; + write(string: string, offset?: number, length?: number, encoding?: string): number; + toString(encoding?: string, start?: number, end?: number): string; + toJSON(): { type: 'Buffer', data: any[] }; + equals(otherBuffer: Buffer): boolean; + compare(otherBuffer: Buffer, targetStart?: number, targetEnd?: number, sourceStart?: number, sourceEnd?: number): number; + copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number; + slice(start?: number, end?: number): Buffer; + writeUIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeUIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntLE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + writeIntBE(value: number, offset: number, byteLength: number, noAssert?: boolean): number; + readUIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readUIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntLE(offset: number, byteLength: number, noAssert?: boolean): number; + readIntBE(offset: number, byteLength: number, noAssert?: boolean): number; + readUInt8(offset: number, noAssert?: boolean): number; + readUInt16LE(offset: number, noAssert?: boolean): number; + readUInt16BE(offset: number, noAssert?: boolean): number; + readUInt32LE(offset: number, noAssert?: boolean): number; + readUInt32BE(offset: number, noAssert?: boolean): number; + readInt8(offset: number, noAssert?: boolean): number; + readInt16LE(offset: number, noAssert?: boolean): number; + readInt16BE(offset: number, noAssert?: boolean): number; + readInt32LE(offset: number, noAssert?: boolean): number; + readInt32BE(offset: number, noAssert?: boolean): number; + readFloatLE(offset: number, noAssert?: boolean): number; + readFloatBE(offset: number, noAssert?: boolean): number; + readDoubleLE(offset: number, noAssert?: boolean): number; + readDoubleBE(offset: number, noAssert?: boolean): number; + swap16(): Buffer; + swap32(): Buffer; + swap64(): Buffer; + writeUInt8(value: number, offset: number, noAssert?: boolean): number; + writeUInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeUInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeInt8(value: number, offset: number, noAssert?: boolean): number; + writeInt16LE(value: number, offset: number, noAssert?: boolean): number; + writeInt16BE(value: number, offset: number, noAssert?: boolean): number; + writeInt32LE(value: number, offset: number, noAssert?: boolean): number; + writeInt32BE(value: number, offset: number, noAssert?: boolean): number; + writeFloatLE(value: number, offset: number, noAssert?: boolean): number; + writeFloatBE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleLE(value: number, offset: number, noAssert?: boolean): number; + writeDoubleBE(value: number, offset: number, noAssert?: boolean): number; + fill(value: any, offset?: number, end?: number): this; + indexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + lastIndexOf(value: string | number | Buffer, byteOffset?: number, encoding?: string): number; + entries(): IterableIterator<[number, number]>; + includes(value: string | number | Buffer, byteOffset?: number, encoding?: string): boolean; + keys(): IterableIterator<number>; + values(): IterableIterator<number>; } /************************************************ @@ -875,269 +601,205 @@ interface NodeBuffer extends Uint8Array { * * ************************************************/ declare module "buffer" { - export var INSPECT_MAX_BYTES: number; - var BuffType: typeof Buffer; - var SlowBuffType: typeof SlowBuffer; - export { BuffType as Buffer, SlowBuffType as SlowBuffer }; + export var INSPECT_MAX_BYTES: number; + var BuffType: typeof Buffer; + var SlowBuffType: typeof SlowBuffer; + export { BuffType as Buffer, SlowBuffType as SlowBuffer }; } declare module "querystring" { - export interface StringifyOptions { - encodeURIComponent?: Function; - } + export interface StringifyOptions { + encodeURIComponent?: Function; + } - export interface ParseOptions { - maxKeys?: number; - decodeURIComponent?: Function; - } + export interface ParseOptions { + maxKeys?: number; + decodeURIComponent?: Function; + } - interface ParsedUrlQuery { [key: string]: string | string[]; } - - export function stringify<T>(obj: T, sep?: string, eq?: string, options?: StringifyOptions): string; - export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): ParsedUrlQuery; - export function parse<T extends {}>(str: string, sep?: string, eq?: string, options?: ParseOptions): T; - export function escape(str: string): string; - export function unescape(str: string): string; + export function stringify<T>(obj: T, sep?: string, eq?: string, options?: StringifyOptions): string; + export function parse(str: string, sep?: string, eq?: string, options?: ParseOptions): any; + export function parse<T extends {}>(str: string, sep?: string, eq?: string, options?: ParseOptions): T; + export function escape(str: string): string; + export function unescape(str: string): string; } declare module "events" { - class internal extends NodeJS.EventEmitter { } + class internal extends NodeJS.EventEmitter { } - namespace internal { - export class EventEmitter extends internal { - static listenerCount(emitter: EventEmitter, event: string | symbol): number; // deprecated - static defaultMaxListeners: number; + namespace internal { + export class EventEmitter extends internal { + static listenerCount(emitter: EventEmitter, event: string | symbol): number; // deprecated + static defaultMaxListeners: number; - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - prependListener(event: string | symbol, listener: (...args: any[]) => void): this; - prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - removeAllListeners(event?: string | symbol): this; - setMaxListeners(n: number): this; - getMaxListeners(): number; - listeners(event: string | symbol): Function[]; - emit(event: string | symbol, ...args: any[]): boolean; - eventNames(): Array<string | symbol>; - listenerCount(type: string | symbol): number; - } - } + addListener(event: string | symbol, listener: Function): this; + on(event: string | symbol, listener: Function): this; + once(event: string | symbol, listener: Function): this; + prependListener(event: string | symbol, listener: Function): this; + prependOnceListener(event: string | symbol, listener: Function): this; + removeListener(event: string | symbol, listener: Function): this; + removeAllListeners(event?: string | symbol): this; + setMaxListeners(n: number): this; + getMaxListeners(): number; + listeners(event: string | symbol): Function[]; + emit(event: string | symbol, ...args: any[]): boolean; + eventNames(): (string | symbol)[]; + listenerCount(type: string | symbol): number; + } + } - export = internal; + export = internal; } declare module "http" { - import * as events from "events"; - import * as net from "net"; - import * as stream from "stream"; - import { URL } from "url"; + import * as events from "events"; + import * as net from "net"; + import * as stream from "stream"; - // incoming headers will never contain number - export interface IncomingHttpHeaders { - 'accept'?: string; - 'access-control-allow-origin'?: string; - 'access-control-allow-credentials'?: string; - 'access-control-expose-headers'?: string; - 'access-control-max-age'?: string; - 'access-control-allow-methods'?: string; - 'access-control-allow-headers'?: string; - 'accept-patch'?: string; - 'accept-ranges'?: string; - 'age'?: string; - 'allow'?: string; - 'alt-svc'?: string; - 'cache-control'?: string; - 'connection'?: string; - 'content-disposition'?: string; - 'content-encoding'?: string; - 'content-language'?: string; - 'content-length'?: string; - 'content-location'?: string; - 'content-range'?: string; - 'content-type'?: string; - 'date'?: string; - 'expires'?: string; - 'host'?: string; - 'last-modified'?: string; - 'location'?: string; - 'pragma'?: string; - 'proxy-authenticate'?: string; - 'public-key-pins'?: string; - 'retry-after'?: string; - 'set-cookie'?: string[]; - 'strict-transport-security'?: string; - 'trailer'?: string; - 'transfer-encoding'?: string; - 'tk'?: string; - 'upgrade'?: string; - 'vary'?: string; - 'via'?: string; - 'warning'?: string; - 'www-authenticate'?: string; - [header: string]: string | string[] | undefined; - } + export interface RequestOptions { + protocol?: string; + host?: string; + hostname?: string; + family?: number; + port?: number; + localAddress?: string; + socketPath?: string; + method?: string; + path?: string; + headers?: { [key: string]: any }; + auth?: string; + agent?: Agent | boolean; + timeout?: number; + } - // outgoing headers allows numbers (as they are converted internally to strings) - export interface OutgoingHttpHeaders { - [header: string]: number | string | string[] | undefined; - } - - export interface ClientRequestArgs { - protocol?: string; - host?: string; - hostname?: string; - family?: number; - port?: number | string; - defaultPort?: number | string; - localAddress?: string; - socketPath?: string; - method?: string; - path?: string; - headers?: OutgoingHttpHeaders; - auth?: string; - agent?: Agent | boolean; - _defaultAgent?: Agent; - timeout?: number; - // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L278 - createConnection?: (options: ClientRequestArgs, oncreate: (err: Error, socket: net.Socket) => void) => net.Socket; - } - - export class Server extends net.Server { - constructor(requestListener?: (req: IncomingMessage, res: ServerResponse) => void); - - setTimeout(msecs?: number, callback?: () => void): this; - setTimeout(callback: () => void): this; - maxHeadersCount: number; - timeout: number; - keepAliveTimeout: number; - } + export interface Server extends net.Server { + setTimeout(msecs: number, callback: Function): void; + maxHeadersCount: number; + timeout: number; + listening: boolean; + } /** * @deprecated Use IncomingMessage */ - export class ServerRequest extends IncomingMessage { - connection: net.Socket; - } + export interface ServerRequest extends IncomingMessage { + connection: net.Socket; + } + export interface ServerResponse extends stream.Writable { + // Extended base methods + write(buffer: Buffer): boolean; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + write(str: string, encoding?: string, fd?: string): boolean; - // https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js - export class OutgoingMessage extends stream.Writable { - upgrading: boolean; - chunkedEncoding: boolean; - shouldKeepAlive: boolean; - useChunkedEncodingByDefault: boolean; - sendDate: boolean; - finished: boolean; - headersSent: boolean; - connection: net.Socket; + writeContinue(): void; + writeHead(statusCode: number, reasonPhrase?: string, headers?: any): void; + writeHead(statusCode: number, headers?: any): void; + statusCode: number; + statusMessage: string; + headersSent: boolean; + setHeader(name: string, value: string | string[]): void; + setTimeout(msecs: number, callback: Function): ServerResponse; + sendDate: boolean; + getHeader(name: string): string; + removeHeader(name: string): void; + write(chunk: any, encoding?: string): any; + addTrailers(headers: any): void; + finished: boolean; - constructor(); + // Extended base methods + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + end(data?: any, encoding?: string): void; + } + export interface ClientRequest extends stream.Writable { + // Extended base methods + write(buffer: Buffer): boolean; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + write(str: string, encoding?: string, fd?: string): boolean; - setTimeout(msecs: number, callback?: () => void): this; - destroy(error: Error): void; - setHeader(name: string, value: number | string | string[]): void; - getHeader(name: string): number | string | string[] | undefined; - getHeaders(): OutgoingHttpHeaders; - getHeaderNames(): string[]; - hasHeader(name: string): boolean; - removeHeader(name: string): void; - addTrailers(headers: OutgoingHttpHeaders | Array<[string, string]>): void; - flushHeaders(): void; - } + write(chunk: any, encoding?: string): void; + abort(): void; + setTimeout(timeout: number, callback?: Function): void; + setNoDelay(noDelay?: boolean): void; + setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; - // https://github.com/nodejs/node/blob/master/lib/_http_server.js#L108-L256 - export class ServerResponse extends OutgoingMessage { - statusCode: number; - statusMessage: string; + setHeader(name: string, value: string | string[]): void; + getHeader(name: string): string; + removeHeader(name: string): void; + addTrailers(headers: any): void; - constructor(req: IncomingMessage); - - assignSocket(socket: net.Socket): void; - detachSocket(socket: net.Socket): void; - // https://github.com/nodejs/node/blob/master/test/parallel/test-http-write-callbacks.js#L53 - // no args in writeContinue callback - writeContinue(callback?: () => void): void; - writeHead(statusCode: number, reasonPhrase?: string, headers?: OutgoingHttpHeaders): void; - writeHead(statusCode: number, headers?: OutgoingHttpHeaders): void; - } - - // https://github.com/nodejs/node/blob/master/lib/_http_client.js#L77 - export class ClientRequest extends OutgoingMessage { - connection: net.Socket; - socket: net.Socket; - aborted: number; - - constructor(url: string | URL | ClientRequestArgs, cb?: (res: IncomingMessage) => void); - - abort(): void; - onSocket(socket: net.Socket): void; - setTimeout(timeout: number, callback?: () => void): this; - setNoDelay(noDelay?: boolean): void; - setSocketKeepAlive(enable?: boolean, initialDelay?: number): void; - } - - export class IncomingMessage extends stream.Readable { - constructor(socket: net.Socket); - - httpVersion: string; - httpVersionMajor: number; - httpVersionMinor: number; - connection: net.Socket; - headers: IncomingHttpHeaders; - rawHeaders: string[]; - trailers: { [key: string]: string | undefined }; - rawTrailers: string[]; - setTimeout(msecs: number, callback: () => void): this; + // Extended base methods + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + end(data?: any, encoding?: string): void; + } + export interface IncomingMessage extends stream.Readable { + httpVersion: string; + httpVersionMajor: number; + httpVersionMinor: number; + connection: net.Socket; + headers: any; + rawHeaders: string[]; + trailers: any; + rawTrailers: any; + setTimeout(msecs: number, callback: Function): NodeJS.Timer; /** * Only valid for request obtained from http.Server. */ - method?: string; + method?: string; /** * Only valid for request obtained from http.Server. */ - url?: string; + url?: string; /** * Only valid for response obtained from http.ClientRequest. */ - statusCode?: number; + statusCode?: number; /** * Only valid for response obtained from http.ClientRequest. */ - statusMessage?: string; - socket: net.Socket; - destroy(error?: Error): void; - } - + statusMessage?: string; + socket: net.Socket; + destroy(error?: Error): void; + } /** * @deprecated Use IncomingMessage */ - export class ClientResponse extends IncomingMessage { } + export interface ClientResponse extends IncomingMessage { } - export interface AgentOptions { + export interface AgentOptions { /** * Keep sockets around in a pool to be used by other requests in the future. Default = false */ - keepAlive?: boolean; + keepAlive?: boolean; /** * When using HTTP KeepAlive, how often to send TCP KeepAlive packets over sockets being kept alive. Default = 1000. * Only relevant if keepAlive is set to true. */ - keepAliveMsecs?: number; + keepAliveMsecs?: number; /** * Maximum number of sockets to allow per host. Default for Node 0.10 is 5, default for Node 0.12 is Infinity */ - maxSockets?: number; + maxSockets?: number; /** * Maximum number of sockets to leave open in a free state. Only relevant if keepAlive is set to true. Default = 256. */ - maxFreeSockets?: number; - } + maxFreeSockets?: number; + } - export class Agent { - maxSockets: number; - sockets: any; - requests: any; + export class Agent { + maxSockets: number; + sockets: any; + requests: any; - constructor(opts?: AgentOptions); + constructor(opts?: AgentOptions); /** * Destroy any sockets that are currently in use by the agent. @@ -1145,61 +807,62 @@ declare module "http" { * then it is best to explicitly shut down the agent when you know that it will no longer be used. Otherwise, * sockets may hang open for quite a long time before the server terminates them. */ - destroy(): void; - } + destroy(): void; + } - export var METHODS: string[]; + export var METHODS: string[]; - export var STATUS_CODES: { - [errorCode: number]: string | undefined; - [errorCode: string]: string | undefined; - }; - - export function createServer(requestListener?: (request: IncomingMessage, response: ServerResponse) => void): Server; - export function createClient(port?: number, host?: string): any; - - // although RequestOptions are passed as ClientRequestArgs to ClientRequest directly, - // create interface RequestOptions would make the naming more clear to developers - export interface RequestOptions extends ClientRequestArgs { } - export function request(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; - export function get(options: RequestOptions | string | URL, callback?: (res: IncomingMessage) => void): ClientRequest; - export var globalAgent: Agent; + export var STATUS_CODES: { + [errorCode: number]: string; + [errorCode: string]: string; + }; + export function createServer(requestListener?: (request: IncomingMessage, response: ServerResponse) => void): Server; + export function createClient(port?: number, host?: string): any; + export function request(options: RequestOptions, callback?: (res: IncomingMessage) => void): ClientRequest; + export function get(options: any, callback?: (res: IncomingMessage) => void): ClientRequest; + export var globalAgent: Agent; } declare module "cluster" { - import * as child from "child_process"; - import * as events from "events"; - import * as net from "net"; + import * as child from "child_process"; + import * as events from "events"; + import * as net from "net"; - // interfaces - export interface ClusterSettings { - execArgv?: string[]; // default: process.execArgv - exec?: string; - args?: string[]; - silent?: boolean; - stdio?: any[]; - uid?: number; - gid?: number; - inspectPort?: number | (() => number); - } + // interfaces + export interface ClusterSettings { + execArgv?: string[]; // default: process.execArgv + exec?: string; + args?: string[]; + silent?: boolean; + stdio?: any[]; + uid?: number; + gid?: number; + } - export interface Address { - address: string; - port: number; - addressType: number | "udp4" | "udp6"; // 4, 6, -1, "udp4", "udp6" - } + export interface ClusterSetupMasterSettings { + exec?: string; // default: process.argv[1] + args?: string[]; // default: process.argv.slice(2) + silent?: boolean; // default: false + stdio?: any[]; + } - export class Worker extends events.EventEmitter { - id: number; - process: child.ChildProcess; - suicide: boolean; - send(message: any, sendHandle?: any, callback?: (error: Error) => void): boolean; - kill(signal?: string): void; - destroy(signal?: string): void; - disconnect(): void; - isConnected(): boolean; - isDead(): boolean; - exitedAfterDisconnect: boolean; + export interface Address { + address: string; + port: number; + addressType: number | "udp4" | "udp6"; // 4, 6, -1, "udp4", "udp6" + } + + export class Worker extends events.EventEmitter { + id: string; + process: child.ChildProcess; + suicide: boolean; + send(message: any, sendHandle?: any, callback?: (error: Error) => void): boolean; + kill(signal?: string): void; + destroy(signal?: string): void; + disconnect(): void; + isConnected(): boolean; + isDead(): boolean; + exitedAfterDisconnect: boolean; /** * events.EventEmitter @@ -1210,68 +873,68 @@ declare module "cluster" { * 5. message * 6. online */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "disconnect", listener: () => void): this; - addListener(event: "error", listener: (error: Error) => void): this; - addListener(event: "exit", listener: (code: number, signal: string) => void): this; - addListener(event: "listening", listener: (address: Address) => void): this; - addListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - addListener(event: "online", listener: () => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: "exit", listener: (code: number, signal: string) => void): this; + addListener(event: "listening", listener: (address: Address) => void): this; + addListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "disconnect"): boolean; - emit(event: "error", error: Error): boolean; - emit(event: "exit", code: number, signal: string): boolean; - emit(event: "listening", address: Address): boolean; - emit(event: "message", message: any, handle: net.Socket | net.Server): boolean; - emit(event: "online"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect", listener: () => void): boolean + emit(event: "error", listener: (error: Error) => void): boolean + emit(event: "exit", listener: (code: number, signal: string) => void): boolean + emit(event: "listening", listener: (address: Address) => void): boolean + emit(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): boolean + emit(event: "online", listener: () => void): boolean - on(event: string, listener: (...args: any[]) => void): this; - on(event: "disconnect", listener: () => void): this; - on(event: "error", listener: (error: Error) => void): this; - on(event: "exit", listener: (code: number, signal: string) => void): this; - on(event: "listening", listener: (address: Address) => void): this; - on(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - on(event: "online", listener: () => void): this; + on(event: string, listener: Function): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (error: Error) => void): this; + on(event: "exit", listener: (code: number, signal: string) => void): this; + on(event: "listening", listener: (address: Address) => void): this; + on(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: () => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "disconnect", listener: () => void): this; - once(event: "error", listener: (error: Error) => void): this; - once(event: "exit", listener: (code: number, signal: string) => void): this; - once(event: "listening", listener: (address: Address) => void): this; - once(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - once(event: "online", listener: () => void): this; + once(event: string, listener: Function): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (error: Error) => void): this; + once(event: "exit", listener: (code: number, signal: string) => void): this; + once(event: "listening", listener: (address: Address) => void): this; + once(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: () => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "disconnect", listener: () => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; - prependListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependListener(event: "listening", listener: (address: Address) => void): this; - prependListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependListener(event: "online", listener: () => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependListener(event: "listening", listener: (address: Address) => void): this; + prependListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependListener(event: "online", listener: () => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "disconnect", listener: () => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "listening", listener: (address: Address) => void): this; - prependOnceListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependOnceListener(event: "online", listener: () => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "listening", listener: (address: Address) => void): this; + prependOnceListener(event: "message", listener: (message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener(event: "online", listener: () => void): this; + } - export interface Cluster extends events.EventEmitter { - Worker: Worker; - disconnect(callback?: Function): void; - fork(env?: any): Worker; - isMaster: boolean; - isWorker: boolean; - // TODO: cluster.schedulingPolicy - settings: ClusterSettings; - setupMaster(settings?: ClusterSettings): void; - worker?: Worker; - workers?: { - [index: string]: Worker | undefined - }; + export interface Cluster extends events.EventEmitter { + Worker: Worker; + disconnect(callback?: Function): void; + fork(env?: any): Worker; + isMaster: boolean; + isWorker: boolean; + // TODO: cluster.schedulingPolicy + settings: ClusterSettings; + setupMaster(settings?: ClusterSetupMasterSettings): void; + worker: Worker; + workers: { + [index: string]: Worker + }; /** * events.EventEmitter @@ -1283,72 +946,73 @@ declare module "cluster" { * 6. online * 7. setup */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "disconnect", listener: (worker: Worker) => void): this; - addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - addListener(event: "fork", listener: (worker: Worker) => void): this; - addListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - addListener(event: "online", listener: (worker: Worker) => void): this; - addListener(event: "setup", listener: (settings: any) => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "disconnect", listener: (worker: Worker) => void): this; + addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + addListener(event: "fork", listener: (worker: Worker) => void): this; + addListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + addListener(event: "online", listener: (worker: Worker) => void): this; + addListener(event: "setup", listener: (settings: any) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "disconnect", worker: Worker): boolean; - emit(event: "exit", worker: Worker, code: number, signal: string): boolean; - emit(event: "fork", worker: Worker): boolean; - emit(event: "listening", worker: Worker, address: Address): boolean; - emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; - emit(event: "online", worker: Worker): boolean; - emit(event: "setup", settings: any): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "disconnect", listener: (worker: Worker) => void): boolean; + emit(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): boolean; + emit(event: "fork", listener: (worker: Worker) => void): boolean; + emit(event: "listening", listener: (worker: Worker, address: Address) => void): boolean; + emit(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): boolean; + emit(event: "online", listener: (worker: Worker) => void): boolean; + emit(event: "setup", listener: (settings: any) => void): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "disconnect", listener: (worker: Worker) => void): this; - on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - on(event: "fork", listener: (worker: Worker) => void): this; - on(event: "listening", listener: (worker: Worker, address: Address) => void): this; - on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - on(event: "online", listener: (worker: Worker) => void): this; - on(event: "setup", listener: (settings: any) => void): this; + on(event: string, listener: Function): this; + on(event: "disconnect", listener: (worker: Worker) => void): this; + on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + on(event: "fork", listener: (worker: Worker) => void): this; + on(event: "listening", listener: (worker: Worker, address: Address) => void): this; + on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + on(event: "online", listener: (worker: Worker) => void): this; + on(event: "setup", listener: (settings: any) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "disconnect", listener: (worker: Worker) => void): this; - once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - once(event: "fork", listener: (worker: Worker) => void): this; - once(event: "listening", listener: (worker: Worker, address: Address) => void): this; - once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - once(event: "online", listener: (worker: Worker) => void): this; - once(event: "setup", listener: (settings: any) => void): this; + once(event: string, listener: Function): this; + once(event: "disconnect", listener: (worker: Worker) => void): this; + once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + once(event: "fork", listener: (worker: Worker) => void): this; + once(event: "listening", listener: (worker: Worker, address: Address) => void): this; + once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + once(event: "online", listener: (worker: Worker) => void): this; + once(event: "setup", listener: (settings: any) => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "disconnect", listener: (worker: Worker) => void): this; - prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - prependListener(event: "fork", listener: (worker: Worker) => void): this; - prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependListener(event: "online", listener: (worker: Worker) => void): this; - prependListener(event: "setup", listener: (settings: any) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependListener(event: "fork", listener: (worker: Worker) => void): this; + prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependListener(event: "online", listener: (worker: Worker) => void): this; + prependListener(event: "setup", listener: (settings: any) => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): this; - prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; - prependOnceListener(event: "fork", listener: (worker: Worker) => void): this; - prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; - prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. - prependOnceListener(event: "online", listener: (worker: Worker) => void): this; - prependOnceListener(event: "setup", listener: (settings: any) => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): this; + prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): this; + prependOnceListener(event: "fork", listener: (worker: Worker) => void): this; + prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): this; + prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): this; // the handle is a net.Socket or net.Server object, or undefined. + prependOnceListener(event: "online", listener: (worker: Worker) => void): this; + prependOnceListener(event: "setup", listener: (settings: any) => void): this; - export function disconnect(callback?: Function): void; - export function fork(env?: any): Worker; - export var isMaster: boolean; - export var isWorker: boolean; - // TODO: cluster.schedulingPolicy - export var settings: ClusterSettings; - export function setupMaster(settings?: ClusterSettings): void; - export var worker: Worker; - export var workers: { - [index: string]: Worker | undefined - }; + } + + export function disconnect(callback?: Function): void; + export function fork(env?: any): Worker; + export var isMaster: boolean; + export var isWorker: boolean; + // TODO: cluster.schedulingPolicy + export var settings: ClusterSettings; + export function setupMaster(settings?: ClusterSetupMasterSettings): void; + export var worker: Worker; + export var workers: { + [index: string]: Worker + }; /** * events.EventEmitter @@ -1360,520 +1024,499 @@ declare module "cluster" { * 6. online * 7. setup */ - export function addListener(event: string, listener: (...args: any[]) => void): Cluster; - export function addListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function addListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function addListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function addListener(event: "setup", listener: (settings: any) => void): Cluster; + export function addListener(event: string, listener: Function): Cluster; + export function addListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function addListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function addListener(event: "fork", listener: (worker: Worker) => void): Cluster; + export function addListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function addListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function addListener(event: "online", listener: (worker: Worker) => void): Cluster; + export function addListener(event: "setup", listener: (settings: any) => void): Cluster; - export function emit(event: string | symbol, ...args: any[]): boolean; - export function emit(event: "disconnect", worker: Worker): boolean; - export function emit(event: "exit", worker: Worker, code: number, signal: string): boolean; - export function emit(event: "fork", worker: Worker): boolean; - export function emit(event: "listening", worker: Worker, address: Address): boolean; - export function emit(event: "message", worker: Worker, message: any, handle: net.Socket | net.Server): boolean; - export function emit(event: "online", worker: Worker): boolean; - export function emit(event: "setup", settings: any): boolean; + export function emit(event: string | symbol, ...args: any[]): boolean; + export function emit(event: "disconnect", listener: (worker: Worker) => void): boolean; + export function emit(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): boolean; + export function emit(event: "fork", listener: (worker: Worker) => void): boolean; + export function emit(event: "listening", listener: (worker: Worker, address: Address) => void): boolean; + export function emit(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): boolean; + export function emit(event: "online", listener: (worker: Worker) => void): boolean; + export function emit(event: "setup", listener: (settings: any) => void): boolean; - export function on(event: string, listener: (...args: any[]) => void): Cluster; - export function on(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function on(event: "fork", listener: (worker: Worker) => void): Cluster; - export function on(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function on(event: "online", listener: (worker: Worker) => void): Cluster; - export function on(event: "setup", listener: (settings: any) => void): Cluster; + export function on(event: string, listener: Function): Cluster; + export function on(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function on(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function on(event: "fork", listener: (worker: Worker) => void): Cluster; + export function on(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function on(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function on(event: "online", listener: (worker: Worker) => void): Cluster; + export function on(event: "setup", listener: (settings: any) => void): Cluster; - export function once(event: string, listener: (...args: any[]) => void): Cluster; - export function once(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function once(event: "fork", listener: (worker: Worker) => void): Cluster; - export function once(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function once(event: "online", listener: (worker: Worker) => void): Cluster; - export function once(event: "setup", listener: (settings: any) => void): Cluster; + export function once(event: string, listener: Function): Cluster; + export function once(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function once(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function once(event: "fork", listener: (worker: Worker) => void): Cluster; + export function once(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function once(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function once(event: "online", listener: (worker: Worker) => void): Cluster; + export function once(event: "setup", listener: (settings: any) => void): Cluster; - export function removeListener(event: string, listener: (...args: any[]) => void): Cluster; - export function removeAllListeners(event?: string): Cluster; - export function setMaxListeners(n: number): Cluster; - export function getMaxListeners(): number; - export function listeners(event: string): Function[]; - export function listenerCount(type: string): number; + export function removeListener(event: string, listener: Function): Cluster; + export function removeAllListeners(event?: string): Cluster; + export function setMaxListeners(n: number): Cluster; + export function getMaxListeners(): number; + export function listeners(event: string): Function[]; + export function listenerCount(type: string): number; - export function prependListener(event: string, listener: (...args: any[]) => void): Cluster; - export function prependListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function prependListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function prependListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function prependListener(event: "setup", listener: (settings: any) => void): Cluster; + export function prependListener(event: string, listener: Function): Cluster; + export function prependListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function prependListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function prependListener(event: "fork", listener: (worker: Worker) => void): Cluster; + export function prependListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function prependListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function prependListener(event: "online", listener: (worker: Worker) => void): Cluster; + export function prependListener(event: "setup", listener: (settings: any) => void): Cluster; - export function prependOnceListener(event: string, listener: (...args: any[]) => void): Cluster; - export function prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; - export function prependOnceListener(event: "fork", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; - export function prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. - export function prependOnceListener(event: "online", listener: (worker: Worker) => void): Cluster; - export function prependOnceListener(event: "setup", listener: (settings: any) => void): Cluster; + export function prependOnceListener(event: string, listener: Function): Cluster; + export function prependOnceListener(event: "disconnect", listener: (worker: Worker) => void): Cluster; + export function prependOnceListener(event: "exit", listener: (worker: Worker, code: number, signal: string) => void): Cluster; + export function prependOnceListener(event: "fork", listener: (worker: Worker) => void): Cluster; + export function prependOnceListener(event: "listening", listener: (worker: Worker, address: Address) => void): Cluster; + export function prependOnceListener(event: "message", listener: (worker: Worker, message: any, handle: net.Socket | net.Server) => void): Cluster; // the handle is a net.Socket or net.Server object, or undefined. + export function prependOnceListener(event: "online", listener: (worker: Worker) => void): Cluster; + export function prependOnceListener(event: "setup", listener: (settings: any) => void): Cluster; - export function eventNames(): string[]; + export function eventNames(): string[]; } declare module "zlib" { - import * as stream from "stream"; + import * as stream from "stream"; - export interface ZlibOptions { - flush?: number; // default: zlib.constants.Z_NO_FLUSH - finishFlush?: number; // default: zlib.constants.Z_FINISH - chunkSize?: number; // default: 16*1024 - windowBits?: number; - level?: number; // compression only - memLevel?: number; // compression only - strategy?: number; // compression only - dictionary?: any; // deflate/inflate only, empty dictionary by default - } + export interface ZlibOptions { + flush?: number; // default: zlib.constants.Z_NO_FLUSH + finishFlush?: number; // default: zlib.constants.Z_FINISH + chunkSize?: number; // default: 16*1024 + windowBits?: number; + level?: number; // compression only + memLevel?: number; // compression only + strategy?: number; // compression only + dictionary?: any; // deflate/inflate only, empty dictionary by default + } - export interface Zlib { - readonly bytesRead: number; - close(callback?: () => void): void; - flush(kind?: number | (() => void), callback?: () => void): void; - } + export interface Gzip extends stream.Transform { } + export interface Gunzip extends stream.Transform { } + export interface Deflate extends stream.Transform { } + export interface Inflate extends stream.Transform { } + export interface DeflateRaw extends stream.Transform { } + export interface InflateRaw extends stream.Transform { } + export interface Unzip extends stream.Transform { } - export interface ZlibParams { - params(level: number, strategy: number, callback: () => void): void; - } + export function createGzip(options?: ZlibOptions): Gzip; + export function createGunzip(options?: ZlibOptions): Gunzip; + export function createDeflate(options?: ZlibOptions): Deflate; + export function createInflate(options?: ZlibOptions): Inflate; + export function createDeflateRaw(options?: ZlibOptions): DeflateRaw; + export function createInflateRaw(options?: ZlibOptions): InflateRaw; + export function createUnzip(options?: ZlibOptions): Unzip; - export interface ZlibReset { - reset(): void; - } + export function deflate(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; + export function deflate(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; + export function deflateSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + export function deflateRaw(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; + export function deflateRaw(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; + export function deflateRawSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + export function gzip(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; + export function gzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; + export function gzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + export function gunzip(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; + export function gunzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; + export function gunzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + export function inflate(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; + export function inflate(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; + export function inflateSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + export function inflateRaw(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; + export function inflateRaw(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; + export function inflateRawSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + export function unzip(buf: Buffer | string, callback: (error: Error, result: Buffer) => void): void; + export function unzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error, result: Buffer) => void): void; + export function unzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export interface Gzip extends stream.Transform, Zlib { } - export interface Gunzip extends stream.Transform, Zlib { } - export interface Deflate extends stream.Transform, Zlib, ZlibReset, ZlibParams { } - export interface Inflate extends stream.Transform, Zlib, ZlibReset { } - export interface DeflateRaw extends stream.Transform, Zlib, ZlibReset, ZlibParams { } - export interface InflateRaw extends stream.Transform, Zlib, ZlibReset { } - export interface Unzip extends stream.Transform, Zlib { } + export namespace constants { + // Allowed flush values. - export function createGzip(options?: ZlibOptions): Gzip; - export function createGunzip(options?: ZlibOptions): Gunzip; - export function createDeflate(options?: ZlibOptions): Deflate; - export function createInflate(options?: ZlibOptions): Inflate; - export function createDeflateRaw(options?: ZlibOptions): DeflateRaw; - export function createInflateRaw(options?: ZlibOptions): InflateRaw; - export function createUnzip(options?: ZlibOptions): Unzip; + export const Z_NO_FLUSH: number; + export const Z_PARTIAL_FLUSH: number; + export const Z_SYNC_FLUSH: number; + export const Z_FULL_FLUSH: number; + export const Z_FINISH: number; + export const Z_BLOCK: number; + export const Z_TREES: number; - export function deflate(buf: Buffer | string, callback: (error: Error | null, result: Buffer) => void): void; - export function deflate(buf: Buffer | string, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function deflateSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function deflateRaw(buf: Buffer | string, callback: (error: Error | null, result: Buffer) => void): void; - export function deflateRaw(buf: Buffer | string, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function deflateRawSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function gzip(buf: Buffer | string, callback: (error: Error | null, result: Buffer) => void): void; - export function gzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function gzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function gunzip(buf: Buffer | string, callback: (error: Error | null, result: Buffer) => void): void; - export function gunzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function gunzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function inflate(buf: Buffer | string, callback: (error: Error | null, result: Buffer) => void): void; - export function inflate(buf: Buffer | string, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function inflateSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function inflateRaw(buf: Buffer | string, callback: (error: Error | null, result: Buffer) => void): void; - export function inflateRaw(buf: Buffer | string, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function inflateRawSync(buf: Buffer | string, options?: ZlibOptions): Buffer; - export function unzip(buf: Buffer | string, callback: (error: Error | null, result: Buffer) => void): void; - export function unzip(buf: Buffer | string, options: ZlibOptions, callback: (error: Error | null, result: Buffer) => void): void; - export function unzipSync(buf: Buffer | string, options?: ZlibOptions): Buffer; + // Return codes for the compression/decompression functions. Negative values are errors, positive values are used for special but normal events. - export namespace constants { - // Allowed flush values. + export const Z_OK: number; + export const Z_STREAM_END: number; + export const Z_NEED_DICT: number; + export const Z_ERRNO: number; + export const Z_STREAM_ERROR: number; + export const Z_DATA_ERROR: number; + export const Z_MEM_ERROR: number; + export const Z_BUF_ERROR: number; + export const Z_VERSION_ERROR: number; - export const Z_NO_FLUSH: number; - export const Z_PARTIAL_FLUSH: number; - export const Z_SYNC_FLUSH: number; - export const Z_FULL_FLUSH: number; - export const Z_FINISH: number; - export const Z_BLOCK: number; - export const Z_TREES: number; + // Compression levels. - // Return codes for the compression/decompression functions. Negative values are errors, positive values are used for special but normal events. + export const Z_NO_COMPRESSION: number; + export const Z_BEST_SPEED: number; + export const Z_BEST_COMPRESSION: number; + export const Z_DEFAULT_COMPRESSION: number; - export const Z_OK: number; - export const Z_STREAM_END: number; - export const Z_NEED_DICT: number; - export const Z_ERRNO: number; - export const Z_STREAM_ERROR: number; - export const Z_DATA_ERROR: number; - export const Z_MEM_ERROR: number; - export const Z_BUF_ERROR: number; - export const Z_VERSION_ERROR: number; + // Compression strategy. - // Compression levels. + export const Z_FILTERED: number; + export const Z_HUFFMAN_ONLY: number; + export const Z_RLE: number; + export const Z_FIXED: number; + export const Z_DEFAULT_STRATEGY: number; + } - export const Z_NO_COMPRESSION: number; - export const Z_BEST_SPEED: number; - export const Z_BEST_COMPRESSION: number; - export const Z_DEFAULT_COMPRESSION: number; - - // Compression strategy. - - export const Z_FILTERED: number; - export const Z_HUFFMAN_ONLY: number; - export const Z_RLE: number; - export const Z_FIXED: number; - export const Z_DEFAULT_STRATEGY: number; - } - - // Constants - export var Z_NO_FLUSH: number; - export var Z_PARTIAL_FLUSH: number; - export var Z_SYNC_FLUSH: number; - export var Z_FULL_FLUSH: number; - export var Z_FINISH: number; - export var Z_BLOCK: number; - export var Z_TREES: number; - export var Z_OK: number; - export var Z_STREAM_END: number; - export var Z_NEED_DICT: number; - export var Z_ERRNO: number; - export var Z_STREAM_ERROR: number; - export var Z_DATA_ERROR: number; - export var Z_MEM_ERROR: number; - export var Z_BUF_ERROR: number; - export var Z_VERSION_ERROR: number; - export var Z_NO_COMPRESSION: number; - export var Z_BEST_SPEED: number; - export var Z_BEST_COMPRESSION: number; - export var Z_DEFAULT_COMPRESSION: number; - export var Z_FILTERED: number; - export var Z_HUFFMAN_ONLY: number; - export var Z_RLE: number; - export var Z_FIXED: number; - export var Z_DEFAULT_STRATEGY: number; - export var Z_BINARY: number; - export var Z_TEXT: number; - export var Z_ASCII: number; - export var Z_UNKNOWN: number; - export var Z_DEFLATED: number; + // Constants + export var Z_NO_FLUSH: number; + export var Z_PARTIAL_FLUSH: number; + export var Z_SYNC_FLUSH: number; + export var Z_FULL_FLUSH: number; + export var Z_FINISH: number; + export var Z_BLOCK: number; + export var Z_TREES: number; + export var Z_OK: number; + export var Z_STREAM_END: number; + export var Z_NEED_DICT: number; + export var Z_ERRNO: number; + export var Z_STREAM_ERROR: number; + export var Z_DATA_ERROR: number; + export var Z_MEM_ERROR: number; + export var Z_BUF_ERROR: number; + export var Z_VERSION_ERROR: number; + export var Z_NO_COMPRESSION: number; + export var Z_BEST_SPEED: number; + export var Z_BEST_COMPRESSION: number; + export var Z_DEFAULT_COMPRESSION: number; + export var Z_FILTERED: number; + export var Z_HUFFMAN_ONLY: number; + export var Z_RLE: number; + export var Z_FIXED: number; + export var Z_DEFAULT_STRATEGY: number; + export var Z_BINARY: number; + export var Z_TEXT: number; + export var Z_ASCII: number; + export var Z_UNKNOWN: number; + export var Z_DEFLATED: number; } declare module "os" { - export interface CpuInfo { - model: string; - speed: number; - times: { - user: number; - nice: number; - sys: number; - idle: number; - irq: number; - }; - } + export interface CpuInfo { + model: string; + speed: number; + times: { + user: number; + nice: number; + sys: number; + idle: number; + irq: number; + }; + } - export interface NetworkInterfaceBase { - address: string; - netmask: string; - mac: string; - internal: boolean; - } + export interface NetworkInterfaceInfo { + address: string; + netmask: string; + family: string; + mac: string; + internal: boolean; + } - export interface NetworkInterfaceInfoIPv4 extends NetworkInterfaceBase { - family: "IPv4"; - } - - export interface NetworkInterfaceInfoIPv6 extends NetworkInterfaceBase { - family: "IPv6"; - scopeid: number; - } - - export type NetworkInterfaceInfo = NetworkInterfaceInfoIPv4 | NetworkInterfaceInfoIPv6; - - export function hostname(): string; - export function loadavg(): number[]; - export function uptime(): number; - export function freemem(): number; - export function totalmem(): number; - export function cpus(): CpuInfo[]; - export function type(): string; - export function release(): string; - export function networkInterfaces(): { [index: string]: NetworkInterfaceInfo[] }; - export function homedir(): string; - export function userInfo(options?: { encoding: string }): { username: string, uid: number, gid: number, shell: any, homedir: string }; - export var constants: { - UV_UDP_REUSEADDR: number, - signals: { - SIGHUP: number; - SIGINT: number; - SIGQUIT: number; - SIGILL: number; - SIGTRAP: number; - SIGABRT: number; - SIGIOT: number; - SIGBUS: number; - SIGFPE: number; - SIGKILL: number; - SIGUSR1: number; - SIGSEGV: number; - SIGUSR2: number; - SIGPIPE: number; - SIGALRM: number; - SIGTERM: number; - SIGCHLD: number; - SIGSTKFLT: number; - SIGCONT: number; - SIGSTOP: number; - SIGTSTP: number; - SIGTTIN: number; - SIGTTOU: number; - SIGURG: number; - SIGXCPU: number; - SIGXFSZ: number; - SIGVTALRM: number; - SIGPROF: number; - SIGWINCH: number; - SIGIO: number; - SIGPOLL: number; - SIGPWR: number; - SIGSYS: number; - SIGUNUSED: number; - }, - errno: { - E2BIG: number; - EACCES: number; - EADDRINUSE: number; - EADDRNOTAVAIL: number; - EAFNOSUPPORT: number; - EAGAIN: number; - EALREADY: number; - EBADF: number; - EBADMSG: number; - EBUSY: number; - ECANCELED: number; - ECHILD: number; - ECONNABORTED: number; - ECONNREFUSED: number; - ECONNRESET: number; - EDEADLK: number; - EDESTADDRREQ: number; - EDOM: number; - EDQUOT: number; - EEXIST: number; - EFAULT: number; - EFBIG: number; - EHOSTUNREACH: number; - EIDRM: number; - EILSEQ: number; - EINPROGRESS: number; - EINTR: number; - EINVAL: number; - EIO: number; - EISCONN: number; - EISDIR: number; - ELOOP: number; - EMFILE: number; - EMLINK: number; - EMSGSIZE: number; - EMULTIHOP: number; - ENAMETOOLONG: number; - ENETDOWN: number; - ENETRESET: number; - ENETUNREACH: number; - ENFILE: number; - ENOBUFS: number; - ENODATA: number; - ENODEV: number; - ENOENT: number; - ENOEXEC: number; - ENOLCK: number; - ENOLINK: number; - ENOMEM: number; - ENOMSG: number; - ENOPROTOOPT: number; - ENOSPC: number; - ENOSR: number; - ENOSTR: number; - ENOSYS: number; - ENOTCONN: number; - ENOTDIR: number; - ENOTEMPTY: number; - ENOTSOCK: number; - ENOTSUP: number; - ENOTTY: number; - ENXIO: number; - EOPNOTSUPP: number; - EOVERFLOW: number; - EPERM: number; - EPIPE: number; - EPROTO: number; - EPROTONOSUPPORT: number; - EPROTOTYPE: number; - ERANGE: number; - EROFS: number; - ESPIPE: number; - ESRCH: number; - ESTALE: number; - ETIME: number; - ETIMEDOUT: number; - ETXTBSY: number; - EWOULDBLOCK: number; - EXDEV: number; - }, - }; - export function arch(): string; - export function platform(): NodeJS.Platform; - export function tmpdir(): string; - export const EOL: string; - export function endianness(): "BE" | "LE"; + export function hostname(): string; + export function loadavg(): number[]; + export function uptime(): number; + export function freemem(): number; + export function totalmem(): number; + export function cpus(): CpuInfo[]; + export function type(): string; + export function release(): string; + export function networkInterfaces(): { [index: string]: NetworkInterfaceInfo[] }; + export function homedir(): string; + export function userInfo(options?: { encoding: string }): { username: string, uid: number, gid: number, shell: any, homedir: string } + export var constants: { + UV_UDP_REUSEADDR: number, + signals: { + SIGHUP: number; + SIGINT: number; + SIGQUIT: number; + SIGILL: number; + SIGTRAP: number; + SIGABRT: number; + SIGIOT: number; + SIGBUS: number; + SIGFPE: number; + SIGKILL: number; + SIGUSR1: number; + SIGSEGV: number; + SIGUSR2: number; + SIGPIPE: number; + SIGALRM: number; + SIGTERM: number; + SIGCHLD: number; + SIGSTKFLT: number; + SIGCONT: number; + SIGSTOP: number; + SIGTSTP: number; + SIGTTIN: number; + SIGTTOU: number; + SIGURG: number; + SIGXCPU: number; + SIGXFSZ: number; + SIGVTALRM: number; + SIGPROF: number; + SIGWINCH: number; + SIGIO: number; + SIGPOLL: number; + SIGPWR: number; + SIGSYS: number; + SIGUNUSED: number; + }, + errno: { + E2BIG: number; + EACCES: number; + EADDRINUSE: number; + EADDRNOTAVAIL: number; + EAFNOSUPPORT: number; + EAGAIN: number; + EALREADY: number; + EBADF: number; + EBADMSG: number; + EBUSY: number; + ECANCELED: number; + ECHILD: number; + ECONNABORTED: number; + ECONNREFUSED: number; + ECONNRESET: number; + EDEADLK: number; + EDESTADDRREQ: number; + EDOM: number; + EDQUOT: number; + EEXIST: number; + EFAULT: number; + EFBIG: number; + EHOSTUNREACH: number; + EIDRM: number; + EILSEQ: number; + EINPROGRESS: number; + EINTR: number; + EINVAL: number; + EIO: number; + EISCONN: number; + EISDIR: number; + ELOOP: number; + EMFILE: number; + EMLINK: number; + EMSGSIZE: number; + EMULTIHOP: number; + ENAMETOOLONG: number; + ENETDOWN: number; + ENETRESET: number; + ENETUNREACH: number; + ENFILE: number; + ENOBUFS: number; + ENODATA: number; + ENODEV: number; + ENOENT: number; + ENOEXEC: number; + ENOLCK: number; + ENOLINK: number; + ENOMEM: number; + ENOMSG: number; + ENOPROTOOPT: number; + ENOSPC: number; + ENOSR: number; + ENOSTR: number; + ENOSYS: number; + ENOTCONN: number; + ENOTDIR: number; + ENOTEMPTY: number; + ENOTSOCK: number; + ENOTSUP: number; + ENOTTY: number; + ENXIO: number; + EOPNOTSUPP: number; + EOVERFLOW: number; + EPERM: number; + EPIPE: number; + EPROTO: number; + EPROTONOSUPPORT: number; + EPROTOTYPE: number; + ERANGE: number; + EROFS: number; + ESPIPE: number; + ESRCH: number; + ESTALE: number; + ETIME: number; + ETIMEDOUT: number; + ETXTBSY: number; + EWOULDBLOCK: number; + EXDEV: number; + }, + }; + export function arch(): string; + export function platform(): NodeJS.Platform; + export function tmpdir(): string; + export var EOL: string; + export function endianness(): "BE" | "LE"; } declare module "https" { - import * as tls from "tls"; - import * as events from "events"; - import * as http from "http"; - import { URL } from "url"; + import * as tls from "tls"; + import * as events from "events"; + import * as http from "http"; - export type ServerOptions = tls.SecureContextOptions & tls.TlsOptions; + export interface ServerOptions { + pfx?: any; + key?: any; + passphrase?: string; + cert?: any; + ca?: any; + crl?: any; + ciphers?: string; + honorCipherOrder?: boolean; + requestCert?: boolean; + rejectUnauthorized?: boolean; + NPNProtocols?: any; + SNICallback?: (servername: string, cb: (err: Error, ctx: tls.SecureContext) => any) => any; + } - // see https://nodejs.org/docs/latest-v8.x/api/https.html#https_https_request_options_callback - type extendedRequestKeys = "pfx" | - "key" | - "passphrase" | - "cert" | - "ca" | - "ciphers" | - "rejectUnauthorized" | - "secureProtocol" | - "servername"; + export interface RequestOptions extends http.RequestOptions { + pfx?: any; + key?: any; + passphrase?: string; + cert?: any; + ca?: any; + ciphers?: string; + rejectUnauthorized?: boolean; + secureProtocol?: string; + } - export type RequestOptions = http.RequestOptions & Pick<tls.ConnectionOptions, extendedRequestKeys>; + export interface Agent extends http.Agent { } - export interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions { - rejectUnauthorized?: boolean; - maxCachedSessions?: number; - } + export interface AgentOptions extends http.AgentOptions { + pfx?: any; + key?: any; + passphrase?: string; + cert?: any; + ca?: any; + ciphers?: string; + rejectUnauthorized?: boolean; + secureProtocol?: string; + maxCachedSessions?: number; + } - export class Agent extends http.Agent { - constructor(options?: AgentOptions); - } - - export class Server extends tls.Server { - setTimeout(callback: () => void): this; - setTimeout(msecs?: number, callback?: () => void): this; - timeout: number; - keepAliveTimeout: number; - } - - export function createServer(options: ServerOptions, requestListener?: (req: http.IncomingMessage, res: http.ServerResponse) => void): Server; - export function request(options: RequestOptions | string | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; - export function get(options: RequestOptions | string | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; - export var globalAgent: Agent; + export var Agent: { + new(options?: AgentOptions): Agent; + }; + export interface Server extends tls.Server { } + export function createServer(options: ServerOptions, requestListener?: Function): Server; + export function request(options: RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; + export function get(options: RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest; + export var globalAgent: Agent; } declare module "punycode" { - export function decode(string: string): string; - export function encode(string: string): string; - export function toUnicode(domain: string): string; - export function toASCII(domain: string): string; - export var ucs2: ucs2; - interface ucs2 { - decode(string: string): number[]; - encode(codePoints: number[]): string; - } - export var version: any; + export function decode(string: string): string; + export function encode(string: string): string; + export function toUnicode(domain: string): string; + export function toASCII(domain: string): string; + export var ucs2: ucs2; + interface ucs2 { + decode(string: string): number[]; + encode(codePoints: number[]): string; + } + export var version: any; } declare module "repl" { - import * as stream from "stream"; - import * as readline from "readline"; + import * as stream from "stream"; + import * as readline from "readline"; - export interface ReplOptions { - prompt?: string; - input?: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - terminal?: boolean; - eval?: Function; - useColors?: boolean; - useGlobal?: boolean; - ignoreUndefined?: boolean; - writer?: Function; - completer?: Function; - replMode?: any; - breakEvalOnSigint?: any; - } + export interface ReplOptions { + prompt?: string; + input?: NodeJS.ReadableStream; + output?: NodeJS.WritableStream; + terminal?: boolean; + eval?: Function; + useColors?: boolean; + useGlobal?: boolean; + ignoreUndefined?: boolean; + writer?: Function; + completer?: Function; + replMode?: any; + breakEvalOnSigint?: any; + } - export interface REPLServer extends readline.ReadLine { - context: any; - inputStream: NodeJS.ReadableStream; - outputStream: NodeJS.WritableStream; - - defineCommand(keyword: string, cmd: Function | { help: string, action: Function }): void; - displayPrompt(preserveCursor?: boolean): void; + export interface REPLServer extends readline.ReadLine { + context: any; + defineCommand(keyword: string, cmd: Function | { help: string, action: Function }): void; + displayPrompt(preserveCursor?: boolean): void; /** * events.EventEmitter * 1. exit * 2. reset - */ + **/ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "exit", listener: () => void): this; - addListener(event: "reset", listener: (...args: any[]) => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "exit", listener: () => void): this; + addListener(event: "reset", listener: Function): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "exit"): boolean; - emit(event: "reset", context: any): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "exit"): boolean; + emit(event: "reset", context: any): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "exit", listener: () => void): this; - on(event: "reset", listener: (...args: any[]) => void): this; + on(event: string, listener: Function): this; + on(event: "exit", listener: () => void): this; + on(event: "reset", listener: Function): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "exit", listener: () => void): this; - once(event: "reset", listener: (...args: any[]) => void): this; + once(event: string, listener: Function): this; + once(event: "exit", listener: () => void): this; + once(event: "reset", listener: Function): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "exit", listener: () => void): this; - prependListener(event: "reset", listener: (...args: any[]) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "exit", listener: () => void): this; + prependListener(event: "reset", listener: Function): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "exit", listener: () => void): this; - prependOnceListener(event: "reset", listener: (...args: any[]) => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "exit", listener: () => void): this; + prependOnceListener(event: "reset", listener: Function): this; + } - export function start(options?: string | ReplOptions): REPLServer; - - export class Recoverable extends SyntaxError { - err: Error; - - constructor(err: Error); - } + export function start(options?: string | ReplOptions): REPLServer; } declare module "readline" { - import * as events from "events"; - import * as stream from "stream"; + import * as events from "events"; + import * as stream from "stream"; - export interface Key { - sequence?: string; - name?: string; - ctrl?: boolean; - meta?: boolean; - shift?: boolean; - } + export interface Key { + sequence?: string; + name?: string; + ctrl?: boolean; + meta?: boolean; + shift?: boolean; + } - export interface ReadLine extends events.EventEmitter { - setPrompt(prompt: string): void; - prompt(preserveCursor?: boolean): void; - question(query: string, callback: (answer: string) => void): void; - pause(): ReadLine; - resume(): ReadLine; - close(): void; - write(data: string | Buffer, key?: Key): void; + export interface ReadLine extends events.EventEmitter { + setPrompt(prompt: string): void; + prompt(preserveCursor?: boolean): void; + question(query: string, callback: (answer: string) => void): void; + pause(): ReadLine; + resume(): ReadLine; + close(): void; + write(data: string | Buffer, key?: Key): void; /** * events.EventEmitter @@ -1884,138 +1527,138 @@ declare module "readline" { * 5. SIGCONT * 6. SIGINT * 7. SIGTSTP - */ + **/ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "line", listener: (input: any) => void): this; - addListener(event: "pause", listener: () => void): this; - addListener(event: "resume", listener: () => void): this; - addListener(event: "SIGCONT", listener: () => void): this; - addListener(event: "SIGINT", listener: () => void): this; - addListener(event: "SIGTSTP", listener: () => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "line", listener: (input: any) => void): this; + addListener(event: "pause", listener: () => void): this; + addListener(event: "resume", listener: () => void): this; + addListener(event: "SIGCONT", listener: () => void): this; + addListener(event: "SIGINT", listener: () => void): this; + addListener(event: "SIGTSTP", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "line", input: any): boolean; - emit(event: "pause"): boolean; - emit(event: "resume"): boolean; - emit(event: "SIGCONT"): boolean; - emit(event: "SIGINT"): boolean; - emit(event: "SIGTSTP"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "line", input: any): boolean; + emit(event: "pause"): boolean; + emit(event: "resume"): boolean; + emit(event: "SIGCONT"): boolean; + emit(event: "SIGINT"): boolean; + emit(event: "SIGTSTP"): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "line", listener: (input: any) => void): this; - on(event: "pause", listener: () => void): this; - on(event: "resume", listener: () => void): this; - on(event: "SIGCONT", listener: () => void): this; - on(event: "SIGINT", listener: () => void): this; - on(event: "SIGTSTP", listener: () => void): this; + on(event: string, listener: Function): this; + on(event: "close", listener: () => void): this; + on(event: "line", listener: (input: any) => void): this; + on(event: "pause", listener: () => void): this; + on(event: "resume", listener: () => void): this; + on(event: "SIGCONT", listener: () => void): this; + on(event: "SIGINT", listener: () => void): this; + on(event: "SIGTSTP", listener: () => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "line", listener: (input: any) => void): this; - once(event: "pause", listener: () => void): this; - once(event: "resume", listener: () => void): this; - once(event: "SIGCONT", listener: () => void): this; - once(event: "SIGINT", listener: () => void): this; - once(event: "SIGTSTP", listener: () => void): this; + once(event: string, listener: Function): this; + once(event: "close", listener: () => void): this; + once(event: "line", listener: (input: any) => void): this; + once(event: "pause", listener: () => void): this; + once(event: "resume", listener: () => void): this; + once(event: "SIGCONT", listener: () => void): this; + once(event: "SIGINT", listener: () => void): this; + once(event: "SIGTSTP", listener: () => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "line", listener: (input: any) => void): this; - prependListener(event: "pause", listener: () => void): this; - prependListener(event: "resume", listener: () => void): this; - prependListener(event: "SIGCONT", listener: () => void): this; - prependListener(event: "SIGINT", listener: () => void): this; - prependListener(event: "SIGTSTP", listener: () => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "line", listener: (input: any) => void): this; + prependListener(event: "pause", listener: () => void): this; + prependListener(event: "resume", listener: () => void): this; + prependListener(event: "SIGCONT", listener: () => void): this; + prependListener(event: "SIGINT", listener: () => void): this; + prependListener(event: "SIGTSTP", listener: () => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "line", listener: (input: any) => void): this; - prependOnceListener(event: "pause", listener: () => void): this; - prependOnceListener(event: "resume", listener: () => void): this; - prependOnceListener(event: "SIGCONT", listener: () => void): this; - prependOnceListener(event: "SIGINT", listener: () => void): this; - prependOnceListener(event: "SIGTSTP", listener: () => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "line", listener: (input: any) => void): this; + prependOnceListener(event: "pause", listener: () => void): this; + prependOnceListener(event: "resume", listener: () => void): this; + prependOnceListener(event: "SIGCONT", listener: () => void): this; + prependOnceListener(event: "SIGINT", listener: () => void): this; + prependOnceListener(event: "SIGTSTP", listener: () => void): this; + } - type Completer = (line: string) => CompleterResult; - type AsyncCompleter = (line: string, callback: (err: any, result: CompleterResult) => void) => any; + type Completer = (line: string) => CompleterResult; + type AsyncCompleter = (line: string, callback: (err: any, result: CompleterResult) => void) => any; - export type CompleterResult = [string[], string]; + export type CompleterResult = [string[], string]; - export interface ReadLineOptions { - input: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - completer?: Completer | AsyncCompleter; - terminal?: boolean; - historySize?: number; - } + export interface ReadLineOptions { + input: NodeJS.ReadableStream; + output?: NodeJS.WritableStream; + completer?: Completer | AsyncCompleter; + terminal?: boolean; + historySize?: number; + prompt?: string; + crlfDelay?: number; + removeHistoryDuplicates?: boolean; + } - export function createInterface(input: NodeJS.ReadableStream, output?: NodeJS.WritableStream, completer?: Completer | AsyncCompleter, terminal?: boolean): ReadLine; - export function createInterface(options: ReadLineOptions): ReadLine; + export function createInterface(input: NodeJS.ReadableStream, output?: NodeJS.WritableStream, completer?: Completer | AsyncCompleter, terminal?: boolean): ReadLine; + export function createInterface(options: ReadLineOptions): ReadLine; - export function cursorTo(stream: NodeJS.WritableStream, x: number, y?: number): void; - export function emitKeypressEvents(stream: NodeJS.ReadableStream, interface?: ReadLine): void; - export function moveCursor(stream: NodeJS.WritableStream, dx: number | string, dy: number | string): void; - export function clearLine(stream: NodeJS.WritableStream, dir: number): void; - export function clearScreenDown(stream: NodeJS.WritableStream): void; + export function cursorTo(stream: NodeJS.WritableStream, x: number, y: number): void; + export function moveCursor(stream: NodeJS.WritableStream, dx: number | string, dy: number | string): void; + export function clearLine(stream: NodeJS.WritableStream, dir: number): void; + export function clearScreenDown(stream: NodeJS.WritableStream): void; } declare module "vm" { - export interface Context { } - export interface ScriptOptions { - filename?: string; - lineOffset?: number; - columnOffset?: number; - displayErrors?: boolean; - timeout?: number; - cachedData?: Buffer; - produceCachedData?: boolean; - } - export interface RunningScriptOptions { - filename?: string; - lineOffset?: number; - columnOffset?: number; - displayErrors?: boolean; - timeout?: number; - } - export class Script { - constructor(code: string, options?: ScriptOptions); - runInContext(contextifiedSandbox: Context, options?: RunningScriptOptions): any; - runInNewContext(sandbox?: Context, options?: RunningScriptOptions): any; - runInThisContext(options?: RunningScriptOptions): any; - } - export function createContext(sandbox?: Context): Context; - export function isContext(sandbox: Context): boolean; - export function runInContext(code: string, contextifiedSandbox: Context, options?: RunningScriptOptions): any; - export function runInDebugContext(code: string): any; - export function runInNewContext(code: string, sandbox?: Context, options?: RunningScriptOptions): any; - export function runInThisContext(code: string, options?: RunningScriptOptions): any; + export interface Context { } + export interface ScriptOptions { + filename?: string; + lineOffset?: number; + columnOffset?: number; + displayErrors?: boolean; + timeout?: number; + cachedData?: Buffer; + produceCachedData?: boolean; + } + export interface RunningScriptOptions { + filename?: string; + lineOffset?: number; + columnOffset?: number; + displayErrors?: boolean; + timeout?: number; + } + export class Script { + constructor(code: string, options?: ScriptOptions); + runInContext(contextifiedSandbox: Context, options?: RunningScriptOptions): any; + runInNewContext(sandbox?: Context, options?: RunningScriptOptions): any; + runInThisContext(options?: RunningScriptOptions): any; + } + export function createContext(sandbox?: Context): Context; + export function isContext(sandbox: Context): boolean; + export function runInContext(code: string, contextifiedSandbox: Context, options?: RunningScriptOptions): any; + export function runInDebugContext(code: string): any; + export function runInNewContext(code: string, sandbox?: Context, options?: RunningScriptOptions): any; + export function runInThisContext(code: string, options?: RunningScriptOptions): any; } declare module "child_process" { - import * as events from "events"; - import * as stream from "stream"; - import * as net from "net"; + import * as events from "events"; + import * as stream from "stream"; + import * as net from "net"; - export interface ChildProcess extends events.EventEmitter { - stdin: stream.Writable; - stdout: stream.Readable; - stderr: stream.Readable; - stdio: [stream.Writable, stream.Readable, stream.Readable]; - killed: boolean; - pid: number; - kill(signal?: string): void; - send(message: any, callback?: (error: Error) => void): boolean; - send(message: any, sendHandle?: net.Socket | net.Server, callback?: (error: Error) => void): boolean; - send(message: any, sendHandle?: net.Socket | net.Server, options?: MessageOptions, callback?: (error: Error) => void): boolean; - connected: boolean; - disconnect(): void; - unref(): void; - ref(): void; + export interface ChildProcess extends events.EventEmitter { + stdin: stream.Writable; + stdout: stream.Readable; + stderr: stream.Readable; + stdio: [stream.Writable, stream.Readable, stream.Readable]; + killed: boolean; + pid: number; + kill(signal?: string): void; + send(message: any, sendHandle?: any): boolean; + connected: boolean; + disconnect(): void; + unref(): void; + ref(): void; /** * events.EventEmitter @@ -2024,610 +1667,464 @@ declare module "child_process" { * 3. error * 4. exit * 5. message - */ + **/ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: (code: number, signal: string) => void): this; - addListener(event: "disconnect", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "exit", listener: (code: number, signal: string) => void): this; - addListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "close", listener: (code: number, signal: string) => void): this; + addListener(event: "disconnect", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "exit", listener: (code: number, signal: string) => void): this; + addListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close", code: number, signal: string): boolean; - emit(event: "disconnect"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "exit", code: number, signal: string): boolean; - emit(event: "message", message: any, sendHandle: net.Socket | net.Server): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", code: number, signal: string): boolean; + emit(event: "disconnect"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "exit", code: number, signal: string): boolean; + emit(event: "message", message: any, sendHandle: net.Socket | net.Server): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: (code: number, signal: string) => void): this; - on(event: "disconnect", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "exit", listener: (code: number, signal: string) => void): this; - on(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + on(event: string, listener: Function): this; + on(event: "close", listener: (code: number, signal: string) => void): this; + on(event: "disconnect", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "exit", listener: (code: number, signal: string) => void): this; + on(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: (code: number, signal: string) => void): this; - once(event: "disconnect", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "exit", listener: (code: number, signal: string) => void): this; - once(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + once(event: string, listener: Function): this; + once(event: "close", listener: (code: number, signal: string) => void): this; + once(event: "disconnect", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "exit", listener: (code: number, signal: string) => void): this; + once(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: (code: number, signal: string) => void): this; - prependListener(event: "disconnect", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "close", listener: (code: number, signal: string) => void): this; + prependListener(event: "disconnect", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "disconnect", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; - prependOnceListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "close", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "disconnect", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "exit", listener: (code: number, signal: string) => void): this; + prependOnceListener(event: "message", listener: (message: any, sendHandle: net.Socket | net.Server) => void): this; + } - export interface MessageOptions { - keepOpen?: boolean; - } + export interface SpawnOptions { + cwd?: string; + env?: any; + stdio?: any; + detached?: boolean; + uid?: number; + gid?: number; + shell?: boolean | string; + windowsVerbatimArguments?: boolean; + } + export function spawn(command: string, args?: string[], options?: SpawnOptions): ChildProcess; - export interface SpawnOptions { - cwd?: string; - env?: any; - stdio?: any; - detached?: boolean; - uid?: number; - gid?: number; - shell?: boolean | string; - windowsVerbatimArguments?: boolean; - } + export interface ExecOptions { + cwd?: string; + env?: any; + shell?: string; + timeout?: number; + maxBuffer?: number; + killSignal?: string; + uid?: number; + gid?: number; + } + export interface ExecOptionsWithStringEncoding extends ExecOptions { + encoding: BufferEncoding; + } + export interface ExecOptionsWithBufferEncoding extends ExecOptions { + encoding: string; // specify `null`. + } + export function exec(command: string, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + export function exec(command: string, options: ExecOptionsWithStringEncoding, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + // usage. child_process.exec("tsc", {encoding: null as string}, (err, stdout, stderr) => {}); + export function exec(command: string, options: ExecOptionsWithBufferEncoding, callback?: (error: Error, stdout: Buffer, stderr: Buffer) => void): ChildProcess; + export function exec(command: string, options: ExecOptions, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - export function spawn(command: string, args?: string[], options?: SpawnOptions): ChildProcess; + export interface ExecFileOptions { + cwd?: string; + env?: any; + timeout?: number; + maxBuffer?: number; + killSignal?: string; + uid?: number; + gid?: number; + } + export interface ExecFileOptionsWithStringEncoding extends ExecFileOptions { + encoding: BufferEncoding; + } + export interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions { + encoding: string; // specify `null`. + } + export function execFile(file: string, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + export function execFile(file: string, options?: ExecFileOptionsWithStringEncoding, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + // usage. child_process.execFile("file.sh", {encoding: null as string}, (err, stdout, stderr) => {}); + export function execFile(file: string, options?: ExecFileOptionsWithBufferEncoding, callback?: (error: Error, stdout: Buffer, stderr: Buffer) => void): ChildProcess; + export function execFile(file: string, options?: ExecFileOptions, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + export function execFile(file: string, args?: string[], callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + export function execFile(file: string, args?: string[], options?: ExecFileOptionsWithStringEncoding, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; + // usage. child_process.execFile("file.sh", ["foo"], {encoding: null as string}, (err, stdout, stderr) => {}); + export function execFile(file: string, args?: string[], options?: ExecFileOptionsWithBufferEncoding, callback?: (error: Error, stdout: Buffer, stderr: Buffer) => void): ChildProcess; + export function execFile(file: string, args?: string[], options?: ExecFileOptions, callback?: (error: Error, stdout: string, stderr: string) => void): ChildProcess; - export interface ExecOptions { - cwd?: string; - env?: any; - shell?: string; - timeout?: number; - maxBuffer?: number; - killSignal?: string; - uid?: number; - gid?: number; - } + export interface ForkOptions { + cwd?: string; + env?: any; + execPath?: string; + execArgv?: string[]; + silent?: boolean; + stdio?: any[]; + uid?: number; + gid?: number; + } + export function fork(modulePath: string, args?: string[], options?: ForkOptions): ChildProcess; - export interface ExecOptionsWithStringEncoding extends ExecOptions { - encoding: BufferEncoding; - } + export interface SpawnSyncOptions { + cwd?: string; + input?: string | Buffer; + stdio?: any; + env?: any; + uid?: number; + gid?: number; + timeout?: number; + killSignal?: string; + maxBuffer?: number; + encoding?: string; + shell?: boolean | string; + } + export interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions { + encoding: BufferEncoding; + } + export interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions { + encoding: string; // specify `null`. + } + export interface SpawnSyncReturns<T> { + pid: number; + output: string[]; + stdout: T; + stderr: T; + status: number; + signal: string; + error: Error; + } + export function spawnSync(command: string): SpawnSyncReturns<Buffer>; + export function spawnSync(command: string, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns<string>; + export function spawnSync(command: string, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns<Buffer>; + export function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns<Buffer>; + export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns<string>; + export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns<Buffer>; + export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptions): SpawnSyncReturns<Buffer>; - export interface ExecOptionsWithBufferEncoding extends ExecOptions { - encoding: string | null; // specify `null`. - } + export interface ExecSyncOptions { + cwd?: string; + input?: string | Buffer; + stdio?: any; + env?: any; + shell?: string; + uid?: number; + gid?: number; + timeout?: number; + killSignal?: string; + maxBuffer?: number; + encoding?: string; + } + export interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions { + encoding: BufferEncoding; + } + export interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions { + encoding: string; // specify `null`. + } + export function execSync(command: string): Buffer; + export function execSync(command: string, options?: ExecSyncOptionsWithStringEncoding): string; + export function execSync(command: string, options?: ExecSyncOptionsWithBufferEncoding): Buffer; + export function execSync(command: string, options?: ExecSyncOptions): Buffer; - // no `options` definitely means stdout/stderr are `string`. - export function exec(command: string, callback?: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. - export function exec(command: string, options: { encoding: "buffer" | null } & ExecOptions, callback?: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - - // `options` with well known `encoding` means stdout/stderr are definitely `string`. - export function exec(command: string, options: { encoding: BufferEncoding } & ExecOptions, callback?: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. - // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. - export function exec(command: string, options: { encoding: string } & ExecOptions, callback?: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - - // `options` without an `encoding` means stdout/stderr are definitely `string`. - export function exec(command: string, options: ExecOptions, callback?: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // fallback if nothing else matches. Worst case is always `string | Buffer`. - export function exec(command: string, options: ({ encoding?: string | null } & ExecOptions) | undefined | null, callback?: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace exec { - export function __promisify__(command: string): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(command: string, options: { encoding: "buffer" | null } & ExecOptions): Promise<{ stdout: Buffer, stderr: Buffer }>; - export function __promisify__(command: string, options: { encoding: BufferEncoding } & ExecOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(command: string, options: ExecOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(command: string, options?: ({ encoding?: string | null } & ExecOptions) | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - } - - export interface ExecFileOptions { - cwd?: string; - env?: any; - timeout?: number; - maxBuffer?: number; - killSignal?: string; - uid?: number; - gid?: number; - windowsVerbatimArguments?: boolean; - } - export interface ExecFileOptionsWithStringEncoding extends ExecFileOptions { - encoding: BufferEncoding; - } - export interface ExecFileOptionsWithBufferEncoding extends ExecFileOptions { - encoding: 'buffer' | null; - } - export interface ExecFileOptionsWithOtherEncoding extends ExecFileOptions { - encoding: string; - } - - export function execFile(file: string): ChildProcess; - export function execFile(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): ChildProcess; - - // no `options` definitely means stdout/stderr are `string`. - export function execFile(file: string, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with `"buffer"` or `null` for `encoding` means stdout/stderr are definitely `Buffer`. - export function execFile(file: string, options: ExecFileOptionsWithBufferEncoding, callback: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithBufferEncoding, callback: (error: Error | null, stdout: Buffer, stderr: Buffer) => void): ChildProcess; - - // `options` with well known `encoding` means stdout/stderr are definitely `string`. - export function execFile(file: string, options: ExecFileOptionsWithStringEncoding, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithStringEncoding, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // `options` with an `encoding` whose type is `string` means stdout/stderr could either be `Buffer` or `string`. - // There is no guarantee the `encoding` is unknown as `string` is a superset of `BufferEncoding`. - export function execFile(file: string, options: ExecFileOptionsWithOtherEncoding, callback: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithOtherEncoding, callback: (error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void): ChildProcess; - - // `options` without an `encoding` means stdout/stderr are definitely `string`. - export function execFile(file: string, options: ExecFileOptions, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null, options: ExecFileOptions, callback: (error: Error | null, stdout: string, stderr: string) => void): ChildProcess; - - // fallback if nothing else matches. Worst case is always `string | Buffer`. - export function execFile(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null, callback: ((error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null): ChildProcess; - export function execFile(file: string, args: string[] | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null, callback: ((error: Error | null, stdout: string | Buffer, stderr: string | Buffer) => void) | undefined | null): ChildProcess; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace execFile { - export function __promisify__(file: string): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, args: string[] | undefined | null): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, options: ExecFileOptionsWithBufferEncoding): Promise<{ stdout: Buffer, stderr: Buffer }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithBufferEncoding): Promise<{ stdout: Buffer, stderr: Buffer }>; - export function __promisify__(file: string, options: ExecFileOptionsWithStringEncoding): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithStringEncoding): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, options: ExecFileOptionsWithOtherEncoding): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptionsWithOtherEncoding): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - export function __promisify__(file: string, options: ExecFileOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ExecFileOptions): Promise<{ stdout: string, stderr: string }>; - export function __promisify__(file: string, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - export function __promisify__(file: string, args: string[] | undefined | null, options: ({ encoding?: string | null } & ExecFileOptions) | undefined | null): Promise<{ stdout: string | Buffer, stderr: string | Buffer }>; - } - - export interface ForkOptions { - cwd?: string; - env?: any; - execPath?: string; - execArgv?: string[]; - silent?: boolean; - stdio?: any[]; - uid?: number; - gid?: number; - windowsVerbatimArguments?: boolean; - } - export function fork(modulePath: string, args?: string[], options?: ForkOptions): ChildProcess; - - export interface SpawnSyncOptions { - cwd?: string; - input?: string | Buffer; - stdio?: any; - env?: any; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string; - maxBuffer?: number; - encoding?: string; - shell?: boolean | string; - windowsVerbatimArguments?: boolean; - } - export interface SpawnSyncOptionsWithStringEncoding extends SpawnSyncOptions { - encoding: BufferEncoding; - } - export interface SpawnSyncOptionsWithBufferEncoding extends SpawnSyncOptions { - encoding: string; // specify `null`. - } - export interface SpawnSyncReturns<T> { - pid: number; - output: string[]; - stdout: T; - stderr: T; - status: number; - signal: string; - error: Error; - } - export function spawnSync(command: string): SpawnSyncReturns<Buffer>; - export function spawnSync(command: string, options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns<string>; - export function spawnSync(command: string, options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns<Buffer>; - export function spawnSync(command: string, options?: SpawnSyncOptions): SpawnSyncReturns<Buffer>; - export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithStringEncoding): SpawnSyncReturns<string>; - export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptionsWithBufferEncoding): SpawnSyncReturns<Buffer>; - export function spawnSync(command: string, args?: string[], options?: SpawnSyncOptions): SpawnSyncReturns<Buffer>; - - export interface ExecSyncOptions { - cwd?: string; - input?: string | Buffer; - stdio?: any; - env?: any; - shell?: string; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string; - maxBuffer?: number; - encoding?: string; - } - export interface ExecSyncOptionsWithStringEncoding extends ExecSyncOptions { - encoding: BufferEncoding; - } - export interface ExecSyncOptionsWithBufferEncoding extends ExecSyncOptions { - encoding: string; // specify `null`. - } - export function execSync(command: string): Buffer; - export function execSync(command: string, options?: ExecSyncOptionsWithStringEncoding): string; - export function execSync(command: string, options?: ExecSyncOptionsWithBufferEncoding): Buffer; - export function execSync(command: string, options?: ExecSyncOptions): Buffer; - - export interface ExecFileSyncOptions { - cwd?: string; - input?: string | Buffer; - stdio?: any; - env?: any; - uid?: number; - gid?: number; - timeout?: number; - killSignal?: string; - maxBuffer?: number; - encoding?: string; - } - export interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions { - encoding: BufferEncoding; - } - export interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions { - encoding: string; // specify `null`. - } - export function execFileSync(command: string): Buffer; - export function execFileSync(command: string, options?: ExecFileSyncOptionsWithStringEncoding): string; - export function execFileSync(command: string, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; - export function execFileSync(command: string, options?: ExecFileSyncOptions): Buffer; - export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithStringEncoding): string; - export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; - export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptions): Buffer; + export interface ExecFileSyncOptions { + cwd?: string; + input?: string | Buffer; + stdio?: any; + env?: any; + uid?: number; + gid?: number; + timeout?: number; + killSignal?: string; + maxBuffer?: number; + encoding?: string; + } + export interface ExecFileSyncOptionsWithStringEncoding extends ExecFileSyncOptions { + encoding: BufferEncoding; + } + export interface ExecFileSyncOptionsWithBufferEncoding extends ExecFileSyncOptions { + encoding: string; // specify `null`. + } + export function execFileSync(command: string): Buffer; + export function execFileSync(command: string, options?: ExecFileSyncOptionsWithStringEncoding): string; + export function execFileSync(command: string, options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; + export function execFileSync(command: string, options?: ExecFileSyncOptions): Buffer; + export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithStringEncoding): string; + export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptionsWithBufferEncoding): Buffer; + export function execFileSync(command: string, args?: string[], options?: ExecFileSyncOptions): Buffer; } declare module "url" { - import { ParsedUrlQuery } from 'querystring'; + export interface Url { + href?: string; + protocol?: string; + auth?: string; + hostname?: string; + port?: string; + host?: string; + pathname?: string; + search?: string; + query?: string | any; + slashes?: boolean; + hash?: string; + path?: string; + } - export interface UrlObjectCommon { - auth?: string; - hash?: string; - host?: string; - hostname?: string; - href?: string; - path?: string; - pathname?: string; - protocol?: string; - search?: string; - slashes?: boolean; - } + export interface UrlObject { + protocol?: string; + slashes?: boolean; + auth?: string; + host?: string; + hostname?: string; + port?: string | number; + pathname?: string; + search?: string; + query?: { [key: string]: any; }; + hash?: string; + } - // Input to `url.format` - export interface UrlObject extends UrlObjectCommon { - port?: string | number; - query?: string | null | { [key: string]: any }; - } + export function parse(urlStr: string, parseQueryString?: boolean, slashesDenoteHost?: boolean): Url; + export function format(URL: URL, options?: URLFormatOptions): string; + export function format(urlObject: UrlObject): string; + export function resolve(from: string, to: string): string; - // Output of `url.parse` - export interface Url extends UrlObjectCommon { - port?: string; - query?: string | null | ParsedUrlQuery; - } + export interface URLFormatOptions { + auth?: boolean; + fragment?: boolean; + search?: boolean; + unicode?: boolean; + } - export interface UrlWithParsedQuery extends Url { - query: ParsedUrlQuery; - } + export class URLSearchParams implements Iterable<string[]> { + constructor(init?: URLSearchParams | string | { [key: string]: string | string[] } | Iterable<string[]>); + append(name: string, value: string): void; + delete(name: string): void; + entries(): Iterator<string[]>; + forEach(callback: (value: string, name: string) => void): void; + get(name: string): string | null; + getAll(name: string): string[]; + has(name: string): boolean; + keys(): Iterator<string>; + set(name: string, value: string): void; + sort(): void; + toString(): string; + values(): Iterator<string>; + [Symbol.iterator](): Iterator<string[]>; + } - export interface UrlWithStringQuery extends Url { - query: string | null; - } - - export function parse(urlStr: string): UrlWithStringQuery; - export function parse(urlStr: string, parseQueryString: false | undefined, slashesDenoteHost?: boolean): UrlWithStringQuery; - export function parse(urlStr: string, parseQueryString: true, slashesDenoteHost?: boolean): UrlWithParsedQuery; - export function parse(urlStr: string, parseQueryString: boolean, slashesDenoteHost?: boolean): Url; - - export function format(URL: URL, options?: URLFormatOptions): string; - export function format(urlObject: UrlObject | string): string; - export function resolve(from: string, to: string): string; - - export interface URLFormatOptions { - auth?: boolean; - fragment?: boolean; - search?: boolean; - unicode?: boolean; - } - - export class URLSearchParams implements Iterable<[string, string]> { - constructor(init?: URLSearchParams | string | { [key: string]: string | string[] | undefined } | Iterable<[string, string]> | Array<[string, string]>); - append(name: string, value: string): void; - delete(name: string): void; - entries(): IterableIterator<[string, string]>; - forEach(callback: (value: string, name: string) => void): void; - get(name: string): string | null; - getAll(name: string): string[]; - has(name: string): boolean; - keys(): IterableIterator<string>; - set(name: string, value: string): void; - sort(): void; - toString(): string; - values(): IterableIterator<string>; - [Symbol.iterator](): IterableIterator<[string, string]>; - } - - export class URL { - constructor(input: string, base?: string | URL); - hash: string; - host: string; - hostname: string; - href: string; - readonly origin: string; - password: string; - pathname: string; - port: string; - protocol: string; - search: string; - readonly searchParams: URLSearchParams; - username: string; - toString(): string; - toJSON(): string; - } + export class URL { + constructor(input: string, base?: string | URL); + hash: string; + host: string; + hostname: string; + href: string; + readonly origin: string; + password: string; + pathname: string; + port: string; + protocol: string; + search: string; + readonly searchParams: URLSearchParams; + username: string; + toString(): string; + toJSON(): string; + } } declare module "dns" { - // Supported getaddrinfo flags. - export const ADDRCONFIG: number; - export const V4MAPPED: number; + // Supported getaddrinfo flags. + export const ADDRCONFIG: number; + export const V4MAPPED: number; - export interface LookupOptions { - family?: number; - hints?: number; - all?: boolean; - } + export interface LookupOptions { + family?: number; + hints?: number; + all?: boolean; + } - export interface LookupOneOptions extends LookupOptions { - all?: false; - } + export interface LookupOneOptions extends LookupOptions { + all?: false; + } - export interface LookupAllOptions extends LookupOptions { - all: true; - } + export interface LookupAllOptions extends LookupOptions { + all: true; + } - export interface LookupAddress { - address: string; - family: number; - } + export interface LookupAddress { + address: string; + family: number; + } - export function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - export function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - export function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException, addresses: LookupAddress[]) => void): void; - export function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException, address: string | LookupAddress[], family: number) => void): void; - export function lookup(hostname: string, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; + export function lookup(hostname: string, family: number, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; + export function lookup(hostname: string, options: LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; + export function lookup(hostname: string, options: LookupAllOptions, callback: (err: NodeJS.ErrnoException, addresses: LookupAddress[]) => void): void; + export function lookup(hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException, address: string | LookupAddress[], family: number) => void): void; + export function lookup(hostname: string, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void): void; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lookup { - export function __promisify__(hostname: string, options: LookupAllOptions): Promise<{ address: LookupAddress[] }>; - export function __promisify__(hostname: string, options?: LookupOneOptions | number): Promise<{ address: string, family: number }>; - export function __promisify__(hostname: string, options?: LookupOptions | number): Promise<{ address: string | LookupAddress[], family?: number }>; - } + export interface ResolveOptions { + ttl: boolean; + } - export interface ResolveOptions { - ttl: boolean; - } + export interface ResolveWithTtlOptions extends ResolveOptions { + ttl: true; + } - export interface ResolveWithTtlOptions extends ResolveOptions { - ttl: true; - } + export interface RecordWithTtl { + address: string; + ttl: number; + } - export interface RecordWithTtl { - address: string; - ttl: number; - } + export interface MxRecord { + priority: number; + exchange: string; + } - export interface MxRecord { - priority: number; - exchange: string; - } + export interface NaptrRecord { + flags: string; + service: string; + regexp: string; + replacement: string; + order: number; + preference: number; + } - export interface NaptrRecord { - flags: string; - service: string; - regexp: string; - replacement: string; - order: number; - preference: number; - } + export interface SoaRecord { + nsname: string; + hostmaster: string; + serial: number; + refresh: number; + retry: number; + expire: number; + minttl: number; + } - export interface SoaRecord { - nsname: string; - hostmaster: string; - serial: number; - refresh: number; - retry: number; - expire: number; - minttl: number; - } + export interface SrvRecord { + priority: number; + weight: number; + port: number; + name: string; + } - export interface SrvRecord { - priority: number; - weight: number; - port: number; - name: string; - } + export function resolve(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "A", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "AAAA", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "CNAME", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "MX", callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; + export function resolve(hostname: string, rrtype: "NAPTR", callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; + export function resolve(hostname: string, rrtype: "NS", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "PTR", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve(hostname: string, rrtype: "SOA", callback: (err: NodeJS.ErrnoException, addresses: SoaRecord) => void): void; + export function resolve(hostname: string, rrtype: "SRV", callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; + export function resolve(hostname: string, rrtype: "TXT", callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; + export function resolve(hostname: string, rrtype: string, callback: (err: NodeJS.ErrnoException, addresses: string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][]) => void): void; - export function resolve(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "A", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "AAAA", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "CNAME", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "MX", callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "NAPTR", callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "NS", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "PTR", callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve(hostname: string, rrtype: "SOA", callback: (err: NodeJS.ErrnoException, addresses: SoaRecord) => void): void; - export function resolve(hostname: string, rrtype: "SRV", callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; - export function resolve(hostname: string, rrtype: "TXT", callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; - export function resolve(hostname: string, rrtype: string, callback: (err: NodeJS.ErrnoException, addresses: string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][]) => void): void; + export function resolve4(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve4(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; + export function resolve4(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace resolve { - export function __promisify__(hostname: string, rrtype?: "A" | "AAAA" | "CNAME" | "NS" | "PTR"): Promise<string[]>; - export function __promisify__(hostname: string, rrtype: "MX"): Promise<MxRecord[]>; - export function __promisify__(hostname: string, rrtype: "NAPTR"): Promise<NaptrRecord[]>; - export function __promisify__(hostname: string, rrtype: "SOA"): Promise<SoaRecord>; - export function __promisify__(hostname: string, rrtype: "SRV"): Promise<SrvRecord[]>; - export function __promisify__(hostname: string, rrtype: "TXT"): Promise<string[][]>; - export function __promisify__(hostname: string, rrtype?: string): Promise<string[] | MxRecord[] | NaptrRecord[] | SoaRecord | SrvRecord[] | string[][]>; - } + export function resolve6(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolve6(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; + export function resolve6(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; - export function resolve4(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve4(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; - export function resolve4(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; + export function resolveCname(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolveMx(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; + export function resolveNaptr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; + export function resolveNs(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolvePtr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; + export function resolveSoa(hostname: string, callback: (err: NodeJS.ErrnoException, address: SoaRecord) => void): void; + export function resolveSrv(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; + export function resolveTxt(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace resolve4 { - export function __promisify__(hostname: string): Promise<string[]>; - export function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise<RecordWithTtl[]>; - export function __promisify__(hostname: string, options?: ResolveOptions): Promise<string[] | RecordWithTtl[]>; - } + export function reverse(ip: string, callback: (err: NodeJS.ErrnoException, hostnames: string[]) => void): void; + export function setServers(servers: string[]): void; - export function resolve6(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolve6(hostname: string, options: ResolveWithTtlOptions, callback: (err: NodeJS.ErrnoException, addresses: RecordWithTtl[]) => void): void; - export function resolve6(hostname: string, options: ResolveOptions, callback: (err: NodeJS.ErrnoException, addresses: string[] | RecordWithTtl[]) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace resolve6 { - export function __promisify__(hostname: string): Promise<string[]>; - export function __promisify__(hostname: string, options: ResolveWithTtlOptions): Promise<RecordWithTtl[]>; - export function __promisify__(hostname: string, options?: ResolveOptions): Promise<string[] | RecordWithTtl[]>; - } - - export function resolveCname(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolveMx(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: MxRecord[]) => void): void; - export function resolveNaptr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: NaptrRecord[]) => void): void; - export function resolveNs(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolvePtr(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[]) => void): void; - export function resolveSoa(hostname: string, callback: (err: NodeJS.ErrnoException, address: SoaRecord) => void): void; - export function resolveSrv(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: SrvRecord[]) => void): void; - export function resolveTxt(hostname: string, callback: (err: NodeJS.ErrnoException, addresses: string[][]) => void): void; - - export function reverse(ip: string, callback: (err: NodeJS.ErrnoException, hostnames: string[]) => void): void; - export function setServers(servers: string[]): void; - - // Error codes - export var NODATA: string; - export var FORMERR: string; - export var SERVFAIL: string; - export var NOTFOUND: string; - export var NOTIMP: string; - export var REFUSED: string; - export var BADQUERY: string; - export var BADNAME: string; - export var BADFAMILY: string; - export var BADRESP: string; - export var CONNREFUSED: string; - export var TIMEOUT: string; - export var EOF: string; - export var FILE: string; - export var NOMEM: string; - export var DESTRUCTION: string; - export var BADSTR: string; - export var BADFLAGS: string; - export var NONAME: string; - export var BADHINTS: string; - export var NOTINITIALIZED: string; - export var LOADIPHLPAPI: string; - export var ADDRGETNETWORKPARAMS: string; - export var CANCELLED: string; + //Error codes + export var NODATA: string; + export var FORMERR: string; + export var SERVFAIL: string; + export var NOTFOUND: string; + export var NOTIMP: string; + export var REFUSED: string; + export var BADQUERY: string; + export var BADNAME: string; + export var BADFAMILY: string; + export var BADRESP: string; + export var CONNREFUSED: string; + export var TIMEOUT: string; + export var EOF: string; + export var FILE: string; + export var NOMEM: string; + export var DESTRUCTION: string; + export var BADSTR: string; + export var BADFLAGS: string; + export var NONAME: string; + export var BADHINTS: string; + export var NOTINITIALIZED: string; + export var LOADIPHLPAPI: string; + export var ADDRGETNETWORKPARAMS: string; + export var CANCELLED: string; } declare module "net" { - import * as stream from "stream"; - import * as events from "events"; - import * as dns from "dns"; + import * as stream from "stream"; + import * as events from "events"; - type LookupFunction = (hostname: string, options: dns.LookupOneOptions, callback: (err: NodeJS.ErrnoException | null, address: string, family: number) => void) => void; + export interface Socket extends stream.Duplex { + // Extended base methods + write(buffer: Buffer): boolean; + write(buffer: Buffer, cb?: Function): boolean; + write(str: string, cb?: Function): boolean; + write(str: string, encoding?: string, cb?: Function): boolean; + write(str: string, encoding?: string, fd?: string): boolean; - export interface SocketConstructorOpts { - fd?: number; - allowHalfOpen?: boolean; - readable?: boolean; - writable?: boolean; - } + connect(port: number, host?: string, connectionListener?: Function): void; + connect(path: string, connectionListener?: Function): void; + bufferSize: number; + setEncoding(encoding?: string): this; + write(data: any, encoding?: string, callback?: Function): void; + destroy(err?: any): void; + pause(): this; + resume(): this; + setTimeout(timeout: number, callback?: Function): void; + setNoDelay(noDelay?: boolean): void; + setKeepAlive(enable?: boolean, initialDelay?: number): void; + address(): { port: number; family: string; address: string; }; + unref(): void; + ref(): void; - export interface TcpSocketConnectOpts { - port: number; - host?: string; - localAddress?: string; - localPort?: number; - hints?: number; - family?: number; - lookup?: LookupFunction; - } + remoteAddress: string; + remoteFamily: string; + remotePort: number; + localAddress: string; + localPort: number; + bytesRead: number; + bytesWritten: number; + connecting: boolean; + destroyed: boolean; - export interface IpcSocketConnectOpts { - path: string; - } - - export type SocketConnectOpts = TcpSocketConnectOpts | IpcSocketConnectOpts; - - export class Socket extends stream.Duplex { - constructor(options?: SocketConstructorOpts); - - // Extended base methods - write(buffer: Buffer): boolean; - write(buffer: Buffer, cb?: Function): boolean; - write(str: string, cb?: Function): boolean; - write(str: string, encoding?: string, cb?: Function): boolean; - write(str: string, encoding?: string, fd?: string): boolean; - write(data: any, encoding?: string, callback?: Function): void; - - connect(options: SocketConnectOpts, connectionListener?: Function): this; - connect(port: number, host: string, connectionListener?: Function): this; - connect(port: number, connectionListener?: Function): this; - connect(path: string, connectionListener?: Function): this; - - bufferSize: number; - setEncoding(encoding?: string): this; - destroy(err?: any): void; - pause(): this; - resume(): this; - setTimeout(timeout: number, callback?: Function): this; - setNoDelay(noDelay?: boolean): this; - setKeepAlive(enable?: boolean, initialDelay?: number): this; - address(): { port: number; family: string; address: string; }; - unref(): void; - ref(): void; - - remoteAddress?: string; - remoteFamily?: string; - remotePort?: number; - localAddress: string; - localPort: number; - bytesRead: number; - bytesWritten: number; - connecting: boolean; - destroyed: boolean; - - // Extended base methods - end(): void; - end(buffer: Buffer, cb?: Function): void; - end(str: string, cb?: Function): void; - end(str: string, encoding?: string, cb?: Function): void; - end(data?: any, encoding?: string): void; + // Extended base methods + end(): void; + end(buffer: Buffer, cb?: Function): void; + end(str: string, cb?: Function): void; + end(str: string, encoding?: string, cb?: Function): void; + end(data?: any, encoding?: string): void; /** * events.EventEmitter @@ -2640,97 +2137,97 @@ declare module "net" { * 7. lookup * 8. timeout */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: (had_error: boolean) => void): this; - addListener(event: "connect", listener: () => void): this; - addListener(event: "data", listener: (data: Buffer) => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - addListener(event: "timeout", listener: () => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "close", listener: (had_error: boolean) => void): this; + addListener(event: "connect", listener: () => void): this; + addListener(event: "data", listener: (data: Buffer) => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + addListener(event: "timeout", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close", had_error: boolean): boolean; - emit(event: "connect"): boolean; - emit(event: "data", data: Buffer): boolean; - emit(event: "drain"): boolean; - emit(event: "end"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "lookup", err: Error, address: string, family: string | number, host: string): boolean; - emit(event: "timeout"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close", had_error: boolean): boolean; + emit(event: "connect"): boolean; + emit(event: "data", data: Buffer): boolean; + emit(event: "drain"): boolean; + emit(event: "end"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "lookup", err: Error, address: string, family: string | number, host: string): boolean; + emit(event: "timeout"): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: (had_error: boolean) => void): this; - on(event: "connect", listener: () => void): this; - on(event: "data", listener: (data: Buffer) => void): this; - on(event: "drain", listener: () => void): this; - on(event: "end", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - on(event: "timeout", listener: () => void): this; + on(event: string, listener: Function): this; + on(event: "close", listener: (had_error: boolean) => void): this; + on(event: "connect", listener: () => void): this; + on(event: "data", listener: (data: Buffer) => void): this; + on(event: "drain", listener: () => void): this; + on(event: "end", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + on(event: "timeout", listener: () => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: (had_error: boolean) => void): this; - once(event: "connect", listener: () => void): this; - once(event: "data", listener: (data: Buffer) => void): this; - once(event: "drain", listener: () => void): this; - once(event: "end", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - once(event: "timeout", listener: () => void): this; + once(event: string, listener: Function): this; + once(event: "close", listener: (had_error: boolean) => void): this; + once(event: "connect", listener: () => void): this; + once(event: "data", listener: (data: Buffer) => void): this; + once(event: "drain", listener: () => void): this; + once(event: "end", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + once(event: "timeout", listener: () => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: (had_error: boolean) => void): this; - prependListener(event: "connect", listener: () => void): this; - prependListener(event: "data", listener: (data: Buffer) => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - prependListener(event: "timeout", listener: () => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "close", listener: (had_error: boolean) => void): this; + prependListener(event: "connect", listener: () => void): this; + prependListener(event: "data", listener: (data: Buffer) => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + prependListener(event: "timeout", listener: () => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: (had_error: boolean) => void): this; - prependOnceListener(event: "connect", listener: () => void): this; - prependOnceListener(event: "data", listener: (data: Buffer) => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "close", listener: (had_error: boolean) => void): this; + prependOnceListener(event: "connect", listener: () => void): this; + prependOnceListener(event: "data", listener: (data: Buffer) => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "lookup", listener: (err: Error, address: string, family: string | number, host: string) => void): this; + prependOnceListener(event: "timeout", listener: () => void): this; + } - export interface ListenOptions { - port?: number; - host?: string; - backlog?: number; - path?: string; - exclusive?: boolean; - } + export var Socket: { + new(options?: { fd?: number; allowHalfOpen?: boolean; readable?: boolean; writable?: boolean; }): Socket; + }; - // https://github.com/nodejs/node/blob/master/lib/net.js - export class Server extends events.EventEmitter { - constructor(connectionListener?: (socket: Socket) => void); - constructor(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void); + export interface ListenOptions { + port?: number; + host?: string; + backlog?: number; + path?: string; + exclusive?: boolean; + } - listen(port?: number, hostname?: string, backlog?: number, listeningListener?: Function): this; - listen(port?: number, hostname?: string, listeningListener?: Function): this; - listen(port?: number, backlog?: number, listeningListener?: Function): this; - listen(port?: number, listeningListener?: Function): this; - listen(path: string, backlog?: number, listeningListener?: Function): this; - listen(path: string, listeningListener?: Function): this; - listen(options: ListenOptions, listeningListener?: Function): this; - listen(handle: any, backlog?: number, listeningListener?: Function): this; - listen(handle: any, listeningListener?: Function): this; - close(callback?: Function): this; - address(): { port: number; family: string; address: string; }; - getConnections(cb: (error: Error | null, count: number) => void): void; - ref(): this; - unref(): this; - maxConnections: number; - connections: number; - listening: boolean; + export interface Server extends events.EventEmitter { + listen(port: number, hostname?: string, backlog?: number, listeningListener?: Function): Server; + listen(port: number, hostname?: string, listeningListener?: Function): Server; + listen(port: number, backlog?: number, listeningListener?: Function): Server; + listen(port: number, listeningListener?: Function): Server; + listen(path: string, backlog?: number, listeningListener?: Function): Server; + listen(path: string, listeningListener?: Function): Server; + listen(options: ListenOptions, listeningListener?: Function): Server; + listen(handle: any, backlog?: number, listeningListener?: Function): Server; + listen(handle: any, listeningListener?: Function): Server; + close(callback?: Function): Server; + address(): { port: number; family: string; address: string; }; + getConnections(cb: (error: Error, count: number) => void): void; + ref(): Server; + unref(): Server; + maxConnections: number; + connections: number; + listening: boolean; /** * events.EventEmitter @@ -2739,123 +2236,101 @@ declare module "net" { * 3. error * 4. listening */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "connection", listener: (socket: Socket) => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "listening", listener: () => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "connection", listener: (socket: Socket) => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "connection", socket: Socket): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "listening"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "connection", socket: Socket): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "connection", listener: (socket: Socket) => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "listening", listener: () => void): this; + on(event: string, listener: Function): this; + on(event: "close", listener: () => void): this; + on(event: "connection", listener: (socket: Socket) => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "connection", listener: (socket: Socket) => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "listening", listener: () => void): this; + once(event: string, listener: Function): this; + once(event: "close", listener: () => void): this; + once(event: "connection", listener: (socket: Socket) => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "connection", listener: (socket: Socket) => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "listening", listener: () => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "connection", listener: (socket: Socket) => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "listening", listener: () => void): this; - } - - export interface TcpNetConnectOpts extends TcpSocketConnectOpts, SocketConstructorOpts { - timeout?: number; - } - - export interface IpcNetConnectOpts extends IpcSocketConnectOpts, SocketConstructorOpts { - timeout?: number; - } - - export type NetConnectOpts = TcpNetConnectOpts | IpcNetConnectOpts; - - export function createServer(connectionListener?: (socket: Socket) => void): Server; - export function createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void): Server; - export function connect(options: NetConnectOpts, connectionListener?: Function): Socket; - export function connect(port: number, host?: string, connectionListener?: Function): Socket; - export function connect(path: string, connectionListener?: Function): Socket; - export function createConnection(options: NetConnectOpts, connectionListener?: Function): Socket; - export function createConnection(port: number, host?: string, connectionListener?: Function): Socket; - export function createConnection(path: string, connectionListener?: Function): Socket; - export function isIP(input: string): number; - export function isIPv4(input: string): boolean; - export function isIPv6(input: string): boolean; + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "connection", listener: (socket: Socket) => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + } + export function createServer(connectionListener?: (socket: Socket) => void): Server; + export function createServer(options?: { allowHalfOpen?: boolean, pauseOnConnect?: boolean }, connectionListener?: (socket: Socket) => void): Server; + export function connect(options: { port: number, host?: string, localAddress?: string, localPort?: string, family?: number, allowHalfOpen?: boolean; }, connectionListener?: Function): Socket; + export function connect(port: number, host?: string, connectionListener?: Function): Socket; + export function connect(path: string, connectionListener?: Function): Socket; + export function createConnection(options: { port: number, host?: string, localAddress?: string, localPort?: string, family?: number, allowHalfOpen?: boolean; }, connectionListener?: Function): Socket; + export function createConnection(port: number, host?: string, connectionListener?: Function): Socket; + export function createConnection(path: string, connectionListener?: Function): Socket; + export function isIP(input: string): number; + export function isIPv4(input: string): boolean; + export function isIPv6(input: string): boolean; } declare module "dgram" { - import * as events from "events"; - import * as dns from "dns"; + import * as events from "events"; - interface RemoteInfo { - address: string; - family: string; - port: number; - } + interface RemoteInfo { + address: string; + family: string; + port: number; + } - interface AddressInfo { - address: string; - family: string; - port: number; - } + interface AddressInfo { + address: string; + family: string; + port: number; + } - interface BindOptions { - port: number; - address?: string; - exclusive?: boolean; - } + interface BindOptions { + port: number; + address?: string; + exclusive?: boolean; + } - type SocketType = "udp4" | "udp6"; + type SocketType = "udp4" | "udp6"; - interface SocketOptions { - type: SocketType; - reuseAddr?: boolean; - recvBufferSize?: number; - sendBufferSize?: number; - lookup?: (hostname: string, options: dns.LookupOneOptions, callback: (err: NodeJS.ErrnoException, address: string, family: number) => void) => void; - } + interface SocketOptions { + type: SocketType; + reuseAddr?: boolean; + } - export function createSocket(type: SocketType, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; - export function createSocket(options: SocketOptions, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + export function createSocket(type: SocketType, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; + export function createSocket(options: SocketOptions, callback?: (msg: Buffer, rinfo: RemoteInfo) => void): Socket; - export class Socket extends events.EventEmitter { - send(msg: Buffer | String | any[], port: number, address: string, callback?: (error: Error | null, bytes: number) => void): void; - send(msg: Buffer | String | any[], offset: number, length: number, port: number, address: string, callback?: (error: Error | null, bytes: number) => void): void; - bind(port?: number, address?: string, callback?: () => void): void; - bind(port?: number, callback?: () => void): void; - bind(callback?: () => void): void; - bind(options: BindOptions, callback?: Function): void; - close(callback?: () => void): void; - address(): AddressInfo; - setBroadcast(flag: boolean): void; - setTTL(ttl: number): void; - setMulticastTTL(ttl: number): void; - setMulticastInterface(multicastInterface: string): void; - setMulticastLoopback(flag: boolean): void; - addMembership(multicastAddress: string, multicastInterface?: string): void; - dropMembership(multicastAddress: string, multicastInterface?: string): void; - ref(): this; - unref(): this; - setRecvBufferSize(size: number): void; - setSendBufferSize(size: number): void; - getRecvBufferSize(): number; - getSendBufferSize(): number; + export interface Socket extends events.EventEmitter { + send(msg: Buffer | String | any[], port: number, address: string, callback?: (error: Error, bytes: number) => void): void; + send(msg: Buffer | String | any[], offset: number, length: number, port: number, address: string, callback?: (error: Error, bytes: number) => void): void; + bind(port?: number, address?: string, callback?: () => void): void; + bind(options: BindOptions, callback?: Function): void; + close(callback?: () => void): void; + address(): AddressInfo; + setBroadcast(flag: boolean): void; + setTTL(ttl: number): void; + setMulticastTTL(ttl: number): void; + setMulticastLoopback(flag: boolean): void; + addMembership(multicastAddress: string, multicastInterface?: string): void; + dropMembership(multicastAddress: string, multicastInterface?: string): void; + ref(): this; + unref(): this; /** * events.EventEmitter @@ -2863,1736 +2338,586 @@ declare module "dgram" { * 2. error * 3. listening * 4. message - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "listening", listener: () => void): this; - addListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + **/ + addListener(event: string, listener: Function): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "listening", listener: () => void): this; + addListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "listening"): boolean; - emit(event: "message", msg: Buffer, rinfo: AddressInfo): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "listening"): boolean; + emit(event: "message", msg: Buffer, rinfo: AddressInfo): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "listening", listener: () => void): this; - on(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + on(event: string, listener: Function): this; + on(event: "close", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "listening", listener: () => void): this; + on(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "listening", listener: () => void): this; - once(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + once(event: string, listener: Function): this; + once(event: "close", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "listening", listener: () => void): this; + once(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "listening", listener: () => void): this; - prependListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "listening", listener: () => void): this; + prependListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "listening", listener: () => void): this; - prependOnceListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "listening", listener: () => void): this; + prependOnceListener(event: "message", listener: (msg: Buffer, rinfo: AddressInfo) => void): this; + } } declare module "fs" { - import * as stream from "stream"; - import * as events from "events"; - import { URL } from "url"; + import * as stream from "stream"; + import * as events from "events"; - /** - * Valid types for path values in "fs". - */ - export type PathLike = string | Buffer | URL; + interface Stats { + isFile(): boolean; + isDirectory(): boolean; + isBlockDevice(): boolean; + isCharacterDevice(): boolean; + isSymbolicLink(): boolean; + isFIFO(): boolean; + isSocket(): boolean; + dev: number; + ino: number; + mode: number; + nlink: number; + uid: number; + gid: number; + rdev: number; + size: number; + blksize: number; + blocks: number; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; + } - export class Stats { - isFile(): boolean; - isDirectory(): boolean; - isBlockDevice(): boolean; - isCharacterDevice(): boolean; - isSymbolicLink(): boolean; - isFIFO(): boolean; - isSocket(): boolean; - dev: number; - ino: number; - mode: number; - nlink: number; - uid: number; - gid: number; - rdev: number; - size: number; - blksize: number; - blocks: number; - atimeMs: number; - mtimeMs: number; - ctimeMs: number; - birthtimeMs: number; - atime: Date; - mtime: Date; - ctime: Date; - birthtime: Date; - } - - export interface FSWatcher extends events.EventEmitter { - close(): void; + interface FSWatcher extends events.EventEmitter { + close(): void; /** * events.EventEmitter * 1. change * 2. error */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - addListener(event: "error", listener: (error: Error) => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + addListener(event: "error", listener: (error: Error) => void): this; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - on(event: "error", listener: (error: Error) => void): this; + on(event: string, listener: Function): this; + on(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + on(event: "error", listener: (error: Error) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - once(event: "error", listener: (error: Error) => void): this; + once(event: string, listener: Function): this; + once(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + once(event: "error", listener: (error: Error) => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependListener(event: "error", listener: (error: Error) => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "change", listener: (eventType: string, filename: string | Buffer) => void): this; + prependOnceListener(event: "error", listener: (error: Error) => void): this; + } - export class ReadStream extends stream.Readable { - close(): void; - destroy(): void; - bytesRead: number; - path: string | Buffer; + export interface ReadStream extends stream.Readable { + close(): void; + destroy(): void; + bytesRead: number; + path: string | Buffer; /** * events.EventEmitter * 1. open * 2. close */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "open", listener: (fd: number) => void): this; - addListener(event: "close", listener: () => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "close", listener: () => void): this; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "open", listener: (fd: number) => void): this; - on(event: "close", listener: () => void): this; + on(event: string, listener: Function): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "close", listener: () => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "open", listener: (fd: number) => void): this; - once(event: "close", listener: () => void): this; + once(event: string, listener: Function): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "close", listener: () => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "open", listener: (fd: number) => void): this; - prependListener(event: "close", listener: () => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "close", listener: () => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "open", listener: (fd: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + } - export class WriteStream extends stream.Writable { - close(): void; - bytesWritten: number; - path: string | Buffer; + export interface WriteStream extends stream.Writable { + close(): void; + bytesWritten: number; + path: string | Buffer; /** * events.EventEmitter * 1. open * 2. close */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "open", listener: (fd: number) => void): this; - addListener(event: "close", listener: () => void): this; + addListener(event: string, listener: Function): this; + addListener(event: "open", listener: (fd: number) => void): this; + addListener(event: "close", listener: () => void): this; + + on(event: string, listener: Function): this; + on(event: "open", listener: (fd: number) => void): this; + on(event: "close", listener: () => void): this; + + once(event: string, listener: Function): this; + once(event: "open", listener: (fd: number) => void): this; + once(event: "close", listener: () => void): this; + + prependListener(event: string, listener: Function): this; + prependListener(event: "open", listener: (fd: number) => void): this; + prependListener(event: "close", listener: () => void): this; + + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "open", listener: (fd: number) => void): this; + prependOnceListener(event: "close", listener: () => void): this; + } + + /** + * Asynchronous rename. + * @param oldPath + * @param newPath + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function rename(oldPath: string, newPath: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + /** + * Synchronous rename + * @param oldPath + * @param newPath + */ + export function renameSync(oldPath: string, newPath: string): void; + export function truncate(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function truncate(path: string | Buffer, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function truncateSync(path: string | Buffer, len?: number): void; + export function ftruncate(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function ftruncate(fd: number, len: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function ftruncateSync(fd: number, len?: number): void; + export function chown(path: string | Buffer, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function chownSync(path: string | Buffer, uid: number, gid: number): void; + export function fchown(fd: number, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fchownSync(fd: number, uid: number, gid: number): void; + export function lchown(path: string | Buffer, uid: number, gid: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function lchownSync(path: string | Buffer, uid: number, gid: number): void; + export function chmod(path: string | Buffer, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function chmod(path: string | Buffer, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function chmodSync(path: string | Buffer, mode: number): void; + export function chmodSync(path: string | Buffer, mode: string): void; + export function fchmod(fd: number, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fchmod(fd: number, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fchmodSync(fd: number, mode: number): void; + export function fchmodSync(fd: number, mode: string): void; + export function lchmod(path: string | Buffer, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function lchmod(path: string | Buffer, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function lchmodSync(path: string | Buffer, mode: number): void; + export function lchmodSync(path: string | Buffer, mode: string): void; + export function stat(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; + export function lstat(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; + export function fstat(fd: number, callback?: (err: NodeJS.ErrnoException, stats: Stats) => any): void; + export function statSync(path: string | Buffer): Stats; + export function lstatSync(path: string | Buffer): Stats; + export function fstatSync(fd: number): Stats; + export function link(srcpath: string | Buffer, dstpath: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function linkSync(srcpath: string | Buffer, dstpath: string | Buffer): void; + export function symlink(srcpath: string | Buffer, dstpath: string | Buffer, type?: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function symlinkSync(srcpath: string | Buffer, dstpath: string | Buffer, type?: string): void; + export function readlink(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, linkString: string) => any): void; + export function readlinkSync(path: string | Buffer): string; + export function realpath(path: string | Buffer, callback?: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; + export function realpath(path: string | Buffer, cache: { [path: string]: string }, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => any): void; + export function realpathSync(path: string | Buffer, cache?: { [path: string]: string }): string; + /** + * Asynchronous unlink - deletes the file specified in {path} + * + * @param path + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function unlink(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + /** + * Synchronous unlink - deletes the file specified in {path} + * + * @param path + */ + export function unlinkSync(path: string | Buffer): void; + /** + * Asynchronous rmdir - removes the directory specified in {path} + * + * @param path + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function rmdir(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + /** + * Synchronous rmdir - removes the directory specified in {path} + * + * @param path + */ + export function rmdirSync(path: string | Buffer): void; + /** + * Asynchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. + * + * @param path + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function mkdir(path: string | Buffer, callback?: (err?: NodeJS.ErrnoException) => void): void; + /** + * Asynchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. + * + * @param path + * @param mode + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function mkdir(path: string | Buffer, mode: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + /** + * Asynchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. + * + * @param path + * @param mode + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function mkdir(path: string | Buffer, mode: string, callback?: (err?: NodeJS.ErrnoException) => void): void; + /** + * Synchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. + * + * @param path + * @param mode + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function mkdirSync(path: string | Buffer, mode?: number): void; + /** + * Synchronous mkdir - creates the directory specified in {path}. Parameter {mode} defaults to 0777. + * + * @param path + * @param mode + * @param callback No arguments other than a possible exception are given to the completion callback. + */ + export function mkdirSync(path: string | Buffer, mode?: string): void; + /** + * Asynchronous mkdtemp - Creates a unique temporary directory. Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * + * @param prefix + * @param callback The created folder path is passed as a string to the callback's second parameter. + */ + export function mkdtemp(prefix: string, callback?: (err: NodeJS.ErrnoException, folder: string) => void): void; + /** + * Synchronous mkdtemp - Creates a unique temporary directory. Generates six random characters to be appended behind a required prefix to create a unique temporary directory. + * + * @param prefix + * @returns Returns the created folder path. + */ + export function mkdtempSync(prefix: string): string; + export function readdir(path: string | Buffer, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; + export function readdir(path: string | Buffer, options: string | {}, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; + export function readdirSync(path: string | Buffer, options?: string | {}): string[]; + export function close(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function closeSync(fd: number): void; + export function open(path: string | Buffer, flags: string | number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; + export function open(path: string | Buffer, flags: string | number, mode: number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; + export function openSync(path: string | Buffer, flags: string | number, mode?: number): number; + export function utimes(path: string | Buffer, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function utimes(path: string | Buffer, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function utimesSync(path: string | Buffer, atime: number, mtime: number): void; + export function utimesSync(path: string | Buffer, atime: Date, mtime: Date): void; + export function futimes(fd: number, atime: number, mtime: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function futimesSync(fd: number, atime: number, mtime: number): void; + export function futimesSync(fd: number, atime: Date, mtime: Date): void; + export function fsync(fd: number, callback?: (err?: NodeJS.ErrnoException) => void): void; + export function fsyncSync(fd: number): void; + export function write(fd: number, buffer: Buffer, offset: number, length: number, position: number | null, callback?: (err: NodeJS.ErrnoException, written: number, buffer: Buffer) => void): void; + export function write(fd: number, buffer: Buffer, offset: number, length: number, callback?: (err: NodeJS.ErrnoException, written: number, buffer: Buffer) => void): void; + export function write(fd: number, data: any, callback?: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; + export function write(fd: number, data: any, offset: number, callback?: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; + export function write(fd: number, data: any, offset: number, encoding: string, callback?: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; + export function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position?: number | null): number; + export function writeSync(fd: number, data: any, position?: number | null, enconding?: string): number; + export function read(fd: number, buffer: Buffer, offset: number, length: number, position: number | null, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: Buffer) => void): void; + export function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number | null): number; + /** + * Asynchronous readFile - Asynchronously reads the entire contents of a file. + * + * @param fileName + * @param encoding + * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + */ + export function readFile(filename: string, encoding: null, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + export function readFile(filename: string, encoding: string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; + export function readFile(filename: string, encoding: string | null, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void; + /** + * Asynchronous readFile - Asynchronously reads the entire contents of a file. + * + * @param fileName + * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFile returns a string; otherwise it returns a Buffer. + * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + */ + export function readFile(filename: string, options: { encoding: null; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + export function readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string) => void): void; + export function readFile(filename: string, options: { encoding: string | null; flag?: string; }, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void; + /** + * Asynchronous readFile - Asynchronously reads the entire contents of a file. + * + * @param fileName + * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFile returns a string; otherwise it returns a Buffer. + * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + */ + export function readFile(filename: string, options: { flag?: string; }, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + /** + * Asynchronous readFile - Asynchronously reads the entire contents of a file. + * + * @param fileName + * @param callback - The callback is passed two arguments (err, data), where data is the contents of the file. + */ + export function readFile(filename: string, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; + /** + * Synchronous readFile - Synchronously reads the entire contents of a file. + * + * @param fileName + * @param encoding + */ + export function readFileSync(filename: string, encoding: null): Buffer; + export function readFileSync(filename: string, encoding: string): string; + export function readFileSync(filename: string, encoding: string | null): string | Buffer; + /** + * Synchronous readFile - Synchronously reads the entire contents of a file. + * + * @param fileName + * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFileSync returns a string; otherwise it returns a Buffer. + */ + export function readFileSync(filename: string, options: { encoding: null; flag?: string; }): Buffer; + export function readFileSync(filename: string, options: { encoding: string; flag?: string; }): string; + export function readFileSync(filename: string, options: { encoding: string | null; flag?: string; }): string | Buffer; + /** + * Synchronous readFile - Synchronously reads the entire contents of a file. + * + * @param fileName + * @param options An object with optional {encoding} and {flag} properties. If {encoding} is specified, readFileSync returns a string; otherwise it returns a Buffer. + */ + export function readFileSync(filename: string, options?: { flag?: string; }): Buffer; + export function writeFile(filename: string | number, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; + export function writeFile(filename: string | number, data: any, encoding: string, callback: (err: NodeJS.ErrnoException) => void): void; + export function writeFile(filename: string | number, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function writeFile(filename: string | number, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function writeFileSync(filename: string | number, data: any, encoding: string): void; + export function writeFileSync(filename: string | number, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; + export function writeFileSync(filename: string | number, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; + export function appendFile(filename: string, data: any, encoding: string, callback: (err: NodeJS.ErrnoException) => void): void; + export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: NodeJS.ErrnoException) => void): void; + export function appendFile(filename: string, data: any, callback?: (err: NodeJS.ErrnoException) => void): void; + export function appendFileSync(filename: string, data: any, encoding: string): void; + export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void; + export function appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void; + export function watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void; + export function watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void; + export function unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void; + export function watch(filename: string, listener?: (event: string, filename: string) => any): FSWatcher; + export function watch(filename: string, encoding: string, listener?: (event: string, filename: string | Buffer) => any): FSWatcher; + export function watch(filename: string, options: { persistent?: boolean; recursive?: boolean; encoding?: string }, listener?: (event: string, filename: string | Buffer) => any): FSWatcher; + export function exists(path: string | Buffer, callback?: (exists: boolean) => void): void; + export function existsSync(path: string | Buffer): boolean; + + export namespace constants { + // File Access Constants - on(event: string, listener: (...args: any[]) => void): this; - on(event: "open", listener: (fd: number) => void): this; - on(event: "close", listener: () => void): this; + /** Constant for fs.access(). File is visible to the calling process. */ + export const F_OK: number; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "open", listener: (fd: number) => void): this; - once(event: "close", listener: () => void): this; + /** Constant for fs.access(). File can be read by the calling process. */ + export const R_OK: number; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "open", listener: (fd: number) => void): this; - prependListener(event: "close", listener: () => void): this; + /** Constant for fs.access(). File can be written by the calling process. */ + export const W_OK: number; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "open", listener: (fd: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - } + /** Constant for fs.access(). File can be executed by the calling process. */ + export const X_OK: number; - /** - * Asynchronous rename(2) - Change the name or location of a file or directory. - * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function rename(oldPath: PathLike, newPath: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace rename { - /** - * Asynchronous rename(2) - Change the name or location of a file or directory. - * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function __promisify__(oldPath: PathLike, newPath: PathLike): Promise<void>; - } - - /** - * Synchronous rename(2) - Change the name or location of a file or directory. - * @param oldPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function renameSync(oldPath: PathLike, newPath: PathLike): void; - - /** - * Asynchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param len If not specified, defaults to `0`. - */ - export function truncate(path: PathLike, len: number | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function truncate(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace truncate { - /** - * Asynchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param len If not specified, defaults to `0`. - */ - export function __promisify__(path: PathLike, len?: number | null): Promise<void>; - } - - /** - * Synchronous truncate(2) - Truncate a file to a specified length. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param len If not specified, defaults to `0`. - */ - export function truncateSync(path: PathLike, len?: number | null): void; - - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - * @param len If not specified, defaults to `0`. - */ - export function ftruncate(fd: number, len: number | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - */ - export function ftruncate(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace ftruncate { - /** - * Asynchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - * @param len If not specified, defaults to `0`. - */ - export function __promisify__(fd: number, len?: number | null): Promise<void>; - } - - /** - * Synchronous ftruncate(2) - Truncate a file to a specified length. - * @param fd A file descriptor. - * @param len If not specified, defaults to `0`. - */ - export function ftruncateSync(fd: number, len?: number | null): void; - - /** - * Asynchronous chown(2) - Change ownership of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function chown(path: PathLike, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace chown { - /** - * Asynchronous chown(2) - Change ownership of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike, uid: number, gid: number): Promise<void>; - } - - /** - * Synchronous chown(2) - Change ownership of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function chownSync(path: PathLike, uid: number, gid: number): void; - - /** - * Asynchronous fchown(2) - Change ownership of a file. - * @param fd A file descriptor. - */ - export function fchown(fd: number, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fchown { - /** - * Asynchronous fchown(2) - Change ownership of a file. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number, uid: number, gid: number): Promise<void>; - } - - /** - * Synchronous fchown(2) - Change ownership of a file. - * @param fd A file descriptor. - */ - export function fchownSync(fd: number, uid: number, gid: number): void; - - /** - * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lchown(path: PathLike, uid: number, gid: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lchown { - /** - * Asynchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike, uid: number, gid: number): Promise<void>; - } - - /** - * Synchronous lchown(2) - Change ownership of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lchownSync(path: PathLike, uid: number, gid: number): void; - - /** - * Asynchronous chmod(2) - Change permissions of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function chmod(path: PathLike, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace chmod { - /** - * Asynchronous chmod(2) - Change permissions of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function __promisify__(path: PathLike, mode: string | number): Promise<void>; - } - - /** - * Synchronous chmod(2) - Change permissions of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function chmodSync(path: PathLike, mode: string | number): void; - - /** - * Asynchronous fchmod(2) - Change permissions of a file. - * @param fd A file descriptor. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function fchmod(fd: number, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fchmod { - /** - * Asynchronous fchmod(2) - Change permissions of a file. - * @param fd A file descriptor. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function __promisify__(fd: number, mode: string | number): Promise<void>; - } - - /** - * Synchronous fchmod(2) - Change permissions of a file. - * @param fd A file descriptor. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function fchmodSync(fd: number, mode: string | number): void; - - /** - * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function lchmod(path: PathLike, mode: string | number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lchmod { - /** - * Asynchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function __promisify__(path: PathLike, mode: string | number): Promise<void>; - } - - /** - * Synchronous lchmod(2) - Change permissions of a file. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. - */ - export function lchmodSync(path: PathLike, mode: string | number): void; - - /** - * Asynchronous stat(2) - Get file status. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function stat(path: PathLike, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace stat { - /** - * Asynchronous stat(2) - Get file status. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise<Stats>; - } - - /** - * Synchronous stat(2) - Get file status. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function statSync(path: PathLike): Stats; - - /** - * Asynchronous fstat(2) - Get file status. - * @param fd A file descriptor. - */ - export function fstat(fd: number, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fstat { - /** - * Asynchronous fstat(2) - Get file status. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise<Stats>; - } - - /** - * Synchronous fstat(2) - Get file status. - * @param fd A file descriptor. - */ - export function fstatSync(fd: number): Stats; - - /** - * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lstat(path: PathLike, callback: (err: NodeJS.ErrnoException, stats: Stats) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace lstat { - /** - * Asynchronous lstat(2) - Get file status. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise<Stats>; - } - - /** - * Synchronous lstat(2) - Get file status. Does not dereference symbolic links. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function lstatSync(path: PathLike): Stats; - - /** - * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. - * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function link(existingPath: PathLike, newPath: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace link { - /** - * Asynchronous link(2) - Create a new link (also known as a hard link) to an existing file. - * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function link(existingPath: PathLike, newPath: PathLike): Promise<void>; - } - - /** - * Synchronous link(2) - Create a new link (also known as a hard link) to an existing file. - * @param existingPath A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param newPath A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function linkSync(existingPath: PathLike, newPath: PathLike): void; - - /** - * Asynchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). - * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. - */ - export function symlink(target: PathLike, path: PathLike, type: string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - */ - export function symlink(target: PathLike, path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace symlink { - /** - * Asynchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). - * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. - */ - export function __promisify__(target: PathLike, path: PathLike, type?: string | null): Promise<void>; - } + // File Open Constants - /** - * Synchronous symlink(2) - Create a new symbolic link to an existing file. - * @param target A path to an existing file. If a URL is provided, it must use the `file:` protocol. - * @param path A path to the new symlink. If a URL is provided, it must use the `file:` protocol. - * @param type May be set to `'dir'`, `'file'`, or `'junction'` (default is `'file'`) and is only available on Windows (ignored on other platforms). - * When using `'junction'`, the `target` argument will automatically be normalized to an absolute path. - */ - export function symlinkSync(target: PathLike, path: PathLike, type?: string | null): void; + /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ + export const O_RDONLY: number; - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlink(path: PathLike, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, linkString: string) => void): void; + /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ + export const O_WRONLY: number; - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlink(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, linkString: Buffer) => void): void; + /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ + export const O_RDWR: number; - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlink(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, linkString: string | Buffer) => void): void; + /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ + export const O_CREAT: number; - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function readlink(path: PathLike, callback: (err: NodeJS.ErrnoException, linkString: string) => void): void; + /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ + export const O_EXCL: number; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace readlink { - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise<string>; + /** Constant for fs.open(). Flag indicating that if path identifies a terminal device, opening the path shall not cause that terminal to become the controlling terminal for the process (if the process does not already have one). */ + export const O_NOCTTY: number; - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise<Buffer>; + /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ + export const O_TRUNC: number; - /** - * Asynchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise<string | Buffer>; - } + /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ + export const O_APPEND: number; - /** - * Synchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlinkSync(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; + /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ + export const O_DIRECTORY: number; - /** - * Synchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlinkSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer; + /** Constant for fs.open(). Flag indicating reading accesses to the file system will no longer result in an update to the atime information associated with the file. This flag is available on Linux operating systems only. */ + export const O_NOATIME: number; - /** - * Synchronous readlink(2) - read value of a symbolic link. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readlinkSync(path: PathLike, options?: { encoding?: string | null } | string | null): string | Buffer; + /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ + export const O_NOFOLLOW: number; - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpath(path: PathLike, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; + /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ + export const O_SYNC: number; - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpath(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, resolvedPath: Buffer) => void): void; + /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ + export const O_SYMLINK: number; - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpath(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, resolvedPath: string | Buffer) => void): void; + /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ + export const O_DIRECT: number; - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function realpath(path: PathLike, callback: (err: NodeJS.ErrnoException, resolvedPath: string) => void): void; + /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ + export const O_NONBLOCK: number; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace realpath { - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise<string>; + // File Type Constants - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options: { encoding: "buffer" } | "buffer"): Promise<Buffer>; + /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ + export const S_IFMT: number; - /** - * Asynchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise<string | Buffer>; - } + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ + export const S_IFREG: number; - /** - * Synchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpathSync(path: PathLike, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ + export const S_IFDIR: number; - /** - * Synchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpathSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ + export const S_IFCHR: number; - /** - * Synchronous realpath(3) - return the canonicalized absolute pathname. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function realpathSync(path: PathLike, options?: { encoding?: string | null } | string | null): string | Buffer; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ + export const S_IFBLK: number; - /** - * Asynchronous unlink(2) - delete a name and possibly the file it refers to. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function unlink(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ + export const S_IFIFO: number; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace unlink { - /** - * Asynchronous unlink(2) - delete a name and possibly the file it refers to. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise<void>; - } + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ + export const S_IFLNK: number; - /** - * Synchronous unlink(2) - delete a name and possibly the file it refers to. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function unlinkSync(path: PathLike): void; + /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ + export const S_IFSOCK: number; - /** - * Asynchronous rmdir(2) - delete a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function rmdir(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + // File Mode Constants - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace rmdir { - /** - * Asynchronous rmdir(2) - delete a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function __promisify__(path: PathLike): Promise<void>; - } + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ + export const S_IRWXU: number; - /** - * Synchronous rmdir(2) - delete a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function rmdirSync(path: PathLike): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ + export const S_IRUSR: number; - /** - * Asynchronous mkdir(2) - create a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. - */ - export function mkdir(path: PathLike, mode: number | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ + export const S_IWUSR: number; - /** - * Asynchronous mkdir(2) - create a directory with a mode of `0o777`. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function mkdir(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ + export const S_IXUSR: number; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace mkdir { - /** - * Asynchronous mkdir(2) - create a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. - */ - export function __promisify__(path: PathLike, mode?: number | string | null): Promise<void>; - } + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ + export const S_IRWXG: number; - /** - * Synchronous mkdir(2) - create a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not specified, defaults to `0o777`. - */ - export function mkdirSync(path: PathLike, mode?: number | string | null): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ + export const S_IRGRP: number; - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtemp(prefix: string, options: { encoding?: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, folder: string) => void): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ + export const S_IWGRP: number; - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtemp(prefix: string, options: "buffer" | { encoding: "buffer" }, callback: (err: NodeJS.ErrnoException, folder: Buffer) => void): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ + export const S_IXGRP: number; - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtemp(prefix: string, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, folder: string | Buffer) => void): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ + export const S_IRWXO: number; - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - */ - export function mkdtemp(prefix: string, callback: (err: NodeJS.ErrnoException, folder: string) => void): void; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ + export const S_IROTH: number; - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace mkdtemp { - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(prefix: string, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): Promise<string>; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ + export const S_IWOTH: number; - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(prefix: string, options: { encoding: "buffer" } | "buffer"): Promise<Buffer>; - - /** - * Asynchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(prefix: string, options?: { encoding?: string | null } | string | null): Promise<string | Buffer>; - } - - /** - * Synchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtempSync(prefix: string, options?: { encoding?: BufferEncoding | null } | BufferEncoding | null): string; - - /** - * Synchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtempSync(prefix: string, options: { encoding: "buffer" } | "buffer"): Buffer; - - /** - * Synchronously creates a unique temporary directory. - * Generates six random characters to be appended behind a required prefix to create a unique temporary directory. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function mkdtempSync(prefix: string, options?: { encoding?: string | null } | string | null): string | Buffer; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdir(path: PathLike, options: { encoding: BufferEncoding | null } | BufferEncoding | undefined | null, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdir(path: PathLike, options: { encoding: "buffer" } | "buffer", callback: (err: NodeJS.ErrnoException, files: Buffer[]) => void): void; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdir(path: PathLike, options: { encoding?: string | null } | string | undefined | null, callback: (err: NodeJS.ErrnoException, files: string[] | Buffer[]) => void): void; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function readdir(path: PathLike, callback: (err: NodeJS.ErrnoException, files: string[]) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace readdir { - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding: BufferEncoding | null } | BufferEncoding | null): Promise<string[]>; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options: "buffer" | { encoding: "buffer" }): Promise<Buffer[]>; - - /** - * Asynchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function __promisify__(path: PathLike, options?: { encoding?: string | null } | string | null): Promise<string[] | Buffer[]>; - } - - /** - * Synchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdirSync(path: PathLike, options?: { encoding: BufferEncoding | null } | BufferEncoding | null): string[]; - - /** - * Synchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdirSync(path: PathLike, options: { encoding: "buffer" } | "buffer"): Buffer[]; - - /** - * Synchronous readdir(3) - read a directory. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param options The encoding (or an object specifying the encoding), used as the encoding of the result. If not provided, `'utf8'` is used. - */ - export function readdirSync(path: PathLike, options?: { encoding?: string | null } | string | null): string[] | Buffer[]; - - /** - * Asynchronous close(2) - close a file descriptor. - * @param fd A file descriptor. - */ - export function close(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace close { - /** - * Asynchronous close(2) - close a file descriptor. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise<void>; - } - - /** - * Synchronous close(2) - close a file descriptor. - * @param fd A file descriptor. - */ - export function closeSync(fd: number): void; - - /** - * Asynchronous open(2) - open and possibly create a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. - */ - export function open(path: PathLike, flags: string | number, mode: string | number | undefined | null, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; - - /** - * Asynchronous open(2) - open and possibly create a file. If the file is created, its mode will be `0o666`. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - */ - export function open(path: PathLike, flags: string | number, callback: (err: NodeJS.ErrnoException, fd: number) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace open { - /** - * Asynchronous open(2) - open and possibly create a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. - */ - export function __promisify__(path: PathLike, flags: string | number, mode?: string | number | null): Promise<number>; - } - - /** - * Synchronous open(2) - open and possibly create a file, returning a file descriptor.. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param mode A file mode. If a string is passed, it is parsed as an octal integer. If not supplied, defaults to `0o666`. - */ - export function openSync(path: PathLike, flags: string | number, mode?: string | number | null): number; + /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ + export const S_IXOTH: number; + } - /** - * Asynchronously change file timestamps of the file referenced by the supplied path. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function utimes(path: PathLike, atime: string | number | Date, mtime: string | number | Date, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace utimes { - /** - * Asynchronously change file timestamps of the file referenced by the supplied path. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function __promisify__(path: PathLike, atime: string | number | Date, mtime: string | number | Date): Promise<void>; - } - - /** - * Synchronously change file timestamps of the file referenced by the supplied path. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function utimesSync(path: PathLike, atime: string | number | Date, mtime: string | number | Date): void; - - /** - * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function futimes(fd: number, atime: string | number | Date, mtime: string | number | Date, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace futimes { - /** - * Asynchronously change file timestamps of the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function __promisify__(fd: number, atime: string | number | Date, mtime: string | number | Date): Promise<void>; - } - - /** - * Synchronously change file timestamps of the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param atime The last access time. If a string is provided, it will be coerced to number. - * @param mtime The last modified time. If a string is provided, it will be coerced to number. - */ - export function futimesSync(fd: number, atime: string | number | Date, mtime: string | number | Date): void; - - /** - * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - * @param fd A file descriptor. - */ - export function fsync(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fsync { - /** - * Asynchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise<void>; - } - - /** - * Synchronous fsync(2) - synchronize a file's in-core state with the underlying storage device. - * @param fd A file descriptor. - */ - export function fsyncSync(fd: number): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function write<TBuffer extends Buffer | Uint8Array>(fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, position: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - */ - export function write<TBuffer extends Buffer | Uint8Array>(fd: number, buffer: TBuffer, offset: number | undefined | null, length: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - */ - export function write<TBuffer extends Buffer | Uint8Array>(fd: number, buffer: TBuffer, offset: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - */ - export function write<TBuffer extends Buffer | Uint8Array>(fd: number, buffer: TBuffer, callback: (err: NodeJS.ErrnoException, written: number, buffer: TBuffer) => void): void; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - export function write(fd: number, string: any, position: number | undefined | null, encoding: string | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function write(fd: number, string: any, position: number | undefined | null, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - */ - export function write(fd: number, string: any, callback: (err: NodeJS.ErrnoException, written: number, str: string) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace write { - /** - * Asynchronously writes `buffer` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function __promisify__<TBuffer extends Buffer | Uint8Array>(fd: number, buffer?: TBuffer, offset?: number, length?: number, position?: number | null): Promise<{ bytesWritten: number, buffer: TBuffer }>; - - /** - * Asynchronously writes `string` to the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - export function __promisify__(fd: number, string: any, position?: number | null, encoding?: string | null): Promise<{ bytesWritten: number, buffer: string }>; - } - - /** - * Synchronously writes `buffer` to the file referenced by the supplied file descriptor, returning the number of bytes written. - * @param fd A file descriptor. - * @param offset The part of the buffer to be written. If not supplied, defaults to `0`. - * @param length The number of bytes to write. If not supplied, defaults to `buffer.length - offset`. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - */ - export function writeSync(fd: number, buffer: Buffer | Uint8Array, offset?: number | null, length?: number | null, position?: number | null): number; - - /** - * Synchronously writes `string` to the file referenced by the supplied file descriptor, returning the number of bytes written. - * @param fd A file descriptor. - * @param string A string to write. If something other than a string is supplied it will be coerced to a string. - * @param position The offset from the beginning of the file where this data should be written. If not supplied, defaults to the current position. - * @param encoding The expected string encoding. - */ - export function writeSync(fd: number, string: any, position?: number | null, encoding?: string | null): number; - - /** - * Asynchronously reads data from the file referenced by the supplied file descriptor. - * @param fd A file descriptor. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. - */ - export function read<TBuffer extends Buffer | Uint8Array>(fd: number, buffer: TBuffer, offset: number, length: number, position: number | null, callback?: (err: NodeJS.ErrnoException, bytesRead: number, buffer: TBuffer) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace read { - /** - * @param fd A file descriptor. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. - */ - export function __promisify__<TBuffer extends Buffer | Uint8Array>(fd: number, buffer: TBuffer, offset: number, length: number, position: number | null): Promise<{ bytesRead: number, buffer: TBuffer }>; - } - - /** - * Synchronously reads data from the file referenced by the supplied file descriptor, returning the number of bytes read. - * @param fd A file descriptor. - * @param buffer The buffer that the data will be written to. - * @param offset The offset in the buffer at which to start writing. - * @param length The number of bytes to read. - * @param position The offset from the beginning of the file from which data should be read. If `null`, data will be read from the current position. - */ - export function readSync(fd: number, buffer: Buffer | Uint8Array, offset: number, length: number, position: number | null): number; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFile(path: PathLike | number, options: { encoding?: null; flag?: string; } | undefined | null, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFile(path: PathLike | number, options: { encoding: string; flag?: string; } | string, callback: (err: NodeJS.ErrnoException, data: string) => void): void; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFile(path: PathLike | number, options: { encoding?: string | null; flag?: string; } | string | undefined | null, callback: (err: NodeJS.ErrnoException, data: string | Buffer) => void): void; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - */ - export function readFile(path: PathLike | number, callback: (err: NodeJS.ErrnoException, data: Buffer) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace readFile { - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function __promisify__(path: PathLike | number, options?: { encoding?: null; flag?: string; } | null): Promise<Buffer>; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function __promisify__(path: PathLike | number, options: { encoding: string; flag?: string; } | string): Promise<string>; - - /** - * Asynchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function __promisify__(path: PathLike | number, options?: { encoding?: string | null; flag?: string; } | string | null): Promise<string | Buffer>; - } - - /** - * Synchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options An object that may contain an optional flag. If a flag is not provided, it defaults to `'r'`. - */ - export function readFileSync(path: PathLike | number, options?: { encoding?: null; flag?: string; } | null): Buffer; - - /** - * Synchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFileSync(path: PathLike | number, options: { encoding: string; flag?: string; } | string): string; - - /** - * Synchronously reads the entire contents of a file. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param options Either the encoding for the result, or an object that contains the encoding and an optional flag. - * If a flag is not provided, it defaults to `'r'`. - */ - export function readFileSync(path: PathLike | number, options?: { encoding?: string | null; flag?: string; } | string | null): string | Buffer; - - /** - * Asynchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - export function writeFile(path: PathLike | number, data: any, options: { encoding?: string | null; mode?: number | string; flag?: string; } | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - */ - export function writeFile(path: PathLike | number, data: any, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace writeFile { - /** - * Asynchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - export function __promisify__(path: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): Promise<void>; - } - - /** - * Synchronously writes data to a file, replacing the file if it already exists. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'w'` is used. - */ - export function writeFileSync(path: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): void; - - /** - * Asynchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - export function appendFile(file: PathLike | number, data: any, options: { encoding?: string | null, mode?: string | number, flag?: string } | string | undefined | null, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - */ - export function appendFile(file: PathLike | number, data: any, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace appendFile { - /** - * Asynchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - export function __promisify__(file: PathLike | number, data: any, options?: { encoding?: string | null, mode?: string | number, flag?: string } | string | null): Promise<void>; - } - - /** - * Synchronously append data to a file, creating the file if it does not exist. - * @param file A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * If a file descriptor is provided, the underlying file will _not_ be closed automatically. - * @param data The data to write. If something other than a Buffer or Uint8Array is provided, the value is coerced to a string. - * @param options Either the encoding for the file, or an object optionally specifying the encoding, file mode, and flag. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `mode` is not supplied, the default of `0o666` is used. - * If `mode` is a string, it is parsed as an octal integer. - * If `flag` is not supplied, the default of `'a'` is used. - */ - export function appendFileSync(file: PathLike | number, data: any, options?: { encoding?: string | null; mode?: number | string; flag?: string; } | string | null): void; - - /** - * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. - */ - export function watchFile(filename: PathLike, options: { persistent?: boolean; interval?: number; } | undefined, listener: (curr: Stats, prev: Stats) => void): void; - - /** - * Watch for changes on `filename`. The callback `listener` will be called each time the file is accessed. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function watchFile(filename: PathLike, listener: (curr: Stats, prev: Stats) => void): void; - - /** - * Stop watching for changes on `filename`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function unwatchFile(filename: PathLike, listener?: (curr: Stats, prev: Stats) => void): void; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `persistent` is not supplied, the default of `true` is used. - * If `recursive` is not supplied, the default of `false` is used. - */ - export function watch(filename: PathLike, options: { encoding?: BufferEncoding | null, persistent?: boolean, recursive?: boolean } | BufferEncoding | undefined | null, listener?: (event: string, filename: string) => void): FSWatcher; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `persistent` is not supplied, the default of `true` is used. - * If `recursive` is not supplied, the default of `false` is used. - */ - export function watch(filename: PathLike, options: { encoding: "buffer", persistent?: boolean, recursive?: boolean } | "buffer", listener?: (event: string, filename: Buffer) => void): FSWatcher; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - * @param options Either the encoding for the filename provided to the listener, or an object optionally specifying encoding, persistent, and recursive options. - * If `encoding` is not supplied, the default of `'utf8'` is used. - * If `persistent` is not supplied, the default of `true` is used. - * If `recursive` is not supplied, the default of `false` is used. - */ - export function watch(filename: PathLike, options: { encoding?: string | null, persistent?: boolean, recursive?: boolean } | string | null, listener?: (event: string, filename: string | Buffer) => void): FSWatcher; - - /** - * Watch for changes on `filename`, where `filename` is either a file or a directory, returning an `FSWatcher`. - * @param filename A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function watch(filename: PathLike, listener?: (event: string, filename: string) => any): FSWatcher; - - /** - * Asynchronously tests whether or not the given path exists by checking with the file system. - * @deprecated - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function exists(path: PathLike, callback: (exists: boolean) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace exists { - /** - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - function __promisify__(path: PathLike): Promise<boolean>; - } - - /** - * Synchronously tests whether or not the given path exists by checking with the file system. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function existsSync(path: PathLike): boolean; - - export namespace constants { - // File Access Constants - - /** Constant for fs.access(). File is visible to the calling process. */ - export const F_OK: number; - - /** Constant for fs.access(). File can be read by the calling process. */ - export const R_OK: number; - - /** Constant for fs.access(). File can be written by the calling process. */ - export const W_OK: number; - - /** Constant for fs.access(). File can be executed by the calling process. */ - export const X_OK: number; - - // File Open Constants - - /** Constant for fs.open(). Flag indicating to open a file for read-only access. */ - export const O_RDONLY: number; - - /** Constant for fs.open(). Flag indicating to open a file for write-only access. */ - export const O_WRONLY: number; - - /** Constant for fs.open(). Flag indicating to open a file for read-write access. */ - export const O_RDWR: number; - - /** Constant for fs.open(). Flag indicating to create the file if it does not already exist. */ - export const O_CREAT: number; - - /** Constant for fs.open(). Flag indicating that opening a file should fail if the O_CREAT flag is set and the file already exists. */ - export const O_EXCL: number; - - /** Constant for fs.open(). Flag indicating that if path identifies a terminal device, opening the path shall not cause that terminal to become the controlling terminal for the process (if the process does not already have one). */ - export const O_NOCTTY: number; - - /** Constant for fs.open(). Flag indicating that if the file exists and is a regular file, and the file is opened successfully for write access, its length shall be truncated to zero. */ - export const O_TRUNC: number; - - /** Constant for fs.open(). Flag indicating that data will be appended to the end of the file. */ - export const O_APPEND: number; - - /** Constant for fs.open(). Flag indicating that the open should fail if the path is not a directory. */ - export const O_DIRECTORY: number; - - /** Constant for fs.open(). Flag indicating reading accesses to the file system will no longer result in an update to the atime information associated with the file. This flag is available on Linux operating systems only. */ - export const O_NOATIME: number; - - /** Constant for fs.open(). Flag indicating that the open should fail if the path is a symbolic link. */ - export const O_NOFOLLOW: number; - - /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O. */ - export const O_SYNC: number; - - /** Constant for fs.open(). Flag indicating that the file is opened for synchronous I/O with write operations waiting for data integrity. */ - export const O_DSYNC: number; - - /** Constant for fs.open(). Flag indicating to open the symbolic link itself rather than the resource it is pointing to. */ - export const O_SYMLINK: number; - - /** Constant for fs.open(). When set, an attempt will be made to minimize caching effects of file I/O. */ - export const O_DIRECT: number; - - /** Constant for fs.open(). Flag indicating to open the file in nonblocking mode when possible. */ - export const O_NONBLOCK: number; - - // File Type Constants - - /** Constant for fs.Stats mode property for determining a file's type. Bit mask used to extract the file type code. */ - export const S_IFMT: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a regular file. */ - export const S_IFREG: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a directory. */ - export const S_IFDIR: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a character-oriented device file. */ - export const S_IFCHR: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a block-oriented device file. */ - export const S_IFBLK: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a FIFO/pipe. */ - export const S_IFIFO: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a symbolic link. */ - export const S_IFLNK: number; - - /** Constant for fs.Stats mode property for determining a file's type. File type constant for a socket. */ - export const S_IFSOCK: number; - - // File Mode Constants - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by owner. */ - export const S_IRWXU: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by owner. */ - export const S_IRUSR: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by owner. */ - export const S_IWUSR: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by owner. */ - export const S_IXUSR: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by group. */ - export const S_IRWXG: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by group. */ - export const S_IRGRP: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by group. */ - export const S_IWGRP: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by group. */ - export const S_IXGRP: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable, writable and executable by others. */ - export const S_IRWXO: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating readable by others. */ - export const S_IROTH: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating writable by others. */ - export const S_IWOTH: number; - - /** Constant for fs.Stats mode property for determining access permissions for a file. File mode indicating executable by others. */ - export const S_IXOTH: number; - - /** Constant for fs.copyFile. Flag indicating the destination file should not be overwritten if it already exists. */ - export const COPYFILE_EXCL: number; - } - - /** - * Asynchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function access(path: PathLike, mode: number | undefined, callback: (err: NodeJS.ErrnoException) => void): void; - - /** - * Asynchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function access(path: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace access { - /** - * Asynchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function __promisify__(path: PathLike, mode?: number): Promise<void>; - } - - /** - * Synchronously tests a user's permissions for the file specified by path. - * @param path A path to a file or directory. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function accessSync(path: PathLike, mode?: number): void; - - /** - * Returns a new `ReadStream` object. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function createReadStream(path: PathLike, options?: string | { - flags?: string; - encoding?: string; - fd?: number; - mode?: number; - autoClose?: boolean; - start?: number; - end?: number; - highWaterMark?: number; - }): ReadStream; - - /** - * Returns a new `WriteStream` object. - * @param path A path to a file. If a URL is provided, it must use the `file:` protocol. - * URL support is _experimental_. - */ - export function createWriteStream(path: PathLike, options?: string | { - flags?: string; - encoding?: string; - fd?: number; - mode?: number; - autoClose?: boolean; - start?: number; - }): WriteStream; - - /** - * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. - * @param fd A file descriptor. - */ - export function fdatasync(fd: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace fdatasync { - /** - * Asynchronous fdatasync(2) - synchronize a file's in-core state with storage device. - * @param fd A file descriptor. - */ - export function __promisify__(fd: number): Promise<void>; - } - - /** - * Synchronous fdatasync(2) - synchronize a file's in-core state with storage device. - * @param fd A file descriptor. - */ - export function fdatasyncSync(fd: number): void; - - /** - * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. - * No arguments other than a possible exception are given to the callback function. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - */ - export function copyFile(src: PathLike, dest: PathLike, callback: (err: NodeJS.ErrnoException) => void): void; - /** - * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. - * No arguments other than a possible exception are given to the callback function. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - * @param flags An integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. - */ - export function copyFile(src: PathLike, dest: PathLike, flags: number, callback: (err: NodeJS.ErrnoException) => void): void; - - // NOTE: This namespace provides design-time support for util.promisify. Exported members do not exist at runtime. - export namespace copyFile { - /** - * Asynchronously copies src to dest. By default, dest is overwritten if it already exists. - * No arguments other than a possible exception are given to the callback function. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - * @param flags An optional integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. - */ - export function __promisify__(src: PathLike, dst: PathLike, flags?: number): Promise<void>; - } - - /** - * Synchronously copies src to dest. By default, dest is overwritten if it already exists. - * Node.js makes no guarantees about the atomicity of the copy operation. - * If an error occurs after the destination file has been opened for writing, Node.js will attempt - * to remove the destination. - * @param src A path to the source file. - * @param dest A path to the destination file. - * @param flags An optional integer that specifies the behavior of the copy operation. The only supported flag is fs.constants.COPYFILE_EXCL, which causes the copy operation to fail if dest already exists. - */ - export function copyFileSync(src: PathLike, dest: PathLike, flags?: number): void; + /** Tests a user's permissions for the file specified by path. */ + export function access(path: string | Buffer, callback: (err: NodeJS.ErrnoException) => void): void; + export function access(path: string | Buffer, mode: number, callback: (err: NodeJS.ErrnoException) => void): void; + /** Synchronous version of fs.access. This throws if any accessibility checks fail, and does nothing otherwise. */ + export function accessSync(path: string | Buffer, mode?: number): void; + export function createReadStream(path: string | Buffer, options?: { + flags?: string; + encoding?: string; + fd?: number; + mode?: number; + autoClose?: boolean; + start?: number; + end?: number; + }): ReadStream; + export function createWriteStream(path: string | Buffer, options?: { + flags?: string; + encoding?: string; + fd?: number; + mode?: number; + autoClose?: boolean; + start?: number; + }): WriteStream; + export function fdatasync(fd: number, callback: Function): void; + export function fdatasyncSync(fd: number): void; } declare module "path" { + /** * A parsed path object generated by path.parse() or consumed by path.format(). */ - export interface ParsedPath { + export interface ParsedPath { /** * The root of the path such as '/' or 'c:\' */ - root: string; + root: string; /** * The full directory path such as '/home/user/dir' or 'c:\path\dir' */ - dir: string; + dir: string; /** * The file name including extension (if any) such as 'index.html' */ - base: string; + base: string; /** * The file extension (if any) such as '.html' */ - ext: string; + ext: string; /** * The file name without extension (if any) such as 'index' */ - name: string; - } - export interface FormatInputPathObject { - /** - * The root of the path such as '/' or 'c:\' - */ - root?: string; - /** - * The full directory path such as '/home/user/dir' or 'c:\path\dir' - */ - dir?: string; - /** - * The file name including extension (if any) such as 'index.html' - */ - base?: string; - /** - * The file extension (if any) such as '.html' - */ - ext?: string; - /** - * The file name without extension (if any) such as 'index' - */ - name?: string; - } + name: string; + } /** * Normalize a string path, reducing '..' and '.' parts. @@ -4600,14 +2925,14 @@ declare module "path" { * * @param p string path to normalize. */ - export function normalize(p: string): string; + export function normalize(p: string): string; /** * Join all arguments together and normalize the resulting path. * Arguments must be strings. In v0.8, non-string arguments were silently ignored. In v0.10 and up, an exception is thrown. * * @param paths paths to join. */ - export function join(...paths: string[]): string; + export function join(...paths: string[]): string; /** * The right-most parameter is considered {to}. Other parameters are considered an array of {from}. * @@ -4617,24 +2942,27 @@ declare module "path" { * * @param pathSegments string paths to join. Non-string arguments are ignored. */ - export function resolve(...pathSegments: string[]): string; + export function resolve(...pathSegments: any[]): string; /** * Determines whether {path} is an absolute path. An absolute path will always resolve to the same location, regardless of the working directory. * * @param path path to test. */ - export function isAbsolute(path: string): boolean; + export function isAbsolute(path: string): boolean; /** * Solve the relative path from {from} to {to}. * At times we have two absolute paths, and we need to derive the relative path from one to the other. This is actually the reverse transform of path.resolve. + * + * @param from + * @param to */ - export function relative(from: string, to: string): string; + export function relative(from: string, to: string): string; /** * Return the directory name of a path. Similar to the Unix dirname command. * * @param p the path to evaluate. */ - export function dirname(p: string): string; + export function dirname(p: string): string; /** * Return the last portion of a path. Similar to the Unix basename command. * Often used to extract the file name from a fully qualified path. @@ -4642,177 +2970,176 @@ declare module "path" { * @param p the path to evaluate. * @param ext optionally, an extension to remove from the result. */ - export function basename(p: string, ext?: string): string; + export function basename(p: string, ext?: string): string; /** * Return the extension of the path, from the last '.' to end of string in the last portion of the path. * If there is no '.' in the last portion of the path or the first character of it is '.', then it returns an empty string * * @param p the path to evaluate. */ - export function extname(p: string): string; + export function extname(p: string): string; /** * The platform-specific file separator. '\\' or '/'. */ - export var sep: string; + export var sep: string; /** * The platform-specific file delimiter. ';' or ':'. */ - export var delimiter: string; + export var delimiter: string; /** * Returns an object from a path string - the opposite of format(). * * @param pathString path to evaluate. */ - export function parse(pathString: string): ParsedPath; + export function parse(pathString: string): ParsedPath; /** * Returns a path string from an object - the opposite of parse(). * * @param pathString path to evaluate. */ - export function format(pathObject: FormatInputPathObject): string; + export function format(pathObject: ParsedPath): string; - export module posix { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function isAbsolute(p: string): boolean; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; - export var delimiter: string; - export function parse(p: string): ParsedPath; - export function format(pP: FormatInputPathObject): string; - } + export module posix { + export function normalize(p: string): string; + export function join(...paths: any[]): string; + export function resolve(...pathSegments: any[]): string; + export function isAbsolute(p: string): boolean; + export function relative(from: string, to: string): string; + export function dirname(p: string): string; + export function basename(p: string, ext?: string): string; + export function extname(p: string): string; + export var sep: string; + export var delimiter: string; + export function parse(p: string): ParsedPath; + export function format(pP: ParsedPath): string; + } - export module win32 { - export function normalize(p: string): string; - export function join(...paths: any[]): string; - export function resolve(...pathSegments: any[]): string; - export function isAbsolute(p: string): boolean; - export function relative(from: string, to: string): string; - export function dirname(p: string): string; - export function basename(p: string, ext?: string): string; - export function extname(p: string): string; - export var sep: string; - export var delimiter: string; - export function parse(p: string): ParsedPath; - export function format(pP: FormatInputPathObject): string; - } + export module win32 { + export function normalize(p: string): string; + export function join(...paths: any[]): string; + export function resolve(...pathSegments: any[]): string; + export function isAbsolute(p: string): boolean; + export function relative(from: string, to: string): string; + export function dirname(p: string): string; + export function basename(p: string, ext?: string): string; + export function extname(p: string): string; + export var sep: string; + export var delimiter: string; + export function parse(p: string): ParsedPath; + export function format(pP: ParsedPath): string; + } } declare module "string_decoder" { - export interface NodeStringDecoder { - write(buffer: Buffer): string; - end(buffer?: Buffer): string; - } - export var StringDecoder: { - new(encoding?: string): NodeStringDecoder; - }; + export interface NodeStringDecoder { + write(buffer: Buffer): string; + end(buffer?: Buffer): string; + } + export var StringDecoder: { + new(encoding?: string): NodeStringDecoder; + }; } declare module "tls" { - import * as crypto from "crypto"; - import * as dns from "dns"; - import * as net from "net"; - import * as stream from "stream"; + import * as crypto from "crypto"; + import * as net from "net"; + import * as stream from "stream"; - var CLIENT_RENEG_LIMIT: number; - var CLIENT_RENEG_WINDOW: number; + var CLIENT_RENEG_LIMIT: number; + var CLIENT_RENEG_WINDOW: number; - export interface Certificate { + export interface Certificate { /** * Country code. */ - C: string; + C: string; /** * Street. */ - ST: string; + ST: string; /** * Locality. */ - L: string; + L: string; /** * Organization. */ - O: string; + O: string; /** * Organizational unit. */ - OU: string; + OU: string; /** * Common name. */ - CN: string; - } + CN: string; + } - export interface PeerCertificate { - subject: Certificate; - issuer: Certificate; - subjectaltname: string; - infoAccess: { [index: string]: string[] | undefined }; - modulus: string; - exponent: string; - valid_from: string; - valid_to: string; - fingerprint: string; - ext_key_usage: string[]; - serialNumber: string; - raw: Buffer; - } + export interface PeerCertificate { + subject: Certificate; + issuer: Certificate; + subjectaltname: string; + infoAccess: { [index: string]: string[] }; + modulus: string; + exponent: string; + valid_from: string; + valid_to: string; + fingerprint: string; + ext_key_usage: string[]; + serialNumber: string; + raw: Buffer; + } - export interface DetailedPeerCertificate extends PeerCertificate { - issuerCertificate: DetailedPeerCertificate; - } + export interface DetailedPeerCertificate extends PeerCertificate { + issuerCertificate: DetailedPeerCertificate; + } - export interface CipherNameAndProtocol { + export interface CipherNameAndProtocol { /** * The cipher name. */ - name: string; + name: string; /** * SSL/TLS protocol version. */ - version: string; - } + version: string; + } - export class TLSSocket extends net.Socket { + export class TLSSocket extends net.Socket { /** * Construct a new tls.TLSSocket object from an existing TCP socket. */ - constructor(socket: net.Socket, options?: { + constructor(socket: net.Socket, options?: { /** * An optional TLS context object from tls.createSecureContext() */ - secureContext?: SecureContext, + secureContext?: SecureContext, /** * If true the TLS socket will be instantiated in server-mode. * Defaults to false. */ - isServer?: boolean, + isServer?: boolean, /** * An optional net.Server instance. */ - server?: net.Server, + server?: net.Server, /** * If true the server will request a certificate from clients that * connect and attempt to verify that certificate. Defaults to * false. */ - requestCert?: boolean, + requestCert?: boolean, /** * If true the server will reject any connection which is not * authorized with the list of supplied CAs. This option only has an * effect if requestCert is true. Defaults to false. */ - rejectUnauthorized?: boolean, + rejectUnauthorized?: boolean, /** * An array of strings or a Buffer naming possible NPN protocols. * (Protocols should be ordered by their priority.) */ - NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array, + NPNProtocols?: string[] | Buffer, /** * An array of strings or a Buffer naming possible ALPN protocols. * (Protocols should be ordered by their priority.) When the server @@ -4820,7 +3147,7 @@ declare module "tls" { * precedence over NPN and the server does not send an NPN extension * to the client. */ - ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array, + ALPNProtocols?: string[] | Buffer, /** * SNICallback(servername, cb) <Function> A function that will be * called if the client supports SNI TLS extension. Two arguments @@ -4830,73 +3157,99 @@ declare module "tls" { * SecureContext.) If SNICallback wasn't provided the default callback * with high-level API will be used (see below). */ - SNICallback?: (servername: string, cb: (err: Error | null, ctx: SecureContext) => void) => void, + SNICallback?: Function, /** * An optional Buffer instance containing a TLS session. */ - session?: Buffer, + session?: Buffer, /** * If true, specifies that the OCSP status request extension will be * added to the client hello and an 'OCSPResponse' event will be * emitted on the socket before establishing a secure communication */ - requestOCSP?: boolean - }); - + requestOCSP?: boolean + }); + /** + * Returns the bound address, the address family name and port of the underlying socket as reported by + * the operating system. + * @returns {any} - An object with three properties, e.g. { port: 12346, family: 'IPv4', address: '127.0.0.1' }. + */ + address(): { port: number; family: string; address: string }; /** * A boolean that is true if the peer certificate was signed by one of the specified CAs, otherwise false. */ - authorized: boolean; + authorized: boolean; /** * The reason why the peer's certificate has not been verified. * This property becomes available only when tlsSocket.authorized === false. */ - authorizationError: Error; + authorizationError: Error; /** * Static boolean value, always true. * May be used to distinguish TLS sockets from regular ones. */ - encrypted: boolean; + encrypted: boolean; /** * Returns an object representing the cipher name and the SSL/TLS protocol version of the current connection. - * @returns Returns an object representing the cipher name + * @returns {CipherNameAndProtocol} - Returns an object representing the cipher name * and the SSL/TLS protocol version of the current connection. */ - getCipher(): CipherNameAndProtocol; + getCipher(): CipherNameAndProtocol; /** * Returns an object representing the peer's certificate. * The returned object has some properties corresponding to the field of the certificate. * If detailed argument is true the full chain with issuer property will be returned, * if false only the top certificate without issuer property. * If the peer does not provide a certificate, it returns null or an empty object. - * @param detailed - If true; the full chain with issuer property will be returned. - * @returns An object representing the peer's certificate. + * @param {boolean} detailed - If true; the full chain with issuer property will be returned. + * @returns {PeerCertificate | DetailedPeerCertificate} - An object representing the peer's certificate. */ - getPeerCertificate(detailed: true): DetailedPeerCertificate; - getPeerCertificate(detailed?: false): PeerCertificate; - getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate; + getPeerCertificate(detailed: true): DetailedPeerCertificate; + getPeerCertificate(detailed?: false): PeerCertificate; + getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate; /** * Could be used to speed up handshake establishment when reconnecting to the server. - * @returns ASN.1 encoded TLS session or undefined if none was negotiated. + * @returns {any} - ASN.1 encoded TLS session or undefined if none was negotiated. */ - getSession(): any; + getSession(): any; /** * NOTE: Works only with client TLS sockets. * Useful only for debugging, for session reuse provide session option to tls.connect(). - * @returns TLS session ticket or undefined if none was negotiated. + * @returns {any} - TLS session ticket or undefined if none was negotiated. */ - getTLSTicket(): any; + getTLSTicket(): any; + /** + * The string representation of the local IP address. + */ + localAddress: string; + /** + * The numeric representation of the local port. + */ + localPort: number; + /** + * The string representation of the remote IP address. + * For example, '74.125.127.100' or '2001:4860:a005::68'. + */ + remoteAddress: string; + /** + * The string representation of the remote IP family. 'IPv4' or 'IPv6'. + */ + remoteFamily: string; + /** + * The numeric representation of the remote port. For example, 443. + */ + remotePort: number; /** * Initiate TLS renegotiation process. * * NOTE: Can be used to request peer's certificate after the secure connection has been established. * ANOTHER NOTE: When running as the server, socket will be destroyed with an error after handshakeTimeout timeout. - * @param options - The options may contain the following fields: rejectUnauthorized, + * @param {TlsOptions} options - The options may contain the following fields: rejectUnauthorized, * requestCert (See tls.createServer() for details). - * @param callback - callback(err) will be executed with null as err, once the renegotiation + * @param {Function} callback - callback(err) will be executed with null as err, once the renegotiation * is successfully completed. */ - renegotiate(options: { rejectUnauthorized?: boolean, requestCert?: boolean }, callback: (err: Error | null) => void): any; + renegotiate(options: TlsOptions, callback: (err: Error) => any): any; /** * Set maximum TLS fragment size (default and maximum value is: 16384, minimum is: 512). * Smaller fragment size decreases buffering latency on the client: large fragments are buffered by @@ -4904,74 +3257,97 @@ declare module "tls" { * large fragments can span multiple roundtrips, and their processing can be delayed due to packet * loss or reordering. However, smaller fragments add extra TLS framing bytes and CPU overhead, * which may decrease overall server throughput. - * @param size - TLS fragment size (default and maximum value is: 16384, minimum is: 512). - * @returns Returns true on success, false otherwise. + * @param {number} size - TLS fragment size (default and maximum value is: 16384, minimum is: 512). + * @returns {boolean} - Returns true on success, false otherwise. */ - setMaxSendFragment(size: number): boolean; + setMaxSendFragment(size: number): boolean; /** * events.EventEmitter * 1. OCSPResponse * 2. secureConnect - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - addListener(event: "secureConnect", listener: () => void): this; + **/ + addListener(event: string, listener: Function): this; + addListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + addListener(event: "secureConnect", listener: () => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "OCSPResponse", response: Buffer): boolean; - emit(event: "secureConnect"): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "OCSPResponse", response: Buffer): boolean; + emit(event: "secureConnect"): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "OCSPResponse", listener: (response: Buffer) => void): this; - on(event: "secureConnect", listener: () => void): this; + on(event: string, listener: Function): this; + on(event: "OCSPResponse", listener: (response: Buffer) => void): this; + on(event: "secureConnect", listener: () => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "OCSPResponse", listener: (response: Buffer) => void): this; - once(event: "secureConnect", listener: () => void): this; + once(event: string, listener: Function): this; + once(event: "OCSPResponse", listener: (response: Buffer) => void): this; + once(event: "secureConnect", listener: () => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - prependListener(event: "secureConnect", listener: () => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependListener(event: "secureConnect", listener: () => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; - prependOnceListener(event: "secureConnect", listener: () => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "OCSPResponse", listener: (response: Buffer) => void): this; + prependOnceListener(event: "secureConnect", listener: () => void): this; + } - export interface TlsOptions extends SecureContextOptions { - handshakeTimeout?: number; - requestCert?: boolean; - rejectUnauthorized?: boolean; - NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - SNICallback?: (servername: string, cb: (err: Error | null, ctx: SecureContext) => void) => void; - sessionTimeout?: number; - ticketKeys?: Buffer; - } + export interface TlsOptions { + host?: string; + port?: number; + pfx?: string | Buffer[]; + key?: string | string[] | Buffer | any[]; + passphrase?: string; + cert?: string | string[] | Buffer | Buffer[]; + ca?: string | string[] | Buffer | Buffer[]; + crl?: string | string[]; + ciphers?: string; + honorCipherOrder?: boolean; + requestCert?: boolean; + rejectUnauthorized?: boolean; + NPNProtocols?: string[] | Buffer; + SNICallback?: (servername: string, cb: (err: Error, ctx: SecureContext) => any) => any; + ecdhCurve?: string; + dhparam?: string | Buffer; + handshakeTimeout?: number; + ALPNProtocols?: string[] | Buffer; + sessionTimeout?: number; + ticketKeys?: any; + sessionIdContext?: string; + secureProtocol?: string; + } - export interface ConnectionOptions extends SecureContextOptions { - host?: string; - port?: number; - path?: string; // Creates unix socket connection to path. If this option is specified, `host` and `port` are ignored. - socket?: net.Socket; // Establish secure connection on a given socket rather than creating a new socket - rejectUnauthorized?: boolean; // Defaults to true - NPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - ALPNProtocols?: string[] | Buffer[] | Uint8Array[] | Buffer | Uint8Array; - checkServerIdentity?: typeof checkServerIdentity; - servername?: string; // SNI TLS Extension - session?: Buffer; - minDHSize?: number; - secureContext?: SecureContext; // If not provided, the entire ConnectionOptions object will be passed to tls.createSecureContext() - lookup?: net.LookupFunction; - } + export interface ConnectionOptions { + host?: string; + port?: number; + socket?: net.Socket; + pfx?: string | Buffer + key?: string | string[] | Buffer | Buffer[]; + passphrase?: string; + cert?: string | string[] | Buffer | Buffer[]; + ca?: string | Buffer | (string | Buffer)[]; + rejectUnauthorized?: boolean; + NPNProtocols?: (string | Buffer)[]; + servername?: string; + path?: string; + ALPNProtocols?: (string | Buffer)[]; + checkServerIdentity?: (servername: string, cert: string | Buffer | (string | Buffer)[]) => any; + secureProtocol?: string; + secureContext?: Object; + session?: Buffer; + minDHSize?: number; + } - export class Server extends net.Server { - addContext(hostName: string, credentials: { - key: string; - cert: string; - ca: string; - }): void; + export interface Server extends net.Server { + close(callback?: Function): Server; + address(): { port: number; family: string; address: string; }; + addContext(hostName: string, credentials: { + key: string; + cert: string; + ca: string; + }): void; + maxConnections: number; + connections: number; /** * events.EventEmitter @@ -4980,2162 +3356,1022 @@ declare module "tls" { * 3. OCSPRequest * 4. resumeSession * 5. secureConnection - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - addListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - addListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - addListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - addListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + **/ + addListener(event: string, listener: Function): this; + addListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + addListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + addListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + addListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + addListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean; - emit(event: "newSession", sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void): boolean; - emit(event: "OCSPRequest", certificate: Buffer, issuer: Buffer, callback: Function): boolean; - emit(event: "resumeSession", sessionId: any, callback: (err: Error, sessionData: any) => void): boolean; - emit(event: "secureConnection", tlsSocket: TLSSocket): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "tlsClientError", err: Error, tlsSocket: TLSSocket): boolean; + emit(event: "newSession", sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void): boolean; + emit(event: "OCSPRequest", certificate: Buffer, issuer: Buffer, callback: Function): boolean; + emit(event: "resumeSession", sessionId: any, callback: (err: Error, sessionData: any) => void): boolean; + emit(event: "secureConnection", tlsSocket: TLSSocket): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - on(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - on(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - on(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - on(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + on(event: string, listener: Function): this; + on(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + on(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + on(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + on(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + on(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - once(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - once(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - once(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - once(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + once(event: string, listener: Function): this; + once(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + once(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + once(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + once(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + once(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - prependListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - prependListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - prependListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - prependListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + prependListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + prependListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + prependListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; - prependOnceListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; - prependOnceListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; - prependOnceListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; - prependOnceListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; - } + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "tlsClientError", listener: (err: Error, tlsSocket: TLSSocket) => void): this; + prependOnceListener(event: "newSession", listener: (sessionId: any, sessionData: any, callback: (err: Error, resp: Buffer) => void) => void): this; + prependOnceListener(event: "OCSPRequest", listener: (certificate: Buffer, issuer: Buffer, callback: Function) => void): this; + prependOnceListener(event: "resumeSession", listener: (sessionId: any, callback: (err: Error, sessionData: any) => void) => void): this; + prependOnceListener(event: "secureConnection", listener: (tlsSocket: TLSSocket) => void): this; + } - export interface ClearTextStream extends stream.Duplex { - authorized: boolean; - authorizationError: Error; - getPeerCertificate(): any; - getCipher: { - name: string; - version: string; - }; - address: { - port: number; - family: string; - address: string; - }; - remoteAddress: string; - remotePort: number; - } + export interface ClearTextStream extends stream.Duplex { + authorized: boolean; + authorizationError: Error; + getPeerCertificate(): any; + getCipher: { + name: string; + version: string; + }; + address: { + port: number; + family: string; + address: string; + }; + remoteAddress: string; + remotePort: number; + } - export interface SecurePair { - encrypted: any; - cleartext: any; - } + export interface SecurePair { + encrypted: any; + cleartext: any; + } - export interface SecureContextOptions { - pfx?: string | Buffer | Array<string | Buffer | Object>; - key?: string | Buffer | Array<Buffer | Object>; - passphrase?: string; - cert?: string | Buffer | Array<string | Buffer>; - ca?: string | Buffer | Array<string | Buffer>; - ciphers?: string; - honorCipherOrder?: boolean; - ecdhCurve?: string; - crl?: string | Buffer | Array<string | Buffer>; - dhparam?: string | Buffer; - secureOptions?: number; // Value is a numeric bitmask of the `SSL_OP_*` options - secureProtocol?: string; // SSL Method, e.g. SSLv23_method - sessionIdContext?: string; - } + export interface SecureContextOptions { + pfx?: string | Buffer; + key?: string | Buffer; + passphrase?: string; + cert?: string | Buffer; + ca?: string | Buffer; + crl?: string | string[] + ciphers?: string; + honorCipherOrder?: boolean; + } - export interface SecureContext { - context: any; - } + export interface SecureContext { + context: any; + } - /* - * Verifies the certificate `cert` is issued to host `host`. - * @host The hostname to verify the certificate against - * @cert PeerCertificate representing the peer's certificate - * - * Returns Error object, populating it with the reason, host and cert on failure. On success, returns undefined. - */ - export function checkServerIdentity(host: string, cert: PeerCertificate): Error | undefined; - export function createServer(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void): Server; - export function connect(options: ConnectionOptions, secureConnectionListener?: () => void): TLSSocket; - export function connect(port: number, host?: string, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; - export function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; - export function createSecurePair(credentials?: crypto.Credentials, isServer?: boolean, requestCert?: boolean, rejectUnauthorized?: boolean): SecurePair; - export function createSecureContext(details: SecureContextOptions): SecureContext; - export function getCiphers(): string[]; - - export var DEFAULT_ECDH_CURVE: string; + export function createServer(options: TlsOptions, secureConnectionListener?: (socket: TLSSocket) => void): Server; + export function connect(options: ConnectionOptions, secureConnectionListener?: () => void): TLSSocket; + export function connect(port: number, host?: string, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + export function connect(port: number, options?: ConnectionOptions, secureConnectListener?: () => void): TLSSocket; + export function createSecurePair(credentials?: crypto.Credentials, isServer?: boolean, requestCert?: boolean, rejectUnauthorized?: boolean): SecurePair; + export function createSecureContext(details: SecureContextOptions): SecureContext; } declare module "crypto" { - export interface Certificate { - exportChallenge(spkac: string | Buffer): Buffer; - exportPublicKey(spkac: string | Buffer): Buffer; - verifySpkac(spkac: Buffer): boolean; - } - export var Certificate: { - new(): Certificate; - (): Certificate; - }; + export interface Certificate { + exportChallenge(spkac: string | Buffer): Buffer; + exportPublicKey(spkac: string | Buffer): Buffer; + verifySpkac(spkac: Buffer): boolean; + } + export var Certificate: { + new(): Certificate; + (): Certificate; + } - export var fips: boolean; + export var fips: boolean; - export interface CredentialDetails { - pfx: string; - key: string; - passphrase: string; - cert: string; - ca: string | string[]; - crl: string | string[]; - ciphers: string; - } - export interface Credentials { context?: any; } - export function createCredentials(details: CredentialDetails): Credentials; - export function createHash(algorithm: string): Hash; - export function createHmac(algorithm: string, key: string | Buffer): Hmac; + export interface CredentialDetails { + pfx: string; + key: string; + passphrase: string; + cert: string; + ca: string | string[]; + crl: string | string[]; + ciphers: string; + } + export interface Credentials { context?: any; } + export function createCredentials(details: CredentialDetails): Credentials; + export function createHash(algorithm: string): Hash; + export function createHmac(algorithm: string, key: string | Buffer): Hmac; - type Utf8AsciiLatin1Encoding = "utf8" | "ascii" | "latin1"; - type HexBase64Latin1Encoding = "latin1" | "hex" | "base64"; - type Utf8AsciiBinaryEncoding = "utf8" | "ascii" | "binary"; - type HexBase64BinaryEncoding = "binary" | "base64" | "hex"; - type ECDHKeyFormat = "compressed" | "uncompressed" | "hybrid"; + type Utf8AsciiLatin1Encoding = "utf8" | "ascii" | "latin1"; + type HexBase64Latin1Encoding = "latin1" | "hex" | "base64"; + type Utf8AsciiBinaryEncoding = "utf8" | "ascii" | "binary"; + type HexBase64BinaryEncoding = "binary" | "base64" | "hex"; + type ECDHKeyFormat = "compressed" | "uncompressed" | "hybrid"; - export interface Hash extends NodeJS.ReadWriteStream { - update(data: string | Buffer | DataView): Hash; - update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Hash; - digest(): Buffer; - digest(encoding: HexBase64Latin1Encoding): string; - } - export interface Hmac extends NodeJS.ReadWriteStream { - update(data: string | Buffer | DataView): Hmac; - update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Hmac; - digest(): Buffer; - digest(encoding: HexBase64Latin1Encoding): string; - } - export function createCipher(algorithm: string, password: any): Cipher; - export function createCipheriv(algorithm: string, key: any, iv: any): Cipher; - export interface Cipher extends NodeJS.ReadWriteStream { - update(data: Buffer | DataView): Buffer; - update(data: string, input_encoding: Utf8AsciiBinaryEncoding): Buffer; - update(data: Buffer | DataView, input_encoding: any, output_encoding: HexBase64BinaryEncoding): string; - update(data: string, input_encoding: Utf8AsciiBinaryEncoding, output_encoding: HexBase64BinaryEncoding): string; - final(): Buffer; - final(output_encoding: string): string; - setAutoPadding(auto_padding?: boolean): void; - getAuthTag(): Buffer; - setAAD(buffer: Buffer): void; - } - export function createDecipher(algorithm: string, password: any): Decipher; - export function createDecipheriv(algorithm: string, key: any, iv: any): Decipher; - export interface Decipher extends NodeJS.ReadWriteStream { - update(data: Buffer | DataView): Buffer; - update(data: string, input_encoding: HexBase64BinaryEncoding): Buffer; - update(data: Buffer | DataView, input_encoding: any, output_encoding: Utf8AsciiBinaryEncoding): string; - update(data: string, input_encoding: HexBase64BinaryEncoding, output_encoding: Utf8AsciiBinaryEncoding): string; - final(): Buffer; - final(output_encoding: string): string; - setAutoPadding(auto_padding?: boolean): void; - setAuthTag(tag: Buffer): void; - setAAD(buffer: Buffer): void; - } - export function createSign(algorithm: string): Signer; - export interface Signer extends NodeJS.WritableStream { - update(data: string | Buffer | DataView): Signer; - update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Signer; - sign(private_key: string | { key: string; passphrase: string }): Buffer; - sign(private_key: string | { key: string; passphrase: string }, output_format: HexBase64Latin1Encoding): string; - } - export function createVerify(algorith: string): Verify; - export interface Verify extends NodeJS.WritableStream { - update(data: string | Buffer | DataView): Verify; - update(data: string | Buffer | DataView, input_encoding: Utf8AsciiLatin1Encoding): Verify; - verify(object: string | Object, signature: Buffer | DataView): boolean; - verify(object: string | Object, signature: string, signature_format: HexBase64Latin1Encoding): boolean; - // https://nodejs.org/api/crypto.html#crypto_verifier_verify_object_signature_signature_format - // The signature field accepts a TypedArray type, but it is only available starting ES2017 - } - export function createDiffieHellman(prime_length: number, generator?: number): DiffieHellman; - export function createDiffieHellman(prime: Buffer): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: number | Buffer): DiffieHellman; - export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: string, generator_encoding: HexBase64Latin1Encoding): DiffieHellman; - export interface DiffieHellman { - generateKeys(): Buffer; - generateKeys(encoding: HexBase64Latin1Encoding): string; - computeSecret(other_public_key: Buffer): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; - getPrime(): Buffer; - getPrime(encoding: HexBase64Latin1Encoding): string; - getGenerator(): Buffer; - getGenerator(encoding: HexBase64Latin1Encoding): string; - getPublicKey(): Buffer; - getPublicKey(encoding: HexBase64Latin1Encoding): string; - getPrivateKey(): Buffer; - getPrivateKey(encoding: HexBase64Latin1Encoding): string; - setPublicKey(public_key: Buffer): void; - setPublicKey(public_key: string, encoding: string): void; - setPrivateKey(private_key: Buffer): void; - setPrivateKey(private_key: string, encoding: string): void; - verifyError: number; - } - export function getDiffieHellman(group_name: string): DiffieHellman; - export function pbkdf2(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string, callback: (err: Error, derivedKey: Buffer) => any): void; - export function pbkdf2Sync(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string): Buffer; - export function randomBytes(size: number): Buffer; - export function randomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; - export function pseudoRandomBytes(size: number): Buffer; - export function pseudoRandomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; - export function randomFillSync(buffer: Buffer | Uint8Array, offset?: number, size?: number): Buffer; - export function randomFill(buffer: Buffer, callback: (err: Error, buf: Buffer) => void): void; - export function randomFill(buffer: Uint8Array, callback: (err: Error, buf: Uint8Array) => void): void; - export function randomFill(buffer: Buffer, offset: number, callback: (err: Error, buf: Buffer) => void): void; - export function randomFill(buffer: Uint8Array, offset: number, callback: (err: Error, buf: Uint8Array) => void): void; - export function randomFill(buffer: Buffer, offset: number, size: number, callback: (err: Error, buf: Buffer) => void): void; - export function randomFill(buffer: Uint8Array, offset: number, size: number, callback: (err: Error, buf: Uint8Array) => void): void; - export interface RsaPublicKey { - key: string; - padding?: number; - } - export interface RsaPrivateKey { - key: string; - passphrase?: string; - padding?: number; - } - export function publicEncrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer; - export function privateDecrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer; - export function privateEncrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer; - export function publicDecrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer; - export function getCiphers(): string[]; - export function getCurves(): string[]; - export function getHashes(): string[]; - export interface ECDH { - generateKeys(): Buffer; - generateKeys(encoding: HexBase64Latin1Encoding): string; - generateKeys(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; - computeSecret(other_public_key: Buffer): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; - computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; - getPrivateKey(): Buffer; - getPrivateKey(encoding: HexBase64Latin1Encoding): string; - getPublicKey(): Buffer; - getPublicKey(encoding: HexBase64Latin1Encoding): string; - getPublicKey(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; - setPrivateKey(private_key: Buffer): void; - setPrivateKey(private_key: string, encoding: HexBase64Latin1Encoding): void; - } - export function createECDH(curve_name: string): ECDH; - export function timingSafeEqual(a: Buffer, b: Buffer): boolean; - export var DEFAULT_ENCODING: string; + export interface Hash extends NodeJS.ReadWriteStream { + update(data: string | Buffer): Hash; + update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Hash; + digest(): Buffer; + digest(encoding: HexBase64Latin1Encoding): string; + } + export interface Hmac extends NodeJS.ReadWriteStream { + update(data: string | Buffer): Hmac; + update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Hmac; + digest(): Buffer; + digest(encoding: HexBase64Latin1Encoding): string; + } + export function createCipher(algorithm: string, password: any): Cipher; + export function createCipheriv(algorithm: string, key: any, iv: any): Cipher; + export interface Cipher extends NodeJS.ReadWriteStream { + update(data: Buffer): Buffer; + update(data: string, input_encoding: Utf8AsciiBinaryEncoding): Buffer; + update(data: Buffer, input_encoding: any, output_encoding: HexBase64BinaryEncoding): string; + update(data: string, input_encoding: Utf8AsciiBinaryEncoding, output_encoding: HexBase64BinaryEncoding): string; + final(): Buffer; + final(output_encoding: string): string; + setAutoPadding(auto_padding?: boolean): void; + getAuthTag(): Buffer; + setAAD(buffer: Buffer): void; + } + export function createDecipher(algorithm: string, password: any): Decipher; + export function createDecipheriv(algorithm: string, key: any, iv: any): Decipher; + export interface Decipher extends NodeJS.ReadWriteStream { + update(data: Buffer): Buffer; + update(data: string, input_encoding: HexBase64BinaryEncoding): Buffer; + update(data: Buffer, input_encoding: any, output_encoding: Utf8AsciiBinaryEncoding): string; + update(data: string, input_encoding: HexBase64BinaryEncoding, output_encoding: Utf8AsciiBinaryEncoding): string; + final(): Buffer; + final(output_encoding: string): string; + setAutoPadding(auto_padding?: boolean): void; + setAuthTag(tag: Buffer): void; + setAAD(buffer: Buffer): void; + } + export function createSign(algorithm: string): Signer; + export interface Signer extends NodeJS.WritableStream { + update(data: string | Buffer): Signer; + update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Signer; + sign(private_key: string | { key: string; passphrase: string }): Buffer; + sign(private_key: string | { key: string; passphrase: string }, output_format: HexBase64Latin1Encoding): string; + } + export function createVerify(algorith: string): Verify; + export interface Verify extends NodeJS.WritableStream { + update(data: string | Buffer): Verify; + update(data: string | Buffer, input_encoding: Utf8AsciiLatin1Encoding): Verify; + verify(object: string, signature: Buffer): boolean; + verify(object: string, signature: string, signature_format: HexBase64Latin1Encoding): boolean; + } + export function createDiffieHellman(prime_length: number, generator?: number): DiffieHellman; + export function createDiffieHellman(prime: Buffer): DiffieHellman; + export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding): DiffieHellman; + export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: number | Buffer): DiffieHellman; + export function createDiffieHellman(prime: string, prime_encoding: HexBase64Latin1Encoding, generator: string, generator_encoding: HexBase64Latin1Encoding): DiffieHellman; + export interface DiffieHellman { + generateKeys(): Buffer; + generateKeys(encoding: HexBase64Latin1Encoding): string; + computeSecret(other_public_key: Buffer): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; + getPrime(): Buffer; + getPrime(encoding: HexBase64Latin1Encoding): string; + getGenerator(): Buffer; + getGenerator(encoding: HexBase64Latin1Encoding): string; + getPublicKey(): Buffer; + getPublicKey(encoding: HexBase64Latin1Encoding): string; + getPrivateKey(): Buffer; + getPrivateKey(encoding: HexBase64Latin1Encoding): string; + setPublicKey(public_key: Buffer): void; + setPublicKey(public_key: string, encoding: string): void; + setPrivateKey(private_key: Buffer): void; + setPrivateKey(private_key: string, encoding: string): void; + verifyError: number; + } + export function getDiffieHellman(group_name: string): DiffieHellman; + export function pbkdf2(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string, callback: (err: Error, derivedKey: Buffer) => any): void; + export function pbkdf2Sync(password: string | Buffer, salt: string | Buffer, iterations: number, keylen: number, digest: string): Buffer; + export function randomBytes(size: number): Buffer; + export function randomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; + export function pseudoRandomBytes(size: number): Buffer; + export function pseudoRandomBytes(size: number, callback: (err: Error, buf: Buffer) => void): void; + export function randomFillSync(buffer: Buffer | Uint8Array, offset?: number, size?: number): Buffer; + export function randomFill(buffer: Buffer, callback: (err: Error, buf: Buffer) => void): void; + export function randomFill(buffer: Uint8Array, callback: (err: Error, buf: Uint8Array) => void): void; + export function randomFill(buffer: Buffer, offset: number, callback: (err: Error, buf: Buffer) => void): void; + export function randomFill(buffer: Uint8Array, offset: number, callback: (err: Error, buf: Uint8Array) => void): void; + export function randomFill(buffer: Buffer, offset: number, size: number, callback: (err: Error, buf: Buffer) => void): void; + export function randomFill(buffer: Uint8Array, offset: number, size: number, callback: (err: Error, buf: Uint8Array) => void): void; + export interface RsaPublicKey { + key: string; + padding?: number; + } + export interface RsaPrivateKey { + key: string; + passphrase?: string, + padding?: number; + } + export function publicEncrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer + export function privateDecrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer + export function privateEncrypt(private_key: string | RsaPrivateKey, buffer: Buffer): Buffer + export function publicDecrypt(public_key: string | RsaPublicKey, buffer: Buffer): Buffer + export function getCiphers(): string[]; + export function getCurves(): string[]; + export function getHashes(): string[]; + export interface ECDH { + generateKeys(): Buffer; + generateKeys(encoding: HexBase64Latin1Encoding): string; + generateKeys(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; + computeSecret(other_public_key: Buffer): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding): Buffer; + computeSecret(other_public_key: string, input_encoding: HexBase64Latin1Encoding, output_encoding: HexBase64Latin1Encoding): string; + getPrivateKey(): Buffer; + getPrivateKey(encoding: HexBase64Latin1Encoding): string; + getPublicKey(): Buffer; + getPublicKey(encoding: HexBase64Latin1Encoding): string; + getPublicKey(encoding: HexBase64Latin1Encoding, format: ECDHKeyFormat): string; + setPrivateKey(private_key: Buffer): void; + setPrivateKey(private_key: string, encoding: HexBase64Latin1Encoding): void; + } + export function createECDH(curve_name: string): ECDH; + export function timingSafeEqual(a: Buffer, b: Buffer): boolean; + export var DEFAULT_ENCODING: string; } declare module "stream" { - import * as events from "events"; + import * as events from "events"; - class internal extends events.EventEmitter { - pipe<T extends NodeJS.WritableStream>(destination: T, options?: { end?: boolean; }): T; - } + class internal extends events.EventEmitter { + pipe<T extends NodeJS.WritableStream>(destination: T, options?: { end?: boolean; }): T; + } - namespace internal { - export class Stream extends internal { } + namespace internal { - export interface ReadableOptions { - highWaterMark?: number; - encoding?: string; - objectMode?: boolean; - read?: (this: Readable, size?: number) => any; - destroy?: (error?: Error) => any; - } + export class Stream extends internal { } - export class Readable extends Stream implements NodeJS.ReadableStream { - readable: boolean; - constructor(opts?: ReadableOptions); - _read(size: number): void; - read(size?: number): any; - setEncoding(encoding: string): this; - pause(): this; - resume(): this; - isPaused(): boolean; - unpipe<T extends NodeJS.WritableStream>(destination?: T): this; - unshift(chunk: any): void; - wrap(oldStream: NodeJS.ReadableStream): this; - push(chunk: any, encoding?: string): boolean; - _destroy(err: Error, callback: Function): void; - destroy(error?: Error): void; + export interface ReadableOptions { + highWaterMark?: number; + encoding?: string; + objectMode?: boolean; + read?: (this: Readable, size?: number) => any; + } + + export class Readable extends Stream implements NodeJS.ReadableStream { + readable: boolean; + constructor(opts?: ReadableOptions); + _read(size: number): void; + read(size?: number): any; + setEncoding(encoding: string): this; + pause(): this; + resume(): this; + isPaused(): boolean; + pipe<T extends NodeJS.WritableStream>(destination: T, options?: { end?: boolean; }): T; + unpipe<T extends NodeJS.WritableStream>(destination?: T): this; + unshift(chunk: any): void; + wrap(oldStream: NodeJS.ReadableStream): Readable; + push(chunk: any, encoding?: string): boolean; /** * Event emitter * The defined events on documents including: - * 1. close - * 2. data - * 3. end - * 4. readable - * 5. error - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "data", listener: (chunk: Buffer | string) => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "readable", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; + * 1. close + * 2. data + * 3. end + * 4. readable + * 5. error + **/ + addListener(event: string, listener: Function): this; + addListener(event: string, listener: Function): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "data", listener: (chunk: Buffer | string) => void): this; + addListener(event: "end", listener: () => void): this; + addListener(event: "readable", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "data", chunk: Buffer | string): boolean; - emit(event: "end"): boolean; - emit(event: "readable"): boolean; - emit(event: "error", err: Error): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "data", chunk: Buffer | string): boolean; + emit(event: "end"): boolean; + emit(event: "readable"): boolean; + emit(event: "error", err: Error): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "data", listener: (chunk: Buffer | string) => void): this; - on(event: "end", listener: () => void): this; - on(event: "readable", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; + on(event: string, listener: Function): this; + on(event: "close", listener: () => void): this; + on(event: "data", listener: (chunk: Buffer | string) => void): this; + on(event: "end", listener: () => void): this; + on(event: "readable", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "data", listener: (chunk: Buffer | string) => void): this; - once(event: "end", listener: () => void): this; - once(event: "readable", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; + once(event: string, listener: Function): this; + once(event: "close", listener: () => void): this; + once(event: "data", listener: (chunk: Buffer | string) => void): this; + once(event: "end", listener: () => void): this; + once(event: "readable", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "readable", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependListener(event: "end", listener: () => void): this; + prependListener(event: "readable", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "readable", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; + prependOnceListener(event: "end", listener: () => void): this; + prependOnceListener(event: "readable", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; - removeListener(event: string, listener: (...args: any[]) => void): this; - removeListener(event: "close", listener: () => void): this; - removeListener(event: "data", listener: (chunk: Buffer | string) => void): this; - removeListener(event: "end", listener: () => void): this; - removeListener(event: "readable", listener: () => void): this; - removeListener(event: "error", listener: (err: Error) => void): this; - } + removeListener(event: string, listener: Function): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "data", listener: (chunk: Buffer | string) => void): this; + removeListener(event: "end", listener: () => void): this; + removeListener(event: "readable", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + } - export interface WritableOptions { - highWaterMark?: number; - decodeStrings?: boolean; - objectMode?: boolean; - write?: (chunk: string | Buffer, encoding: string, callback: Function) => any; - writev?: (chunks: Array<{ chunk: string | Buffer, encoding: string }>, callback: Function) => any; - destroy?: (error?: Error) => any; - final?: (callback: (error?: Error) => void) => void; - } + export interface WritableOptions { + highWaterMark?: number; + decodeStrings?: boolean; + objectMode?: boolean; + write?: (chunk: string | Buffer, encoding: string, callback: Function) => any; + writev?: (chunks: { chunk: string | Buffer, encoding: string }[], callback: Function) => any; + } - export class Writable extends Stream implements NodeJS.WritableStream { - writable: boolean; - constructor(opts?: WritableOptions); - _write(chunk: any, encoding: string, callback: (err?: Error) => void): void; - _writev?(chunks: Array<{ chunk: any, encoding: string }>, callback: (err?: Error) => void): void; - _destroy(err: Error, callback: Function): void; - _final(callback: Function): void; - write(chunk: any, cb?: Function): boolean; - write(chunk: any, encoding?: string, cb?: Function): boolean; - setDefaultEncoding(encoding: string): this; - end(cb?: Function): void; - end(chunk: any, cb?: Function): void; - end(chunk: any, encoding?: string, cb?: Function): void; - cork(): void; - uncork(): void; - destroy(error?: Error): void; + export class Writable extends Stream implements NodeJS.WritableStream { + writable: boolean; + constructor(opts?: WritableOptions); + _write(chunk: any, encoding: string, callback: Function): void; + write(chunk: any, cb?: Function): boolean; + write(chunk: any, encoding?: string, cb?: Function): boolean; + setDefaultEncoding(encoding: string): this; + end(): void; + end(chunk: any, cb?: Function): void; + end(chunk: any, encoding?: string, cb?: Function): void; /** * Event emitter * The defined events on documents including: - * 1. close - * 2. drain - * 3. error - * 4. finish - * 5. pipe - * 6. unpipe - */ - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "finish", listener: () => void): this; - addListener(event: "pipe", listener: (src: Readable) => void): this; - addListener(event: "unpipe", listener: (src: Readable) => void): this; + * 1. close + * 2. drain + * 3. error + * 4. finish + * 5. pipe + * 6. unpipe + **/ + addListener(event: string, listener: Function): this; + addListener(event: "close", listener: () => void): this; + addListener(event: "drain", listener: () => void): this; + addListener(event: "error", listener: (err: Error) => void): this; + addListener(event: "finish", listener: () => void): this; + addListener(event: "pipe", listener: (src: Readable) => void): this; + addListener(event: "unpipe", listener: (src: Readable) => void): this; - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "drain", chunk: Buffer | string): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "finish"): boolean; - emit(event: "pipe", src: Readable): boolean; - emit(event: "unpipe", src: Readable): boolean; + emit(event: string | symbol, ...args: any[]): boolean; + emit(event: "close"): boolean; + emit(event: "drain", chunk: Buffer | string): boolean; + emit(event: "error", err: Error): boolean; + emit(event: "finish"): boolean; + emit(event: "pipe", src: Readable): boolean; + emit(event: "unpipe", src: Readable): boolean; - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "drain", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "finish", listener: () => void): this; - on(event: "pipe", listener: (src: Readable) => void): this; - on(event: "unpipe", listener: (src: Readable) => void): this; + on(event: string, listener: Function): this; + on(event: "close", listener: () => void): this; + on(event: "drain", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + on(event: "finish", listener: () => void): this; + on(event: "pipe", listener: (src: Readable) => void): this; + on(event: "unpipe", listener: (src: Readable) => void): this; - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "drain", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "finish", listener: () => void): this; - once(event: "pipe", listener: (src: Readable) => void): this; - once(event: "unpipe", listener: (src: Readable) => void): this; + once(event: string, listener: Function): this; + once(event: "close", listener: () => void): this; + once(event: "drain", listener: () => void): this; + once(event: "error", listener: (err: Error) => void): this; + once(event: "finish", listener: () => void): this; + once(event: "pipe", listener: (src: Readable) => void): this; + once(event: "unpipe", listener: (src: Readable) => void): this; - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "finish", listener: () => void): this; - prependListener(event: "pipe", listener: (src: Readable) => void): this; - prependListener(event: "unpipe", listener: (src: Readable) => void): this; + prependListener(event: string, listener: Function): this; + prependListener(event: "close", listener: () => void): this; + prependListener(event: "drain", listener: () => void): this; + prependListener(event: "error", listener: (err: Error) => void): this; + prependListener(event: "finish", listener: () => void): this; + prependListener(event: "pipe", listener: (src: Readable) => void): this; + prependListener(event: "unpipe", listener: (src: Readable) => void): this; - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "finish", listener: () => void): this; - prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; - prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; + prependOnceListener(event: string, listener: Function): this; + prependOnceListener(event: "close", listener: () => void): this; + prependOnceListener(event: "drain", listener: () => void): this; + prependOnceListener(event: "error", listener: (err: Error) => void): this; + prependOnceListener(event: "finish", listener: () => void): this; + prependOnceListener(event: "pipe", listener: (src: Readable) => void): this; + prependOnceListener(event: "unpipe", listener: (src: Readable) => void): this; - removeListener(event: string, listener: (...args: any[]) => void): this; - removeListener(event: "close", listener: () => void): this; - removeListener(event: "drain", listener: () => void): this; - removeListener(event: "error", listener: (err: Error) => void): this; - removeListener(event: "finish", listener: () => void): this; - removeListener(event: "pipe", listener: (src: Readable) => void): this; - removeListener(event: "unpipe", listener: (src: Readable) => void): this; - } + removeListener(event: string, listener: Function): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "drain", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + removeListener(event: "finish", listener: () => void): this; + removeListener(event: "pipe", listener: (src: Readable) => void): this; + removeListener(event: "unpipe", listener: (src: Readable) => void): this; + } - export interface DuplexOptions extends ReadableOptions, WritableOptions { - allowHalfOpen?: boolean; - readableObjectMode?: boolean; - writableObjectMode?: boolean; - } + export interface DuplexOptions extends ReadableOptions, WritableOptions { + allowHalfOpen?: boolean; + readableObjectMode?: boolean; + writableObjectMode?: boolean; + } - // Note: Duplex extends both Readable and Writable. - export class Duplex extends Readable implements Writable { - writable: boolean; - constructor(opts?: DuplexOptions); - _write(chunk: any, encoding: string, callback: (err?: Error) => void): void; - _writev?(chunks: Array<{ chunk: any, encoding: string }>, callback: (err?: Error) => void): void; - _destroy(err: Error, callback: Function): void; - _final(callback: Function): void; - write(chunk: any, cb?: Function): boolean; - write(chunk: any, encoding?: string, cb?: Function): boolean; - setDefaultEncoding(encoding: string): this; - end(cb?: Function): void; - end(chunk: any, cb?: Function): void; - end(chunk: any, encoding?: string, cb?: Function): void; - cork(): void; - uncork(): void; - } + // Note: Duplex extends both Readable and Writable. + export class Duplex extends Readable implements Writable { + writable: boolean; + constructor(opts?: DuplexOptions); + _write(chunk: any, encoding: string, callback: Function): void; + write(chunk: any, cb?: Function): boolean; + write(chunk: any, encoding?: string, cb?: Function): boolean; + setDefaultEncoding(encoding: string): this; + end(): void; + end(chunk: any, cb?: Function): void; + end(chunk: any, encoding?: string, cb?: Function): void; + } - export interface TransformOptions extends DuplexOptions { - transform?: (chunk: string | Buffer, encoding: string, callback: Function) => any; - flush?: (callback: Function) => any; - } + export interface TransformOptions extends DuplexOptions { + transform?: (chunk: string | Buffer, encoding: string, callback: Function) => any; + flush?: (callback: Function) => any; + } - export class Transform extends Duplex { - constructor(opts?: TransformOptions); - _transform(chunk: any, encoding: string, callback: Function): void; - destroy(error?: Error): void; - } + export class Transform extends Duplex { + constructor(opts?: TransformOptions); + _transform(chunk: any, encoding: string, callback: Function): void; + } - export class PassThrough extends Transform { } - } + export class PassThrough extends Transform { } + } - export = internal; + export = internal; } declare module "util" { - export interface InspectOptions extends NodeJS.InspectOptions { } - export function format(format: any, ...param: any[]): string; - export function debug(string: string): void; - export function error(...param: any[]): void; - export function puts(...param: any[]): void; - export function print(...param: any[]): void; - export function log(string: string): void; - export var inspect: { - (object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string; - (object: any, options: InspectOptions): string; - colors: { - [color: string]: [number, number] | undefined - } - styles: { - [style: string]: string | undefined - } - defaultOptions: InspectOptions; - custom: symbol; - }; - export function isArray(object: any): object is any[]; - export function isRegExp(object: any): object is RegExp; - export function isDate(object: any): object is Date; - export function isError(object: any): object is Error; - export function inherits(constructor: any, superConstructor: any): void; - export function debuglog(key: string): (msg: string, ...param: any[]) => void; - export function isBoolean(object: any): object is boolean; - export function isBuffer(object: any): object is Buffer; - export function isFunction(object: any): boolean; - export function isNull(object: any): object is null; - export function isNullOrUndefined(object: any): object is null | undefined; - export function isNumber(object: any): object is number; - export function isObject(object: any): boolean; - export function isPrimitive(object: any): boolean; - export function isString(object: any): object is string; - export function isSymbol(object: any): object is symbol; - export function isUndefined(object: any): object is undefined; - export function deprecate<T extends Function>(fn: T, message: string): T; - - export interface CustomPromisify<TCustom extends Function> extends Function { - __promisify__: TCustom; - } - - export function callbackify(fn: () => Promise<void>): (callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify<TResult>(fn: () => Promise<TResult>): (callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify<T1>(fn: (arg1: T1) => Promise<void>): (arg1: T1, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify<T1, TResult>(fn: (arg1: T1) => Promise<TResult>): (arg1: T1, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify<T1, T2>(fn: (arg1: T1, arg2: T2) => Promise<void>): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify<T1, T2, TResult>(fn: (arg1: T1, arg2: T2) => Promise<TResult>): (arg1: T1, arg2: T2, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify<T1, T2, T3>(fn: (arg1: T1, arg2: T2, arg3: T3) => Promise<void>): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify<T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3) => Promise<TResult>): (arg1: T1, arg2: T2, arg3: T3, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify<T1, T2, T3, T4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<void>): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify<T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<TResult>): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify<T1, T2, T3, T4, T5>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<void>): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify<T1, T2, T3, T4, T5, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<TResult>): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - export function callbackify<T1, T2, T3, T4, T5, T6>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<void>): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: NodeJS.ErrnoException) => void) => void; - export function callbackify<T1, T2, T3, T4, T5, T6, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Promise<TResult>): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: NodeJS.ErrnoException, result: TResult) => void) => void; - - export function promisify<TCustom extends Function>(fn: CustomPromisify<TCustom>): TCustom; - export function promisify<TResult>(fn: (callback: (err: Error, result: TResult) => void) => void): () => Promise<TResult>; - export function promisify(fn: (callback: (err: Error) => void) => void): () => Promise<void>; - export function promisify<T1, TResult>(fn: (arg1: T1, callback: (err: Error, result: TResult) => void) => void): (arg1: T1) => Promise<TResult>; - export function promisify<T1>(fn: (arg1: T1, callback: (err: Error) => void) => void): (arg1: T1) => Promise<void>; - export function promisify<T1, T2, TResult>(fn: (arg1: T1, arg2: T2, callback: (err: Error, result: TResult) => void) => void): (arg1: T1, arg2: T2) => Promise<TResult>; - export function promisify<T1, T2>(fn: (arg1: T1, arg2: T2, callback: (err: Error) => void) => void): (arg1: T1, arg2: T2) => Promise<void>; - export function promisify<T1, T2, T3, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3) => Promise<TResult>; - export function promisify<T1, T2, T3>(fn: (arg1: T1, arg2: T2, arg3: T3, callback: (err: Error) => void) => void): (arg1: T1, arg2: T2, arg3: T3) => Promise<void>; - export function promisify<T1, T2, T3, T4, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<TResult>; - export function promisify<T1, T2, T3, T4>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: Error) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Promise<void>; - export function promisify<T1, T2, T3, T4, T5, TResult>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error, result: TResult) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<TResult>; - export function promisify<T1, T2, T3, T4, T5>(fn: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: Error) => void) => void): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Promise<void>; - export function promisify(fn: Function): Function; - export namespace promisify { - const custom: symbol; - } + export interface InspectOptions extends NodeJS.InspectOptions { } + export function format(format: any, ...param: any[]): string; + export function debug(string: string): void; + export function error(...param: any[]): void; + export function puts(...param: any[]): void; + export function print(...param: any[]): void; + export function log(string: string): void; + export function inspect(object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string; + export function inspect(object: any, options: InspectOptions): string; + export function isArray(object: any): object is any[]; + export function isRegExp(object: any): object is RegExp; + export function isDate(object: any): object is Date; + export function isError(object: any): object is Error; + export function inherits(constructor: any, superConstructor: any): void; + export function debuglog(key: string): (msg: string, ...param: any[]) => void; + export function isBoolean(object: any): object is boolean; + export function isBuffer(object: any): object is Buffer; + export function isFunction(object: any): boolean; + export function isNull(object: any): object is null; + export function isNullOrUndefined(object: any): object is null | undefined; + export function isNumber(object: any): object is number; + export function isObject(object: any): boolean; + export function isPrimitive(object: any): boolean; + export function isString(object: any): object is string; + export function isSymbol(object: any): object is symbol; + export function isUndefined(object: any): object is undefined; + export function deprecate<T extends Function>(fn: T, message: string): T; } declare module "assert" { - function internal(value: any, message?: string): void; - namespace internal { - export class AssertionError implements Error { - name: string; - message: string; - actual: any; - expected: any; - operator: string; - generatedMessage: boolean; + function internal(value: any, message?: string): void; + namespace internal { + export class AssertionError implements Error { + name: string; + message: string; + actual: any; + expected: any; + operator: string; + generatedMessage: boolean; - constructor(options?: { - message?: string; actual?: any; expected?: any; - operator?: string; stackStartFunction?: Function - }); - } + constructor(options?: { + message?: string; actual?: any; expected?: any; + operator?: string; stackStartFunction?: Function + }); + } - export function fail(message: string): void; - export function fail(actual: any, expected: any, message?: string, operator?: string): void; - export function ok(value: any, message?: string): void; - export function equal(actual: any, expected: any, message?: string): void; - export function notEqual(actual: any, expected: any, message?: string): void; - export function deepEqual(actual: any, expected: any, message?: string): void; - export function notDeepEqual(acutal: any, expected: any, message?: string): void; - export function strictEqual(actual: any, expected: any, message?: string): void; - export function notStrictEqual(actual: any, expected: any, message?: string): void; - export function deepStrictEqual(actual: any, expected: any, message?: string): void; - export function notDeepStrictEqual(actual: any, expected: any, message?: string): void; + export function fail(actual?: any, expected?: any, message?: string, operator?: string): void; + export function ok(value: any, message?: string): void; + export function equal(actual: any, expected: any, message?: string): void; + export function notEqual(actual: any, expected: any, message?: string): void; + export function deepEqual(actual: any, expected: any, message?: string): void; + export function notDeepEqual(acutal: any, expected: any, message?: string): void; + export function strictEqual(actual: any, expected: any, message?: string): void; + export function notStrictEqual(actual: any, expected: any, message?: string): void; + export function deepStrictEqual(actual: any, expected: any, message?: string): void; + export function notDeepStrictEqual(actual: any, expected: any, message?: string): void; - export function throws(block: Function, message?: string): void; - export function throws(block: Function, error: Function, message?: string): void; - export function throws(block: Function, error: RegExp, message?: string): void; - export function throws(block: Function, error: (err: any) => boolean, message?: string): void; + export function throws(block: Function, message?: string): void; + export function throws(block: Function, error: Function, message?: string): void; + export function throws(block: Function, error: RegExp, message?: string): void; + export function throws(block: Function, error: (err: any) => boolean, message?: string): void; - export function doesNotThrow(block: Function, message?: string): void; - export function doesNotThrow(block: Function, error: Function, message?: string): void; - export function doesNotThrow(block: Function, error: RegExp, message?: string): void; - export function doesNotThrow(block: Function, error: (err: any) => boolean, message?: string): void; + export function doesNotThrow(block: Function, message?: string): void; + export function doesNotThrow(block: Function, error: Function, message?: string): void; + export function doesNotThrow(block: Function, error: RegExp, message?: string): void; + export function doesNotThrow(block: Function, error: (err: any) => boolean, message?: string): void; - export function ifError(value: any): void; - } + export function ifError(value: any): void; + } - export = internal; + export = internal; } declare module "tty" { - import * as net from "net"; + import * as net from "net"; - export function isatty(fd: number): boolean; - export class ReadStream extends net.Socket { - isRaw: boolean; - setRawMode(mode: boolean): void; - isTTY: boolean; - } - export class WriteStream extends net.Socket { - columns: number; - rows: number; - isTTY: boolean; - } + export function isatty(fd: number): boolean; + export interface ReadStream extends net.Socket { + isRaw: boolean; + setRawMode(mode: boolean): void; + isTTY: boolean; + } + export interface WriteStream extends net.Socket { + columns: number; + rows: number; + isTTY: boolean; + } } declare module "domain" { - import * as events from "events"; + import * as events from "events"; - export class Domain extends events.EventEmitter implements NodeJS.Domain { - run(fn: Function): void; - add(emitter: events.EventEmitter): void; - remove(emitter: events.EventEmitter): void; - bind(cb: (err: Error, data: any) => any): any; - intercept(cb: (data: any) => any): any; - dispose(): void; - members: any[]; - enter(): void; - exit(): void; - } + export class Domain extends events.EventEmitter implements NodeJS.Domain { + run(fn: Function): void; + add(emitter: events.EventEmitter): void; + remove(emitter: events.EventEmitter): void; + bind(cb: (err: Error, data: any) => any): any; + intercept(cb: (data: any) => any): any; + dispose(): void; + members: any[]; + enter(): void; + exit(): void; + } - export function create(): Domain; + export function create(): Domain; } declare module "constants" { - export var E2BIG: number; - export var EACCES: number; - export var EADDRINUSE: number; - export var EADDRNOTAVAIL: number; - export var EAFNOSUPPORT: number; - export var EAGAIN: number; - export var EALREADY: number; - export var EBADF: number; - export var EBADMSG: number; - export var EBUSY: number; - export var ECANCELED: number; - export var ECHILD: number; - export var ECONNABORTED: number; - export var ECONNREFUSED: number; - export var ECONNRESET: number; - export var EDEADLK: number; - export var EDESTADDRREQ: number; - export var EDOM: number; - export var EEXIST: number; - export var EFAULT: number; - export var EFBIG: number; - export var EHOSTUNREACH: number; - export var EIDRM: number; - export var EILSEQ: number; - export var EINPROGRESS: number; - export var EINTR: number; - export var EINVAL: number; - export var EIO: number; - export var EISCONN: number; - export var EISDIR: number; - export var ELOOP: number; - export var EMFILE: number; - export var EMLINK: number; - export var EMSGSIZE: number; - export var ENAMETOOLONG: number; - export var ENETDOWN: number; - export var ENETRESET: number; - export var ENETUNREACH: number; - export var ENFILE: number; - export var ENOBUFS: number; - export var ENODATA: number; - export var ENODEV: number; - export var ENOENT: number; - export var ENOEXEC: number; - export var ENOLCK: number; - export var ENOLINK: number; - export var ENOMEM: number; - export var ENOMSG: number; - export var ENOPROTOOPT: number; - export var ENOSPC: number; - export var ENOSR: number; - export var ENOSTR: number; - export var ENOSYS: number; - export var ENOTCONN: number; - export var ENOTDIR: number; - export var ENOTEMPTY: number; - export var ENOTSOCK: number; - export var ENOTSUP: number; - export var ENOTTY: number; - export var ENXIO: number; - export var EOPNOTSUPP: number; - export var EOVERFLOW: number; - export var EPERM: number; - export var EPIPE: number; - export var EPROTO: number; - export var EPROTONOSUPPORT: number; - export var EPROTOTYPE: number; - export var ERANGE: number; - export var EROFS: number; - export var ESPIPE: number; - export var ESRCH: number; - export var ETIME: number; - export var ETIMEDOUT: number; - export var ETXTBSY: number; - export var EWOULDBLOCK: number; - export var EXDEV: number; - export var WSAEINTR: number; - export var WSAEBADF: number; - export var WSAEACCES: number; - export var WSAEFAULT: number; - export var WSAEINVAL: number; - export var WSAEMFILE: number; - export var WSAEWOULDBLOCK: number; - export var WSAEINPROGRESS: number; - export var WSAEALREADY: number; - export var WSAENOTSOCK: number; - export var WSAEDESTADDRREQ: number; - export var WSAEMSGSIZE: number; - export var WSAEPROTOTYPE: number; - export var WSAENOPROTOOPT: number; - export var WSAEPROTONOSUPPORT: number; - export var WSAESOCKTNOSUPPORT: number; - export var WSAEOPNOTSUPP: number; - export var WSAEPFNOSUPPORT: number; - export var WSAEAFNOSUPPORT: number; - export var WSAEADDRINUSE: number; - export var WSAEADDRNOTAVAIL: number; - export var WSAENETDOWN: number; - export var WSAENETUNREACH: number; - export var WSAENETRESET: number; - export var WSAECONNABORTED: number; - export var WSAECONNRESET: number; - export var WSAENOBUFS: number; - export var WSAEISCONN: number; - export var WSAENOTCONN: number; - export var WSAESHUTDOWN: number; - export var WSAETOOMANYREFS: number; - export var WSAETIMEDOUT: number; - export var WSAECONNREFUSED: number; - export var WSAELOOP: number; - export var WSAENAMETOOLONG: number; - export var WSAEHOSTDOWN: number; - export var WSAEHOSTUNREACH: number; - export var WSAENOTEMPTY: number; - export var WSAEPROCLIM: number; - export var WSAEUSERS: number; - export var WSAEDQUOT: number; - export var WSAESTALE: number; - export var WSAEREMOTE: number; - export var WSASYSNOTREADY: number; - export var WSAVERNOTSUPPORTED: number; - export var WSANOTINITIALISED: number; - export var WSAEDISCON: number; - export var WSAENOMORE: number; - export var WSAECANCELLED: number; - export var WSAEINVALIDPROCTABLE: number; - export var WSAEINVALIDPROVIDER: number; - export var WSAEPROVIDERFAILEDINIT: number; - export var WSASYSCALLFAILURE: number; - export var WSASERVICE_NOT_FOUND: number; - export var WSATYPE_NOT_FOUND: number; - export var WSA_E_NO_MORE: number; - export var WSA_E_CANCELLED: number; - export var WSAEREFUSED: number; - export var SIGHUP: number; - export var SIGINT: number; - export var SIGILL: number; - export var SIGABRT: number; - export var SIGFPE: number; - export var SIGKILL: number; - export var SIGSEGV: number; - export var SIGTERM: number; - export var SIGBREAK: number; - export var SIGWINCH: number; - export var SSL_OP_ALL: number; - export var SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number; - export var SSL_OP_CIPHER_SERVER_PREFERENCE: number; - export var SSL_OP_CISCO_ANYCONNECT: number; - export var SSL_OP_COOKIE_EXCHANGE: number; - export var SSL_OP_CRYPTOPRO_TLSEXT_BUG: number; - export var SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number; - export var SSL_OP_EPHEMERAL_RSA: number; - export var SSL_OP_LEGACY_SERVER_CONNECT: number; - export var SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER: number; - export var SSL_OP_MICROSOFT_SESS_ID_BUG: number; - export var SSL_OP_MSIE_SSLV2_RSA_PADDING: number; - export var SSL_OP_NETSCAPE_CA_DN_BUG: number; - export var SSL_OP_NETSCAPE_CHALLENGE_BUG: number; - export var SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG: number; - export var SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG: number; - export var SSL_OP_NO_COMPRESSION: number; - export var SSL_OP_NO_QUERY_MTU: number; - export var SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number; - export var SSL_OP_NO_SSLv2: number; - export var SSL_OP_NO_SSLv3: number; - export var SSL_OP_NO_TICKET: number; - export var SSL_OP_NO_TLSv1: number; - export var SSL_OP_NO_TLSv1_1: number; - export var SSL_OP_NO_TLSv1_2: number; - export var SSL_OP_PKCS1_CHECK_1: number; - export var SSL_OP_PKCS1_CHECK_2: number; - export var SSL_OP_SINGLE_DH_USE: number; - export var SSL_OP_SINGLE_ECDH_USE: number; - export var SSL_OP_SSLEAY_080_CLIENT_DH_BUG: number; - export var SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG: number; - export var SSL_OP_TLS_BLOCK_PADDING_BUG: number; - export var SSL_OP_TLS_D5_BUG: number; - export var SSL_OP_TLS_ROLLBACK_BUG: number; - export var ENGINE_METHOD_DSA: number; - export var ENGINE_METHOD_DH: number; - export var ENGINE_METHOD_RAND: number; - export var ENGINE_METHOD_ECDH: number; - export var ENGINE_METHOD_ECDSA: number; - export var ENGINE_METHOD_CIPHERS: number; - export var ENGINE_METHOD_DIGESTS: number; - export var ENGINE_METHOD_STORE: number; - export var ENGINE_METHOD_PKEY_METHS: number; - export var ENGINE_METHOD_PKEY_ASN1_METHS: number; - export var ENGINE_METHOD_ALL: number; - export var ENGINE_METHOD_NONE: number; - export var DH_CHECK_P_NOT_SAFE_PRIME: number; - export var DH_CHECK_P_NOT_PRIME: number; - export var DH_UNABLE_TO_CHECK_GENERATOR: number; - export var DH_NOT_SUITABLE_GENERATOR: number; - export var NPN_ENABLED: number; - export var RSA_PKCS1_PADDING: number; - export var RSA_SSLV23_PADDING: number; - export var RSA_NO_PADDING: number; - export var RSA_PKCS1_OAEP_PADDING: number; - export var RSA_X931_PADDING: number; - export var RSA_PKCS1_PSS_PADDING: number; - export var POINT_CONVERSION_COMPRESSED: number; - export var POINT_CONVERSION_UNCOMPRESSED: number; - export var POINT_CONVERSION_HYBRID: number; - export var O_RDONLY: number; - export var O_WRONLY: number; - export var O_RDWR: number; - export var S_IFMT: number; - export var S_IFREG: number; - export var S_IFDIR: number; - export var S_IFCHR: number; - export var S_IFBLK: number; - export var S_IFIFO: number; - export var S_IFSOCK: number; - export var S_IRWXU: number; - export var S_IRUSR: number; - export var S_IWUSR: number; - export var S_IXUSR: number; - export var S_IRWXG: number; - export var S_IRGRP: number; - export var S_IWGRP: number; - export var S_IXGRP: number; - export var S_IRWXO: number; - export var S_IROTH: number; - export var S_IWOTH: number; - export var S_IXOTH: number; - export var S_IFLNK: number; - export var O_CREAT: number; - export var O_EXCL: number; - export var O_NOCTTY: number; - export var O_DIRECTORY: number; - export var O_NOATIME: number; - export var O_NOFOLLOW: number; - export var O_SYNC: number; - export var O_DSYNC: number; - export var O_SYMLINK: number; - export var O_DIRECT: number; - export var O_NONBLOCK: number; - export var O_TRUNC: number; - export var O_APPEND: number; - export var F_OK: number; - export var R_OK: number; - export var W_OK: number; - export var X_OK: number; - export var UV_UDP_REUSEADDR: number; - export var SIGQUIT: number; - export var SIGTRAP: number; - export var SIGIOT: number; - export var SIGBUS: number; - export var SIGUSR1: number; - export var SIGUSR2: number; - export var SIGPIPE: number; - export var SIGALRM: number; - export var SIGCHLD: number; - export var SIGSTKFLT: number; - export var SIGCONT: number; - export var SIGSTOP: number; - export var SIGTSTP: number; - export var SIGTTIN: number; - export var SIGTTOU: number; - export var SIGURG: number; - export var SIGXCPU: number; - export var SIGXFSZ: number; - export var SIGVTALRM: number; - export var SIGPROF: number; - export var SIGIO: number; - export var SIGPOLL: number; - export var SIGPWR: number; - export var SIGSYS: number; - export var SIGUNUSED: number; - export var defaultCoreCipherList: string; - export var defaultCipherList: string; - export var ENGINE_METHOD_RSA: number; - export var ALPN_ENABLED: number; -} - -declare module "module" { - export = NodeJS.Module; + export var E2BIG: number; + export var EACCES: number; + export var EADDRINUSE: number; + export var EADDRNOTAVAIL: number; + export var EAFNOSUPPORT: number; + export var EAGAIN: number; + export var EALREADY: number; + export var EBADF: number; + export var EBADMSG: number; + export var EBUSY: number; + export var ECANCELED: number; + export var ECHILD: number; + export var ECONNABORTED: number; + export var ECONNREFUSED: number; + export var ECONNRESET: number; + export var EDEADLK: number; + export var EDESTADDRREQ: number; + export var EDOM: number; + export var EEXIST: number; + export var EFAULT: number; + export var EFBIG: number; + export var EHOSTUNREACH: number; + export var EIDRM: number; + export var EILSEQ: number; + export var EINPROGRESS: number; + export var EINTR: number; + export var EINVAL: number; + export var EIO: number; + export var EISCONN: number; + export var EISDIR: number; + export var ELOOP: number; + export var EMFILE: number; + export var EMLINK: number; + export var EMSGSIZE: number; + export var ENAMETOOLONG: number; + export var ENETDOWN: number; + export var ENETRESET: number; + export var ENETUNREACH: number; + export var ENFILE: number; + export var ENOBUFS: number; + export var ENODATA: number; + export var ENODEV: number; + export var ENOENT: number; + export var ENOEXEC: number; + export var ENOLCK: number; + export var ENOLINK: number; + export var ENOMEM: number; + export var ENOMSG: number; + export var ENOPROTOOPT: number; + export var ENOSPC: number; + export var ENOSR: number; + export var ENOSTR: number; + export var ENOSYS: number; + export var ENOTCONN: number; + export var ENOTDIR: number; + export var ENOTEMPTY: number; + export var ENOTSOCK: number; + export var ENOTSUP: number; + export var ENOTTY: number; + export var ENXIO: number; + export var EOPNOTSUPP: number; + export var EOVERFLOW: number; + export var EPERM: number; + export var EPIPE: number; + export var EPROTO: number; + export var EPROTONOSUPPORT: number; + export var EPROTOTYPE: number; + export var ERANGE: number; + export var EROFS: number; + export var ESPIPE: number; + export var ESRCH: number; + export var ETIME: number; + export var ETIMEDOUT: number; + export var ETXTBSY: number; + export var EWOULDBLOCK: number; + export var EXDEV: number; + export var WSAEINTR: number; + export var WSAEBADF: number; + export var WSAEACCES: number; + export var WSAEFAULT: number; + export var WSAEINVAL: number; + export var WSAEMFILE: number; + export var WSAEWOULDBLOCK: number; + export var WSAEINPROGRESS: number; + export var WSAEALREADY: number; + export var WSAENOTSOCK: number; + export var WSAEDESTADDRREQ: number; + export var WSAEMSGSIZE: number; + export var WSAEPROTOTYPE: number; + export var WSAENOPROTOOPT: number; + export var WSAEPROTONOSUPPORT: number; + export var WSAESOCKTNOSUPPORT: number; + export var WSAEOPNOTSUPP: number; + export var WSAEPFNOSUPPORT: number; + export var WSAEAFNOSUPPORT: number; + export var WSAEADDRINUSE: number; + export var WSAEADDRNOTAVAIL: number; + export var WSAENETDOWN: number; + export var WSAENETUNREACH: number; + export var WSAENETRESET: number; + export var WSAECONNABORTED: number; + export var WSAECONNRESET: number; + export var WSAENOBUFS: number; + export var WSAEISCONN: number; + export var WSAENOTCONN: number; + export var WSAESHUTDOWN: number; + export var WSAETOOMANYREFS: number; + export var WSAETIMEDOUT: number; + export var WSAECONNREFUSED: number; + export var WSAELOOP: number; + export var WSAENAMETOOLONG: number; + export var WSAEHOSTDOWN: number; + export var WSAEHOSTUNREACH: number; + export var WSAENOTEMPTY: number; + export var WSAEPROCLIM: number; + export var WSAEUSERS: number; + export var WSAEDQUOT: number; + export var WSAESTALE: number; + export var WSAEREMOTE: number; + export var WSASYSNOTREADY: number; + export var WSAVERNOTSUPPORTED: number; + export var WSANOTINITIALISED: number; + export var WSAEDISCON: number; + export var WSAENOMORE: number; + export var WSAECANCELLED: number; + export var WSAEINVALIDPROCTABLE: number; + export var WSAEINVALIDPROVIDER: number; + export var WSAEPROVIDERFAILEDINIT: number; + export var WSASYSCALLFAILURE: number; + export var WSASERVICE_NOT_FOUND: number; + export var WSATYPE_NOT_FOUND: number; + export var WSA_E_NO_MORE: number; + export var WSA_E_CANCELLED: number; + export var WSAEREFUSED: number; + export var SIGHUP: number; + export var SIGINT: number; + export var SIGILL: number; + export var SIGABRT: number; + export var SIGFPE: number; + export var SIGKILL: number; + export var SIGSEGV: number; + export var SIGTERM: number; + export var SIGBREAK: number; + export var SIGWINCH: number; + export var SSL_OP_ALL: number; + export var SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION: number; + export var SSL_OP_CIPHER_SERVER_PREFERENCE: number; + export var SSL_OP_CISCO_ANYCONNECT: number; + export var SSL_OP_COOKIE_EXCHANGE: number; + export var SSL_OP_CRYPTOPRO_TLSEXT_BUG: number; + export var SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS: number; + export var SSL_OP_EPHEMERAL_RSA: number; + export var SSL_OP_LEGACY_SERVER_CONNECT: number; + export var SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER: number; + export var SSL_OP_MICROSOFT_SESS_ID_BUG: number; + export var SSL_OP_MSIE_SSLV2_RSA_PADDING: number; + export var SSL_OP_NETSCAPE_CA_DN_BUG: number; + export var SSL_OP_NETSCAPE_CHALLENGE_BUG: number; + export var SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG: number; + export var SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG: number; + export var SSL_OP_NO_COMPRESSION: number; + export var SSL_OP_NO_QUERY_MTU: number; + export var SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION: number; + export var SSL_OP_NO_SSLv2: number; + export var SSL_OP_NO_SSLv3: number; + export var SSL_OP_NO_TICKET: number; + export var SSL_OP_NO_TLSv1: number; + export var SSL_OP_NO_TLSv1_1: number; + export var SSL_OP_NO_TLSv1_2: number; + export var SSL_OP_PKCS1_CHECK_1: number; + export var SSL_OP_PKCS1_CHECK_2: number; + export var SSL_OP_SINGLE_DH_USE: number; + export var SSL_OP_SINGLE_ECDH_USE: number; + export var SSL_OP_SSLEAY_080_CLIENT_DH_BUG: number; + export var SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG: number; + export var SSL_OP_TLS_BLOCK_PADDING_BUG: number; + export var SSL_OP_TLS_D5_BUG: number; + export var SSL_OP_TLS_ROLLBACK_BUG: number; + export var ENGINE_METHOD_DSA: number; + export var ENGINE_METHOD_DH: number; + export var ENGINE_METHOD_RAND: number; + export var ENGINE_METHOD_ECDH: number; + export var ENGINE_METHOD_ECDSA: number; + export var ENGINE_METHOD_CIPHERS: number; + export var ENGINE_METHOD_DIGESTS: number; + export var ENGINE_METHOD_STORE: number; + export var ENGINE_METHOD_PKEY_METHS: number; + export var ENGINE_METHOD_PKEY_ASN1_METHS: number; + export var ENGINE_METHOD_ALL: number; + export var ENGINE_METHOD_NONE: number; + export var DH_CHECK_P_NOT_SAFE_PRIME: number; + export var DH_CHECK_P_NOT_PRIME: number; + export var DH_UNABLE_TO_CHECK_GENERATOR: number; + export var DH_NOT_SUITABLE_GENERATOR: number; + export var NPN_ENABLED: number; + export var RSA_PKCS1_PADDING: number; + export var RSA_SSLV23_PADDING: number; + export var RSA_NO_PADDING: number; + export var RSA_PKCS1_OAEP_PADDING: number; + export var RSA_X931_PADDING: number; + export var RSA_PKCS1_PSS_PADDING: number; + export var POINT_CONVERSION_COMPRESSED: number; + export var POINT_CONVERSION_UNCOMPRESSED: number; + export var POINT_CONVERSION_HYBRID: number; + export var O_RDONLY: number; + export var O_WRONLY: number; + export var O_RDWR: number; + export var S_IFMT: number; + export var S_IFREG: number; + export var S_IFDIR: number; + export var S_IFCHR: number; + export var S_IFBLK: number; + export var S_IFIFO: number; + export var S_IFSOCK: number; + export var S_IRWXU: number; + export var S_IRUSR: number; + export var S_IWUSR: number; + export var S_IXUSR: number; + export var S_IRWXG: number; + export var S_IRGRP: number; + export var S_IWGRP: number; + export var S_IXGRP: number; + export var S_IRWXO: number; + export var S_IROTH: number; + export var S_IWOTH: number; + export var S_IXOTH: number; + export var S_IFLNK: number; + export var O_CREAT: number; + export var O_EXCL: number; + export var O_NOCTTY: number; + export var O_DIRECTORY: number; + export var O_NOATIME: number; + export var O_NOFOLLOW: number; + export var O_SYNC: number; + export var O_SYMLINK: number; + export var O_DIRECT: number; + export var O_NONBLOCK: number; + export var O_TRUNC: number; + export var O_APPEND: number; + export var F_OK: number; + export var R_OK: number; + export var W_OK: number; + export var X_OK: number; + export var UV_UDP_REUSEADDR: number; + export var SIGQUIT: number; + export var SIGTRAP: number; + export var SIGIOT: number; + export var SIGBUS: number; + export var SIGUSR1: number; + export var SIGUSR2: number; + export var SIGPIPE: number; + export var SIGALRM: number; + export var SIGCHLD: number; + export var SIGSTKFLT: number; + export var SIGCONT: number; + export var SIGSTOP: number; + export var SIGTSTP: number; + export var SIGTTIN: number; + export var SIGTTOU: number; + export var SIGURG: number; + export var SIGXCPU: number; + export var SIGXFSZ: number; + export var SIGVTALRM: number; + export var SIGPROF: number; + export var SIGIO: number; + export var SIGPOLL: number; + export var SIGPWR: number; + export var SIGSYS: number; + export var SIGUNUSED: number; + export var defaultCoreCipherList: string; + export var defaultCipherList: string; + export var ENGINE_METHOD_RSA: number; + export var ALPN_ENABLED: number; } declare module "process" { - export = process; + export = process; } -// tslint:disable-next-line:no-declare-current-package declare module "v8" { - interface HeapSpaceInfo { - space_name: string; - space_size: number; - space_used_size: number; - space_available_size: number; - physical_space_size: number; - } + interface HeapSpaceInfo { + space_name: string; + space_size: number; + space_used_size: number; + space_available_size: number; + physical_space_size: number; + } - // ** Signifies if the --zap_code_space option is enabled or not. 1 == enabled, 0 == disabled. */ - type DoesZapCodeSpaceFlag = 0 | 1; + //** Signifies if the --zap_code_space option is enabled or not. 1 == enabled, 0 == disabled. */ + type DoesZapCodeSpaceFlag = 0 | 1; - interface HeapInfo { - total_heap_size: number; - total_heap_size_executable: number; - total_physical_size: number; - total_available_size: number; - used_heap_size: number; - heap_size_limit: number; - malloced_memory: number; - peak_malloced_memory: number; - does_zap_garbage: DoesZapCodeSpaceFlag; - } + interface HeapInfo { + total_heap_size: number; + total_heap_size_executable: number; + total_physical_size: number; + total_available_size: number; + used_heap_size: number; + heap_size_limit: number; + malloced_memory: number; + peak_malloced_memory: number; + does_zap_garbage: DoesZapCodeSpaceFlag; + } - export function getHeapStatistics(): HeapInfo; - export function getHeapSpaceStatistics(): HeapSpaceInfo[]; - export function setFlagsFromString(flags: string): void; + export function getHeapStatistics(): HeapInfo; + export function getHeapSpaceStatistics(): HeapSpaceInfo[]; + export function setFlagsFromString(flags: string): void; } declare module "timers" { - export function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; - export namespace setTimeout { - export function __promisify__(ms: number): Promise<void>; - export function __promisify__<T>(ms: number, value: T): Promise<T>; - } - export function clearTimeout(timeoutId: NodeJS.Timer): void; - export function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; - export function clearInterval(intervalId: NodeJS.Timer): void; - export function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; - export namespace setImmediate { - export function __promisify__(): Promise<void>; - export function __promisify__<T>(value: T): Promise<T>; - } - export function clearImmediate(immediateId: any): void; + export function setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; + export function clearTimeout(timeoutId: NodeJS.Timer): void; + export function setInterval(callback: (...args: any[]) => void, ms: number, ...args: any[]): NodeJS.Timer; + export function clearInterval(intervalId: NodeJS.Timer): void; + export function setImmediate(callback: (...args: any[]) => void, ...args: any[]): any; + export function clearImmediate(immediateId: any): void; } declare module "console" { - export = console; + export = console; } /** - * Async Hooks module: https://nodejs.org/api/async_hooks.html + * _debugger module is not documented. + * Source code is at https://github.com/nodejs/node/blob/master/lib/_debugger.js */ -declare module "async_hooks" { - /** - * Returns the asyncId of the current execution context. - */ - export function executionAsyncId(): number; - /// @deprecated - replaced by executionAsyncId() - export function currentId(): number; +declare module "_debugger" { + export interface Packet { + raw: string; + headers: string[]; + body: Message; + } - /** - * Returns the ID of the resource responsible for calling the callback that is currently being executed. - */ - export function triggerAsyncId(): number; - /// @deprecated - replaced by triggerAsyncId() - export function triggerId(): number; + export interface Message { + seq: number; + type: string; + } - export interface HookCallbacks { - /** - * Called when a class is constructed that has the possibility to emit an asynchronous event. - * @param asyncId a unique ID for the async resource - * @param type the type of the async resource - * @param triggerAsyncId the unique ID of the async resource in whose execution context this async resource was created - * @param resource reference to the resource representing the async operation, needs to be released during destroy - */ - init?(asyncId: number, type: string, triggerAsyncId: number, resource: Object): void; + export interface RequestInfo { + command: string; + arguments: any; + } - /** - * When an asynchronous operation is initiated or completes a callback is called to notify the user. - * The before callback is called just before said callback is executed. - * @param asyncId the unique identifier assigned to the resource about to execute the callback. - */ - before?(asyncId: number): void; + export interface Request extends Message, RequestInfo { + } - /** - * Called immediately after the callback specified in before is completed. - * @param asyncId the unique identifier assigned to the resource which has executed the callback. - */ - after?(asyncId: number): void; + export interface Event extends Message { + event: string; + body?: any; + } - /** - * Called when a promise has resolve() called. This may not be in the same execution id - * as the promise itself. - * @param asyncId the unique id for the promise that was resolve()d. - */ - promiseResolve?(asyncId: number): void; + export interface Response extends Message { + request_seq: number; + success: boolean; + /** Contains error message if success === false. */ + message?: string; + /** Contains message body if success === true. */ + body?: any; + } - /** - * Called after the resource corresponding to asyncId is destroyed - * @param asyncId a unique ID for the async resource - */ - destroy?(asyncId: number): void; - } + export interface BreakpointMessageBody { + type: string; + target: number; + line: number; + } - export interface AsyncHook { - /** - * Enable the callbacks for a given AsyncHook instance. If no callbacks are provided enabling is a noop. - */ - enable(): this; + export class Protocol { + res: Packet; + state: string; + execute(data: string): void; + serialize(rq: Request): string; + onResponse: (pkt: Packet) => void; + } - /** - * Disable the callbacks for a given AsyncHook instance from the global pool of AsyncHook callbacks to be executed. Once a hook has been disabled it will not be called again until enabled. - */ - disable(): this; - } + export var NO_FRAME: number; + export var port: number; - /** - * Registers functions to be called for different lifetime events of each async operation. - * @param options the callbacks to register - * @return an AsyncHooks instance used for disabling and enabling hooks - */ - export function createHook(options: HookCallbacks): AsyncHook; + export interface ScriptDesc { + name: string; + id: number; + isNative?: boolean; + handle?: number; + type: string; + lineOffset?: number; + columnOffset?: number; + lineCount?: number; + } - /** - * The class AsyncResource was designed to be extended by the embedder's async resources. - * Using this users can easily trigger the lifetime events of their own resources. - */ - export class AsyncResource { - /** - * AsyncResource() is meant to be extended. Instantiating a - * new AsyncResource() also triggers init. If triggerAsyncId is omitted then - * async_hook.executionAsyncId() is used. - * @param type the name of this async resource type - * @param triggerAsyncId the unique ID of the async resource in whose execution context this async resource was created - */ - constructor(type: string, triggerAsyncId?: number) + export interface Breakpoint { + id: number; + scriptId: number; + script: ScriptDesc; + line: number; + condition?: string; + scriptReq?: string; + } - /** - * Call AsyncHooks before callbacks. - */ - emitBefore(): void; + export interface RequestHandler { + (err: boolean, body: Message, res: Packet): void; + request_seq?: number; + } - /** - * Call AsyncHooks after callbacks - */ - emitAfter(): void; + export interface ResponseBodyHandler { + (err: boolean, body?: any): void; + request_seq?: number; + } - /** - * Call AsyncHooks destroy callbacks. - */ - emitDestroy(): void; + export interface ExceptionInfo { + text: string; + } - /** - * @return the unique ID assigned to this AsyncResource instance. - */ - asyncId(): number; + export interface BreakResponse { + script?: ScriptDesc; + exception?: ExceptionInfo; + sourceLine: number; + sourceLineText: string; + sourceColumn: number; + } - /** - * @return the trigger ID for this AsyncResource instance. - */ - triggerAsyncId(): number; - } + export function SourceInfo(body: BreakResponse): string; + + export interface ClientInstance extends NodeJS.EventEmitter { + protocol: Protocol; + scripts: ScriptDesc[]; + handles: ScriptDesc[]; + breakpoints: Breakpoint[]; + currentSourceLine: number; + currentSourceColumn: number; + currentSourceLineText: string; + currentFrame: number; + currentScript: string; + + connect(port: number, host: string): void; + req(req: any, cb: RequestHandler): void; + reqFrameEval(code: string, frame: number, cb: RequestHandler): void; + mirrorObject(obj: any, depth: number, cb: ResponseBodyHandler): void; + setBreakpoint(rq: BreakpointMessageBody, cb: RequestHandler): void; + clearBreakpoint(rq: Request, cb: RequestHandler): void; + listbreakpoints(cb: RequestHandler): void; + reqSource(from: number, to: number, cb: RequestHandler): void; + reqScripts(cb: any): void; + reqContinue(cb: RequestHandler): void; + } + + export var Client: { + new(): ClientInstance + } } - -declare module "http2" { - import * as events from "events"; - import * as fs from "fs"; - import * as net from "net"; - import * as stream from "stream"; - import * as tls from "tls"; - import * as url from "url"; - - import { IncomingHttpHeaders, OutgoingHttpHeaders } from "http"; - export { IncomingHttpHeaders, OutgoingHttpHeaders } from "http"; - - // Http2Stream - - export interface StreamPriorityOptions { - exclusive?: boolean; - parent?: number; - weight?: number; - silent?: boolean; - } - - export interface StreamState { - localWindowSize?: number; - state?: number; - streamLocalClose?: number; - streamRemoteClose?: number; - sumDependencyWeight?: number; - weight?: number; - } - - export interface ServerStreamResponseOptions { - endStream?: boolean; - getTrailers?: (trailers: OutgoingHttpHeaders) => void; - } - - export interface StatOptions { - offset: number; - length: number; - } - - export interface ServerStreamFileResponseOptions { - statCheck?: (stats: fs.Stats, headers: OutgoingHttpHeaders, statOptions: StatOptions) => void | boolean; - getTrailers?: (trailers: OutgoingHttpHeaders) => void; - offset?: number; - length?: number; - } - - export interface ServerStreamFileResponseOptionsWithError extends ServerStreamFileResponseOptions { - onError?: (err: NodeJS.ErrnoException) => void; - } - - export interface Http2Stream extends stream.Duplex { - readonly aborted: boolean; - readonly destroyed: boolean; - priority(options: StreamPriorityOptions): void; - readonly rstCode: number; - rstStream(code: number): void; - rstWithNoError(): void; - rstWithProtocolError(): void; - rstWithCancel(): void; - rstWithRefuse(): void; - rstWithInternalError(): void; - readonly session: Http2Session; - setTimeout(msecs: number, callback?: () => void): void; - readonly state: StreamState; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "aborted", listener: () => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "data", listener: (chunk: Buffer | string) => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "end", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "finish", listener: () => void): this; - addListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - addListener(event: "pipe", listener: (src: stream.Readable) => void): this; - addListener(event: "unpipe", listener: (src: stream.Readable) => void): this; - addListener(event: "streamClosed", listener: (code: number) => void): this; - addListener(event: "timeout", listener: () => void): this; - addListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "aborted"): boolean; - emit(event: "close"): boolean; - emit(event: "data", chunk: Buffer | string): boolean; - emit(event: "drain"): boolean; - emit(event: "end"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "finish"): boolean; - emit(event: "frameError", frameType: number, errorCode: number): boolean; - emit(event: "pipe", src: stream.Readable): boolean; - emit(event: "unpipe", src: stream.Readable): boolean; - emit(event: "streamClosed", code: number): boolean; - emit(event: "timeout"): boolean; - emit(event: "trailers", trailers: IncomingHttpHeaders, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "aborted", listener: () => void): this; - on(event: "close", listener: () => void): this; - on(event: "data", listener: (chunk: Buffer | string) => void): this; - on(event: "drain", listener: () => void): this; - on(event: "end", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "finish", listener: () => void): this; - on(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - on(event: "pipe", listener: (src: stream.Readable) => void): this; - on(event: "unpipe", listener: (src: stream.Readable) => void): this; - on(event: "streamClosed", listener: (code: number) => void): this; - on(event: "timeout", listener: () => void): this; - on(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "aborted", listener: () => void): this; - once(event: "close", listener: () => void): this; - once(event: "data", listener: (chunk: Buffer | string) => void): this; - once(event: "drain", listener: () => void): this; - once(event: "end", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "finish", listener: () => void): this; - once(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - once(event: "pipe", listener: (src: stream.Readable) => void): this; - once(event: "unpipe", listener: (src: stream.Readable) => void): this; - once(event: "streamClosed", listener: (code: number) => void): this; - once(event: "timeout", listener: () => void): this; - once(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "aborted", listener: () => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "end", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "finish", listener: () => void): this; - prependListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - prependListener(event: "pipe", listener: (src: stream.Readable) => void): this; - prependListener(event: "unpipe", listener: (src: stream.Readable) => void): this; - prependListener(event: "streamClosed", listener: (code: number) => void): this; - prependListener(event: "timeout", listener: () => void): this; - prependListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "aborted", listener: () => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "data", listener: (chunk: Buffer | string) => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "end", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "finish", listener: () => void): this; - prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number) => void): this; - prependOnceListener(event: "pipe", listener: (src: stream.Readable) => void): this; - prependOnceListener(event: "unpipe", listener: (src: stream.Readable) => void): this; - prependOnceListener(event: "streamClosed", listener: (code: number) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - prependOnceListener(event: "trailers", listener: (trailers: IncomingHttpHeaders, flags: number) => void): this; - } - - export interface ClientHttp2Stream extends Http2Stream { - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - addListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - addListener(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "headers", headers: IncomingHttpHeaders, flags: number): boolean; - emit(event: "push", headers: IncomingHttpHeaders, flags: number): boolean; - emit(event: "response", headers: IncomingHttpHeaders, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - on(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - on(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - once(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - once(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - prependListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - prependListener(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "headers", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - prependOnceListener(event: "push", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - prependOnceListener(event: "response", listener: (headers: IncomingHttpHeaders, flags: number) => void): this; - } - - export interface ServerHttp2Stream extends Http2Stream { - additionalHeaders(headers: OutgoingHttpHeaders): void; - readonly headersSent: boolean; - readonly pushAllowed: boolean; - pushStream(headers: OutgoingHttpHeaders, callback?: (pushStream: ServerHttp2Stream) => void): void; - pushStream(headers: OutgoingHttpHeaders, options?: StreamPriorityOptions, callback?: (pushStream: ServerHttp2Stream) => void): void; - respond(headers?: OutgoingHttpHeaders, options?: ServerStreamResponseOptions): void; - respondWithFD(fd: number, headers?: OutgoingHttpHeaders, options?: ServerStreamFileResponseOptions): void; - respondWithFile(path: string, headers?: OutgoingHttpHeaders, options?: ServerStreamFileResponseOptionsWithError): void; - } - - // Http2Session - - export interface Settings { - headerTableSize?: number; - enablePush?: boolean; - initialWindowSize?: number; - maxFrameSize?: number; - maxConcurrentStreams?: number; - maxHeaderListSize?: number; - } - - export interface ClientSessionRequestOptions { - endStream?: boolean; - exclusive?: boolean; - parent?: number; - weight?: number; - getTrailers?: (trailers: OutgoingHttpHeaders, flags: number) => void; - } - - export interface SessionShutdownOptions { - graceful?: boolean; - errorCode?: number; - lastStreamID?: number; - opaqueData?: Buffer | Uint8Array; - } - - export interface SessionState { - effectiveLocalWindowSize?: number; - effectiveRecvDataLength?: number; - nextStreamID?: number; - localWindowSize?: number; - lastProcStreamID?: number; - remoteWindowSize?: number; - outboundQueueSize?: number; - deflateDynamicTableSize?: number; - inflateDynamicTableSize?: number; - } - - export interface Http2Session extends events.EventEmitter { - destroy(): void; - readonly destroyed: boolean; - readonly localSettings: Settings; - readonly pendingSettingsAck: boolean; - readonly remoteSettings: Settings; - rstStream(stream: Http2Stream, code?: number): void; - setTimeout(msecs: number, callback?: () => void): void; - shutdown(callback?: () => void): void; - shutdown(options: SessionShutdownOptions, callback?: () => void): void; - readonly socket: net.Socket | tls.TLSSocket; - readonly state: SessionState; - priority(stream: Http2Stream, options: StreamPriorityOptions): void; - settings(settings: Settings): void; - readonly type: number; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "error", listener: (err: Error) => void): this; - addListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - addListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - addListener(event: "localSettings", listener: (settings: Settings) => void): this; - addListener(event: "remoteSettings", listener: (settings: Settings) => void): this; - addListener(event: "socketError", listener: (err: Error) => void): this; - addListener(event: "timeout", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "close"): boolean; - emit(event: "error", err: Error): boolean; - emit(event: "frameError", frameType: number, errorCode: number, streamID: number): boolean; - emit(event: "goaway", errorCode: number, lastStreamID: number, opaqueData: Buffer): boolean; - emit(event: "localSettings", settings: Settings): boolean; - emit(event: "remoteSettings", settings: Settings): boolean; - emit(event: "socketError", err: Error): boolean; - emit(event: "timeout"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "close", listener: () => void): this; - on(event: "error", listener: (err: Error) => void): this; - on(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - on(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - on(event: "localSettings", listener: (settings: Settings) => void): this; - on(event: "remoteSettings", listener: (settings: Settings) => void): this; - on(event: "socketError", listener: (err: Error) => void): this; - on(event: "timeout", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; - once(event: "error", listener: (err: Error) => void): this; - once(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - once(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - once(event: "localSettings", listener: (settings: Settings) => void): this; - once(event: "remoteSettings", listener: (settings: Settings) => void): this; - once(event: "socketError", listener: (err: Error) => void): this; - once(event: "timeout", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "error", listener: (err: Error) => void): this; - prependListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - prependListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - prependListener(event: "localSettings", listener: (settings: Settings) => void): this; - prependListener(event: "remoteSettings", listener: (settings: Settings) => void): this; - prependListener(event: "socketError", listener: (err: Error) => void): this; - prependListener(event: "timeout", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "error", listener: (err: Error) => void): this; - prependOnceListener(event: "frameError", listener: (frameType: number, errorCode: number, streamID: number) => void): this; - prependOnceListener(event: "goaway", listener: (errorCode: number, lastStreamID: number, opaqueData: Buffer) => void): this; - prependOnceListener(event: "localSettings", listener: (settings: Settings) => void): this; - prependOnceListener(event: "remoteSettings", listener: (settings: Settings) => void): this; - prependOnceListener(event: "socketError", listener: (err: Error) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - } - - export interface ClientHttp2Session extends Http2Session { - request(headers?: OutgoingHttpHeaders, options?: ClientSessionRequestOptions): ClientHttp2Stream; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - addListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "connect", session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; - emit(event: "stream", stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - on(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - once(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "connect", listener: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependOnceListener(event: "stream", listener: (stream: ClientHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - } - - export interface ServerHttp2Session extends Http2Session { - readonly server: Http2Server | Http2SecureServer; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "connect", session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket): boolean; - emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "connect", listener: (session: ServerHttp2Session, socket: net.Socket | tls.TLSSocket) => void): this; - prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - } - - // Http2Server - - export interface SessionOptions { - maxDeflateDynamicTableSize?: number; - maxReservedRemoteStreams?: number; - maxSendHeaderBlockLength?: number; - paddingStrategy?: number; - peerMaxConcurrentStreams?: number; - selectPadding?: (frameLen: number, maxFrameLen: number) => number; - settings?: Settings; - } - - export type ClientSessionOptions = SessionOptions; - export type ServerSessionOptions = SessionOptions; - - export interface SecureClientSessionOptions extends ClientSessionOptions, tls.ConnectionOptions { } - export interface SecureServerSessionOptions extends ServerSessionOptions, tls.TlsOptions { } - - export interface ServerOptions extends ServerSessionOptions { - allowHTTP1?: boolean; - } - - export interface SecureServerOptions extends SecureServerSessionOptions { - allowHTTP1?: boolean; - } - - export interface Http2Server extends net.Server { - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - addListener(event: "sessionError", listener: (err: Error) => void): this; - addListener(event: "socketError", listener: (err: Error) => void): this; - addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - addListener(event: "timeout", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; - emit(event: "sessionError", err: Error): boolean; - emit(event: "socketError", err: Error): boolean; - emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; - emit(event: "timeout"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - on(event: "sessionError", listener: (err: Error) => void): this; - on(event: "socketError", listener: (err: Error) => void): this; - on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - on(event: "timeout", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - once(event: "sessionError", listener: (err: Error) => void): this; - once(event: "socketError", listener: (err: Error) => void): this; - once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - once(event: "timeout", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependListener(event: "sessionError", listener: (err: Error) => void): this; - prependListener(event: "socketError", listener: (err: Error) => void): this; - prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependListener(event: "timeout", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; - prependOnceListener(event: "socketError", listener: (err: Error) => void): this; - prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - } - - export interface Http2SecureServer extends tls.Server { - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - addListener(event: "sessionError", listener: (err: Error) => void): this; - addListener(event: "socketError", listener: (err: Error) => void): this; - addListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - addListener(event: "timeout", listener: () => void): this; - addListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "request", request: Http2ServerRequest, response: Http2ServerResponse): boolean; - emit(event: "sessionError", err: Error): boolean; - emit(event: "socketError", err: Error): boolean; - emit(event: "stream", stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number): boolean; - emit(event: "timeout"): boolean; - emit(event: "unknownProtocol", socket: tls.TLSSocket): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - on(event: "sessionError", listener: (err: Error) => void): this; - on(event: "socketError", listener: (err: Error) => void): this; - on(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - on(event: "timeout", listener: () => void): this; - on(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - once(event: "sessionError", listener: (err: Error) => void): this; - once(event: "socketError", listener: (err: Error) => void): this; - once(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - once(event: "timeout", listener: () => void): this; - once(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependListener(event: "sessionError", listener: (err: Error) => void): this; - prependListener(event: "socketError", listener: (err: Error) => void): this; - prependListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependListener(event: "timeout", listener: () => void): this; - prependListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "request", listener: (request: Http2ServerRequest, response: Http2ServerResponse) => void): this; - prependOnceListener(event: "sessionError", listener: (err: Error) => void): this; - prependOnceListener(event: "socketError", listener: (err: Error) => void): this; - prependOnceListener(event: "stream", listener: (stream: ServerHttp2Stream, headers: IncomingHttpHeaders, flags: number) => void): this; - prependOnceListener(event: "timeout", listener: () => void): this; - prependOnceListener(event: "unknownProtocol", listener: (socket: tls.TLSSocket) => void): this; - } - - export interface Http2ServerRequest extends stream.Readable { - headers: IncomingHttpHeaders; - httpVersion: string; - method: string; - rawHeaders: string[]; - rawTrailers: string[]; - setTimeout(msecs: number, callback?: () => void): void; - socket: net.Socket | tls.TLSSocket; - stream: ServerHttp2Stream; - trailers: IncomingHttpHeaders; - url: string; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "aborted", hadError: boolean, code: number): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - } - - export interface Http2ServerResponse extends events.EventEmitter { - addTrailers(trailers: OutgoingHttpHeaders): void; - connection: net.Socket | tls.TLSSocket; - end(callback?: () => void): void; - end(data?: string | Buffer, callback?: () => void): void; - end(data?: string | Buffer, encoding?: string, callback?: () => void): void; - readonly finished: boolean; - getHeader(name: string): string; - getHeaderNames(): string[]; - getHeaders(): OutgoingHttpHeaders; - hasHeader(name: string): boolean; - readonly headersSent: boolean; - removeHeader(name: string): void; - sendDate: boolean; - setHeader(name: string, value: number | string | string[]): void; - setTimeout(msecs: number, callback?: () => void): void; - socket: net.Socket | tls.TLSSocket; - statusCode: number; - statusMessage: ''; - stream: ServerHttp2Stream; - write(chunk: string | Buffer, callback?: (err: Error) => void): boolean; - write(chunk: string | Buffer, encoding?: string, callback?: (err: Error) => void): boolean; - writeContinue(): void; - writeHead(statusCode: number, headers?: OutgoingHttpHeaders): void; - writeHead(statusCode: number, statusMessage?: string, headers?: OutgoingHttpHeaders): void; - createPushResponse(headers: OutgoingHttpHeaders, callback: (err: Error | null, res: Http2ServerResponse) => void): void; - - addListener(event: string, listener: (...args: any[]) => void): this; - addListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - addListener(event: "close", listener: () => void): this; - addListener(event: "drain", listener: () => void): this; - addListener(event: "error", listener: (error: Error) => void): this; - addListener(event: "finish", listener: () => void): this; - - emit(event: string | symbol, ...args: any[]): boolean; - emit(event: "aborted", hadError: boolean, code: number): boolean; - emit(event: "close"): boolean; - emit(event: "drain"): boolean; - emit(event: "error", error: Error): boolean; - emit(event: "finish"): boolean; - - on(event: string, listener: (...args: any[]) => void): this; - on(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - on(event: "close", listener: () => void): this; - on(event: "drain", listener: () => void): this; - on(event: "error", listener: (error: Error) => void): this; - on(event: "finish", listener: () => void): this; - - once(event: string, listener: (...args: any[]) => void): this; - once(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - once(event: "close", listener: () => void): this; - once(event: "drain", listener: () => void): this; - once(event: "error", listener: (error: Error) => void): this; - once(event: "finish", listener: () => void): this; - - prependListener(event: string, listener: (...args: any[]) => void): this; - prependListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "drain", listener: () => void): this; - prependListener(event: "error", listener: (error: Error) => void): this; - prependListener(event: "finish", listener: () => void): this; - - prependOnceListener(event: string, listener: (...args: any[]) => void): this; - prependOnceListener(event: "aborted", listener: (hadError: boolean, code: number) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "drain", listener: () => void): this; - prependOnceListener(event: "error", listener: (error: Error) => void): this; - prependOnceListener(event: "finish", listener: () => void): this; - } - - // Public API - - export namespace constants { - export const NGHTTP2_SESSION_SERVER: number; - export const NGHTTP2_SESSION_CLIENT: number; - export const NGHTTP2_STREAM_STATE_IDLE: number; - export const NGHTTP2_STREAM_STATE_OPEN: number; - export const NGHTTP2_STREAM_STATE_RESERVED_LOCAL: number; - export const NGHTTP2_STREAM_STATE_RESERVED_REMOTE: number; - export const NGHTTP2_STREAM_STATE_HALF_CLOSED_LOCAL: number; - export const NGHTTP2_STREAM_STATE_HALF_CLOSED_REMOTE: number; - export const NGHTTP2_STREAM_STATE_CLOSED: number; - export const NGHTTP2_NO_ERROR: number; - export const NGHTTP2_PROTOCOL_ERROR: number; - export const NGHTTP2_INTERNAL_ERROR: number; - export const NGHTTP2_FLOW_CONTROL_ERROR: number; - export const NGHTTP2_SETTINGS_TIMEOUT: number; - export const NGHTTP2_STREAM_CLOSED: number; - export const NGHTTP2_FRAME_SIZE_ERROR: number; - export const NGHTTP2_REFUSED_STREAM: number; - export const NGHTTP2_CANCEL: number; - export const NGHTTP2_COMPRESSION_ERROR: number; - export const NGHTTP2_CONNECT_ERROR: number; - export const NGHTTP2_ENHANCE_YOUR_CALM: number; - export const NGHTTP2_INADEQUATE_SECURITY: number; - export const NGHTTP2_HTTP_1_1_REQUIRED: number; - export const NGHTTP2_ERR_FRAME_SIZE_ERROR: number; - export const NGHTTP2_FLAG_NONE: number; - export const NGHTTP2_FLAG_END_STREAM: number; - export const NGHTTP2_FLAG_END_HEADERS: number; - export const NGHTTP2_FLAG_ACK: number; - export const NGHTTP2_FLAG_PADDED: number; - export const NGHTTP2_FLAG_PRIORITY: number; - export const DEFAULT_SETTINGS_HEADER_TABLE_SIZE: number; - export const DEFAULT_SETTINGS_ENABLE_PUSH: number; - export const DEFAULT_SETTINGS_INITIAL_WINDOW_SIZE: number; - export const DEFAULT_SETTINGS_MAX_FRAME_SIZE: number; - export const MAX_MAX_FRAME_SIZE: number; - export const MIN_MAX_FRAME_SIZE: number; - export const MAX_INITIAL_WINDOW_SIZE: number; - export const NGHTTP2_DEFAULT_WEIGHT: number; - export const NGHTTP2_SETTINGS_HEADER_TABLE_SIZE: number; - export const NGHTTP2_SETTINGS_ENABLE_PUSH: number; - export const NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS: number; - export const NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE: number; - export const NGHTTP2_SETTINGS_MAX_FRAME_SIZE: number; - export const NGHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE: number; - export const PADDING_STRATEGY_NONE: number; - export const PADDING_STRATEGY_MAX: number; - export const PADDING_STRATEGY_CALLBACK: number; - export const HTTP2_HEADER_STATUS: string; - export const HTTP2_HEADER_METHOD: string; - export const HTTP2_HEADER_AUTHORITY: string; - export const HTTP2_HEADER_SCHEME: string; - export const HTTP2_HEADER_PATH: string; - export const HTTP2_HEADER_ACCEPT_CHARSET: string; - export const HTTP2_HEADER_ACCEPT_ENCODING: string; - export const HTTP2_HEADER_ACCEPT_LANGUAGE: string; - export const HTTP2_HEADER_ACCEPT_RANGES: string; - export const HTTP2_HEADER_ACCEPT: string; - export const HTTP2_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN: string; - export const HTTP2_HEADER_AGE: string; - export const HTTP2_HEADER_ALLOW: string; - export const HTTP2_HEADER_AUTHORIZATION: string; - export const HTTP2_HEADER_CACHE_CONTROL: string; - export const HTTP2_HEADER_CONNECTION: string; - export const HTTP2_HEADER_CONTENT_DISPOSITION: string; - export const HTTP2_HEADER_CONTENT_ENCODING: string; - export const HTTP2_HEADER_CONTENT_LANGUAGE: string; - export const HTTP2_HEADER_CONTENT_LENGTH: string; - export const HTTP2_HEADER_CONTENT_LOCATION: string; - export const HTTP2_HEADER_CONTENT_MD5: string; - export const HTTP2_HEADER_CONTENT_RANGE: string; - export const HTTP2_HEADER_CONTENT_TYPE: string; - export const HTTP2_HEADER_COOKIE: string; - export const HTTP2_HEADER_DATE: string; - export const HTTP2_HEADER_ETAG: string; - export const HTTP2_HEADER_EXPECT: string; - export const HTTP2_HEADER_EXPIRES: string; - export const HTTP2_HEADER_FROM: string; - export const HTTP2_HEADER_HOST: string; - export const HTTP2_HEADER_IF_MATCH: string; - export const HTTP2_HEADER_IF_MODIFIED_SINCE: string; - export const HTTP2_HEADER_IF_NONE_MATCH: string; - export const HTTP2_HEADER_IF_RANGE: string; - export const HTTP2_HEADER_IF_UNMODIFIED_SINCE: string; - export const HTTP2_HEADER_LAST_MODIFIED: string; - export const HTTP2_HEADER_LINK: string; - export const HTTP2_HEADER_LOCATION: string; - export const HTTP2_HEADER_MAX_FORWARDS: string; - export const HTTP2_HEADER_PREFER: string; - export const HTTP2_HEADER_PROXY_AUTHENTICATE: string; - export const HTTP2_HEADER_PROXY_AUTHORIZATION: string; - export const HTTP2_HEADER_RANGE: string; - export const HTTP2_HEADER_REFERER: string; - export const HTTP2_HEADER_REFRESH: string; - export const HTTP2_HEADER_RETRY_AFTER: string; - export const HTTP2_HEADER_SERVER: string; - export const HTTP2_HEADER_SET_COOKIE: string; - export const HTTP2_HEADER_STRICT_TRANSPORT_SECURITY: string; - export const HTTP2_HEADER_TRANSFER_ENCODING: string; - export const HTTP2_HEADER_TE: string; - export const HTTP2_HEADER_UPGRADE: string; - export const HTTP2_HEADER_USER_AGENT: string; - export const HTTP2_HEADER_VARY: string; - export const HTTP2_HEADER_VIA: string; - export const HTTP2_HEADER_WWW_AUTHENTICATE: string; - export const HTTP2_HEADER_HTTP2_SETTINGS: string; - export const HTTP2_HEADER_KEEP_ALIVE: string; - export const HTTP2_HEADER_PROXY_CONNECTION: string; - export const HTTP2_METHOD_ACL: string; - export const HTTP2_METHOD_BASELINE_CONTROL: string; - export const HTTP2_METHOD_BIND: string; - export const HTTP2_METHOD_CHECKIN: string; - export const HTTP2_METHOD_CHECKOUT: string; - export const HTTP2_METHOD_CONNECT: string; - export const HTTP2_METHOD_COPY: string; - export const HTTP2_METHOD_DELETE: string; - export const HTTP2_METHOD_GET: string; - export const HTTP2_METHOD_HEAD: string; - export const HTTP2_METHOD_LABEL: string; - export const HTTP2_METHOD_LINK: string; - export const HTTP2_METHOD_LOCK: string; - export const HTTP2_METHOD_MERGE: string; - export const HTTP2_METHOD_MKACTIVITY: string; - export const HTTP2_METHOD_MKCALENDAR: string; - export const HTTP2_METHOD_MKCOL: string; - export const HTTP2_METHOD_MKREDIRECTREF: string; - export const HTTP2_METHOD_MKWORKSPACE: string; - export const HTTP2_METHOD_MOVE: string; - export const HTTP2_METHOD_OPTIONS: string; - export const HTTP2_METHOD_ORDERPATCH: string; - export const HTTP2_METHOD_PATCH: string; - export const HTTP2_METHOD_POST: string; - export const HTTP2_METHOD_PRI: string; - export const HTTP2_METHOD_PROPFIND: string; - export const HTTP2_METHOD_PROPPATCH: string; - export const HTTP2_METHOD_PUT: string; - export const HTTP2_METHOD_REBIND: string; - export const HTTP2_METHOD_REPORT: string; - export const HTTP2_METHOD_SEARCH: string; - export const HTTP2_METHOD_TRACE: string; - export const HTTP2_METHOD_UNBIND: string; - export const HTTP2_METHOD_UNCHECKOUT: string; - export const HTTP2_METHOD_UNLINK: string; - export const HTTP2_METHOD_UNLOCK: string; - export const HTTP2_METHOD_UPDATE: string; - export const HTTP2_METHOD_UPDATEREDIRECTREF: string; - export const HTTP2_METHOD_VERSION_CONTROL: string; - export const HTTP_STATUS_CONTINUE: number; - export const HTTP_STATUS_SWITCHING_PROTOCOLS: number; - export const HTTP_STATUS_PROCESSING: number; - export const HTTP_STATUS_OK: number; - export const HTTP_STATUS_CREATED: number; - export const HTTP_STATUS_ACCEPTED: number; - export const HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION: number; - export const HTTP_STATUS_NO_CONTENT: number; - export const HTTP_STATUS_RESET_CONTENT: number; - export const HTTP_STATUS_PARTIAL_CONTENT: number; - export const HTTP_STATUS_MULTI_STATUS: number; - export const HTTP_STATUS_ALREADY_REPORTED: number; - export const HTTP_STATUS_IM_USED: number; - export const HTTP_STATUS_MULTIPLE_CHOICES: number; - export const HTTP_STATUS_MOVED_PERMANENTLY: number; - export const HTTP_STATUS_FOUND: number; - export const HTTP_STATUS_SEE_OTHER: number; - export const HTTP_STATUS_NOT_MODIFIED: number; - export const HTTP_STATUS_USE_PROXY: number; - export const HTTP_STATUS_TEMPORARY_REDIRECT: number; - export const HTTP_STATUS_PERMANENT_REDIRECT: number; - export const HTTP_STATUS_BAD_REQUEST: number; - export const HTTP_STATUS_UNAUTHORIZED: number; - export const HTTP_STATUS_PAYMENT_REQUIRED: number; - export const HTTP_STATUS_FORBIDDEN: number; - export const HTTP_STATUS_NOT_FOUND: number; - export const HTTP_STATUS_METHOD_NOT_ALLOWED: number; - export const HTTP_STATUS_NOT_ACCEPTABLE: number; - export const HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED: number; - export const HTTP_STATUS_REQUEST_TIMEOUT: number; - export const HTTP_STATUS_CONFLICT: number; - export const HTTP_STATUS_GONE: number; - export const HTTP_STATUS_LENGTH_REQUIRED: number; - export const HTTP_STATUS_PRECONDITION_FAILED: number; - export const HTTP_STATUS_PAYLOAD_TOO_LARGE: number; - export const HTTP_STATUS_URI_TOO_LONG: number; - export const HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: number; - export const HTTP_STATUS_RANGE_NOT_SATISFIABLE: number; - export const HTTP_STATUS_EXPECTATION_FAILED: number; - export const HTTP_STATUS_TEAPOT: number; - export const HTTP_STATUS_MISDIRECTED_REQUEST: number; - export const HTTP_STATUS_UNPROCESSABLE_ENTITY: number; - export const HTTP_STATUS_LOCKED: number; - export const HTTP_STATUS_FAILED_DEPENDENCY: number; - export const HTTP_STATUS_UNORDERED_COLLECTION: number; - export const HTTP_STATUS_UPGRADE_REQUIRED: number; - export const HTTP_STATUS_PRECONDITION_REQUIRED: number; - export const HTTP_STATUS_TOO_MANY_REQUESTS: number; - export const HTTP_STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE: number; - export const HTTP_STATUS_UNAVAILABLE_FOR_LEGAL_REASONS: number; - export const HTTP_STATUS_INTERNAL_SERVER_ERROR: number; - export const HTTP_STATUS_NOT_IMPLEMENTED: number; - export const HTTP_STATUS_BAD_GATEWAY: number; - export const HTTP_STATUS_SERVICE_UNAVAILABLE: number; - export const HTTP_STATUS_GATEWAY_TIMEOUT: number; - export const HTTP_STATUS_HTTP_VERSION_NOT_SUPPORTED: number; - export const HTTP_STATUS_VARIANT_ALSO_NEGOTIATES: number; - export const HTTP_STATUS_INSUFFICIENT_STORAGE: number; - export const HTTP_STATUS_LOOP_DETECTED: number; - export const HTTP_STATUS_BANDWIDTH_LIMIT_EXCEEDED: number; - export const HTTP_STATUS_NOT_EXTENDED: number; - export const HTTP_STATUS_NETWORK_AUTHENTICATION_REQUIRED: number; - } - - export function getDefaultSettings(): Settings; - export function getPackedSettings(settings: Settings): Settings; - export function getUnpackedSettings(buf: Buffer | Uint8Array): Settings; - - export function createServer(onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2Server; - export function createServer(options: ServerOptions, onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2Server; - - export function createSecureServer(onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2SecureServer; - export function createSecureServer(options: SecureServerOptions, onRequestHandler?: (request: Http2ServerRequest, response: Http2ServerResponse) => void): Http2SecureServer; - - export function connect(authority: string | url.URL, listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): ClientHttp2Session; - export function connect(authority: string | url.URL, options?: ClientSessionOptions | SecureClientSessionOptions, listener?: (session: ClientHttp2Session, socket: net.Socket | tls.TLSSocket) => void): ClientHttp2Session; -} - -declare module "perf_hooks" { - export interface PerformanceEntry { - /** - * The total number of milliseconds elapsed for this entry. - * This value will not be meaningful for all Performance Entry types. - */ - readonly duration: number; - - /** - * The name of the performance entry. - */ - readonly name: string; - - /** - * The high resolution millisecond timestamp marking the starting time of the Performance Entry. - */ - readonly startTime: number; - - /** - * The type of the performance entry. - * Currently it may be one of: 'node', 'mark', 'measure', 'gc', or 'function'. - */ - readonly entryType: string; - - /** - * When performanceEntry.entryType is equal to 'gc', the performance.kind property identifies - * the type of garbage collection operation that occurred. - * The value may be one of perf_hooks.constants. - */ - readonly kind?: number; - } - - export interface PerformanceNodeTiming extends PerformanceEntry { - /** - * The high resolution millisecond timestamp at which the Node.js process completed bootstrap. - */ - readonly bootstrapComplete: number; - - /** - * The high resolution millisecond timestamp at which cluster processing ended. - */ - readonly clusterSetupEnd: number; - - /** - * The high resolution millisecond timestamp at which cluster processing started. - */ - readonly clusterSetupStart: number; - - /** - * The high resolution millisecond timestamp at which the Node.js event loop exited. - */ - readonly loopExit: number; - - /** - * The high resolution millisecond timestamp at which the Node.js event loop started. - */ - readonly loopStart: number; - - /** - * The high resolution millisecond timestamp at which main module load ended. - */ - readonly moduleLoadEnd: number; - - /** - * The high resolution millisecond timestamp at which main module load started. - */ - readonly moduleLoadStart: number; - - /** - * The high resolution millisecond timestamp at which the Node.js process was initialized. - */ - readonly nodeStart: number; - - /** - * The high resolution millisecond timestamp at which preload module load ended. - */ - readonly preloadModuleLoadEnd: number; - - /** - * The high resolution millisecond timestamp at which preload module load started. - */ - readonly preloadModuleLoadStart: number; - - /** - * The high resolution millisecond timestamp at which third_party_main processing ended. - */ - readonly thirdPartyMainEnd: number; - - /** - * The high resolution millisecond timestamp at which third_party_main processing started. - */ - readonly thirdPartyMainStart: number; - - /** - * The high resolution millisecond timestamp at which the V8 platform was initialized. - */ - readonly v8Start: number; - } - - export interface Performance { - /** - * If name is not provided, removes all PerformanceFunction objects from the Performance Timeline. - * If name is provided, removes entries with name. - * @param name - */ - clearFunctions(name?: string): void; - - /** - * If name is not provided, removes all PerformanceMark objects from the Performance Timeline. - * If name is provided, removes only the named mark. - * @param name - */ - clearMarks(name?: string): void; - - /** - * If name is not provided, removes all PerformanceMeasure objects from the Performance Timeline. - * If name is provided, removes only objects whose performanceEntry.name matches name. - */ - clearMeasures(name?: string): void; - - /** - * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime. - * @return list of all PerformanceEntry objects - */ - getEntries(): PerformanceEntry[]; - - /** - * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.name is equal to name, and optionally, whose performanceEntry.entryType is equal to type. - * @param name - * @param type - * @return list of all PerformanceEntry objects - */ - getEntriesByName(name: string, type?: string): PerformanceEntry[]; - - /** - * Returns a list of all PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.entryType is equal to type. - * @param type - * @return list of all PerformanceEntry objects - */ - getEntriesByType(type: string): PerformanceEntry[]; - - /** - * Creates a new PerformanceMark entry in the Performance Timeline. - * A PerformanceMark is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'mark', - * and whose performanceEntry.duration is always 0. - * Performance marks are used to mark specific significant moments in the Performance Timeline. - * @param name - */ - mark(name?: string): void; - - /** - * Creates a new PerformanceMeasure entry in the Performance Timeline. - * A PerformanceMeasure is a subclass of PerformanceEntry whose performanceEntry.entryType is always 'measure', - * and whose performanceEntry.duration measures the number of milliseconds elapsed since startMark and endMark. - * - * The startMark argument may identify any existing PerformanceMark in the the Performance Timeline, or may identify - * any of the timestamp properties provided by the PerformanceNodeTiming class. If the named startMark does not exist, - * then startMark is set to timeOrigin by default. - * - * The endMark argument must identify any existing PerformanceMark in the the Performance Timeline or any of the timestamp - * properties provided by the PerformanceNodeTiming class. If the named endMark does not exist, an error will be thrown. - * @param name - * @param startMark - * @param endMark - */ - measure(name: string, startMark: string, endMark: string): void; - - /** - * An instance of the PerformanceNodeTiming class that provides performance metrics for specific Node.js operational milestones. - */ - readonly nodeTiming: PerformanceNodeTiming; - - /** - * @return the current high resolution millisecond timestamp - */ - now(): number; - - /** - * The timeOrigin specifies the high resolution millisecond timestamp from which all performance metric durations are measured. - */ - readonly timeOrigin: number; - - /** - * Wraps a function within a new function that measures the running time of the wrapped function. - * A PerformanceObserver must be subscribed to the 'function' event type in order for the timing details to be accessed. - * @param fn - */ - timerify<T extends (...optionalParams: any[]) => any>(fn: T): T; - } - - export interface PerformanceObserverEntryList { - /** - * @return a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime. - */ - getEntries(): PerformanceEntry[]; - - /** - * @return a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.name is equal to name, and optionally, whose performanceEntry.entryType is equal to type. - */ - getEntriesByName(name: string, type?: string): PerformanceEntry[]; - - /** - * @return Returns a list of PerformanceEntry objects in chronological order with respect to performanceEntry.startTime - * whose performanceEntry.entryType is equal to type. - */ - getEntriesByType(type: string): PerformanceEntry[]; - } - - export type PerformanceObserverCallback = (list: PerformanceObserverEntryList, observer: PerformanceObserver) => void; - - export class PerformanceObserver { - constructor(callback: PerformanceObserverCallback); - - /** - * Disconnects the PerformanceObserver instance from all notifications. - */ - disconnect(): void; - - /** - * Subscribes the PerformanceObserver instance to notifications of new PerformanceEntry instances identified by options.entryTypes. - * When options.buffered is false, the callback will be invoked once for every PerformanceEntry instance. - * Property buffered defaults to false. - * @param options - */ - observe(options: { entryTypes: string[], buffered?: boolean }): void; - } - - export namespace constants { - export const NODE_PERFORMANCE_GC_MAJOR: number; - export const NODE_PERFORMANCE_GC_MINOR: number; - export const NODE_PERFORMANCE_GC_INCREMENTAL: number; - export const NODE_PERFORMANCE_GC_WEAKCB: number; - } - - const performance: Performance; -} \ No newline at end of file diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index a6ec588d5a6..605f48afab8 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -146,7 +146,7 @@ function showContextMenu(e) { }) ); - menu.popup({ window: remote.getCurrentWindow() }); + menu.popup(remote.getCurrentWindow()); } } diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index d578e8c752b..238f3fb5b4f 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -61,8 +61,6 @@ import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; -import { join } from 'path'; -import { copy, exists, rename } from 'vs/base/node/pfs'; export class CodeApplication { @@ -264,55 +262,49 @@ export class CodeApplication { this.logService.debug(`from: ${this.environmentService.appRoot}`); this.logService.debug('args:', this.environmentService.args); - // Handle local storage (TODO@Ben remove me after a while) - this.logService.trace('Handling localStorage if needed...'); - return this.handleLocalStorage().then(() => { + // Make sure we associate the program with the app user model id + // This will help Windows to associate the running program with + // any shortcut that is pinned to the taskbar and prevent showing + // two icons in the taskbar for the same app. + if (platform.isWindows && product.win32AppUserModelId) { + app.setAppUserModelId(product.win32AppUserModelId); + } - // Make sure we associate the program with the app user model id - // This will help Windows to associate the running program with - // any shortcut that is pinned to the taskbar and prevent showing - // two icons in the taskbar for the same app. - if (platform.isWindows && product.win32AppUserModelId) { - app.setAppUserModelId(product.win32AppUserModelId); + // Create Electron IPC Server + this.electronIpcServer = new ElectronIPCServer(); + + // Resolve unique machine ID + this.logService.trace('Resolving machine identifier...'); + return this.resolveMachineId().then(machineId => { + this.logService.trace(`Resolved machine identifier: ${machineId}`); + + // Spawn shared process + this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); + this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); + + // Services + const appInstantiationService = this.initServices(machineId); + + let promise: TPromise<any> = TPromise.as(null); + + // Create driver + if (this.environmentService.driverHandle) { + serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { + this.logService.info('Driver started at:', this.environmentService.driverHandle); + this.toDispose.push(server); + }); } - // Create Electron IPC Server - this.electronIpcServer = new ElectronIPCServer(); + return promise.then(() => { + // Setup Auth Handler + const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); + this.toDispose.push(authHandler); - // Resolve unique machine ID - this.logService.trace('Resolving machine identifier...'); - return this.resolveMachineId().then(machineId => { - this.logService.trace(`Resolved machine identifier: ${machineId}`); + // Open Windows + appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); - // Spawn shared process - this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); - this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); - - // Services - const appInstantiationService = this.initServices(machineId); - - let promise: TPromise<any> = TPromise.as(null); - - // Create driver - if (this.environmentService.driverHandle) { - serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { - this.logService.info('Driver started at:', this.environmentService.driverHandle); - this.toDispose.push(server); - }); - } - - return promise.then(() => { - - // Setup Auth Handler - const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); - this.toDispose.push(authHandler); - - // Open Windows - appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); - - // Post Open Windows Tasks - appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); - }); + // Post Open Windows Tasks + appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); }); }); } @@ -332,36 +324,6 @@ export class CodeApplication { }); } - private handleLocalStorage(): TPromise<void> { - const localStorageFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage'); - const localStorageJournalFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal'); - const localStorageBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage.vscbak'); - const localStorageJournalBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal.vscbak'); - - // Electron 1.7.12: Restore storage - if (process.versions.electron === '1.7.12') { - return exists(localStorageBackupFile).then(localStorageBackupFileExists => { - return exists(localStorageJournalBackupFile).then(localStorageJournalBackupFileExists => { - return TPromise.join([ - localStorageBackupFileExists ? rename(localStorageBackupFile, localStorageFile) : TPromise.as(void 0), - localStorageJournalBackupFileExists ? rename(localStorageJournalBackupFile, localStorageJournalFile) : TPromise.as(void 0) - ]); - }); - }).then(() => void 0, () => void 0); - } - - // Electron 2.0: Backup - else { - return exists(localStorageBackupFile).then(backupExists => { - if (backupExists) { - return void 0; // do not backup if backup already exists - } - - return copy(localStorageFile, localStorageBackupFile).then(() => copy(localStorageJournalFile, localStorageJournalBackupFile)); - }).then(() => void 0, () => void 0); - } - } - private initServices(machineId: string): IInstantiationService { const services = new ServiceCollection(); @@ -519,4 +481,4 @@ export class CodeApplication { private dispose(): void { this.toDispose = dispose(this.toDispose); } -} \ No newline at end of file +} diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index e5968577d0b..af71a291e7b 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -186,6 +186,23 @@ export class CodeWindow implements ICodeWindow { this._win = new BrowserWindow(options); this._id = this._win.id; + // Bug in Electron (https://github.com/electron/electron/issues/10862). On multi-monitor setups, + // it can happen that the position we set to the window is not the correct one on the display. + // To workaround, we ask the window for its position and set it again if not matching. + // This only applies if the window is not fullscreen or maximized and multiple monitors are used. + if (isWindows && !isFullscreenOrMaximized) { + try { + if (screen.getAllDisplays().length > 1) { + const [x, y] = this._win.getPosition(); + if (x !== this.windowState.x || y !== this.windowState.y) { + this._win.setPosition(this.windowState.x, this.windowState.y, false); + } + } + } catch (err) { + this.logService.warn(`Unexpected error fixing window position on windows with multiple windows: ${err}\n${err.stack}`); + } + } + if (useCustomTitleStyle) { this._win.setSheetOffset(22); // offset dialogs by the height of the custom title bar if we have any } @@ -938,6 +955,11 @@ export class CodeWindow implements ICodeWindow { this.touchBarGroups.push(groupTouchBar); } + // Ugly workaround for native crash on macOS 10.12.1. We are not + // leveraging the API for changing the ESC touch bar item. + // See https://github.com/electron/electron/issues/10442 + (<any>this._win)._setEscapeTouchBarItem = () => { }; + this._win.setTouchBar(new TouchBar({ items: this.touchBarGroups })); } diff --git a/src/vs/platform/update/electron-main/updateService.darwin.ts b/src/vs/platform/update/electron-main/updateService.darwin.ts index 629ca60be86..aae291e1630 100644 --- a/src/vs/platform/update/electron-main/updateService.darwin.ts +++ b/src/vs/platform/update/electron-main/updateService.darwin.ts @@ -49,7 +49,7 @@ export class DarwinUpdateService extends AbstractUpdateService { protected setUpdateFeedUrl(quality: string): boolean { try { - electron.autoUpdater.setFeedURL({ url: createUpdateURL('darwin', quality) }); + electron.autoUpdater.setFeedURL(createUpdateURL('darwin', quality)); } catch (e) { // application is very likely not signed this.logService.error('Failed to set update feed URL'); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index c6c432a65c0..d63f117ff44 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -24,17 +24,14 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ToggleActivityBarVisibilityAction } from 'vs/workbench/browser/actions/toggleActivityBarVisibility'; -import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER, ACTIVITY_BAR_FOREGROUND, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND } from 'vs/workbench/common/theme'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { CompositeBar } from 'vs/workbench/browser/parts/compositebar/compositeBar'; import { ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/compositebar/compositeBarActions'; -import { isMacintosh } from 'vs/base/common/platform'; -import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { Dimension, scheduleAtNextAnimationFrame } from 'vs/base/browser/dom'; -import { Color } from 'vs/base/common/color'; import { ViewLocation, ViewsRegistry } from 'vs/workbench/common/views'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; +import { Dimension } from 'vs/base/browser/dom'; export class ActivitybarPart extends Part { @@ -62,8 +59,7 @@ export class ActivitybarPart extends Part { @IContextMenuService private contextMenuService: IContextMenuService, @IInstantiationService private instantiationService: IInstantiationService, @IPartService private partService: IPartService, - @IThemeService themeService: IThemeService, - @ILifecycleService private lifecycleService: ILifecycleService + @IThemeService themeService: IThemeService ) { super(id, { hasTitle: false }, themeService); @@ -142,27 +138,6 @@ export class ActivitybarPart extends Part { // Top Actionbar with action items for each viewlet action this.createGlobalActivityActionBar($('.global-activity').appendTo($result).getHTMLElement()); - // TODO@Ben: workaround for https://github.com/Microsoft/vscode/issues/45700 - // It looks like there are rendering glitches on macOS with Chrome 61 when - // using --webkit-mask with a background color that is different from the image - // The workaround is to promote the element onto its own drawing layer. We do - // this only after the workbench has loaded because otherwise there is ugly flicker. - if (isMacintosh) { - this.lifecycleService.when(LifecyclePhase.Running).then(() => { - scheduleAtNextAnimationFrame(() => { // another delay... - scheduleAtNextAnimationFrame(() => { // ...to prevent more flickering on startup - registerThemingParticipant((theme, collector) => { - const activityBarForeground = theme.getColor(ACTIVITY_BAR_FOREGROUND); - if (activityBarForeground && !activityBarForeground.equals(Color.white)) { - // only apply this workaround if the color is different from the image one (white) - collector.addRule('.monaco-workbench .activitybar > .content > .composite-bar > .monaco-action-bar .action-label { will-change: transform; }'); - } - }); - }); - }); - }); - } - return $result.getHTMLElement(); } diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 5692c84329a..93ba3e987c8 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -43,7 +43,7 @@ import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; import { EditorWorkerServiceImpl } from 'vs/editor/common/services/editorWorkerServiceImpl'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { ExtensionService } from 'vs/workbench/services/extensions/electron-browser/extensionService'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { IStorageService } from 'vs/platform/storage/common/storage'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; @@ -83,7 +83,7 @@ import { HashService } from 'vs/workbench/services/hash/node/hashService'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; import { ILogService } from 'vs/platform/log/common/log'; import { WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; -import { stat, existsSync } from 'fs'; +import { stat } from 'fs'; import { join } from 'path'; import { ILocalizationsChannel, LocalizationsChannelClient } from 'vs/platform/localizations/common/localizationsIpc'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; @@ -128,7 +128,6 @@ export class WorkbenchShell { private lifecycleService: LifecycleService; private mainProcessServices: ServiceCollection; private notificationService: INotificationService; - private mainProcessClient: IPCClient; private container: HTMLElement; private toUnbind: IDisposable[]; @@ -140,9 +139,7 @@ export class WorkbenchShell { private configuration: IWindowConfiguration; private workbench: Workbench; - private hasLocalStorageData: boolean; - - constructor(container: HTMLElement, coreServices: ICoreServices, mainProcessServices: ServiceCollection, mainProcessClient: IPCClient, configuration: IWindowConfiguration) { + constructor(container: HTMLElement, coreServices: ICoreServices, mainProcessServices: ServiceCollection, private mainProcessClient: IPCClient, configuration: IWindowConfiguration) { this.container = container; this.configuration = configuration; @@ -155,13 +152,9 @@ export class WorkbenchShell { this.storageService = coreServices.storageService; this.mainProcessServices = mainProcessServices; - this.mainProcessClient = mainProcessClient; this.toUnbind = []; this.previousErrorTime = 0; - - // TODO@Ben remove me later - this.hasLocalStorageData = !!this.storageService.get('releaseNotes/lastVersion', StorageScope.GLOBAL); } private createContents(parent: HTMLElement): HTMLElement { @@ -227,11 +220,6 @@ export class WorkbenchShell { if (!this.environmentService.extensionTestsPath && this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { this.logLocalStorageMetrics(); } - - // localStorage migration (TODO@Ben remove me later) - if (!this.environmentService.extensionTestsPath) { - this.logLocalStorageMigrationStatus(); - } }); return workbench; @@ -306,17 +294,17 @@ export class WorkbenchShell { } perf.mark('willReadLocalStorage'); - const readyToSend = this.storageService.getBoolean('localStorageMetricsReadyToSend4'); + const readyToSend = this.storageService.getBoolean('localStorageMetricsReadyToSend2'); perf.mark('didReadLocalStorage'); if (!readyToSend) { - this.storageService.store('localStorageMetricsReadyToSend4', true); + this.storageService.store('localStorageMetricsReadyToSend2', true); return; // avoid logging localStorage metrics directly after the update, we prefer cold startup numbers } - if (!this.storageService.getBoolean('localStorageMetricsSent4')) { + if (!this.storageService.getBoolean('localStorageMetricsSent2')) { perf.mark('willWriteLocalStorage'); - this.storageService.store('localStorageMetricsSent4', true); + this.storageService.store('localStorageMetricsSent2', true); perf.mark('didWriteLocalStorage'); perf.mark('willStatLocalStorage'); @@ -334,7 +322,7 @@ export class WorkbenchShell { "size": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } } */ - this.telemetryService.publicLog('localStorageTimers4', { + this.telemetryService.publicLog('localStorageTimers2', { 'statTime': perf.getDuration('willStatLocalStorage', 'didStatLocalStorage'), 'accessTime': perf.getDuration('willAccessLocalStorage', 'didAccessLocalStorage'), 'firstReadTime': perf.getDuration('willReadWorkspaceIdentifier', 'didReadWorkspaceIdentifier'), @@ -347,38 +335,6 @@ export class WorkbenchShell { } } - private logLocalStorageMigrationStatus(): void { - if (product.quality === 'insider' && !this.storageService.getBoolean('localStorageMigrationStatusLogged')) { - this.storageService.store('localStorageMigrationStatusLogged', true); - - stat(join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage.vscbak'), (error, stat) => { - // if we have a backup of localStorage it means a migration was attempted - // by Electron 2.0. We log to telemetry if we had data initially which means - // the migration was successful. - if (stat) { - /* __GDPR__ - "localStorageMigrationStatus" : { - "platform": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "arch": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "migrated": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "size": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "sqliteStillExists": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "sqliteJournalExists": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } - } - */ - this.telemetryService.publicLog('localStorageMigrationStatus', { - 'platform': process.platform, - 'arch': process.arch, - 'migrated': this.hasLocalStorageData, - 'size': stat.size, - 'sqliteStillExists': existsSync(join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage')), - 'sqliteJournalExists': existsSync(join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal')) - }); - } - }); - } - } - private initServiceCollection(container: HTMLElement): [IInstantiationService, ServiceCollection] { const serviceCollection = new ServiceCollection(); serviceCollection.set(IWorkspaceContextService, this.contextService); diff --git a/src/vs/workbench/node/extensionHostProcess.ts b/src/vs/workbench/node/extensionHostProcess.ts index fb05c3f3c2e..b91ad78ad4d 100644 --- a/src/vs/workbench/node/extensionHostProcess.ts +++ b/src/vs/workbench/node/extensionHostProcess.ts @@ -13,24 +13,6 @@ import { Protocol } from 'vs/base/parts/ipc/node/ipc.net'; import { createConnection } from 'net'; import { Event, filterEvent } from 'vs/base/common/event'; -// TODO@ben: with Electron 2.x and node.js 8.x the "natives" module -// can cause a native crash (see https://github.com/nodejs/node/issues/19891 and -// https://github.com/electron/electron/issues/10905). To prevent this from -// happening we essentially blocklist this module from getting loaded in any -// extension by patching the node require() function. -(function () { - const Module = require.__$__nodeRequire('module') as any; - const originalLoad = Module._load; - - Module._load = function (request) { - if (request === 'natives') { - throw new Error('Either the extension or a NPM dependency is using the "natives" node module which is unsupported as it can cause a crash of the extension host. Click [here](https://go.microsoft.com/fwlink/?linkid=871887) to find out more'); - } - - return originalLoad.apply(this, arguments); - }; -})(); - interface IRendererConnection { protocol: IMessagePassingProtocol; initData: IInitData; @@ -146,6 +128,8 @@ createExtHostProtocol().then(protocol => { return extensionHostMain.start(); }).catch(err => console.error(err)); + + function patchExecArgv() { // when encountering the prevent-inspect flag we delete this // and the prior flag diff --git a/src/vs/workbench/services/configuration/node/configurationService.ts b/src/vs/workbench/services/configuration/node/configurationService.ts index 99e62f15189..f304dc4c546 100644 --- a/src/vs/workbench/services/configuration/node/configurationService.ts +++ b/src/vs/workbench/services/configuration/node/configurationService.ts @@ -16,8 +16,8 @@ import { Queue } from 'vs/base/common/async'; import { stat, writeFile } from 'vs/base/node/pfs'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; import { IWorkspaceContextService, Workspace, WorkbenchState, IWorkspaceFolder, toWorkspaceFolders, IWorkspaceFoldersChangeEvent, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { isLinux, isWindows, isMacintosh } from 'vs/base/common/platform'; import { IFileService } from 'vs/platform/files/common/files'; +import { isLinux } from 'vs/base/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ConfigurationChangeEvent, ConfigurationModel, DefaultConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { IConfigurationChangeEvent, ConfigurationTarget, IConfigurationOverrides, keyFromOverrideIdentifier, isConfigurationOverrides, IConfigurationData } from 'vs/platform/configuration/common/configuration'; @@ -349,19 +349,7 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat const folderPath = URI.file(singleFolderWorkspaceIdentifier); return stat(folderPath.fsPath) .then(workspaceStat => { - let ctime: number; - if (isLinux) { - ctime = workspaceStat.ino; // Linux: birthtime is ctime, so we cannot use it! We use the ino instead! - } else if (isMacintosh) { - ctime = workspaceStat.birthtime.getTime(); // macOS: birthtime is fine to use as is - } else if (isWindows) { - if (typeof workspaceStat.birthtimeMs === 'number') { - ctime = Math.floor(workspaceStat.birthtimeMs); // Windows: fix precision issue in node.js 8.x to get 7.x results (see https://github.com/nodejs/node/issues/19897) - } else { - ctime = workspaceStat.birthtime.getTime(); - } - } - + const ctime = isLinux ? workspaceStat.ino : workspaceStat.birthtime.getTime(); // On Linux, birthtime is ctime, so we cannot use it! We use the ino instead! const id = createHash('md5').update(folderPath.fsPath).update(ctime ? String(ctime) : '').digest('hex'); const folder = URI.file(folderPath.fsPath); return new Workspace(id, getBaseLabel(folder), toWorkspaceFolders([{ path: folder.fsPath }]), null, ctime); diff --git a/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts b/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts index 6382148634b..5c323ca2409 100644 --- a/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts +++ b/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts @@ -18,7 +18,6 @@ import { unmnemonicLabel } from 'vs/base/common/labels'; import { Event, Emitter } from 'vs/base/common/event'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IContextMenuDelegate, ContextSubMenu, IEvent } from 'vs/base/browser/contextmenu'; -import { once } from 'vs/base/common/functional'; export class ContextMenuService implements IContextMenuService { @@ -43,15 +42,7 @@ export class ContextMenuService implements IContextMenuService { } return TPromise.timeout(0).then(() => { // https://github.com/Microsoft/vscode/issues/3638 - const onHide = once(() => { - if (delegate.onHide) { - delegate.onHide(undefined); - } - - this._onDidContextMenu.fire(); - }); - - const menu = this.createMenu(delegate, actions, onHide); + const menu = this.createMenu(delegate, actions); const anchor = delegate.getAnchor(); let x: number, y: number; @@ -70,18 +61,16 @@ export class ContextMenuService implements IContextMenuService { x *= zoom; y *= zoom; - menu.popup({ - window: remote.getCurrentWindow(), - x: Math.floor(x), - y: Math.floor(y), - positioningItem: delegate.autoSelectFirstItem ? 0 : void 0, - callback: () => onHide() - }); + menu.popup(remote.getCurrentWindow(), { x: Math.floor(x), y: Math.floor(y), positioningItem: delegate.autoSelectFirstItem ? 0 : void 0 }); + this._onDidContextMenu.fire(); + if (delegate.onHide) { + delegate.onHide(undefined); + } }); }); } - private createMenu(delegate: IContextMenuDelegate, entries: (IAction | ContextSubMenu)[], onHide: () => void): Electron.Menu { + private createMenu(delegate: IContextMenuDelegate, entries: (IAction | ContextSubMenu)[]): Electron.Menu { const menu = new remote.Menu(); const actionRunner = delegate.actionRunner || new ActionRunner(); @@ -90,7 +79,7 @@ export class ContextMenuService implements IContextMenuService { menu.append(new remote.MenuItem({ type: 'separator' })); } else if (e instanceof ContextSubMenu) { const submenu = new remote.MenuItem({ - submenu: this.createMenu(delegate, e.entries, onHide), + submenu: this.createMenu(delegate, e.entries), label: unmnemonicLabel(e.label) }); @@ -102,13 +91,6 @@ export class ContextMenuService implements IContextMenuService { type: !!e.checked ? 'checkbox' : !!e.radio ? 'radio' : void 0, enabled: !!e.enabled, click: (menuItem, win, event) => { - - // To preserve pre-electron-2.x behaviour, we first trigger - // the onHide callback and then the action. - // Fixes https://github.com/Microsoft/vscode/issues/45601 - onHide(); - - // Run action which will close the menu this.runAction(actionRunner, e, delegate, event); } }; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index ad9aab56112..7a1508c2eec 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -193,13 +193,13 @@ export class ExtensionHostProcessWorker { }, 100); // Print out extension host output - onDebouncedOutput(output => { - const inspectorUrlMatch = !this._environmentService.isBuilt && output.data && output.data.match(/ws:\/\/([^\s]+)/); - if (inspectorUrlMatch) { - console.log(`%c[Extension Host] %cdebugger inspector at chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=${inspectorUrlMatch[1]}`, 'color: blue', 'color: black'); + onDebouncedOutput(data => { + const inspectorUrlIndex = !this._environmentService.isBuilt && data.data && data.data.indexOf('chrome-devtools://'); + if (inspectorUrlIndex >= 0) { + console.log(`%c[Extension Host] %cdebugger inspector at ${data.data.substr(inspectorUrlIndex)}`, 'color: blue', 'color: black'); } else { console.group('Extension Host'); - console.log(output.data, ...output.format); + console.log(data.data, ...data.format); console.groupEnd(); } }); From aaa191d9a2d893a7d42b6e2233430c5fe5064d9e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Fri, 20 Apr 2018 16:24:27 +0200 Subject: [PATCH 594/710] localStorage: restore from backup if any --- src/vs/code/electron-main/app.ts | 100 +++++++++++++++++++------------ 1 file changed, 62 insertions(+), 38 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 238f3fb5b4f..2060846bfc5 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -61,6 +61,8 @@ import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; +import { join } from 'path'; +import { exists, rename } from 'vs/base/node/pfs'; export class CodeApplication { @@ -262,49 +264,54 @@ export class CodeApplication { this.logService.debug(`from: ${this.environmentService.appRoot}`); this.logService.debug('args:', this.environmentService.args); - // Make sure we associate the program with the app user model id - // This will help Windows to associate the running program with - // any shortcut that is pinned to the taskbar and prevent showing - // two icons in the taskbar for the same app. - if (platform.isWindows && product.win32AppUserModelId) { - app.setAppUserModelId(product.win32AppUserModelId); - } + // Handle local storage (TODO@Ben remove me after a while) + return this.handleLocalStorage().then(() => { - // Create Electron IPC Server - this.electronIpcServer = new ElectronIPCServer(); - - // Resolve unique machine ID - this.logService.trace('Resolving machine identifier...'); - return this.resolveMachineId().then(machineId => { - this.logService.trace(`Resolved machine identifier: ${machineId}`); - - // Spawn shared process - this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); - this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); - - // Services - const appInstantiationService = this.initServices(machineId); - - let promise: TPromise<any> = TPromise.as(null); - - // Create driver - if (this.environmentService.driverHandle) { - serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { - this.logService.info('Driver started at:', this.environmentService.driverHandle); - this.toDispose.push(server); - }); + // Make sure we associate the program with the app user model id + // This will help Windows to associate the running program with + // any shortcut that is pinned to the taskbar and prevent showing + // two icons in the taskbar for the same app. + if (platform.isWindows && product.win32AppUserModelId) { + app.setAppUserModelId(product.win32AppUserModelId); } - return promise.then(() => { - // Setup Auth Handler - const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); - this.toDispose.push(authHandler); + // Create Electron IPC Server + this.electronIpcServer = new ElectronIPCServer(); - // Open Windows - appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); + // Resolve unique machine ID + this.logService.trace('Resolving machine identifier...'); + return this.resolveMachineId().then(machineId => { + this.logService.trace(`Resolved machine identifier: ${machineId}`); - // Post Open Windows Tasks - appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + // Spawn shared process + this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); + this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); + + // Services + const appInstantiationService = this.initServices(machineId); + + let promise: TPromise<any> = TPromise.as(null); + + // Create driver + if (this.environmentService.driverHandle) { + serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { + this.logService.info('Driver started at:', this.environmentService.driverHandle); + this.toDispose.push(server); + }); + } + + return promise.then(() => { + + // Setup Auth Handler + const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); + this.toDispose.push(authHandler); + + // Open Windows + appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); + + // Post Open Windows Tasks + appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); + }); }); }); } @@ -324,6 +331,23 @@ export class CodeApplication { }); } + private handleLocalStorage(): TPromise<void> { + const localStorageFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage'); + const localStorageJournalFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal'); + const localStorageBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage.vscbak'); + const localStorageJournalBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal.vscbak'); + + // Electron 1.7.12: Restore storage + return exists(localStorageBackupFile).then(localStorageBackupFileExists => { + return exists(localStorageJournalBackupFile).then(localStorageJournalBackupFileExists => { + return TPromise.join([ + localStorageBackupFileExists ? rename(localStorageBackupFile, localStorageFile) : TPromise.as(void 0), + localStorageJournalBackupFileExists ? rename(localStorageJournalBackupFile, localStorageJournalFile) : TPromise.as(void 0) + ]); + }); + }).then(() => void 0, () => void 0); + } + private initServices(machineId: string): IInstantiationService { const services = new ServiceCollection(); From 2a54d2960c4d01272dab1f7e150b03165e95fd70 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Fri, 20 Apr 2018 17:38:12 +0200 Subject: [PATCH 595/710] minor rename --- .../workbench/parts/files/electron-browser/fileCommands.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts index fa3c104b434..06a87609635 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts @@ -386,11 +386,11 @@ CommandsRegistry.registerCommand({ } }); -function revealResourcesInOS(resources: URI[], windowsService: IWindowsService, notificationService: INotificationService, workSpaceContextService: IWorkspaceContextService): void { +function revealResourcesInOS(resources: URI[], windowsService: IWindowsService, notificationService: INotificationService, workspaceContextService: IWorkspaceContextService): void { if (resources.length) { sequence(resources.map(r => () => windowsService.showItemInFolder(paths.normalize(r.fsPath, true)))); - } else if (workSpaceContextService.getWorkspace().folders.length) { - windowsService.showItemInFolder(paths.normalize(workSpaceContextService.getWorkspace().folders[0].uri.fsPath, true)); + } else if (workspaceContextService.getWorkspace().folders.length) { + windowsService.showItemInFolder(paths.normalize(workspaceContextService.getWorkspace().folders[0].uri.fsPath, true)); } else { notificationService.info(nls.localize('openFileToReveal', "Open a file first to reveal")); } From 3df75e9194207aca819941df98e24fba268c4d27 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Fri, 20 Apr 2018 17:42:26 +0200 Subject: [PATCH 596/710] back to IWorkbenchEditorService for creating file input (for #48275) --- .../parts/files/electron-browser/files.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts b/src/vs/workbench/parts/files/electron-browser/files.contribution.ts index 48906d6533e..1da4ee90a94 100644 --- a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/electron-browser/files.contribution.ts @@ -136,7 +136,7 @@ class FileEditorInputFactory implements IEditorInputFactory { const resource = !!fileInput.resourceJSON ? URI.revive(fileInput.resourceJSON) : URI.parse(fileInput.resource); const encoding = fileInput.encoding; - return accessor.get(IInstantiationService).createInstance(FileEditorInput, resource, encoding); + return accessor.get(IWorkbenchEditorService).createInput({ resource, encoding }) as FileEditorInput; }); } } From d9d5663a69295a34dedbeaed5bab515b36961792 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Fri, 20 Apr 2018 17:00:21 +0200 Subject: [PATCH 597/710] scm viewlet: call setVisible on contributed panels --- .../parts/scm/electron-browser/scmViewlet.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 51dadcef081..17c764c629e 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -1185,14 +1185,23 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { } setVisible(visible: boolean): TPromise<void> { - const result = super.setVisible(visible); + const promises: TPromise<any>[] = []; + promises.push(super.setVisible(visible)); if (!visible) { this.cachedMainPanelHeight = this.getPanelSize(this.mainPanel); } this._onDidChangeVisibility.fire(visible); - return result; + + const start = this.getContributedViewsStartIndex(); + + for (let i = 0; i < this.contributedViews.viewDescriptors.length; i++) { + const panel = this.panels[start + i] as ViewsViewletPanel; + promises.push(panel.setVisible(visible)); + } + + return TPromise.join(promises) as TPromise<any>; } getOptimalWidth(): number { @@ -1351,6 +1360,7 @@ export class SCMViewlet extends PanelViewlet implements IViewModel { }) as ViewsViewletPanel; this.addPanels([{ panel, size: size || panel.minimumSize, index: start + index }]); + panel.setVisible(true); const contextMenuDisposable = addDisposableListener(panel.draggableElement, 'contextmenu', e => { e.stopPropagation(); From 9c4ad2db686b7e29c89f52c172376fe1e7574256 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Fri, 20 Apr 2018 17:26:08 +0200 Subject: [PATCH 598/710] rename uri api --- src/vs/vscode.proposed.d.ts | 8 ++++---- .../workbench/api/electron-browser/mainThreadUrls.ts | 6 +++--- src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++-- src/vs/workbench/api/node/extHost.protocol.ts | 6 +++--- src/vs/workbench/api/node/extHostUrls.ts | 12 ++++++------ 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 8158008cd85..8c7906ceae9 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -656,16 +656,16 @@ declare module 'vscode' { //#region URLs - export interface UrlHandler { - handleUrl(uri: Uri): void; + export interface ExternalUriHandler { + handleExternalUri(uri: Uri): void; } export namespace window { /** - * Registers a URL handler. + * Registers a protocol handler capable of handling system-wide URIs. */ - export function registerUrlHandler(handler: UrlHandler): Disposable; + export function registerExternalUriHandler(handler: ExternalUriHandler): Disposable; } //#endregion diff --git a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts index 64d74d4f23e..b84eecd04e8 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts @@ -23,7 +23,7 @@ class ExtensionUrlHandler implements IURLHandler { return TPromise.as(false); } - return this.proxy.$handleUrl(this.handle, uri).then(() => true); + return this.proxy.$handleExternalUri(this.handle, uri).then(() => true); } } @@ -41,7 +41,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { this.proxy = context.getProxy(ExtHostContext.ExtHostUrls); } - $registerUrlHandler(handle: number, extensionId: string): TPromise<void> { + $registerExternalUriHandler(handle: number, extensionId: string): TPromise<void> { const handler = new ExtensionUrlHandler(this.proxy, handle, extensionId); const disposable = this.urlService.registerHandler(handler); this.handlers.set(handle, disposable); @@ -49,7 +49,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { return TPromise.as(null); } - $unregisterUrlHandler(handle: number): TPromise<void> { + $unregisterExternalUriHandler(handle: number): TPromise<void> { const disposable = this.handlers.get(handle); if (!disposable) { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 054977f834d..688f4f3460f 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -434,8 +434,8 @@ export function createApiFactory( registerWebviewPanelSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviews.registerWebviewPanelSerializer(viewType, serializer); }), - registerUrlHandler: proposedApiFunction(extension, (handler: vscode.UrlHandler) => { - return extHostUrls.registerUrlHandler(extension.id, handler); + registerExternalUriHandler: proposedApiFunction(extension, (handler: vscode.ExternalUriHandler) => { + return extHostUrls.registerExternalUriHandler(extension.id, handler); }) }; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 9c1906697da..a31a36c4c7c 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -373,12 +373,12 @@ export interface ExtHostWebviewsShape { } export interface MainThreadUrlsShape extends IDisposable { - $registerUrlHandler(handle: number, extensionId: string): TPromise<void>; - $unregisterUrlHandler(handle: number): TPromise<void>; + $registerExternalUriHandler(handle: number, extensionId: string): TPromise<void>; + $unregisterExternalUriHandler(handle: number): TPromise<void>; } export interface ExtHostUrlsShape { - $handleUrl(handle: number, uri: UriComponents): TPromise<void>; + $handleExternalUri(handle: number, uri: UriComponents): TPromise<void>; } export interface MainThreadWorkspaceShape extends IDisposable { diff --git a/src/vs/workbench/api/node/extHostUrls.ts b/src/vs/workbench/api/node/extHostUrls.ts index a9e946c0c6d..c4ba32abf0e 100644 --- a/src/vs/workbench/api/node/extHostUrls.ts +++ b/src/vs/workbench/api/node/extHostUrls.ts @@ -14,7 +14,7 @@ export class ExtHostUrls implements ExtHostUrlsShape { private static HandlePool = 0; private readonly _proxy: MainThreadUrlsShape; - private handlers = new Map<number, vscode.UrlHandler>(); + private handlers = new Map<number, vscode.ExternalUriHandler>(); constructor( mainContext: IMainContext @@ -22,25 +22,25 @@ export class ExtHostUrls implements ExtHostUrlsShape { this._proxy = mainContext.getProxy(MainContext.MainThreadUrls); } - registerUrlHandler(extensionId: string, handler: vscode.UrlHandler): vscode.Disposable { + registerExternalUriHandler(extensionId: string, handler: vscode.ExternalUriHandler): vscode.Disposable { const handle = ExtHostUrls.HandlePool++; this.handlers.set(handle, handler); - this._proxy.$registerUrlHandler(handle, extensionId); + this._proxy.$registerExternalUriHandler(handle, extensionId); return toDisposable(() => { this.handlers.delete(handle); - this._proxy.$unregisterUrlHandler(handle); + this._proxy.$unregisterExternalUriHandler(handle); }); } - $handleUrl(handle: number, uri: UriComponents): TPromise<void> { + $handleExternalUri(handle: number, uri: UriComponents): TPromise<void> { const handler = this.handlers.get(handle); if (!handler) { return TPromise.as(null); } - handler.handleUrl(URI.revive(uri)); + handler.handleExternalUri(URI.revive(uri)); return TPromise.as(null); } } \ No newline at end of file From 1421074796dd565115f6956f1453d178a59cd6c8 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Fri, 20 Apr 2018 19:00:24 +0200 Subject: [PATCH 599/710] inactive extension url handler --- .../inactiveExtensionUrlHandler.ts | 122 ++++++++++++++++++ .../api/electron-browser/mainThreadUrls.ts | 25 ++-- .../workbench/electron-browser/workbench.ts | 4 + .../node/extensionDescriptionRegistry.ts | 6 + 4 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts diff --git a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts new file mode 100644 index 00000000000..9f9c05762c9 --- /dev/null +++ b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts @@ -0,0 +1,122 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; +import URI from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IDisposable, toDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; + +const FIVE_MINUTES = 5 * 60 * 1000; +const THIRTY_SECONDS = 30 * 1000; + +function isExtensionId(value: string): boolean { + return /^[a-z0-9][a-z0-9\-]*\.[a-z0-9][a-z0-9\-]*$/i.test(value); +} + +export const IInactiveExtensionUrlHandler = createDecorator<IInactiveExtensionUrlHandler>('inactiveExtensionUrlHandler'); + +export interface IInactiveExtensionUrlHandler { + readonly _serviceBrand: any; + registerExtensionHandler(extensionId: string, handler: IURLHandler): void; + unregisterExtensionHandler(extensionId: string): void; +} + +/** + * This class handles URLs which are directed towards inactive extensions. + * If a URL is directed towards an inactive extension, it buffers it, + * activates the extension and re-opens the URL once the extension registers + * a URL handler. If the extension never registers a URL handler, the urls + * will eventually be garbage collected. + */ +export class InactiveExtensionUrlHandler implements IInactiveExtensionUrlHandler, IURLHandler { + + readonly _serviceBrand: any; + + private extensionIds = new Set<string>(); + private uriBuffer = new Map<string, { timestamp: number, uri: URI }[]>(); + private disposable: IDisposable; + + constructor( + @IURLService urlService: IURLService, + @IExtensionService private extensionService: IExtensionService + ) { + const interval = setInterval(() => this.garbageCollect(), THIRTY_SECONDS); + + this.disposable = combinedDisposable([ + urlService.registerHandler(this), + toDisposable(() => clearInterval(interval)) + ]); + } + + handleURL(uri: URI): TPromise<boolean> { + if (!isExtensionId(uri.authority)) { + return TPromise.as(false); + } + + const extensionId = uri.authority; + + // let the ExtensionUrlHandler instance handle this + if (this.extensionIds.has(extensionId)) { + return TPromise.as(false); + } + + // collect URI for eventual extension activation + const timestamp = new Date().getTime(); + let uris = this.uriBuffer.get(extensionId); + + if (!uris) { + uris = []; + this.uriBuffer.set(extensionId, uris); + } + + uris.push({ timestamp, uri }); + + // activate the extension + return this.extensionService.activateByEvent(`onExternalUri:${extensionId}`) + .then(() => true); + } + + registerExtensionHandler(extensionId: string, handler: IURLHandler): void { + this.extensionIds.add(extensionId); + + const uris = this.uriBuffer.get(extensionId) || []; + + for (const { uri } of uris) { + handler.handleURL(uri); + } + + this.uriBuffer.delete(extensionId); + } + + unregisterExtensionHandler(extensionId: string): void { + this.extensionIds.delete(extensionId); + } + + // forget about all uris buffered more than 5 minutes ago + private garbageCollect(): void { + console.log('garbage collect'); + + const now = new Date().getTime(); + const uriBuffer = new Map<string, { timestamp: number, uri: URI }[]>(); + + this.uriBuffer.forEach((uris, extensionId) => { + uris = uris.filter(({ timestamp }) => now - timestamp < FIVE_MINUTES); + + if (uris.length > 0) { + uriBuffer.set(extensionId, uris); + } + }); + + this.uriBuffer = uriBuffer; + } + + dispose(): void { + this.disposable.dispose(); + this.extensionIds.clear(); + this.uriBuffer.clear(); + } +} \ No newline at end of file diff --git a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts index b84eecd04e8..1923e437eb1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts @@ -9,13 +9,14 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import URI from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { IInactiveExtensionUrlHandler } from 'vs/platform/url/electron-browser/inactiveExtensionUrlHandler'; class ExtensionUrlHandler implements IURLHandler { constructor( private readonly proxy: ExtHostUrlsShape, private readonly handle: number, - private readonly extensionId: string + readonly extensionId: string ) { } handleURL(uri: URI): TPromise<boolean> { @@ -31,12 +32,12 @@ class ExtensionUrlHandler implements IURLHandler { export class MainThreadUrls implements MainThreadUrlsShape { private readonly proxy: ExtHostUrlsShape; - - private handlers = new Map<number, IDisposable>(); + private handlers = new Map<number, { extensionId: string, disposable: IDisposable }>(); constructor( context: IExtHostContext, - @IURLService private urlService: IURLService + @IURLService private urlService: IURLService, + @IInactiveExtensionUrlHandler private inactiveExtensionUrlHandler: IInactiveExtensionUrlHandler ) { this.proxy = context.getProxy(ExtHostContext.ExtHostUrls); } @@ -44,25 +45,31 @@ export class MainThreadUrls implements MainThreadUrlsShape { $registerExternalUriHandler(handle: number, extensionId: string): TPromise<void> { const handler = new ExtensionUrlHandler(this.proxy, handle, extensionId); const disposable = this.urlService.registerHandler(handler); - this.handlers.set(handle, disposable); + + this.handlers.set(handle, { extensionId, disposable }); + this.inactiveExtensionUrlHandler.registerExtensionHandler(extensionId, handler); return TPromise.as(null); } $unregisterExternalUriHandler(handle: number): TPromise<void> { - const disposable = this.handlers.get(handle); + const tuple = this.handlers.get(handle); - if (!disposable) { + if (!tuple) { return TPromise.as(null); } - disposable.dispose(); + const { extensionId, disposable } = tuple; + + this.inactiveExtensionUrlHandler.unregisterExtensionHandler(extensionId); this.handlers.delete(handle); + disposable.dispose(); return TPromise.as(null); } dispose(): void { - + this.handlers.forEach(({ disposable }) => disposable.dispose()); + this.handlers.clear(); } } diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index c007900105a..4ea24f29b42 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -110,6 +110,7 @@ import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { PreferencesService } from 'vs/workbench/services/preferences/browser/preferencesService'; +import { IInactiveExtensionUrlHandler, InactiveExtensionUrlHandler } from 'vs/platform/url/electron-browser/inactiveExtensionUrlHandler'; export const EditorsVisibleContext = new RawContextKey<boolean>('editorIsOpen', false); export const InZenModeContext = new RawContextKey<boolean>('inZenMode', false); @@ -616,6 +617,9 @@ export class Workbench implements IPartService { // SCM Service serviceCollection.set(ISCMService, new SyncDescriptor(SCMService)); + // Inactive extension URL handler + serviceCollection.set(IInactiveExtensionUrlHandler, new SyncDescriptor(InactiveExtensionUrlHandler)); + // Text Model Resolver Service serviceCollection.set(ITextModelService, new SyncDescriptor(TextModelResolverService)); diff --git a/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts b/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts index 0d97bec7ccb..5fbb9357739 100644 --- a/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts +++ b/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts @@ -33,6 +33,12 @@ export class ExtensionDescriptionRegistry { if (Array.isArray(extensionDescription.activationEvents)) { for (let j = 0, lenJ = extensionDescription.activationEvents.length; j < lenJ; j++) { let activationEvent = extensionDescription.activationEvents[j]; + + // TODO@joao: there's no easy way to contribute this + if (activationEvent === 'onExternalUri') { + activationEvent = `onExternalUri:${extensionDescription.id}`; + } + this._activationMap[activationEvent] = this._activationMap[activationEvent] || []; this._activationMap[activationEvent].push(extensionDescription); } From d52cc1bd0ae85643453c0833594313b503f92fee Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Fri, 20 Apr 2018 10:23:38 -0700 Subject: [PATCH 600/710] Stop sending OSVersion as PlatformVersion is used post Nova --- src/vs/platform/telemetry/node/commonProperties.ts | 2 -- .../telemetry/test/electron-browser/commonProperties.test.ts | 1 - 2 files changed, 3 deletions(-) diff --git a/src/vs/platform/telemetry/node/commonProperties.ts b/src/vs/platform/telemetry/node/commonProperties.ts index 493d2692402..e997435d9c1 100644 --- a/src/vs/platform/telemetry/node/commonProperties.ts +++ b/src/vs/platform/telemetry/node/commonProperties.ts @@ -21,8 +21,6 @@ export function resolveCommonProperties(commit: string, version: string, machine result['version'] = version; // __GDPR__COMMON__ "common.platformVersion" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } result['common.platformVersion'] = (os.release() || '').replace(/^(\d+)(\.\d+)?(\.\d+)?(.*)/, '$1$2$3'); - // __GDPR__COMMON__ "common.osVersion" : { "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" } - result['common.osVersion'] = result['common.platformVersion']; // TODO: Drop this after the move to Nova // __GDPR__COMMON__ "common.platform" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } result['common.platform'] = Platform.Platform[Platform.platform]; // __GDPR__COMMON__ "common.nodePlatform" : { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth" } diff --git a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts index 2970c6b00bd..1c5e341b12b 100644 --- a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts @@ -48,7 +48,6 @@ suite('Telemetry - common properties', function () { // assert.ok('common.version.shell' in first.data); // only when running on electron // assert.ok('common.version.renderer' in first.data); - assert.ok('common.osVersion' in props, 'osVersion'); assert.ok('common.platformVersion' in props, 'platformVersion'); assert.ok('version' in props); assert.equal(props['common.source'], 'my.install.source'); From 953cdf7f3df21e55e070ab38490fdebcf82e90e3 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Fri, 20 Apr 2018 10:29:50 -0700 Subject: [PATCH 601/710] Update vscode-extension-telemetry version --- extensions/git/package.json | 2 +- extensions/html-language-features/package.json | 2 +- extensions/json-language-features/package.json | 2 +- extensions/markdown-language-features/package.json | 2 +- extensions/typescript-language-features/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 3c69526c68e..f6d86f0a91b 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1114,7 +1114,7 @@ "file-type": "^7.2.0", "iconv-lite": "0.4.19", "jschardet": "^1.6.0", - "vscode-extension-telemetry": "0.0.15", + "vscode-extension-telemetry": "0.0.16", "vscode-nls": "^3.2.1", "which": "^1.3.0" }, diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 7de2bb112bc..2de21c20bd7 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -172,7 +172,7 @@ } }, "dependencies": { - "vscode-extension-telemetry": "0.0.15", + "vscode-extension-telemetry": "0.0.16", "vscode-languageclient": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2" diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 807a17db050..9d4028b62fc 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -100,7 +100,7 @@ } }, "dependencies": { - "vscode-extension-telemetry": "0.0.15", + "vscode-extension-telemetry": "0.0.16", "vscode-languageclient": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-nls": "^3.2.2" diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 6fa682e351d..54338021532 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -288,7 +288,7 @@ "highlight.js": "9.5.0", "markdown-it": "^8.4.0", "markdown-it-named-headers": "0.0.4", - "vscode-extension-telemetry": "0.0.15", + "vscode-extension-telemetry": "0.0.16", "vscode-nls": "^3.2.1" }, "devDependencies": { diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 836a370e785..64a2132a32c 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -17,7 +17,7 @@ ], "dependencies": { "semver": "4.3.6", - "vscode-extension-telemetry": "0.0.15", + "vscode-extension-telemetry": "0.0.16", "vscode-nls": "^3.2.1" }, "devDependencies": { From 3a24b12179474e2b32b4fa6ee24a245c7c0044a3 Mon Sep 17 00:00:00 2001 From: Daniel Imms <daimms@microsoft.com> Date: Fri, 20 Apr 2018 11:24:22 -0700 Subject: [PATCH 602/710] Add Terminal.onData API Part of #46192 --- src/vs/vscode.proposed.d.ts | 4 +++ .../mainThreadTerminalService.ts | 13 +++++++ src/vs/workbench/api/node/extHost.protocol.ts | 2 ++ .../api/node/extHostTerminalService.ts | 34 +++++++++++++------ .../parts/terminal/common/terminal.ts | 7 ++++ .../electron-browser/terminalInstance.ts | 4 +++ 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 8c7906ceae9..c3dc4f6c07f 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -637,6 +637,10 @@ declare module 'vscode' { //#region Terminal + export interface Terminal { + onData: Event<string>; + } + export namespace window { /** * The currently active terminals or an empty array. diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 434652bfaf6..58e3ab9786d 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -16,6 +16,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _proxy: ExtHostTerminalServiceShape; private _toDispose: IDisposable[] = []; private _terminalProcesses: { [id: number]: ITerminalProcessExtHostProxy } = {}; + private _dataListeners: { [id: number]: IDisposable } = {}; constructor( extHostContext: IExtHostContext, @@ -87,6 +88,18 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } } + public $registerOnDataListener(terminalId: number): void { + let terminalInstance = this.terminalService.getInstanceFromId(terminalId); + if (terminalInstance) { + this._dataListeners[terminalId] = terminalInstance.onData(data => this._onTerminalData(terminalId, data)); + terminalInstance.onDisposed(instance => delete this._dataListeners[terminalId]); + } + } + + private _onTerminalData(terminalId: number, data: string): void { + this._proxy.$acceptTerminalProcessData(terminalId, data); + } + private _onTerminalDisposed(terminalInstance: ITerminalInstance): void { this._proxy.$acceptTerminalClosed(terminalInstance.id); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index a31a36c4c7c..f2aba8c2861 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -319,6 +319,7 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $hide(terminalId: number): void; $sendText(terminalId: number, text: string, addNewLine: boolean): void; $show(terminalId: number, preserveFocus: boolean): void; + $registerOnDataListener(terminalId: number): void; $sendProcessTitle(terminalId: number, title: string): void; $sendProcessData(terminalId: number, data: string): void; @@ -755,6 +756,7 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalClosed(id: number): void; $acceptTerminalOpened(id: number, name: string): void; $acceptTerminalProcessId(id: number, processId: number): void; + $acceptTerminalProcessData(id: number, data: string); $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; $acceptProcessInput(id: number, data: string): void; $acceptProcessResize(id: number, cols: number, rows: number): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index cb546c2e8d8..c4f2e996461 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -25,6 +25,13 @@ export class ExtHostTerminal implements vscode.Terminal { private _pidPromise: Promise<number>; private _pidPromiseComplete: (value: number) => any; + private readonly _onData: Emitter<string> = new Emitter<string>(); + public get onData(): Event<string> { + // Tell the main side to start sending data if it's not already + this._proxy.$registerOnDataListener(this._id); + return this._onData && this._onData.event; + } + constructor( proxy: MainThreadTerminalServiceShape, name: string = '', @@ -95,6 +102,10 @@ export class ExtHostTerminal implements vscode.Terminal { } } + public _fireOnData(data: string): void { + this._onData.fire(data); + } + private _queueApiRequest(callback: (...args: any[]) => void, args: any[]) { let request: ApiRequest = new ApiRequest(callback, args); if (!this._id) { @@ -112,21 +123,22 @@ export class ExtHostTerminal implements vscode.Terminal { } export class ExtHostTerminalService implements ExtHostTerminalServiceShape { - private readonly _onDidCloseTerminal: Emitter<vscode.Terminal>; - private readonly _onDidOpenTerminal: Emitter<vscode.Terminal>; private _proxy: MainThreadTerminalServiceShape; private _terminals: ExtHostTerminal[] = []; private _terminalProcesses: { [id: number]: cp.ChildProcess } = {}; public get terminals(): ExtHostTerminal[] { return this._terminals; } + private readonly _onDidCloseTerminal: Emitter<vscode.Terminal> = new Emitter<vscode.Terminal>(); + public get onDidCloseTerminal(): Event<vscode.Terminal> { return this._onDidCloseTerminal && this._onDidCloseTerminal.event; } + private readonly _onDidOpenTerminal: Emitter<vscode.Terminal> = new Emitter<vscode.Terminal>(); + public get onDidOpenTerminal(): Event<vscode.Terminal> { return this._onDidOpenTerminal && this._onDidOpenTerminal.event; } + constructor( mainContext: IMainContext, private _extHostConfiguration: ExtHostConfiguration, private _logService: ILogService ) { - this._onDidCloseTerminal = new Emitter<vscode.Terminal>(); - this._onDidOpenTerminal = new Emitter<vscode.Terminal>(); this._proxy = mainContext.getProxy(MainContext.MainThreadTerminalService); } @@ -144,18 +156,18 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { return terminal; } - public get onDidCloseTerminal(): Event<vscode.Terminal> { - return this._onDidCloseTerminal && this._onDidCloseTerminal.event; - } - - public get onDidOpenTerminal(): Event<vscode.Terminal> { - return this._onDidOpenTerminal && this._onDidOpenTerminal.event; + public $acceptTerminalProcessData(id: number, data: string): void { + let index = this._getTerminalIndexById(id); + if (index === null) { + return; + } + const terminal = this._terminals[index]; + terminal._fireOnData(data); } public $acceptTerminalClosed(id: number): void { let index = this._getTerminalIndexById(id); if (index === null) { - // The terminal was not created by the terminal API, ignore it return; } let terminal = this._terminals.splice(index, 1)[0]; diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index dfe9d89cc12..c10e3c4a734 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -439,6 +439,13 @@ export interface ITerminalInstance { */ setVisible(visible: boolean): void; + /** + * Attach a listener to the raw data stream coming from the pty, including ANSI escape + * sequecnes. + * @param listener The listener function. + */ + onData(listener: (data: string) => void): IDisposable; + /** * Attach a listener to listen for new lines added to this terminal instance. * diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 0459ce481c8..039eb1e3560 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -727,6 +727,10 @@ export class TerminalInstance implements ITerminalInstance { this._shellLaunchConfig = shell; } + public onData(listener: (data: string) => void): lifecycle.IDisposable { + return this._processManager.onProcessData(data => listener(data)); + } + public onLineData(listener: (lineData: string) => void): lifecycle.IDisposable { this._onLineDataListeners.push(listener); return { From 07d85ac0a02a30db82c387b099192884d74635c7 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Fri, 20 Apr 2018 13:27:07 -0700 Subject: [PATCH 603/710] Update js/ts grammar --- .../syntaxes/JavaScript.tmLanguage.json | 150 +++++++++++++----- .../syntaxes/JavaScriptReact.tmLanguage.json | 150 +++++++++++++----- .../syntaxes/TypeScript.tmLanguage.json | 150 +++++++++++++----- .../syntaxes/TypeScriptReact.tmLanguage.json | 150 +++++++++++++----- 4 files changed, 424 insertions(+), 176 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index 578adfbc370..e214a676dc6 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/3f27a794a2dbebf18714d7eaa799162fbadf7a11", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/fefa94101ef0114b95d3e14493051ebf5ec70c7c", "name": "JavaScript (with React support)", "scopeName": "source.js", "patterns": [ @@ -291,7 +291,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.js", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.js entity.name.function.js" @@ -525,7 +525,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.js" @@ -751,7 +751,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.js entity.name.function.js" @@ -2075,7 +2075,7 @@ }, { "name": "meta.object.member.js", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.js" @@ -2139,7 +2139,7 @@ "end": "(?=,|\\})", "patterns": [ { - "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.js" @@ -2172,7 +2172,7 @@ ] }, { - "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.js" @@ -2305,6 +2305,20 @@ }, "paren-expression-possibly-arrow": { "patterns": [ + { + "begin": "(?<=[(=,])\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, { "begin": "(?<=[(=,]|=>)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", "beginCaptures": { @@ -2315,26 +2329,29 @@ "end": "(?<=\\))", "patterns": [ { - "include": "#type-parameters" + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, + { + "begin": "(?<=[(=,])\\s*(async)?\\s*(\\()(?=\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js" }, + "2": { + "name": "meta.brace.round.js" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js" + } + }, + "patterns": [ { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.js" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] + "include": "#expression-inside-possibly-arrow-parens" } ] }, @@ -2365,6 +2382,32 @@ } ] }, + "paren-expression-possibly-arrow-with-typeparameters": { + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.js" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, "expression-inside-possibly-arrow-parens": { "patterns": [ { @@ -2879,7 +2922,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.js" @@ -3574,28 +3617,47 @@ "match": "\\\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)" }, "template": { - "name": "string.template.js", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.js" - }, - "2": { - "name": "punctuation.definition.string.template.begin.js" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.template.end.js" - } - }, "patterns": [ { - "include": "#template-substitution-element" + "name": "string.template.js", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.js" + } + }, + "end": "(?=`)", + "patterns": [ + { + "include": "#type-parameters" + } + ] }, { - "include": "#string-character-escape" + "name": "string.template.js", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.js" + }, + "2": { + "name": "punctuation.definition.string.template.begin.js" + } + }, + "end": "`", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.template.end.js" + } + }, + "patterns": [ + { + "include": "#template-substitution-element" + }, + { + "include": "#string-character-escape" + } + ] } ] }, diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json index f756aa5d6bf..f3795bda4bf 100644 --- a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/3f27a794a2dbebf18714d7eaa799162fbadf7a11", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/fefa94101ef0114b95d3e14493051ebf5ec70c7c", "name": "JavaScript (with React support)", "scopeName": "source.js.jsx", "patterns": [ @@ -291,7 +291,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.js.jsx", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.js.jsx entity.name.function.js.jsx" @@ -525,7 +525,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.js.jsx" @@ -751,7 +751,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.js.jsx entity.name.function.js.jsx" @@ -2075,7 +2075,7 @@ }, { "name": "meta.object.member.js.jsx", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.js.jsx" @@ -2139,7 +2139,7 @@ "end": "(?=,|\\})", "patterns": [ { - "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.js.jsx" @@ -2172,7 +2172,7 @@ ] }, { - "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.js.jsx" @@ -2305,6 +2305,20 @@ }, "paren-expression-possibly-arrow": { "patterns": [ + { + "begin": "(?<=[(=,])\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js.jsx" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, { "begin": "(?<=[(=,]|=>)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", "beginCaptures": { @@ -2315,26 +2329,29 @@ "end": "(?<=\\))", "patterns": [ { - "include": "#type-parameters" + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, + { + "begin": "(?<=[(=,])\\s*(async)?\\s*(\\()(?=\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js.jsx" }, + "2": { + "name": "meta.brace.round.js.jsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js.jsx" + } + }, + "patterns": [ { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.js.jsx" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.js.jsx" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] + "include": "#expression-inside-possibly-arrow-parens" } ] }, @@ -2365,6 +2382,32 @@ } ] }, + "paren-expression-possibly-arrow-with-typeparameters": { + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.js.jsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.js.jsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, "expression-inside-possibly-arrow-parens": { "patterns": [ { @@ -2879,7 +2922,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.js.jsx" @@ -3574,28 +3617,47 @@ "match": "\\\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)" }, "template": { - "name": "string.template.js.jsx", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.js.jsx" - }, - "2": { - "name": "punctuation.definition.string.template.begin.js.jsx" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.template.end.js.jsx" - } - }, "patterns": [ { - "include": "#template-substitution-element" + "name": "string.template.js.jsx", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.js.jsx" + } + }, + "end": "(?=`)", + "patterns": [ + { + "include": "#type-parameters" + } + ] }, { - "include": "#string-character-escape" + "name": "string.template.js.jsx", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.js.jsx" + }, + "2": { + "name": "punctuation.definition.string.template.begin.js.jsx" + } + }, + "end": "`", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.template.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#template-substitution-element" + }, + { + "include": "#string-character-escape" + } + ] } ] }, diff --git a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json index 33f6319b5c3..fbdfb52cb92 100644 --- a/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScript.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/3f27a794a2dbebf18714d7eaa799162fbadf7a11", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/fefa94101ef0114b95d3e14493051ebf5ec70c7c", "name": "TypeScript", "scopeName": "source.ts", "patterns": [ @@ -288,7 +288,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.ts", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.ts entity.name.function.ts" @@ -522,7 +522,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.ts" @@ -748,7 +748,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.ts entity.name.function.ts" @@ -2072,7 +2072,7 @@ }, { "name": "meta.object.member.ts", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.ts" @@ -2136,7 +2136,7 @@ "end": "(?=,|\\})", "patterns": [ { - "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.ts" @@ -2169,7 +2169,7 @@ ] }, { - "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.ts" @@ -2302,6 +2302,20 @@ }, "paren-expression-possibly-arrow": { "patterns": [ + { + "begin": "(?<=[(=,])\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.ts" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, { "begin": "(?<=[(=,]|=>)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", "beginCaptures": { @@ -2312,26 +2326,29 @@ "end": "(?<=\\))", "patterns": [ { - "include": "#type-parameters" + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, + { + "begin": "(?<=[(=,])\\s*(async)?\\s*(\\()(?=\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.ts" }, + "2": { + "name": "meta.brace.round.ts" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "patterns": [ { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.ts" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.ts" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] + "include": "#expression-inside-possibly-arrow-parens" } ] }, @@ -2362,6 +2379,32 @@ } ] }, + "paren-expression-possibly-arrow-with-typeparameters": { + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, "expression-inside-possibly-arrow-parens": { "patterns": [ { @@ -2913,7 +2956,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ((<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?[\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.ts" @@ -3608,28 +3651,47 @@ "match": "\\\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)" }, "template": { - "name": "string.template.ts", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.ts" - }, - "2": { - "name": "punctuation.definition.string.template.begin.ts" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.template.end.ts" - } - }, "patterns": [ { - "include": "#template-substitution-element" + "name": "string.template.ts", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.ts" + } + }, + "end": "(?=`)", + "patterns": [ + { + "include": "#type-parameters" + } + ] }, { - "include": "#string-character-escape" + "name": "string.template.ts", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.ts" + }, + "2": { + "name": "punctuation.definition.string.template.begin.ts" + } + }, + "end": "`", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.template.end.ts" + } + }, + "patterns": [ + { + "include": "#template-substitution-element" + }, + { + "include": "#string-character-escape" + } + ] } ] }, diff --git a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json index a956c527775..3f920d0f66e 100644 --- a/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "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/Microsoft/TypeScript-TmLanguage/commit/3f27a794a2dbebf18714d7eaa799162fbadf7a11", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/fefa94101ef0114b95d3e14493051ebf5ec70c7c", "name": "TypeScriptReact", "scopeName": "source.tsx", "patterns": [ @@ -291,7 +291,7 @@ "patterns": [ { "name": "meta.var-single-variable.expr.tsx", - "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.tsx entity.name.function.tsx" @@ -525,7 +525,7 @@ } }, { - "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?<!=|:)(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))\\s*(\\??)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "storage.modifier.tsx" @@ -751,7 +751,7 @@ "include": "#comment" }, { - "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(\\?)?(?=(\\?\\s*)?\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)) |\n(:\\s*(=>|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(<[^<>]*>)|[^<>(),=])+=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "1": { "name": "meta.definition.property.tsx entity.name.function.tsx" @@ -2075,7 +2075,7 @@ }, { "name": "meta.object.member.tsx", - "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "match": "(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { "0": { "name": "meta.object-literal.key.tsx" @@ -2139,7 +2139,7 @@ "end": "(?=,|\\})", "patterns": [ { - "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", + "begin": "(?<=:)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.tsx" @@ -2172,7 +2172,7 @@ ] }, { - "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*$)", + "begin": "(?<=:)\\s*(async)?\\s*(\\()(?=\\s*([\\{\\[]\\s*)?$)", "beginCaptures": { "1": { "name": "storage.modifier.async.tsx" @@ -2305,6 +2305,20 @@ }, "paren-expression-possibly-arrow": { "patterns": [ + { + "begin": "(?<=[(=,])\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.tsx" + } + }, + "end": "(?<=\\))", + "patterns": [ + { + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, { "begin": "(?<=[(=,]|=>)\\s*(async)?(?=\\s*(<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)\\(\\s*$)", "beginCaptures": { @@ -2315,26 +2329,29 @@ "end": "(?<=\\))", "patterns": [ { - "include": "#type-parameters" + "include": "#paren-expression-possibly-arrow-with-typeparameters" + } + ] + }, + { + "begin": "(?<=[(=,])\\s*(async)?\\s*(\\()(?=\\s*[\\{\\[]\\s*$)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.tsx" }, + "2": { + "name": "meta.brace.round.tsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.tsx" + } + }, + "patterns": [ { - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "meta.brace.round.tsx" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "meta.brace.round.tsx" - } - }, - "patterns": [ - { - "include": "#expression-inside-possibly-arrow-parens" - } - ] + "include": "#expression-inside-possibly-arrow-parens" } ] }, @@ -2365,6 +2382,32 @@ } ] }, + "paren-expression-possibly-arrow-with-typeparameters": { + "patterns": [ + { + "include": "#type-parameters" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.tsx" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.tsx" + } + }, + "patterns": [ + { + "include": "#expression-inside-possibly-arrow-parens" + } + ] + } + ] + }, "expression-inside-possibly-arrow-parens": { "patterns": [ { @@ -2879,7 +2922,7 @@ "include": "#object-identifiers" }, { - "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "match": "(?x)(?:(?:(\\.)|(\\?\\.(?!\\s*[[:digit:]])))\\s*)?([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n ([\\(]\\s*([\\{\\[]\\s*)?$) |\n # sure shot arrow functions even if => is on new line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)?\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<]|\\<\\s*([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^=<>]|=[^<])*\\>)*>\\s*)? # typeparameters\n \\(\\s*(([_$[:alpha:]]|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\]))([^()]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\)))*)?\\) # parameters\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", "captures": { "1": { "name": "punctuation.accessor.tsx" @@ -3574,28 +3617,47 @@ "match": "\\\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)" }, "template": { - "name": "string.template.tsx", - "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", - "beginCaptures": { - "1": { - "name": "entity.name.function.tagged-template.tsx" - }, - "2": { - "name": "punctuation.definition.string.template.begin.tsx" - } - }, - "end": "`", - "endCaptures": { - "0": { - "name": "punctuation.definition.string.template.end.tsx" - } - }, "patterns": [ { - "include": "#template-substitution-element" + "name": "string.template.tsx", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=(<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>|\\<\\s*(((keyof|infer)\\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\\{([^\\{\\}]|(\\{[^\\{\\}]*\\}))*\\})|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(\\[([^\\[\\]]|(\\[[^\\[\\]]*\\]))*\\])|(\\'[^\\']*\\')|(\\\"[^\\\"]*\\\")|(\\`[^\\`]*\\`))(?=\\s*([\\<\\>\\,\\.\\[]|=>|&(?!&)|\\|(?!\\|)))))([^<>\\(]|(\\(([^\\(\\)]|(\\([^\\(\\)]*\\)))*\\))|(?<==)\\>)*(?!=)\\>)*(?!=)>\\s*)`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.tsx" + } + }, + "end": "(?=`)", + "patterns": [ + { + "include": "#type-parameters" + } + ] }, { - "include": "#string-character-escape" + "name": "string.template.tsx", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)?(`)", + "beginCaptures": { + "1": { + "name": "entity.name.function.tagged-template.tsx" + }, + "2": { + "name": "punctuation.definition.string.template.begin.tsx" + } + }, + "end": "`", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.template.end.tsx" + } + }, + "patterns": [ + { + "include": "#template-substitution-element" + }, + { + "include": "#string-character-escape" + } + ] } ] }, From c29f432de5418b84ad6479cfa7c2c8c2d66f0fdc Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Fri, 20 Apr 2018 13:46:25 -0700 Subject: [PATCH 604/710] Add editor.codeActionsOnSave (#48086) * Add editor.codeActionsOnSave Fixes #42092 Adds a way to run code actions on save using the `editor.codeActionsOnSave` setting. This setting lists code action kinds to be executed automatically when the document is saved. * Use object instead of array for config option * Adding timeout * Fix description * Fix relative path --- .../common/config/commonEditorConfig.ts | 19 ++++++ src/vs/editor/common/config/editorOptions.ts | 47 +++++++++++++- .../contrib/codeAction/codeActionCommands.ts | 21 +++++-- src/vs/monaco.d.ts | 17 +++++ .../mainThreadSaveParticipant.ts | 62 +++++++++++++++++++ 5 files changed, 157 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 62ebc3a17d9..035f47aa206 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -652,6 +652,25 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_DEFAULTS.contribInfo.lightbulbEnabled, 'description': nls.localize('codeActions', "Enables the code action lightbulb") }, + 'editor.codeActionsOnSave': { + 'type': 'object', + 'properties': { + 'source.organizeImports': { + 'type': 'boolean', + 'description': nls.localize('codeActionsOnSave.organizeImports', "Run organize imports on save?") + } + }, + 'additionalProperties': { + 'type': 'boolean' + }, + 'default': EDITOR_DEFAULTS.contribInfo.codeActionsOnSave, + 'description': nls.localize('codeActionsOnSave', "Code actions kinds to be run on save.") + }, + 'editor.codeActionsOnSaveTimeout': { + 'type': 'number', + 'default': EDITOR_DEFAULTS.contribInfo.codeActionsOnSaveTimeout, + 'description': nls.localize('codeActionsOnSaveTimeout', "Timeout for code actions run on save.") + }, 'editor.selectionClipboard': { 'type': 'boolean', 'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard, diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index e4aa5cf65af..61037c9f7d0 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -11,6 +11,7 @@ import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { Constants } from 'vs/editor/common/core/uint'; import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; import * as arrays from 'vs/base/common/arrays'; +import * as objects from 'vs/base/common/objects'; /** * Configuration options for editor scrollbars @@ -136,6 +137,13 @@ export interface IEditorLightbulbOptions { enabled?: boolean; } +/** + * Configuration map for codeActionsOnSave + */ +export interface ICodeActionsOnSaveOptions { + [kind: string]: boolean; +} + /** * Configuration options for the editor. */ @@ -496,6 +504,14 @@ export interface IEditorOptions { * Control the behavior and rendering of the code action lightbulb. */ lightbulb?: IEditorLightbulbOptions; + /** + * Code action kinds to be run on save. + */ + codeActionsOnSave?: ICodeActionsOnSaveOptions; + /** + * Timeout for running code actions on save. + */ + codeActionsOnSaveTimeout?: number; /** * Enable code folding * Defaults to true. @@ -850,6 +866,8 @@ export interface EditorContribOptions { readonly find: InternalEditorFindOptions; readonly colorDecorators: boolean; readonly lightbulbEnabled: boolean; + readonly codeActionsOnSave: ICodeActionsOnSaveOptions; + readonly codeActionsOnSaveTimeout: number; } /** @@ -1194,6 +1212,8 @@ export class InternalEditorOptions { && a.matchBrackets === b.matchBrackets && this._equalFindOptions(a.find, b.find) && a.colorDecorators === b.colorDecorators + && objects.equals(a.codeActionsOnSave, b.codeActionsOnSave) + && a.codeActionsOnSaveTimeout === b.codeActionsOnSaveTimeout && a.lightbulbEnabled === b.lightbulbEnabled ); } @@ -1391,6 +1411,21 @@ function _boolean<T>(value: any, defaultValue: T): boolean | T { return Boolean(value); } +function _booleanMap(value: { [key: string]: boolean }, defaultValue: { [key: string]: boolean }): { [key: string]: boolean } { + if (!value) { + return defaultValue; + } + + const out = Object.create(null); + for (const k of Object.keys(value)) { + const v = value[k]; + if (typeof v === 'boolean') { + out[k] = v; + } + } + return out; +} + function _string(value: any, defaultValue: string): string { if (typeof value !== 'string') { return defaultValue; @@ -1736,7 +1771,9 @@ export class EditorOptionsValidator { matchBrackets: _boolean(opts.matchBrackets, defaults.matchBrackets), find: find, colorDecorators: _boolean(opts.colorDecorators, defaults.colorDecorators), - lightbulbEnabled: _boolean(opts.lightbulb ? opts.lightbulb.enabled : false, defaults.lightbulbEnabled) + lightbulbEnabled: _boolean(opts.lightbulb ? opts.lightbulb.enabled : false, defaults.lightbulbEnabled), + codeActionsOnSave: _booleanMap(opts.codeActionsOnSave, {}), + codeActionsOnSaveTimeout: _clampedInt(opts.codeActionsOnSaveTimeout, defaults.codeActionsOnSaveTimeout, 1, 10000) }; } } @@ -1839,7 +1876,9 @@ export class InternalEditorOptionsFactory { matchBrackets: (accessibilityIsOn ? false : opts.contribInfo.matchBrackets), // DISABLED WHEN SCREEN READER IS ATTACHED find: opts.contribInfo.find, colorDecorators: opts.contribInfo.colorDecorators, - lightbulbEnabled: opts.contribInfo.lightbulbEnabled + lightbulbEnabled: opts.contribInfo.lightbulbEnabled, + codeActionsOnSave: opts.contribInfo.codeActionsOnSave, + codeActionsOnSaveTimeout: opts.contribInfo.codeActionsOnSaveTimeout } }; } @@ -2305,6 +2344,8 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { globalFindClipboard: false }, colorDecorators: true, - lightbulbEnabled: true + lightbulbEnabled: true, + codeActionsOnSave: {}, + codeActionsOnSaveTimeout: 750 }, }; diff --git a/src/vs/editor/contrib/codeAction/codeActionCommands.ts b/src/vs/editor/contrib/codeAction/codeActionCommands.ts index 3083b047c8d..d356d916ed8 100644 --- a/src/vs/editor/contrib/codeAction/codeActionCommands.ts +++ b/src/vs/editor/contrib/codeAction/codeActionCommands.ts @@ -131,13 +131,22 @@ export class QuickFixController implements IEditorContribution { } private async _onApplyCodeAction(action: CodeAction): TPromise<void> { - if (action.edit) { - await BulkEdit.perform(action.edit.edits, this._textModelService, this._fileService, this._editor); - } + await applyCodeAction(action, this._textModelService, this._fileService, this._commandService, this._editor); + } +} - if (action.command) { - await this._commandService.executeCommand(action.command.id, ...action.command.arguments); - } +export async function applyCodeAction( + action: CodeAction, + textModelService: ITextModelService, + fileService: IFileService, + commandService: ICommandService, + editor: ICodeEditor, +) { + if (action.edit) { + await BulkEdit.perform(action.edit.edits, textModelService, fileService, editor); + } + if (action.command) { + await commandService.executeCommand(action.command.id, ...action.command.arguments); } } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 268571ebc7d..6c8b58194f0 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2471,6 +2471,13 @@ declare namespace monaco.editor { enabled?: boolean; } + /** + * Configuration map for codeActionsOnSave + */ + export interface ICodeActionsOnSaveOptions { + [kind: string]: boolean; + } + /** * Configuration options for the editor. */ @@ -2823,6 +2830,14 @@ declare namespace monaco.editor { * Control the behavior and rendering of the code action lightbulb. */ lightbulb?: IEditorLightbulbOptions; + /** + * Code action kinds to be run on save. + */ + codeActionsOnSave?: ICodeActionsOnSaveOptions; + /** + * Timeout for running code actions on save. + */ + codeActionsOnSaveTimeout?: number; /** * Enable code folding * Defaults to true. @@ -3118,6 +3133,8 @@ declare namespace monaco.editor { readonly find: InternalEditorFindOptions; readonly colorDecorators: boolean; readonly lightbulbEnabled: boolean; + readonly codeActionsOnSave: ICodeActionsOnSaveOptions; + readonly codeActionsOnSaveTimeout: number; } /** diff --git a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts index c5c267edb8d..ddeba980ac2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts @@ -30,6 +30,14 @@ import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { ILogService } from 'vs/platform/log/common/log'; import { shouldSynchronizeModel } from 'vs/editor/common/services/modelService'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IFileService } from 'vs/platform/files/common/files'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/codeActionTrigger'; +import { CodeAction } from 'vs/editor/common/modes'; +import { applyCodeAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; +import { getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; +import { ICodeActionsOnSaveOptions } from 'vs/editor/common/config/editorOptions'; export interface ISaveParticipantParticipant extends ISaveParticipant { // progressMessage: string; @@ -259,6 +267,59 @@ class FormatOnSaveParticipant implements ISaveParticipantParticipant { } } +class CodeActionOnParticipant implements ISaveParticipant { + + constructor( + @ITextModelService private readonly _textModelService: ITextModelService, + @IFileService private readonly _fileService: IFileService, + @ICommandService private readonly _commandService: ICommandService, + @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { } + + async participate(editorModel: ITextFileEditorModel, env: { reason: SaveReason }): Promise<void> { + if (env.reason === SaveReason.AUTO) { + return undefined; + } + + const model = editorModel.textEditorModel; + const editor = findEditor(model, this._codeEditorService); + if (!editor) { + return undefined; + } + + const settingsOverrides = { overrideIdentifier: model.getLanguageIdentifier().language, resource: editorModel.getResource() }; + const setting = this._configurationService.getValue<ICodeActionsOnSaveOptions>('editor.codeActionsOnSave', settingsOverrides); + if (!setting) { + return undefined; + } + + const codeActionsOnSave = Object.keys(setting).filter(x => setting[x]).map(x => new CodeActionKind(x)); + if (!codeActionsOnSave.length) { + return undefined; + } + + const timeout = this._configurationService.getValue<number>('editor.codeActionsOnSaveTimeout', settingsOverrides); + + return new Promise<CodeAction[]>((resolve, reject) => { + setTimeout(() => reject(localize('codeActionsOnSave.didTimeout', "Aborted codeActionsOnSave after {0}ms", timeout)), timeout); + this.getActionsToRun(model, codeActionsOnSave).then(resolve); + }).then(actionsToRun => this.applyCodeActions(actionsToRun, editor)); + } + + private async applyCodeActions(actionsToRun: CodeAction[], editor: ICodeEditor) { + for (const action of actionsToRun) { + await applyCodeAction(action, this._textModelService, this._fileService, this._commandService, editor); + } + } + + private async getActionsToRun(model: ITextModel, codeActionsOnSave: CodeActionKind[]) { + const actions = await getCodeActions(model, model.getFullModelRange(), { kind: CodeActionKind.Source, includeSourceActions: true }); + const actionsToRun = actions.filter(returnedAction => returnedAction.kind && codeActionsOnSave.some(onSaveKind => onSaveKind.contains(returnedAction.kind))); + return actionsToRun; + } +} + class ExtHostSaveParticipant implements ISaveParticipantParticipant { private _proxy: ExtHostDocumentSaveParticipantShape; @@ -303,6 +364,7 @@ export class SaveParticipant implements ISaveParticipant { ) { this._saveParticipants = [ instantiationService.createInstance(TrimWhitespaceParticipant), + instantiationService.createInstance(CodeActionOnParticipant), instantiationService.createInstance(FormatOnSaveParticipant), instantiationService.createInstance(FinalNewLineParticipant), instantiationService.createInstance(TrimFinalNewLinesParticipant), From 524698473fc4eadc93bcdde56d1fb1c065846ff5 Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Sat, 21 Apr 2018 01:13:40 +0200 Subject: [PATCH 605/710] restructure command variable resolving --- .../workbench/api/node/extHostDebugService.ts | 8 +-- .../parts/debug/node/debugAdapter.ts | 5 +- src/vs/workbench/parts/debug/node/debugger.ts | 31 +++++----- .../common/configurationResolver.ts | 4 +- .../configurationResolverService.ts | 62 ++++++++++--------- .../node/variableResolver.ts | 23 ++++--- .../configurationResolverService.test.ts | 14 +++-- 7 files changed, 85 insertions(+), 62 deletions(-) diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index b969522ba5e..e85cb0fe1a7 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -584,11 +584,11 @@ export class ExtHostVariableResolverService implements IConfigurationResolverSer return this._variableResolver.resolveAny(root ? root.uri : undefined, value); } - public resolveAny(root: IWorkspaceFolder, value: any): any { - return this._variableResolver.resolveAny(root ? root.uri : undefined, value); + public resolveAny<T>(root: IWorkspaceFolder, value: T, commandMapping?: IStringDictionary<string>): T { + return this._variableResolver.resolveAny(root ? root.uri : undefined, value, commandMapping); } - resolveInteractiveVariables(configuration: any, interactiveVariablesMap: { [key: string]: string; }): TPromise<any, any> { - throw new Error('Method not implemented.'); + public executeCommandVariables(configuration: any, variables: IStringDictionary<string>): TPromise<IStringDictionary<string>> { + throw new Error('findAndExecuteCommandVariables not implemented.'); } } \ No newline at end of file diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index c74bd1c9e4d..f3cc2f9fcab 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -20,6 +20,7 @@ import { IOutputService } from 'vs/workbench/parts/output/common/output'; import { IDebugAdapter, IAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution, IConfig } from 'vs/workbench/parts/debug/common/debug'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import { IStringDictionary } from 'vs/base/common/collections'; /** * Abstract implementation of the low level API for a debug adapter. @@ -409,7 +410,7 @@ export class DebugAdapter extends StreamDebugAdapter { } } - static substituteVariables(workspaceFolder: IWorkspaceFolder, config: IConfig, resolverService: IConfigurationResolverService): IConfig { + static substituteVariables(workspaceFolder: IWorkspaceFolder, config: IConfig, resolverService: IConfigurationResolverService, commandValueMapping?: IStringDictionary<string>): IConfig { const result = objects.deepClone(config) as IConfig; @@ -428,7 +429,7 @@ export class DebugAdapter extends StreamDebugAdapter { delete result.linux; // substitute all variables in string values - return resolverService.resolveAny(workspaceFolder, result); + return resolverService.resolveAny(workspaceFolder, result, commandValueMapping); } } diff --git a/src/vs/workbench/parts/debug/node/debugger.ts b/src/vs/workbench/parts/debug/node/debugger.ts index e6e1ffed7ab..3a637954e12 100644 --- a/src/vs/workbench/parts/debug/node/debugger.ts +++ b/src/vs/workbench/parts/debug/node/debugger.ts @@ -63,21 +63,24 @@ export class Debugger { public substituteVariables(folder: IWorkspaceFolder, config: IConfig): TPromise<IConfig> { - let configP: TPromise<IConfig>; - const debugConfigs = this.configurationService.getValue<IDebugConfiguration>('debug'); - if (debugConfigs.extensionHostDebugAdapter) { - configP = this.configurationManager.substituteVariables(this.type, folder, config); - } else { - try { - configP = TPromise.as(DebugAdapter.substituteVariables(folder, config, this.configurationResolverService)); - } catch (e) { - return TPromise.wrapError(e); - } - } + // first resolve command variables (which might have a UI) + return this.configurationResolverService.executeCommandVariables(config, this.variables).then(commandValueMapping => { - return configP.then(result => { - // substitute 'command' variables (including interactive) - return this.configurationResolverService.resolveInteractiveVariables(result, this.variables); + if (!commandValueMapping) { // cancelled by user + return null; + } + + // optionally substitute in EH + const inEh = this.configurationService.getValue<IDebugConfiguration>('debug').extensionHostDebugAdapter; + + // now substitute all other variables + return (inEh ? this.configurationManager.substituteVariables(this.type, folder, config) : TPromise.as(config)).then(config => { + try { + return TPromise.as(DebugAdapter.substituteVariables(folder, config, this.configurationResolverService, commandValueMapping)); + } catch (e) { + return TPromise.wrapError(e); + } + }); }); } diff --git a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts index 2ef8daf1ccd..ec8a9eab100 100644 --- a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts @@ -16,6 +16,6 @@ export interface IConfigurationResolverService { resolve(root: IWorkspaceFolder, value: string): string; resolve(root: IWorkspaceFolder, value: string[]): string[]; resolve(root: IWorkspaceFolder, value: IStringDictionary<string>): IStringDictionary<string>; - resolveAny<T>(root: IWorkspaceFolder, value: T): T; - resolveInteractiveVariables(configuration: any, interactiveVariablesMap: { [key: string]: string }): TPromise<any>; + resolveAny<T>(root: IWorkspaceFolder, value: T, commandMapping?: IStringDictionary<string>): T; + executeCommandVariables(value: any, variables: IStringDictionary<string>): TPromise<IStringDictionary<string>>; } diff --git a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts index 080f600ce81..47ef388a39e 100644 --- a/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/electron-browser/configurationResolverService.ts @@ -94,44 +94,52 @@ export class ConfigurationResolverService implements IConfigurationResolverServi return this.resolver.resolveAny(root ? root.uri : undefined, value); } - public resolveAny(root: IWorkspaceFolder, value: any): any { - return this.resolver.resolveAny(root ? root.uri : undefined, value); + public resolveAny(root: IWorkspaceFolder, value: any, commandValueMapping?: IStringDictionary<string>): any { + return this.resolver.resolveAny(root ? root.uri : undefined, value, commandValueMapping); } /** - * Resolve all interactive variables in configuration #6569 + * Finds and executes all command variables (see #6569) */ - public resolveInteractiveVariables(configuration: any, interactiveVariablesMap: { [key: string]: string }): TPromise<any> { + public executeCommandVariables(configuration: any, variableToCommandMap: IStringDictionary<string>): TPromise<IStringDictionary<string>> { + if (!configuration) { return TPromise.as(null); } - // We need a map from interactive variables to keys because we only want to trigger an command once per key - - // even though it might occur multiple times in configuration #7026. - const interactiveVariablesToSubstitutes: { [interactiveVariable: string]: { object: any, key: string }[] } = Object.create(null); - const findInteractiveVariables = (object: any) => { + // use an array to preserve order of first appearance + const commands: string[] = []; + + const cmd_var = /\${command:(.*?)}/g; + + const findCommandVariables = (object: any) => { Object.keys(object).forEach(key => { - if (object[key] && typeof object[key] === 'object') { - findInteractiveVariables(object[key]); - } else if (typeof object[key] === 'string') { - const matches = /\${command:(.*?)}/.exec(object[key]); - if (matches && matches.length === 2) { - const interactiveVariable = matches[1]; - if (!interactiveVariablesToSubstitutes[interactiveVariable]) { - interactiveVariablesToSubstitutes[interactiveVariable] = []; + const value = object[key]; + if (value && typeof value === 'object') { + findCommandVariables(value); + } else if (typeof value === 'string') { + let matches; + while ((matches = cmd_var.exec(value)) !== null) { + if (matches.length === 2) { + const command = matches[1]; + if (commands.indexOf(command) < 0) { + commands.push(command); + } } - interactiveVariablesToSubstitutes[interactiveVariable].push({ object, key }); } } }); }; - findInteractiveVariables(configuration); - let substitionCanceled = false; - const factory: { (): TPromise<any> }[] = Object.keys(interactiveVariablesToSubstitutes).map(interactiveVariable => { + findCommandVariables(configuration); + + let cancelled = false; + const commandValueMapping: IStringDictionary<string> = Object.create(null); + + const factory: { (): TPromise<any> }[] = commands.map(interactiveVariable => { return () => { - let commandId: string = null; - commandId = interactiveVariablesMap ? interactiveVariablesMap[interactiveVariable] : null; + + let commandId = variableToCommandMap ? variableToCommandMap[interactiveVariable] : null; if (!commandId) { // Just launch any command if the interactive variable is not contributed by the adapter #12735 commandId = interactiveVariable; @@ -139,18 +147,14 @@ export class ConfigurationResolverService implements IConfigurationResolverServi return this.commandService.executeCommand<string>(commandId, configuration).then(result => { if (result) { - interactiveVariablesToSubstitutes[interactiveVariable].forEach(substitute => { - if (substitute.object[substitute.key].indexOf(`\${command:${interactiveVariable}}`) >= 0) { - substitute.object[substitute.key] = substitute.object[substitute.key].replace(`\${command:${interactiveVariable}}`, result); - } - }); + commandValueMapping[interactiveVariable] = result; } else { - substitionCanceled = true; + cancelled = true; } }); }; }); - return sequence(factory).then(() => substitionCanceled ? null : configuration); + return sequence(factory).then(() => cancelled ? null : commandValueMapping); } } diff --git a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts index a8fc1e8b982..0b493b1314f 100644 --- a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts @@ -12,7 +12,6 @@ import { normalizeDriveLetter } from 'vs/base/common/labels'; import { localize } from 'vs/nls'; import uri from 'vs/base/common/uri'; - export interface IVariableAccessor { getFolderUri(folderName: string): uri | undefined; getWorkspaceFolderCount(): number; @@ -43,22 +42,22 @@ export class VariableResolver { } } - resolveAny(folderUri: uri, value: any): any { + resolveAny(folderUri: uri, value: any, commandValueMapping?: IStringDictionary<string>): any { if (types.isString(value)) { - return this.resolve(folderUri, value); + return this.resolve(folderUri, value, commandValueMapping); } else if (types.isArray(value)) { - return value.map(s => this.resolveAny(folderUri, s)); + return value.map(s => this.resolveAny(folderUri, s, commandValueMapping)); } else if (types.isObject(value)) { let result: IStringDictionary<string | IStringDictionary<string> | string[]> = Object.create(null); Object.keys(value).forEach(key => { - result[key] = this.resolveAny(folderUri, value[key]); + result[key] = this.resolveAny(folderUri, value[key], commandValueMapping); }); return result; } return value; } - resolve(folderUri: uri, value: string): string { + resolve(folderUri: uri, value: string, commandValueMapping: IStringDictionary<string>): string { const filePath = this.accessor.getFilePath(); @@ -100,6 +99,16 @@ export class VariableResolver { } throw new Error(localize('missingConfigName', "'{0}' can not be resolved because no settings name is given.", match)); + case 'command': + if (argument && commandValueMapping) { + const v = commandValueMapping[argument]; + if (typeof v === 'string') { + return v; + } + throw new Error(localize('noValueForCommand', "'{0}' can not be resolved because the command has no value.", match)); + } + return match; + default: { // common error handling for all variables that require an open folder and accept a folder name argument @@ -197,7 +206,7 @@ export class VariableResolver { if (ep) { return ep; } - throw new Error(localize('canNotResolveExecPath', "'{0}' can not be resolved.", match)); + return match; default: return match; diff --git a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts index 5b514fb535b..8054b3dd566 100644 --- a/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/electron-browser/configurationResolverService.test.ts @@ -240,8 +240,11 @@ suite('Configuration Resolver Service', () => { interactiveVariables['interactiveVariable1'] = 'command1'; interactiveVariables['interactiveVariable2'] = 'command2'; - configurationResolverService.resolveInteractiveVariables(configuration, interactiveVariables).then(resolved => { - assert.deepEqual(resolved, { + configurationResolverService.executeCommandVariables(configuration, interactiveVariables).then(mapping => { + + const result = configurationResolverService.resolveAny(undefined, configuration, mapping); + + assert.deepEqual(result, { 'name': 'Attach to Process', 'type': 'node', 'request': 'attach', @@ -272,8 +275,11 @@ suite('Configuration Resolver Service', () => { interactiveVariables['interactiveVariable1'] = 'command1'; interactiveVariables['interactiveVariable2'] = 'command2'; - configurationResolverService.resolveInteractiveVariables(configuration, interactiveVariables).then(resolved => { - assert.deepEqual(resolved, { + configurationResolverService.executeCommandVariables(configuration, interactiveVariables).then(mapping => { + + const result = configurationResolverService.resolveAny(undefined, configuration, mapping); + + assert.deepEqual(result, { 'name': 'Attach to Process', 'type': 'node', 'request': 'attach', From 899c95d097ff506fced57e55938186740dec1bfb Mon Sep 17 00:00:00 2001 From: Stefan Dombrowski <sdo451@gmail.com> Date: Sat, 21 Apr 2018 17:59:45 +0200 Subject: [PATCH 606/710] Enable clear search even if there are no results found For the clear button it shouldn't matter whether there are search results found or not. The clear button gets now enabled after every search. --- src/vs/workbench/parts/search/browser/searchActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index af43ddcccf4..2b42bba2c68 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -393,7 +393,7 @@ export class ClearSearchResultsAction extends Action { update(): void { const searchView = getSearchView(this.viewletService, this.panelService); - this.enabled = searchView && searchView.hasSearchResults(); + this.enabled = searchView && searchView.isSearchSubmitted(); } public run(): TPromise<void> { From 48b0ec47dacacfbc9e203d102bb2a03678c0625d Mon Sep 17 00:00:00 2001 From: Erich Gamma <egamma@microsoft.com> Date: Sat, 21 Apr 2018 10:13:34 -0700 Subject: [PATCH 607/710] added config option whether the explorer should be enabled. --- extensions/npm/README.md | 1 + extensions/npm/package.json | 9 +++++++-- extensions/npm/package.nls.json | 1 + extensions/npm/src/main.ts | 24 ++++++++++++++++-------- extensions/npm/src/tasks.ts | 20 +++++++++++++++++--- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/extensions/npm/README.md b/extensions/npm/README.md index 50a67731daa..33d85a1f547 100644 --- a/extensions/npm/README.md +++ b/extensions/npm/README.md @@ -14,3 +14,4 @@ For more information about auto detection of Tasks pls see the [documentation](h - `npm.runSilent` run npm script with the `--silent` option, the default is `false`. - `npm.packageManager` the package manager used to run the scripts: `npm` or `yarn`, the default is `npm`. - `npm.exclude` glob patterns for folders that should be excluded from automatic script detection. The pattern is matched against the **absolute path** of the package.json. For example, to exclude all test folders use '**/test/**'. +- `npm.enableScriptExplorer` enable an explorer view for npm scripts when the workspace contains a 'package.json' file. diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 6e4547123c2..5affb9009f4 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -96,7 +96,6 @@ } ] }, - "configuration": { "id": "npm", "type": "object", @@ -138,6 +137,12 @@ }, "description": "%config.npm.exclude%", "scope": "resource" + }, + "npm.enableScriptExplorer": { + "type": "boolean", + "default": false, + "scope": "resource", + "description": "%config.npm.enableScriptExplorer%" } } }, @@ -170,4 +175,4 @@ } ] } -} +} \ No newline at end of file diff --git a/extensions/npm/package.nls.json b/extensions/npm/package.nls.json index 90ba49ebd6f..c9093ef39a0 100644 --- a/extensions/npm/package.nls.json +++ b/extensions/npm/package.nls.json @@ -5,6 +5,7 @@ "config.npm.runSilent": "Run npm commands with the `--silent` option.", "config.npm.packageManager": "The package manager used to run scripts.", "config.npm.exclude": "Configure glob patterns for folders that should be excluded from automatic script detection.", + "config.npm.enableScriptExplorer": "Enable an explorer view for npm scripts, when the workspace contains a 'package.json' file.", "npm.parseError": "Npm task detection: failed to parse the file {0}", "taskdef.script": "The npm script to customize.", "taskdef.path": "The path to the folder of the package.json file that provides the script. Can be ommitted.", diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 2035766ba8f..48b87e23bad 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -12,12 +12,18 @@ const localize = nls.loadMessageBundle(); import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; -import { provideNpmScripts, hasNpmScripts } from './tasks'; +import { provideNpmScripts, hasNpmScripts, explorerIsEnabled } from './tasks'; let taskProvider: vscode.Disposable | undefined; export async function activate(context: vscode.ExtensionContext): Promise<void> { + taskProvider = registerTaskProvider(context); + configureHttpRequest(); + vscode.workspace.onDidChangeConfiguration(() => configureHttpRequest()); + context.subscriptions.push(addJSONProviders(httpRequest.xhr)); +} +function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposable | undefined { if (vscode.workspace.workspaceFolders) { let provider: vscode.TaskProvider = { provideTasks: () => { @@ -27,19 +33,21 @@ export async function activate(context: vscode.ExtensionContext): Promise<void> return undefined; } }; - taskProvider = vscode.workspace.registerTaskProvider('npm', provider); + let disposable = vscode.workspace.registerTaskProvider('npm', provider); + registerExplorer(context, provider); + return disposable; + } + return undefined; +} + +async function registerExplorer(context: vscode.ExtensionContext, provider: vscode.TaskProvider) { + if (explorerIsEnabled()) { let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, localize)); context.subscriptions.push(treeDataProvider); - if (await hasNpmScripts()) { vscode.commands.executeCommand('setContext', 'hasNpmScripts', true); } } - - configureHttpRequest(); - vscode.workspace.onDidChangeConfiguration(() => configureHttpRequest()); - - context.subscriptions.push(addJSONProviders(httpRequest.xhr)); } function configureHttpRequest() { diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 20036750c13..a0403824e49 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -48,6 +48,20 @@ export function getPackageManager(folder: WorkspaceFolder): string { return workspace.getConfiguration('npm', folder.uri).get<string>('packageManager', 'npm'); } +export function explorerIsEnabled(): boolean { + let folders = workspace.workspaceFolders; + if (!folders) { + return false; + } + for (let i = 0; i < folders.length; i++) { + let folder = folders[i]; + if (workspace.getConfiguration('npm', folder.uri).get<boolean>('enableScriptExplorer') === true) { + return true; + } + } + return false; +} + export async function hasNpmScripts(): Promise<boolean> { let folders = workspace.workspaceFolders; if (!folders) { @@ -56,7 +70,7 @@ export async function hasNpmScripts(): Promise<boolean> { try { for (let i = 0; i < folders.length; i++) { let folder = folders[i]; - if (isEnabled(folder)) { + if (isAutoDetectionEnabled(folder)) { let relativePattern = new RelativePattern(folder, '**/package.json'); let paths = await workspace.findFiles(relativePattern, '**/node_modules/**'); if (paths.length > 0) { @@ -81,7 +95,7 @@ export async function provideNpmScripts(localize: any): Promise<Task[]> { try { for (let i = 0; i < folders.length; i++) { let folder = folders[i]; - if (isEnabled(folder)) { + if (isAutoDetectionEnabled(folder)) { let relativePattern = new RelativePattern(folder, '**/package.json'); let paths = await workspace.findFiles(relativePattern, '**/node_modules/**'); for (let j = 0; j < paths.length; j++) { @@ -98,7 +112,7 @@ export async function provideNpmScripts(localize: any): Promise<Task[]> { } } -function isEnabled(folder: WorkspaceFolder): boolean { +function isAutoDetectionEnabled(folder: WorkspaceFolder): boolean { return workspace.getConfiguration('npm', folder.uri).get<AutoDetect>('autoDetect') === 'on'; } From 4c3e0599bbdbca766063b81122c185555f77054b Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Sat, 21 Apr 2018 16:33:22 -0700 Subject: [PATCH 608/710] Bump node2 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index ca2bcf5144a..e33fb0e30c6 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -6,7 +6,7 @@ }, { "name": "ms-vscode.node-debug2", - "version": "1.23.0", + "version": "1.23.1", "repo": "https://github.com/Microsoft/vscode-node-debug2" } ] From ed7b0daa4db42ef1806916a7d7ce4e227c485009 Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Sat, 21 Apr 2018 18:57:54 -0700 Subject: [PATCH 609/710] Don't ship php-language-features src --- extensions/php-language-features/.vscodeignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 extensions/php-language-features/.vscodeignore diff --git a/extensions/php-language-features/.vscodeignore b/extensions/php-language-features/.vscodeignore new file mode 100644 index 00000000000..d43a539fddf --- /dev/null +++ b/extensions/php-language-features/.vscodeignore @@ -0,0 +1,2 @@ +src/** +tsconfig.json \ No newline at end of file From 0c47c04e85bc604288a288422f0a7db69302a323 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Sat, 21 Apr 2018 20:44:21 -0700 Subject: [PATCH 610/710] Add missing yarn updates --- extensions/git/yarn.lock | 6 +++--- extensions/html-language-features/yarn.lock | 6 +++--- extensions/json-language-features/yarn.lock | 6 +++--- extensions/markdown-language-features/yarn.lock | 6 +++--- extensions/typescript-language-features/yarn.lock | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index 06a4b992dbb..6708fb651fc 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -257,9 +257,9 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" -vscode-extension-telemetry@0.0.15: - version "0.0.15" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856" +vscode-extension-telemetry@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" dependencies: applicationinsights "1.0.1" diff --git a/extensions/html-language-features/yarn.lock b/extensions/html-language-features/yarn.lock index 4c8da33fb9b..dc4158605c2 100644 --- a/extensions/html-language-features/yarn.lock +++ b/extensions/html-language-features/yarn.lock @@ -28,9 +28,9 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -vscode-extension-telemetry@0.0.15: - version "0.0.15" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856" +vscode-extension-telemetry@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" dependencies: applicationinsights "1.0.1" diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 2a2706462ef..d6b9902f6f4 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -28,9 +28,9 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -vscode-extension-telemetry@0.0.15: - version "0.0.15" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856" +vscode-extension-telemetry@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" dependencies: applicationinsights "1.0.1" diff --git a/extensions/markdown-language-features/yarn.lock b/extensions/markdown-language-features/yarn.lock index f38d9ea33aa..4225e3f21f7 100644 --- a/extensions/markdown-language-features/yarn.lock +++ b/extensions/markdown-language-features/yarn.lock @@ -5415,9 +5415,9 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" -vscode-extension-telemetry@0.0.15: - version "0.0.15" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856" +vscode-extension-telemetry@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" dependencies: applicationinsights "1.0.1" diff --git a/extensions/typescript-language-features/yarn.lock b/extensions/typescript-language-features/yarn.lock index 25f40c25d76..40b09e92104 100644 --- a/extensions/typescript-language-features/yarn.lock +++ b/extensions/typescript-language-features/yarn.lock @@ -36,9 +36,9 @@ semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -vscode-extension-telemetry@0.0.15: - version "0.0.15" - resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.15.tgz#685c32f3b67e8fb85ba689c1d7f88ff90ff87856" +vscode-extension-telemetry@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.0.16.tgz#506cb49d7a8c90982019434651e5e3871b81c178" dependencies: applicationinsights "1.0.1" From e2a123a5be5a198c99efedecb7159909fbe66d2d Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Sun, 22 Apr 2018 17:06:10 +0200 Subject: [PATCH 611/710] Revert "debug: do not listen on launch.json changes, re-read it before debug start" This reverts commit 1bf1b55e3d6e74415833a6b784df77c6333e660c. --- .../parts/debug/electron-browser/debugService.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index d24ae70b037..09921796ba7 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -82,6 +82,7 @@ export class DebugService implements debug.IDebugService { private debugType: IContextKey<string>; private debugState: IContextKey<string>; private breakpointsToSendOnResourceSaved: Set<string>; + private launchJsonChanged: boolean; private firstSessionStart: boolean; private skipRunningTask: boolean; private previousState: debug.State; @@ -703,6 +704,7 @@ export class DebugService implements debug.IDebugService { this.allProcesses.clear(); this.model.getBreakpoints().forEach(bp => bp.verified = false); } + this.launchJsonChanged = false; let config: debug.IConfig, compound: debug.ICompound; if (!configOrName) { @@ -1108,9 +1110,12 @@ export class DebugService implements debug.IDebugService { return new TPromise<void>((c, e) => { setTimeout(() => { + // Read the configuration again if a launch.json has been changed, if not just use the inmemory configuration let config = process.configuration; + const launch = process.session.root ? this.configurationManager.getLaunch(process.session.root.uri) : undefined; - if (launch) { + if (this.launchJsonChanged && launch) { + this.launchJsonChanged = false; config = launch.getConfiguration(process.configuration.name) || config; // Take the type from the process since the debug extension might overwrite it #21316 config.type = process.configuration.type; @@ -1329,9 +1334,13 @@ export class DebugService implements debug.IDebugService { } fileChangesEvent.getUpdated().forEach(event => { + if (this.breakpointsToSendOnResourceSaved.delete(event.resource.toString())) { this.sendBreakpoints(event.resource, true).done(null, errors.onUnexpectedError); } + if (strings.endsWith(event.resource.toString(), '.vscode/launch.json')) { + this.launchJsonChanged = true; + } }); } From c09ffd53fe6f4f0fd5702f347aa293783bfc62f1 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann <martinae@microsoft.com> Date: Sun, 22 Apr 2018 18:43:32 +0100 Subject: [PATCH 612/710] [html] update service --- .../html-language-features/server/package.json | 4 ++-- extensions/html-language-features/server/yarn.lock | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index 395b66b65b5..e2e1821512f 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -8,9 +8,9 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.7", + "vscode-css-languageservice": "^3.0.9-next.10", "vscode-emmet-helper": "1.2.6", - "vscode-html-languageservice": "^2.1.3-next.2", + "vscode-html-languageservice": "^2.1.3-next.3", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", "vscode-languageserver-types": "^3.6.1", diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 8e5e816b1f5..f4da19b9c1d 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -18,9 +18,9 @@ jsonc-parser@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" -vscode-css-languageservice@^3.0.9-next.7: - version "3.0.9-next.7" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.7.tgz#1eb8deadaa6bfaf55187656ea6fb6b7e8d71cd7f" +vscode-css-languageservice@^3.0.9-next.10: + version "3.0.9-next.10" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.10.tgz#be73d571221176b43d2c398a4a27f7d38206952d" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" @@ -33,9 +33,9 @@ vscode-emmet-helper@1.2.6: jsonc-parser "^1.0.0" vscode-languageserver-types "^3.6.0-next.1" -vscode-html-languageservice@^2.1.3-next.2: - version "2.1.3-next.2" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.3-next.2.tgz#911821cada8a237bd6773569851658c733409d65" +vscode-html-languageservice@^2.1.3-next.3: + version "2.1.3-next.3" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.3-next.3.tgz#20c4a0ae673815b598a7e132b5ef03a6920fa7af" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From ac5dbbf7c72ddc0e81548e9c0376ac82d5cd7249 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann <martinae@microsoft.com> Date: Sun, 22 Apr 2018 19:03:35 +0100 Subject: [PATCH 613/710] [loc][Query] Typo in source text for "ancester". fixes #48214 --- src/vs/platform/theme/common/colorRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index dcd84b72179..258d470a08a 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -299,7 +299,7 @@ export const mergeCurrentContentBackground = registerColor('merge.currentContent export const mergeIncomingHeaderBackground = registerColor('merge.incomingHeaderBackground', { dark: incomingBaseColor, light: incomingBaseColor, hc: null }, nls.localize('mergeIncomingHeaderBackground', 'Incoming header background in inline merge-conflicts. The color must not be opaque to not hide underlying decorations.'), true); export const mergeIncomingContentBackground = registerColor('merge.incomingContentBackground', { dark: transparent(mergeIncomingHeaderBackground, contentTransparency), light: transparent(mergeIncomingHeaderBackground, contentTransparency), hc: transparent(mergeIncomingHeaderBackground, contentTransparency) }, nls.localize('mergeIncomingContentBackground', 'Incoming content background in inline merge-conflicts. The color must not be opaque to not hide underlying decorations.'), true); export const mergeCommonHeaderBackground = registerColor('merge.commonHeaderBackground', { dark: commonBaseColor, light: commonBaseColor, hc: null }, nls.localize('mergeCommonHeaderBackground', 'Common ancestor header background in inline merge-conflicts. The color must not be opaque to not hide underlying decorations.'), true); -export const mergeCommonContentBackground = registerColor('merge.commonContentBackground', { dark: transparent(mergeCommonHeaderBackground, contentTransparency), light: transparent(mergeCommonHeaderBackground, contentTransparency), hc: transparent(mergeCommonHeaderBackground, contentTransparency) }, nls.localize('mergeCommonContentBackground', 'Common ancester content background in inline merge-conflicts. The color must not be opaque to not hide underlying decorations.'), true); +export const mergeCommonContentBackground = registerColor('merge.commonContentBackground', { dark: transparent(mergeCommonHeaderBackground, contentTransparency), light: transparent(mergeCommonHeaderBackground, contentTransparency), hc: transparent(mergeCommonHeaderBackground, contentTransparency) }, nls.localize('mergeCommonContentBackground', 'Common ancestor content background in inline merge-conflicts. The color must not be opaque to not hide underlying decorations.'), true); export const mergeBorder = registerColor('merge.border', { dark: null, light: null, hc: '#C3DF6F' }, nls.localize('mergeBorder', 'Border color on headers and the splitter in inline merge-conflicts.')); From 5af224c0390a414a390cc49e80f9eb519c037e51 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann <martinae@microsoft.com> Date: Sun, 22 Apr 2018 19:06:09 +0100 Subject: [PATCH 614/710] [loc][Query] Typo in source text for "Color of range". Fixes #48213 --- src/vs/platform/theme/common/colorRegistry.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 258d470a08a..6862d3f3108 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -254,10 +254,10 @@ export const editorSelectionHighlightBorder = registerColor('editor.selectionHig */ export const editorFindMatch = registerColor('editor.findMatchBackground', { light: '#A8AC94', dark: '#515C6A', hc: null }, nls.localize('editorFindMatch', "Color of the current search match.")); export const editorFindMatchHighlight = registerColor('editor.findMatchHighlightBackground', { light: '#EA5C0055', dark: '#EA5C0055', hc: null }, nls.localize('findMatchHighlight', "Color of the other search matches. The color must not be opaque to not hide underlying decorations."), true); -export const editorFindRangeHighlight = registerColor('editor.findRangeHighlightBackground', { dark: '#3a3d4166', light: '#b4b4b44d', hc: null }, nls.localize('findRangeHighlight', "Color the range limiting the search. The color must not be opaque to not hide underlying decorations."), true); +export const editorFindRangeHighlight = registerColor('editor.findRangeHighlightBackground', { dark: '#3a3d4166', light: '#b4b4b44d', hc: null }, nls.localize('findRangeHighlight', "Color of the range limiting the search. The color must not be opaque to not hide underlying decorations."), true); export const editorFindMatchBorder = registerColor('editor.findMatchBorder', { light: null, dark: null, hc: activeContrastBorder }, nls.localize('editorFindMatchBorder', "Border color of the current search match.")); export const editorFindMatchHighlightBorder = registerColor('editor.findMatchHighlightBorder', { light: null, dark: null, hc: activeContrastBorder }, nls.localize('findMatchHighlightBorder', "Border color of the other search matches.")); -export const editorFindRangeHighlightBorder = registerColor('editor.findRangeHighlightBorder', { dark: null, light: null, hc: transparent(activeContrastBorder, 0.4) }, nls.localize('findRangeHighlightBorder', "Border color the range limiting the search. The color must not be opaque to not hide underlying decorations."), true); +export const editorFindRangeHighlightBorder = registerColor('editor.findRangeHighlightBorder', { dark: null, light: null, hc: transparent(activeContrastBorder, 0.4) }, nls.localize('findRangeHighlightBorder', "Border color of the range limiting the search. The color must not be opaque to not hide underlying decorations."), true); /** * Editor hover From f4e9ff4773a256fe3fb3574e30ae95b83871ef88 Mon Sep 17 00:00:00 2001 From: Erich Gamma <egamma@microsoft.com> Date: Sun, 22 Apr 2018 11:12:03 -0700 Subject: [PATCH 615/710] keep @ts-check happy --- build/gulpfile.hygiene.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index 5ea1b5c51a4..ce14c96c3a8 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -202,12 +202,17 @@ function hygiene(some) { tsfmt.processString(file.path, file.contents.toString('utf8'), { verify: false, tsfmt: true, - // verbose: true + // verbose: true, // keep checkJS happy editorconfig: undefined, replace: undefined, tsconfig: undefined, - tslint: undefined + tsconfigFile: undefined, + tslint: undefined, + tslintFile: undefined, + tsfmtFile: undefined, + vscode: undefined, + vscodeFile: undefined }).then(result => { let original = result.src.replace(/\r\n/gm, '\n'); let formatted = result.dest.replace(/\r\n/gm, '\n'); From e2b07d79daa2440441912eaf8cdfe750d7639357 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Sat, 21 Apr 2018 10:45:22 +0200 Subject: [PATCH 616/710] ProtocolHandler --- .../electron-browser/inactiveExtensionUrlHandler.ts | 2 -- src/vs/vscode.proposed.d.ts | 6 +++--- .../workbench/api/electron-browser/mainThreadUrls.ts | 4 ++-- src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++-- src/vs/workbench/api/node/extHost.protocol.ts | 4 ++-- src/vs/workbench/api/node/extHostUrls.ts | 10 +++++----- 6 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts index 9f9c05762c9..5fbb0acd987 100644 --- a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts +++ b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts @@ -98,8 +98,6 @@ export class InactiveExtensionUrlHandler implements IInactiveExtensionUrlHandler // forget about all uris buffered more than 5 minutes ago private garbageCollect(): void { - console.log('garbage collect'); - const now = new Date().getTime(); const uriBuffer = new Map<string, { timestamp: number, uri: URI }[]>(); diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index c3dc4f6c07f..b2c22774a38 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -660,8 +660,8 @@ declare module 'vscode' { //#region URLs - export interface ExternalUriHandler { - handleExternalUri(uri: Uri): void; + export interface ProtocolHandler { + handleUri(uri: Uri): void; } export namespace window { @@ -669,7 +669,7 @@ declare module 'vscode' { /** * Registers a protocol handler capable of handling system-wide URIs. */ - export function registerExternalUriHandler(handler: ExternalUriHandler): Disposable; + export function registerProtocolHandler(handler: ProtocolHandler): Disposable; } //#endregion diff --git a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts index 1923e437eb1..c9fc7ab862b 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts @@ -42,7 +42,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { this.proxy = context.getProxy(ExtHostContext.ExtHostUrls); } - $registerExternalUriHandler(handle: number, extensionId: string): TPromise<void> { + $registerProtocolHandler(handle: number, extensionId: string): TPromise<void> { const handler = new ExtensionUrlHandler(this.proxy, handle, extensionId); const disposable = this.urlService.registerHandler(handler); @@ -52,7 +52,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { return TPromise.as(null); } - $unregisterExternalUriHandler(handle: number): TPromise<void> { + $unregisterProtocolHandler(handle: number): TPromise<void> { const tuple = this.handlers.get(handle); if (!tuple) { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 688f4f3460f..d477382fdf9 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -434,8 +434,8 @@ export function createApiFactory( registerWebviewPanelSerializer: proposedApiFunction(extension, (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviews.registerWebviewPanelSerializer(viewType, serializer); }), - registerExternalUriHandler: proposedApiFunction(extension, (handler: vscode.ExternalUriHandler) => { - return extHostUrls.registerExternalUriHandler(extension.id, handler); + registerProtocolHandler: proposedApiFunction(extension, (handler: vscode.ProtocolHandler) => { + return extHostUrls.registerProtocolHandler(extension.id, handler); }) }; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index f2aba8c2861..dc7aba45b18 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -374,8 +374,8 @@ export interface ExtHostWebviewsShape { } export interface MainThreadUrlsShape extends IDisposable { - $registerExternalUriHandler(handle: number, extensionId: string): TPromise<void>; - $unregisterExternalUriHandler(handle: number): TPromise<void>; + $registerProtocolHandler(handle: number, extensionId: string): TPromise<void>; + $unregisterProtocolHandler(handle: number): TPromise<void>; } export interface ExtHostUrlsShape { diff --git a/src/vs/workbench/api/node/extHostUrls.ts b/src/vs/workbench/api/node/extHostUrls.ts index c4ba32abf0e..6732afcad4d 100644 --- a/src/vs/workbench/api/node/extHostUrls.ts +++ b/src/vs/workbench/api/node/extHostUrls.ts @@ -14,7 +14,7 @@ export class ExtHostUrls implements ExtHostUrlsShape { private static HandlePool = 0; private readonly _proxy: MainThreadUrlsShape; - private handlers = new Map<number, vscode.ExternalUriHandler>(); + private handlers = new Map<number, vscode.ProtocolHandler>(); constructor( mainContext: IMainContext @@ -22,14 +22,14 @@ export class ExtHostUrls implements ExtHostUrlsShape { this._proxy = mainContext.getProxy(MainContext.MainThreadUrls); } - registerExternalUriHandler(extensionId: string, handler: vscode.ExternalUriHandler): vscode.Disposable { + registerProtocolHandler(extensionId: string, handler: vscode.ProtocolHandler): vscode.Disposable { const handle = ExtHostUrls.HandlePool++; this.handlers.set(handle, handler); - this._proxy.$registerExternalUriHandler(handle, extensionId); + this._proxy.$registerProtocolHandler(handle, extensionId); return toDisposable(() => { this.handlers.delete(handle); - this._proxy.$unregisterExternalUriHandler(handle); + this._proxy.$unregisterProtocolHandler(handle); }); } @@ -40,7 +40,7 @@ export class ExtHostUrls implements ExtHostUrlsShape { return TPromise.as(null); } - handler.handleExternalUri(URI.revive(uri)); + handler.handleUri(URI.revive(uri)); return TPromise.as(null); } } \ No newline at end of file From aeef9c5fc176dd8955fe75165c4930173bb7718c Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Sat, 21 Apr 2018 10:51:33 +0200 Subject: [PATCH 617/710] onUri --- .../url/electron-browser/inactiveExtensionUrlHandler.ts | 2 +- .../services/extensions/common/extensionsRegistry.ts | 5 +++++ .../services/extensions/node/extensionDescriptionRegistry.ts | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts index 5fbb0acd987..54cfc70e05a 100644 --- a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts +++ b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts @@ -76,7 +76,7 @@ export class InactiveExtensionUrlHandler implements IInactiveExtensionUrlHandler uris.push({ timestamp, uri }); // activate the extension - return this.extensionService.activateByEvent(`onExternalUri:${extensionId}`) + return this.extensionService.activateByEvent(`onUri:${extensionId}`) .then(() => true); } diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index 95a5a332c4d..cfa52243d64 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -226,6 +226,11 @@ const schema: IJSONSchema = { body: 'onView:${5:viewId}', description: nls.localize('vscode.extension.activationEvents.onView', 'An activation event emitted whenever the specified view is expanded.'), }, + { + label: 'onUri', + body: 'onView', + description: nls.localize('vscode.extension.activationEvents.onUri', 'An activation event emitted whenever a system-wide Uri directed towards this extension is open.'), + }, { label: '*', description: nls.localize('vscode.extension.activationEvents.star', 'An activation event emitted on VS Code startup. To ensure a great end user experience, please use this activation event in your extension only when no other activation events combination works in your use-case.'), diff --git a/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts b/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts index 5fbb9357739..6778572f42e 100644 --- a/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts +++ b/src/vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts @@ -35,8 +35,8 @@ export class ExtensionDescriptionRegistry { let activationEvent = extensionDescription.activationEvents[j]; // TODO@joao: there's no easy way to contribute this - if (activationEvent === 'onExternalUri') { - activationEvent = `onExternalUri:${extensionDescription.id}`; + if (activationEvent === 'onUri') { + activationEvent = `onUri:${extensionDescription.id}`; } this._activationMap[activationEvent] = this._activationMap[activationEvent] || []; From c314388da21720d893e7a36345e1cac36d1cfd5f Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Sun, 22 Apr 2018 12:29:13 -0700 Subject: [PATCH 618/710] Move emmet from html extenstion to emmet extension --- .../client/src/cssMain.ts | 2 +- .../emmet/src/defaultCompletionProvider.ts | 6 +- extensions/emmet/src/extension.ts | 3 +- extensions/emmet/src/util.ts | 1 + .../client/src/htmlMain.ts | 2 +- .../server/package.json | 1 - .../server/src/htmlServerMain.ts | 52 ++------------ .../server/src/modes/cssMode.ts | 22 +----- .../server/src/modes/htmlMode.ts | 7 +- .../server/src/modes/languageModes.ts | 3 +- .../server/src/test/emmet.test.ts | 72 ------------------- .../html-language-features/server/yarn.lock | 20 ------ 12 files changed, 17 insertions(+), 174 deletions(-) delete mode 100644 extensions/html-language-features/server/src/test/emmet.test.ts diff --git a/extensions/css-language-features/client/src/cssMain.ts b/extensions/css-language-features/client/src/cssMain.ts index c03c44b6cd6..a3474705b16 100644 --- a/extensions/css-language-features/client/src/cssMain.ts +++ b/extensions/css-language-features/client/src/cssMain.ts @@ -33,7 +33,7 @@ export function activate(context: ExtensionContext) { let clientOptions: LanguageClientOptions = { documentSelector, synchronize: { - configurationSection: ['css', 'scss', 'less', 'emmet'] + configurationSection: ['css', 'scss', 'less'] }, initializationOptions: { } diff --git a/extensions/emmet/src/defaultCompletionProvider.ts b/extensions/emmet/src/defaultCompletionProvider.ts index 9e06041548d..fc7ac6d796a 100644 --- a/extensions/emmet/src/defaultCompletionProvider.ts +++ b/extensions/emmet/src/defaultCompletionProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { Stylesheet } from 'EmmetNode'; +import { Node, Stylesheet } from 'EmmetNode'; import { isValidLocationForEmmetAbbreviation } from './abbreviationActions'; import { getEmmetHelper, getMappingForIncludedLanguages, parsePartialStylesheet, getEmmetConfiguration, getEmmetMode, isStyleSheet, parseDocument, } from './util'; @@ -34,7 +34,7 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi } let validateLocation = false; - let rootNode: Stylesheet | undefined = undefined; + let rootNode: Node | undefined = undefined; if (context.triggerKind !== vscode.CompletionTriggerKind.TriggerForIncompleteCompletions) { validateLocation = syntax === 'html' || syntax === 'jsx' || syntax === 'xml' || isStyleSheet(document.languageId); @@ -45,6 +45,8 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi if (!rootNode) { return; } + } else if (document.languageId === 'html') { + rootNode = parseDocument(document, false); } } diff --git a/extensions/emmet/src/extension.ts b/extensions/emmet/src/extension.ts index 3e0b46d979f..3079a1764fe 100644 --- a/extensions/emmet/src/extension.ts +++ b/extensions/emmet/src/extension.ts @@ -142,7 +142,6 @@ export function activate(context: vscode.ExtensionContext) { */ const languageMappingForCompletionProviders: Map<string, string> = new Map<string, string>(); const completionProvidersMapping: Map<string, vscode.Disposable> = new Map<string, vscode.Disposable>(); -const languagesToSkipCompletionProviders = ['html']; function registerCompletionProviders(context: vscode.ExtensionContext) { let completionProvider = new DefaultCompletionItemProvider(); @@ -170,7 +169,7 @@ function registerCompletionProviders(context: vscode.ExtensionContext) { }); Object.keys(LANGUAGE_MODES).forEach(language => { - if (languagesToSkipCompletionProviders.indexOf(language) === -1 && !languageMappingForCompletionProviders.has(language)) { + if (!languageMappingForCompletionProviders.has(language)) { const provider = vscode.languages.registerCompletionItemProvider(language, completionProvider, ...LANGUAGE_MODES[language]); context.subscriptions.push(provider); diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index 3d0d8e2ac5d..37820db427f 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -54,6 +54,7 @@ const emmetModes = ['html', 'pug', 'slim', 'haml', 'xml', 'xsl', 'jsx', 'css', ' // For other languages, users will have to use `emmet.includeLanguages` or // language specific extensions can provide emmet completion support export const MAPPED_MODES: Object = { + 'handlebars': 'html', 'php': 'html' }; diff --git a/extensions/html-language-features/client/src/htmlMain.ts b/extensions/html-language-features/client/src/htmlMain.ts index 6e25547a896..9d32be2861f 100644 --- a/extensions/html-language-features/client/src/htmlMain.ts +++ b/extensions/html-language-features/client/src/htmlMain.ts @@ -54,7 +54,7 @@ export function activate(context: ExtensionContext) { let clientOptions: LanguageClientOptions = { documentSelector, synchronize: { - configurationSection: ['html', 'css', 'javascript', 'emmet'], // the settings to synchronize + configurationSection: ['html', 'css', 'javascript'], // the settings to synchronize }, initializationOptions: { embeddedLanguages diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index e2e1821512f..70d664466d1 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -9,7 +9,6 @@ }, "dependencies": { "vscode-css-languageservice": "^3.0.9-next.10", - "vscode-emmet-helper": "1.2.6", "vscode-html-languageservice": "^2.1.3-next.3", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2", diff --git a/extensions/html-language-features/server/src/htmlServerMain.ts b/extensions/html-language-features/server/src/htmlServerMain.ts index c054ca83845..7e9253c83e6 100644 --- a/extensions/html-language-features/server/src/htmlServerMain.ts +++ b/extensions/html-language-features/server/src/htmlServerMain.ts @@ -7,10 +7,10 @@ import { createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, RequestType, DocumentRangeFormattingRequest, Disposable, DocumentSelector, TextDocumentPositionParams, ServerCapabilities, - Position, CompletionTriggerKind, ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, + Position, ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, WorkspaceFolder, DocumentColorRequest, ColorInformation, ColorPresentationRequest } from 'vscode-languageserver'; -import { TextDocument, Diagnostic, DocumentLink, SymbolInformation, CompletionList } from 'vscode-languageserver-types'; +import { TextDocument, Diagnostic, DocumentLink, SymbolInformation } from 'vscode-languageserver-types'; import { getLanguageModes, LanguageModes, Settings } from './modes/languageModes'; import { format } from './modes/formatting'; @@ -18,7 +18,6 @@ import { pushAll } from './utils/arrays'; import { getDocumentContext } from './utils/documentContext'; import uri from 'vscode-uri'; import { formatError, runSafe, runSafeAsync } from './utils/runner'; -import { doComplete as emmetDoComplete, updateExtensionsPath as updateEmmetExtensionsPath, getEmmetCompletionParticipants } from 'vscode-emmet-helper'; import { FoldingRangeRequest, FoldingRangeServerCapabilities } from 'vscode-languageserver-protocol-foldingprovider'; import { getFoldingRanges } from './modes/htmlFolding'; @@ -78,10 +77,6 @@ function getDocumentSettings(textDocument: TextDocument, needsDocumentSettings: return Promise.resolve(void 0); } -let emmetSettings: any = {}; -let currentEmmetExtensionsPath: string; -const emmetTriggerCharacters = ['!', '.', '}', ':', '*', '$', ']', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; - // After the server has started the client sends an initialize request. The server receives // in the passed params the rootPath of the workspace plus the client capabilities connection.onInitialize((params: InitializeParams): InitializeResult => { @@ -127,7 +122,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { let capabilities: ServerCapabilities & FoldingRangeServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, - completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: [...emmetTriggerCharacters, '.', ':', '<', '"', '=', '/'] } : undefined, + completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/'] } : undefined, hoverProvider: true, documentHighlightProvider: true, documentRangeFormattingProvider: false, @@ -184,13 +179,6 @@ connection.onDidChangeConfiguration((change) => { formatterRegistration = null; } } - - emmetSettings = globalSettings.emmet || {}; - if (currentEmmetExtensionsPath !== emmetSettings['extensionsPath']) { - currentEmmetExtensionsPath = emmetSettings['extensionsPath']; - const workspaceUri = (workspaceFolders && workspaceFolders.length === 1) ? uri.parse(workspaceFolders[0].uri) : null; - updateEmmetExtensionsPath(currentEmmetExtensionsPath, workspaceUri ? workspaceUri.fsPath : undefined); - } }); const pendingValidationRequests: { [uri: string]: NodeJS.Timer } = {}; @@ -254,8 +242,6 @@ async function validateTextDocument(textDocument: TextDocument) { } } -let cachedCompletionList: CompletionList | null; -const hexColorRegex = /^#[\d,a-f,A-F]{1,6}$/; connection.onCompletion(async (textDocumentPosition, token) => { return runSafeAsync(async () => { const document = documents.get(textDocumentPosition.textDocument.uri); @@ -265,22 +251,6 @@ connection.onCompletion(async (textDocumentPosition, token) => { } const doComplete = mode.doComplete!; - if (cachedCompletionList - && !cachedCompletionList.isIncomplete - && (mode.getId() === 'html' || mode.getId() === 'css') - && textDocumentPosition.context - && textDocumentPosition.context.triggerKind === CompletionTriggerKind.TriggerForIncompleteCompletions - ) { - let result: CompletionList = emmetDoComplete(document, textDocumentPosition.position, mode.getId(), emmetSettings); - if (result && result.items) { - result.items.push(...cachedCompletionList.items); - } else { - result = cachedCompletionList; - cachedCompletionList = null; - } - return result; - } - if (mode.getId() !== 'html') { /* __GDPR__ "html.embbedded.complete" : { @@ -290,22 +260,8 @@ connection.onCompletion(async (textDocumentPosition, token) => { connection.telemetry.logEvent({ key: 'html.embbedded.complete', value: { languageId: mode.getId() } }); } - cachedCompletionList = null; - const emmetCompletionList = CompletionList.create([], false); - - const emmetCompletionParticipant = getEmmetCompletionParticipants(document, textDocumentPosition.position, mode.getId(), emmetSettings, emmetCompletionList); - const completionParticipants = [emmetCompletionParticipant]; - let settings = await getDocumentSettings(document, () => doComplete.length > 2); - let result = doComplete(document, textDocumentPosition.position, settings, completionParticipants); - if (emmetCompletionList.isIncomplete) { - emmetCompletionList.items = emmetCompletionList.items || []; - cachedCompletionList = result; - if (emmetCompletionList.items.length && hexColorRegex.test(emmetCompletionList.items[0].label) && result.items.some(x => x.label === emmetCompletionList.items[0].label)) { - emmetCompletionList.items.shift(); - } - return CompletionList.create([...emmetCompletionList.items, ...result.items], emmetCompletionList.isIncomplete || result.isIncomplete); - } + let result = doComplete(document, textDocumentPosition.position, settings); return result; }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); diff --git a/extensions/html-language-features/server/src/modes/cssMode.ts b/extensions/html-language-features/server/src/modes/cssMode.ts index 1b40285ef0d..2e886642862 100644 --- a/extensions/html-language-features/server/src/modes/cssMode.ts +++ b/extensions/html-language-features/server/src/modes/cssMode.ts @@ -6,11 +6,10 @@ import { LanguageModelCache, getLanguageModelCache } from '../languageModelCache'; import { TextDocument, Position, Range, CompletionList } from 'vscode-languageserver-types'; -import { getCSSLanguageService, Stylesheet, ICompletionParticipant, FoldingRange } from 'vscode-css-languageservice'; +import { getCSSLanguageService, Stylesheet, FoldingRange } from 'vscode-css-languageservice'; import { LanguageMode, Workspace } from './languageModes'; import { HTMLDocumentRegions, CSS_STYLE_RULE } from './embeddedSupport'; import { Color } from 'vscode-languageserver'; -import { extractAbbreviation } from 'vscode-emmet-helper'; export function getCSSMode(documentRegions: LanguageModelCache<HTMLDocumentRegions>, workspace: Workspace): LanguageMode { let cssLanguageService = getCSSLanguageService(); @@ -25,26 +24,9 @@ export function getCSSMode(documentRegions: LanguageModelCache<HTMLDocumentRegio let embedded = embeddedCSSDocuments.get(document); return cssLanguageService.doValidation(embedded, cssStylesheets.get(embedded), settings && settings.css); }, - doComplete(document: TextDocument, position: Position, settings = workspace.settings, registeredCompletionParticipants?: ICompletionParticipant[]) { + doComplete(document: TextDocument, position: Position, settings = workspace.settings) { let embedded = embeddedCSSDocuments.get(document); const stylesheet = cssStylesheets.get(embedded); - - const nonEmmetCompletionParticipants = []; - if (registeredCompletionParticipants) { - // Css Emmet completions in html files are provided no matter where the cursor is inside the embedded css document - // Mimic the same here, until we solve the issue of css language service not able to parse complete embedded documents when there are errors - for (let i = 0; i < registeredCompletionParticipants.length; i++) { - if (typeof (<any>registeredCompletionParticipants[i]).getId === 'function' && (<any>registeredCompletionParticipants[i]).getId() === 'emmet') { - const extractedResults = extractAbbreviation(document, position, { lookAhead: false, syntax: 'css' }); - if (extractedResults && extractedResults.abbreviation) { - registeredCompletionParticipants[i].onCssProperty!({ propertyName: extractedResults.abbreviation, range: extractedResults.abbreviationRange }); - } - } else { - nonEmmetCompletionParticipants.push(registeredCompletionParticipants[i]); - } - } - } - cssLanguageService.setCompletionParticipants(nonEmmetCompletionParticipants); return cssLanguageService.doComplete(embedded, position, stylesheet) || CompletionList.create(); }, doHover(document: TextDocument, position: Position) { diff --git a/extensions/html-language-features/server/src/modes/htmlMode.ts b/extensions/html-language-features/server/src/modes/htmlMode.ts index d906ecde4ca..cd3edbaed4b 100644 --- a/extensions/html-language-features/server/src/modes/htmlMode.ts +++ b/extensions/html-language-features/server/src/modes/htmlMode.ts @@ -5,7 +5,7 @@ 'use strict'; import { getLanguageModelCache } from '../languageModelCache'; -import { LanguageService as HTMLLanguageService, HTMLDocument, DocumentContext, FormattingOptions, HTMLFormatConfiguration, ICompletionParticipant } from 'vscode-html-languageservice'; +import { LanguageService as HTMLLanguageService, HTMLDocument, DocumentContext, FormattingOptions, HTMLFormatConfiguration } from 'vscode-html-languageservice'; import { TextDocument, Position, Range, CompletionItem } from 'vscode-languageserver-types'; import { LanguageMode, Workspace } from './languageModes'; @@ -18,7 +18,7 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: getId() { return 'html'; }, - doComplete(document: TextDocument, position: Position, settings = workspace.settings, completionParticipants?: ICompletionParticipant[]) { + doComplete(document: TextDocument, position: Position, settings = workspace.settings) { let options = settings && settings.html && settings.html.suggest; let doAutoComplete = settings && settings.html && settings.html.autoClosingTags; if (doAutoComplete) { @@ -26,9 +26,6 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService, workspace: } let pathCompletionProposals: CompletionItem[] = []; let participants = [getPathCompletionParticipant(document, workspace.folders, pathCompletionProposals)]; - if (completionParticipants) { - participants.push(...completionParticipants); - } htmlLanguageService.setCompletionParticipants(participants); const htmlDocument = htmlDocuments.get(document); diff --git a/extensions/html-language-features/server/src/modes/languageModes.ts b/extensions/html-language-features/server/src/modes/languageModes.ts index 13242925d5a..282c4f75ef4 100644 --- a/extensions/html-language-features/server/src/modes/languageModes.ts +++ b/extensions/html-language-features/server/src/modes/languageModes.ts @@ -24,7 +24,6 @@ export interface Settings { css?: any; html?: any; javascript?: any; - emmet?: { [key: string]: any }; } export interface Workspace { @@ -35,7 +34,7 @@ export interface Workspace { export interface LanguageMode { getId(): string; doValidation?: (document: TextDocument, settings?: Settings) => Diagnostic[]; - doComplete?: (document: TextDocument, position: Position, settings?: Settings, registeredCompletionParticipants?: any[]) => CompletionList; + doComplete?: (document: TextDocument, position: Position, settings?: Settings) => CompletionList; doResolve?: (document: TextDocument, item: CompletionItem) => CompletionItem; doHover?: (document: TextDocument, position: Position) => Hover | null; doSignatureHelp?: (document: TextDocument, position: Position) => SignatureHelp | null; diff --git a/extensions/html-language-features/server/src/test/emmet.test.ts b/extensions/html-language-features/server/src/test/emmet.test.ts deleted file mode 100644 index 15997dcf20d..00000000000 --- a/extensions/html-language-features/server/src/test/emmet.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import 'mocha'; -import * as assert from 'assert'; -import { getHTMLMode } from '../modes/htmlMode'; -import { TextDocument, CompletionList } from 'vscode-languageserver-types'; -import { getLanguageModelCache } from '../languageModelCache'; - -import { getLanguageService } from 'vscode-html-languageservice'; -import * as embeddedSupport from '../modes/embeddedSupport'; -import { getEmmetCompletionParticipants } from 'vscode-emmet-helper'; -import { getCSSMode } from '../modes/cssMode'; - -suite('HTML Emmet Support', () => { - - const htmlLanguageService = getLanguageService(); - - function assertCompletions(syntax: string, value: string, expectedProposal: string | null, expectedProposalDoc: string | null): void { - const offset = value.indexOf('|'); - value = value.substr(0, offset) + value.substr(offset + 1); - - const workspace = { - settings: {}, - folders: [{ name: 'test', uri: 'test://test' }] - }; - - const document = TextDocument.create('test://test/test.' + syntax, syntax, 0, value); - const position = document.positionAt(offset); - const documentRegions = getLanguageModelCache<embeddedSupport.HTMLDocumentRegions>(10, 60, document => embeddedSupport.getDocumentRegions(htmlLanguageService, document)); - const mode = syntax === 'html' ? getHTMLMode(htmlLanguageService, workspace) : getCSSMode(documentRegions, workspace); - - const emmetCompletionList = CompletionList.create([], false); - const emmetParticipant = getEmmetCompletionParticipants(document, position, document.languageId, {}, emmetCompletionList); - - const list = mode.doComplete!(document, position, {}, [emmetParticipant]); - assert.ok(list); - assert.ok(emmetCompletionList); - - let actualLabels = emmetCompletionList.items.map(c => c.label).sort(); - let actualDocs = emmetCompletionList.items.map(c => c.documentation).sort(); - if (expectedProposal && expectedProposalDoc) { - assert.ok(actualLabels.indexOf(expectedProposal) !== -1, value + ': Not found:' + expectedProposal + ' is ' + actualLabels.join(', ')); - assert.ok(actualDocs.indexOf(expectedProposalDoc) !== -1, value + ': Not found:' + expectedProposalDoc + ' is ' + actualDocs.join(', ')); - } else { - assert.ok(!emmetCompletionList.items.length && !emmetCompletionList.isIncomplete, value + ': No proposals expected, but was ' + actualLabels.join(', ')); - } - - } - - test('Html Emmet Completions', function (): any { - assertCompletions('html', 'ul|', 'ul', '<ul>|</ul>'); - assertCompletions('html', '<ul|', null, null); - assertCompletions('html', '<html>ul|</html>', 'ul', '<ul>|</ul>'); - assertCompletions('html', '<img src=|', null, null); - assertCompletions('html', '<div class=|/>', null, null); - }); - - test('Css Emmet Completions', function (): any { - assertCompletions('css', '<style>.foo { display: none; m10| }</style>', 'margin: 10px;', 'margin: 10px;'); - assertCompletions('css', '<style>foo { display: none; pos:f| }</style>', 'position: fixed;', 'position: fixed;'); - // assertCompletions('css', '<style>foo { display: none; margin: a| }</style>', null, null); // disabled for #29113 - // assertCompletions('css', '<style>foo| { display: none; }</style>', null, null); // disabled for #29113 - assertCompletions('css', '<style>foo {| display: none; }</style>', null, null); - assertCompletions('css', '<style>foo { display: none;| }</style>', null, null); - assertCompletions('css', '<style>foo { display: none|; }</style>', null, null); - assertCompletions('css', '<style>.foo { display: none; -m-m10| }</style>', 'margin: 10px;', '-moz-margin: 10px;\nmargin: 10px;'); - }); -}); \ No newline at end of file diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index f4da19b9c1d..0ef1e255f19 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -2,10 +2,6 @@ # yarn lockfile v1 -"@emmetio/extract-abbreviation@0.1.6": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@emmetio/extract-abbreviation/-/extract-abbreviation-0.1.6.tgz#e4a9856c1057f0aff7d443b8536477c243abe28c" - "@types/mocha@2.2.33": version "2.2.33" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.33.tgz#d79a0061ec270379f4d9e225f4096fb436669def" @@ -14,10 +10,6 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -jsonc-parser@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" - vscode-css-languageservice@^3.0.9-next.10: version "3.0.9-next.10" resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.10.tgz#be73d571221176b43d2c398a4a27f7d38206952d" @@ -25,14 +17,6 @@ vscode-css-languageservice@^3.0.9-next.10: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" -vscode-emmet-helper@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.6.tgz#6cc7293765af7136d409d0d62ef17c66e8b9cf45" - dependencies: - "@emmetio/extract-abbreviation" "0.1.6" - jsonc-parser "^1.0.0" - vscode-languageserver-types "^3.6.0-next.1" - vscode-html-languageservice@^2.1.3-next.3: version "2.1.3-next.3" resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.3-next.3.tgz#20c4a0ae673815b598a7e132b5ef03a6920fa7af" @@ -63,10 +47,6 @@ vscode-languageserver-types@^3.6.0, vscode-languageserver-types@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz#4bc06a48dff653495f12f94b8b1e228988a1748d" -vscode-languageserver-types@^3.6.0-next.1: - version "3.6.0-next.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.0-next.1.tgz#98e488d3f87b666b4ee1a3d89f0023e246d358f3" - vscode-languageserver@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-4.0.0.tgz#8b792f0d6d10acfe363d02371ed4ce53d08af88a" From 79a2512769762928f089e4fd0b84764e37a1ce0d Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Sun, 22 Apr 2018 21:49:29 -0700 Subject: [PATCH 619/710] Emmet: Allow css completions in style tag/attribute, html completions in script tags with html type --- extensions/emmet/src/abbreviationActions.ts | 34 +++- .../emmet/src/defaultCompletionProvider.ts | 91 +++++++-- .../emmet/src/test/abbreviationAction.test.ts | 180 +++++++++++++++--- .../src/test/partialParsingStylesheet.test.ts | 37 ++-- extensions/emmet/src/util.ts | 34 ++++ 5 files changed, 312 insertions(+), 64 deletions(-) diff --git a/extensions/emmet/src/abbreviationActions.ts b/extensions/emmet/src/abbreviationActions.ts index ad5934c6c99..e072d33b280 100644 --- a/extensions/emmet/src/abbreviationActions.ts +++ b/extensions/emmet/src/abbreviationActions.ts @@ -5,11 +5,11 @@ import * as vscode from 'vscode'; import { Node, HtmlNode, Rule, Property, Stylesheet } from 'EmmetNode'; -import { getEmmetHelper, getNode, getInnerRange, getMappingForIncludedLanguages, parseDocument, validate, getEmmetConfiguration, isStyleSheet, getEmmetMode, parsePartialStylesheet } from './util'; +import { getEmmetHelper, getNode, getInnerRange, getMappingForIncludedLanguages, parseDocument, validate, getEmmetConfiguration, isStyleSheet, getEmmetMode, parsePartialStylesheet, isStyleAttribute, getEmbeddedCssNodeIfAny } from './util'; const trimRegex = /[\u00a0]*[\d|#|\-|\*|\u2022]+\.?/; const hexColorRegex = /^#\d+$/; - +const allowedMimeTypesInScriptTag = ['text/html', 'text/plain', 'text/x-template', 'text/template']; const inlineElements = ['a', 'abbr', 'acronym', 'applet', 'b', 'basefont', 'bdo', 'big', 'br', 'button', 'cite', 'code', 'del', 'dfn', 'em', 'font', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'object', 'q', @@ -294,8 +294,24 @@ export function expandEmmetAbbreviation(args: any): Thenable<boolean | undefined if (!helper.isAbbreviationValid(syntax, abbreviation)) { return; } + let currentNode = getNode(rootNode, position, true); + let validateLocation = true; + let syntaxToUse = syntax; - if (!isValidLocationForEmmetAbbreviation(editor.document, rootNode, syntax, position, rangeToReplace)) { + if (editor.document.languageId === 'html') { + if (isStyleAttribute(currentNode, position)) { + syntaxToUse = 'css'; + validateLocation = false; + } else { + const embeddedCssNode = getEmbeddedCssNodeIfAny(editor.document, currentNode, position); + if (embeddedCssNode) { + currentNode = getNode(embeddedCssNode, position, true); + syntaxToUse = 'css'; + } + } + } + + if (validateLocation && !isValidLocationForEmmetAbbreviation(editor.document, rootNode, currentNode, syntaxToUse, position, rangeToReplace)) { return; } @@ -305,7 +321,7 @@ export function expandEmmetAbbreviation(args: any): Thenable<boolean | undefined allAbbreviationsSame = false; } - abbreviationList.push({ syntax, abbreviation, rangeToReplace, filter }); + abbreviationList.push({ syntax: syntaxToUse, abbreviation, rangeToReplace, filter }); }); return expandAbbreviationInRange(editor, abbreviationList, allAbbreviationsSame).then(success => { @@ -326,12 +342,12 @@ function fallbackTab(): Thenable<boolean | undefined> { * Works only on html and css/less/scss syntax * @param document current Text Document * @param rootNode parsed document + * @param currentNode current node in the parsed document * @param syntax syntax of the abbreviation * @param position position to validate * @param abbreviationRange The range of the abbreviation for which given position is being validated */ -export function isValidLocationForEmmetAbbreviation(document: vscode.TextDocument, rootNode: Node | undefined, syntax: string, position: vscode.Position, abbreviationRange: vscode.Range): boolean { - const currentNode = rootNode ? getNode(rootNode, position, true) : null; +export function isValidLocationForEmmetAbbreviation(document: vscode.TextDocument, rootNode: Node | undefined, currentNode: Node | null, syntax: string, position: vscode.Position, abbreviationRange: vscode.Range): boolean { if (isStyleSheet(syntax)) { const stylesheet = <Stylesheet>rootNode; if (stylesheet && (stylesheet.comments || []).some(x => position.isAfterOrEqual(x.start) && position.isBeforeOrEqual(x.end))) { @@ -407,6 +423,12 @@ export function isValidLocationForEmmetAbbreviation(document: vscode.TextDocumen let start = new vscode.Position(0, 0); if (currentHtmlNode) { + if (currentHtmlNode.name === 'script') { + return (currentHtmlNode.attributes + && currentHtmlNode.attributes.some(x => x.name.toString() === 'type' + && allowedMimeTypesInScriptTag.indexOf(x.value.toString()) > -1)); + } + const innerRange = getInnerRange(currentHtmlNode); // Fix for https://github.com/Microsoft/vscode/issues/28829 diff --git a/extensions/emmet/src/defaultCompletionProvider.ts b/extensions/emmet/src/defaultCompletionProvider.ts index fc7ac6d796a..92888ea1c4b 100644 --- a/extensions/emmet/src/defaultCompletionProvider.ts +++ b/extensions/emmet/src/defaultCompletionProvider.ts @@ -6,11 +6,39 @@ import * as vscode from 'vscode'; import { Node, Stylesheet } from 'EmmetNode'; import { isValidLocationForEmmetAbbreviation } from './abbreviationActions'; -import { getEmmetHelper, getMappingForIncludedLanguages, parsePartialStylesheet, getEmmetConfiguration, getEmmetMode, isStyleSheet, parseDocument, } from './util'; +import { getEmmetHelper, getMappingForIncludedLanguages, parsePartialStylesheet, getEmmetConfiguration, getEmmetMode, isStyleSheet, parseDocument, getEmbeddedCssNodeIfAny, isStyleAttribute, getNode } from './util'; export class DefaultCompletionItemProvider implements vscode.CompletionItemProvider { + private lastCompletionType: string | undefined; + public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext): Thenable<vscode.CompletionList | undefined> | undefined { + const completionResult = this.provideCompletionItemsInternal(document, position, token, context); + if (!completionResult) { + this.lastCompletionType = undefined; + return; + } + + return completionResult.then(completionList => { + if (!completionList || !completionList.items.length) { + this.lastCompletionType = undefined; + return completionList; + } + const item = completionList.items[0]; + const expandedText = item.documentation ? item.documentation.toString() : ''; + + if (expandedText.startsWith('<')) { + this.lastCompletionType = 'html'; + } else if (expandedText.indexOf(':') > 0 && expandedText.endsWith(';')) { + this.lastCompletionType = 'css'; + } else { + this.lastCompletionType = undefined; + } + return completionList; + }); + } + + private provideCompletionItemsInternal(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext): Thenable<vscode.CompletionList | undefined> | undefined { const emmetConfig = vscode.workspace.getConfiguration('emmet'); const excludedLanguages = emmetConfig['excludeLanguages'] ? emmetConfig['excludeLanguages'] : []; if (excludedLanguages.indexOf(document.languageId) > -1) { @@ -28,29 +56,60 @@ export class DefaultCompletionItemProvider implements vscode.CompletionItemProvi } const helper = getEmmetHelper(); + let validateLocation = syntax === 'html' || syntax === 'jsx' || syntax === 'xml'; + let rootNode: Node | undefined = undefined; + let currentNode: Node | null = null; + + if (document.languageId === 'html') { + if (context.triggerKind === vscode.CompletionTriggerKind.TriggerForIncompleteCompletions) { + switch (this.lastCompletionType) { + case 'html': + validateLocation = false; + break; + case 'css': + validateLocation = false; + syntax = 'css'; + break; + default: + break; + } + + } + if (validateLocation) { + rootNode = parseDocument(document, false); + currentNode = getNode(rootNode, position, true); + if (isStyleAttribute(currentNode, position)) { + syntax = 'css'; + validateLocation = false; + } else { + const embeddedCssNode = getEmbeddedCssNodeIfAny(document, currentNode, position); + if (embeddedCssNode) { + currentNode = getNode(embeddedCssNode, position, true); + syntax = 'css'; + } + } + } + + } + const extractAbbreviationResults = helper.extractAbbreviation(document, position, !isStyleSheet(syntax)); if (!extractAbbreviationResults || !helper.isAbbreviationValid(syntax, extractAbbreviationResults.abbreviation)) { return; } - let validateLocation = false; - let rootNode: Node | undefined = undefined; - - if (context.triggerKind !== vscode.CompletionTriggerKind.TriggerForIncompleteCompletions) { - validateLocation = syntax === 'html' || syntax === 'jsx' || syntax === 'xml' || isStyleSheet(document.languageId); - // If document can be css parsed, get currentNode - if (isStyleSheet(document.languageId)) { - let usePartialParsing = vscode.workspace.getConfiguration('emmet')['optimizeStylesheetParsing'] === true; - rootNode = usePartialParsing && document.lineCount > 1000 ? parsePartialStylesheet(document, position) : <Stylesheet>parseDocument(document, false); - if (!rootNode) { - return; - } - } else if (document.languageId === 'html') { - rootNode = parseDocument(document, false); + if (isStyleSheet(document.languageId) && context.triggerKind !== vscode.CompletionTriggerKind.TriggerForIncompleteCompletions) { + validateLocation = true; + let usePartialParsing = vscode.workspace.getConfiguration('emmet')['optimizeStylesheetParsing'] === true; + rootNode = usePartialParsing && document.lineCount > 1000 ? parsePartialStylesheet(document, position) : <Stylesheet>parseDocument(document, false); + if (!rootNode) { + return; } + currentNode = getNode(rootNode, position, true); } - if (validateLocation && !isValidLocationForEmmetAbbreviation(document, rootNode, syntax, position, extractAbbreviationResults.abbreviationRange)) { + + + if (validateLocation && !isValidLocationForEmmetAbbreviation(document, rootNode, currentNode, syntax, position, extractAbbreviationResults.abbreviationRange)) { return; } diff --git a/extensions/emmet/src/test/abbreviationAction.test.ts b/extensions/emmet/src/test/abbreviationAction.test.ts index a8bd637da32..14286654d05 100644 --- a/extensions/emmet/src/test/abbreviationAction.test.ts +++ b/extensions/emmet/src/test/abbreviationAction.test.ts @@ -25,13 +25,19 @@ const htmlContents = ` </ul> <style> .boo { - m10 + display: dn; m10 } </style> <span></span> (ul>li.item$)*2 (ul>li.item$)*2+span (div>dl>(dt+dd)*2) + <script type="text/html"> + span.hello + </script> + <script type="text/javascript"> + span.hello + </script> </body> `; @@ -216,7 +222,7 @@ suite('Tests for Expand Abbreviations (HTML)', () => { test('Expand css when inside style tag (HTML)', () => { return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { - editor.selection = new Selection(13, 3, 13, 6); + editor.selection = new Selection(13, 16, 13, 19); let expandPromise = expandEmmetAbbreviation({ language: 'css' }); if (!expandPromise) { return Promise.resolve(); @@ -228,32 +234,154 @@ suite('Tests for Expand Abbreviations (HTML)', () => { }); }); - // test('Expand css when inside style tag in completion list (HTML)', () => { - // const abbreviation = 'm10'; - // const expandedText = 'margin: 10px;'; + test('Expand css when inside style tag in completion list (HTML)', () => { + const abbreviation = 'm10'; + const expandedText = 'margin: 10px;'; - // return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { - // editor.selection = new Selection(13, 3, 13, 6); - // const cancelSrc = new CancellationTokenSource(); - // const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); - // if (!completionPromise) { - // assert.equal(1, 2, `Problem with expanding m10`); - // return Promise.resolve(); - // } + return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { + editor.selection = new Selection(13, 16, 13, 19); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + if (!completionPromise) { + assert.equal(1, 2, `Problem with expanding m10`); + return Promise.resolve(); + } - // return completionPromise.then((completionList: CompletionList) => { - // if (!completionList.items || !completionList.items.length) { - // assert.equal(1, 2, `Problem with expanding m10`); - // return Promise.resolve(); - // } - // const emmetCompletionItem = completionList.items[0]; - // assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`); - // assert.equal((<string>emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`); - // assert.equal(emmetCompletionItem.filterText, abbreviation, `FilterText of completion item doesnt match.`); - // return Promise.resolve(); - // }); - // }); - // }); + return completionPromise.then((completionList: CompletionList) => { + if (!completionList.items || !completionList.items.length) { + assert.equal(1, 2, `Problem with expanding m10`); + return Promise.resolve(); + } + const emmetCompletionItem = completionList.items[0]; + assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`); + assert.equal((<string>emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`); + assert.equal(emmetCompletionItem.filterText, abbreviation, `FilterText of completion item doesnt match.`); + return Promise.resolve(); + }); + }); + }); + + test('No expanding text inside style tag if position is not for property name (HTML)', () => { + return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { + editor.selection = new Selection(13, 14, 13, 14); + return expandEmmetAbbreviation(null).then(() => { + assert.equal(editor.document.getText(), htmlContents); + return Promise.resolve(); + }); + }); + }); + + test('No expanding text in completion list inside style tag if position is not for property name (HTML)', () => { + return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { + editor.selection = new Selection(13, 14, 13, 14); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); + return Promise.resolve(); + }); + }); + + test('Expand css when inside style attribute (HTML)', () => { + const styleAttributeContent = '<div style="m10" class="hello"></div>'; + return withRandomFileEditor(styleAttributeContent, 'html', (editor, doc) => { + editor.selection = new Selection(0, 15, 0, 15); + let expandPromise = expandEmmetAbbreviation(null); + if (!expandPromise) { + return Promise.resolve(); + } + return expandPromise.then(() => { + assert.equal(editor.document.getText(), styleAttributeContent.replace('m10', 'margin: 10px;')); + return Promise.resolve(); + }); + }); + }); + + test('Expand css when inside style attribute in completion list (HTML)', () => { + const abbreviation = 'm10'; + const expandedText = 'margin: 10px;'; + + return withRandomFileEditor('<div style="m10" class="hello"></div>', 'html', (editor, doc) => { + editor.selection = new Selection(0, 15, 0, 15); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + if (!completionPromise) { + assert.equal(1, 2, `Problem with expanding m10`); + return Promise.resolve(); + } + + return completionPromise.then((completionList: CompletionList) => { + if (!completionList.items || !completionList.items.length) { + assert.equal(1, 2, `Problem with expanding m10`); + return Promise.resolve(); + } + const emmetCompletionItem = completionList.items[0]; + assert.equal(emmetCompletionItem.label, expandedText, `Label of completion item doesnt match.`); + assert.equal((<string>emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`); + assert.equal(emmetCompletionItem.filterText, abbreviation, `FilterText of completion item doesnt match.`); + return Promise.resolve(); + }); + }); + }); + + test('Expand html when inside script tag with html type (HTML)', () => { + return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { + editor.selection = new Selection(21, 12, 21, 12); + let expandPromise = expandEmmetAbbreviation(null); + if (!expandPromise) { + return Promise.resolve(); + } + return expandPromise.then(() => { + assert.equal(editor.document.getText(), htmlContents.replace('span.hello', '<span class="hello"></span>')); + return Promise.resolve(); + }); + }); + }); + + test('Expand html when inside script tag with html type (HTML)', () => { + const abbreviation = 'span.hello'; + const expandedText = '<span class="hello"></span>'; + + return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { + editor.selection = new Selection(21, 12, 21, 12); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + if (!completionPromise) { + assert.equal(1, 2, `Problem with expanding span.hello`); + return Promise.resolve(); + } + + return completionPromise.then((completionList: CompletionList) => { + if (!completionList.items || !completionList.items.length) { + assert.equal(1, 2, `Problem with expanding span.hello`); + return Promise.resolve(); + } + const emmetCompletionItem = completionList.items[0]; + assert.equal(emmetCompletionItem.label, abbreviation, `Label of completion item doesnt match.`); + assert.equal((<string>emmetCompletionItem.documentation || '').replace(/\|/g, ''), expandedText, `Docs of completion item doesnt match.`); + return Promise.resolve(); + }); + }); + }); + + test('No expanding text inside script tag with javascript type (HTML)', () => { + return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { + editor.selection = new Selection(24, 12, 24, 12); + return expandEmmetAbbreviation(null).then(() => { + assert.equal(editor.document.getText(), htmlContents); + return Promise.resolve(); + }); + }); + }); + + test('No expanding text in completion list inside script tag with javascript type (HTML)', () => { + return withRandomFileEditor(htmlContents, 'html', (editor, doc) => { + editor.selection = new Selection(24, 12, 24, 12); + const cancelSrc = new CancellationTokenSource(); + const completionPromise = completionProvider.provideCompletionItems(editor.document, editor.selection.active, cancelSrc.token, { triggerKind: CompletionTriggerKind.Invoke }); + assert.equal(!completionPromise, true, `Got unexpected comapletion promise instead of undefined`); + return Promise.resolve(); + }); + }); // test('No expanding when html is excluded in the settings', () => { // return workspace.getConfiguration('emmet').update('excludeLanguages', ['html'], ConfigurationTarget.Global).then(() => { diff --git a/extensions/emmet/src/test/partialParsingStylesheet.test.ts b/extensions/emmet/src/test/partialParsingStylesheet.test.ts index 6c3b995960f..59fae12a0d4 100644 --- a/extensions/emmet/src/test/partialParsingStylesheet.test.ts +++ b/extensions/emmet/src/test/partialParsingStylesheet.test.ts @@ -7,12 +7,17 @@ import 'mocha'; import * as assert from 'assert'; import { withRandomFileEditor } from './testUtils'; import * as vscode from 'vscode'; -import { parsePartialStylesheet } from '../util'; +import { parsePartialStylesheet, getNode } from '../util'; import { isValidLocationForEmmetAbbreviation } from '../abbreviationActions'; - - suite('Tests for partial parse of Stylesheets', () => { + + function isValid(doc: vscode.TextDocument, range: vscode.Range, syntax: string): boolean { + const rootNode = parsePartialStylesheet(doc, range.end); + const currentNode = getNode(rootNode, range.end, true); + return isValidLocationForEmmetAbbreviation(doc, rootNode, currentNode, 'css', range.end, range); + } + test('Ignore block comment inside rule', function (): any { const cssContents = ` p { @@ -37,10 +42,10 @@ p { ] rangesForEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'css', range.end, range), true); + assert.equal(isValid(doc, range, 'css'), true); }); rangesNotEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'css', range.end, range), false); + assert.equal(isValid(doc, range, 'css'), false); }); return Promise.resolve(); @@ -67,7 +72,7 @@ dn { new vscode.Range(7, 2, 7, 4) // bg after ending of badly constructed block ]; rangesNotEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), false); + assert.equal(isValid(doc, range, 'scss'), false); }); return Promise.resolve(); }); @@ -102,10 +107,10 @@ comment */ new vscode.Range(10, 2, 10, 3) // p after ending of block ]; rangesForEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'css', range.end, range), true); + assert.equal(isValid(doc, range, 'css'), true); }); rangesNotEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'css', range.end, range), false); + assert.equal(isValid(doc, range, 'css'), false); }); return Promise.resolve(); }); @@ -137,10 +142,10 @@ comment */ new vscode.Range(6, 3, 6, 4) // In selector ]; rangesForEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), true); + assert.equal(isValid(doc, range, 'scss'), true); }); rangesNotEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), false); + assert.equal(isValid(doc, range, 'scss'), false); }); return Promise.resolve(); }); @@ -169,10 +174,10 @@ comment */ new vscode.Range(1, 66, 1, 68) // Outside any ruleset ]; rangesForEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), true); + assert.equal(isValid(doc, range, 'scss'), true); }); rangesNotEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), false); + assert.equal(isValid(doc, range, 'scss'), false); }); return Promise.resolve(); }); @@ -204,10 +209,10 @@ p.#{dn} { new vscode.Range(7, 1, 7, 3) // dn inside ruleset whose selector uses nested interpolation ]; rangesForEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), true); + assert.equal(isValid(doc, range, 'scss'), true); }); rangesNotEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), false); + assert.equal(isValid(doc, range, 'scss'), false); }); return Promise.resolve(); }); @@ -242,10 +247,10 @@ ment */{ new vscode.Range(6, 3, 6, 4) // In c inside block comment ]; rangesForEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), true); + assert.equal(isValid(doc, range, 'scss'), true); }); rangesNotEmmet.forEach(range => { - assert.equal(isValidLocationForEmmetAbbreviation(doc, parsePartialStylesheet(doc, range.end), 'scss', range.end, range), false); + assert.equal(isValid(doc, range, 'scss'), false); }); return Promise.resolve(); }); diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index 37820db427f..2e9bbc931f6 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -529,3 +529,37 @@ export function getCssPropertyFromDocument(editor: vscode.TextEditor, position: return (node && node.type === 'property') ? <Property>node : null; } } + + +export function getEmbeddedCssNodeIfAny(document: vscode.TextDocument, currentNode: Node | null, position: vscode.Position): Node | undefined { + if (!currentNode) { + return; + } + const currentHtmlNode = <HtmlNode>currentNode; + if (currentHtmlNode && currentHtmlNode.close) { + const innerRange = getInnerRange(currentHtmlNode); + if (innerRange && innerRange.contains(position)) { + if (currentHtmlNode.name === 'style' + && currentHtmlNode.open.end.isBefore(position) + && currentHtmlNode.close.start.isAfter(position) + + ) { + let buffer = new DocumentStreamReader(document, currentHtmlNode.open.end, new vscode.Range(currentHtmlNode.open.end, currentHtmlNode.close.start)); + return parseStylesheet(buffer); + } + } + } +} + +export function isStyleAttribute(currentNode: Node | null, position: vscode.Position): boolean { + if (!currentNode) { + return false; + } + const currentHtmlNode = <HtmlNode>currentNode; + const index = (currentHtmlNode.attributes || []).findIndex(x => x.name.toString() === 'style'); + if (index === -1) { + return false; + } + const styleAttribute = currentHtmlNode.attributes[index]; + return position.isAfterOrEqual(styleAttribute.value.start) && position.isBeforeOrEqual(styleAttribute.value.end); +} \ No newline at end of file From fd3e860995d03a7b575dd7b1e875f5f03ff7c152 Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Mon, 23 Apr 2018 10:06:36 +0200 Subject: [PATCH 620/710] Update calendar --- .github/calendar.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/calendar.yml b/.github/calendar.yml index 276adfcda36..3c354cc0a90 100644 --- a/.github/calendar.yml +++ b/.github/calendar.yml @@ -12,4 +12,7 @@ '2018-03-26 18:00, US/Pacific': 'endgame', '2018-04-06 18:00, US/Pacific': 'release', # 1.22.1 '2018-04-11 18:00, US/Pacific': 'development', + '2018-04-12 12:00, US/Pacific': 'release', # 1.22.2 + '2018-04-17 12:00, US/Pacific': 'development', + '2018-04-23 18:00, US/Pacific': 'endgame', } From 68c4b99a02e68f916a82329c6fb0afd7a372c846 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Mon, 23 Apr 2018 10:05:42 +0200 Subject: [PATCH 621/710] Fix #48277 --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 36a9e67cbb1..860272a4fa5 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -41,7 +41,7 @@ const viewsContainerSchema: IJSONSchema = { type: 'object', properties: { id: { - description: localize('vscode.extension.contributes.views.containers.id', "Unique id used to identify the container in which views can be contributed using 'views' contribution point"), + description: localize({ key: 'vscode.extension.contributes.views.containers.id', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "Unique id used to identify the container in which views can be contributed using 'views' contribution point"), type: 'string' }, label: { @@ -79,7 +79,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { for (let extension of extensions) { const { value, collector } = extension; if (!extension.description.enableProposedApi) { - collector.error(localize('proposed', "'{0}' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {1}", 'viewsContainer', extension.description.id)); + collector.error(localize({ key: 'proposed', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "'{0}' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {1}", 'viewsContainer', extension.description.id)); continue; } forEach(value, entry => { From ef241b03b13088254a2e2aed6ec92da3cf64d61e Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Mon, 23 Apr 2018 10:31:50 +0200 Subject: [PATCH 622/710] debug: if output event does not have a column use column 1 fixes #46165 --- src/vs/workbench/parts/debug/electron-browser/debugService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 09921796ba7..b70f399d972 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -372,7 +372,7 @@ export class DebugService implements debug.IDebugService { const waitFor = outputPromises.slice(); const source = event.body.source ? { lineNumber: event.body.line, - column: event.body.column, + column: event.body.column ? event.body.column : 1, source: process.getSource(event.body.source) } : undefined; if (event.body.variablesReference) { From c84720841c5a3991ec97f05a66db0de306e99823 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Mon, 23 Apr 2018 10:41:03 +0200 Subject: [PATCH 623/710] allow to run unit tests from vscode again (workaround for #48205) --- .../files/electron-browser/fileService.ts | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index f1be736dffc..219dd9ff8a9 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -18,7 +18,7 @@ import * as arrays from 'vs/base/common/arrays'; import { TPromise } from 'vs/base/common/winjs.base'; import * as objects from 'vs/base/common/objects'; import * as extfs from 'vs/base/node/extfs'; -import { nfcall, ThrottledDelayer } from 'vs/base/common/async'; +import { nfcall, ThrottledDelayer, asWinJsPromise } from 'vs/base/common/async'; import uri from 'vs/base/common/uri'; import * as nls from 'vs/nls'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; @@ -43,7 +43,6 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { onUnexpectedError } from 'vs/base/common/errors'; import product from 'vs/platform/node/product'; -import { shell } from 'electron'; import { IEncodingOverride, ResourceEncodings } from 'vs/workbench/services/files/electron-browser/encoding'; import { createReadableOfSnapshot } from 'vs/workbench/services/files/electron-browser/streams'; @@ -906,22 +905,25 @@ export class FileService implements IFileService { public del(resource: uri, useTrash?: boolean): TPromise<void> { if (useTrash) { - return this.doMoveItemToTrash(resource); + return asWinJsPromise(() => this.doMoveItemToTrash(resource)); } return this.doDelete(resource); } - private doMoveItemToTrash(resource: uri): TPromise<void> { + private doMoveItemToTrash(resource: uri): Promise<void> { const absolutePath = resource.fsPath; - const result = shell.moveItemToTrash(absolutePath); - if (!result) { - return TPromise.wrapError<void>(new Error(isWindows ? nls.localize('binFailed', "Failed to move '{0}' to the recycle bin", paths.basename(absolutePath)) : nls.localize('trashFailed', "Failed to move '{0}' to the trash", paths.basename(absolutePath)))); - } - this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.DELETE)); + return (import('electron')).then(electron => { // workaround for https://github.com/Microsoft/vscode/issues/48205 + const result = electron.shell.moveItemToTrash(absolutePath); + if (!result) { + return TPromise.wrapError<void>(new Error(isWindows ? nls.localize('binFailed', "Failed to move '{0}' to the recycle bin", paths.basename(absolutePath)) : nls.localize('trashFailed', "Failed to move '{0}' to the trash", paths.basename(absolutePath)))); + } - return TPromise.as(null); + this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.DELETE)); + + return TPromise.wrap(null); + }); } private doDelete(resource: uri): TPromise<void> { From 91bd149bfe44b215882f843f6d0d925e40df0aab Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Mon, 23 Apr 2018 10:43:58 +0200 Subject: [PATCH 624/710] Check for word boundaries around word-only brackets (#11856) --- src/vs/editor/common/model/textModel.ts | 26 +++++++------------ .../common/modes/supports/richEditBrackets.ts | 19 +++++++++----- .../common/model/textModelWithTokens.test.ts | 25 ++++++++++++++++++ 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 3f50b4cf63e..8bad048eb1b 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -2041,25 +2041,13 @@ export class TextModel extends Disposable implements model.ITextModel { // limit search to not go after `maxBracketLength` const searchEndOffset = Math.min(lineTokens.getEndOffset(tokenIndex), position.column - 1 + currentModeBrackets.maxBracketLength); - // first, check if there is a bracket to the right of `position` - let foundBracket = BracketsUtils.findNextBracketInToken(currentModeBrackets.forwardRegex, lineNumber, lineText, position.column - 1, searchEndOffset); - if (foundBracket && foundBracket.startColumn === position.column) { - let foundBracketText = lineText.substring(foundBracket.startColumn - 1, foundBracket.endColumn - 1); - foundBracketText = foundBracketText.toLowerCase(); - - let r = this._matchFoundBracket(foundBracket, currentModeBrackets.textIsBracket[foundBracketText], currentModeBrackets.textIsOpenBracket[foundBracketText]); - - // check that we can actually match this bracket - if (r) { - return r; - } - } - - // it might still be the case that [currentTokenStart -> currentTokenEnd] contains multiple brackets + // it might be the case that [currentTokenStart -> currentTokenEnd] contains multiple brackets + // `bestResult` will contain the most right-side result + let bestResult: [Range, Range] = null; while (true) { let foundBracket = BracketsUtils.findNextBracketInToken(currentModeBrackets.forwardRegex, lineNumber, lineText, searchStartOffset, searchEndOffset); if (!foundBracket) { - // there are no brackets in this text + // there are no more brackets in this text break; } @@ -2072,12 +2060,16 @@ export class TextModel extends Disposable implements model.ITextModel { // check that we can actually match this bracket if (r) { - return r; + bestResult = r; } } searchStartOffset = foundBracket.endColumn - 1; } + + if (bestResult) { + return bestResult; + } } // If position is in between two tokens, try also looking in the previous token diff --git a/src/vs/editor/common/modes/supports/richEditBrackets.ts b/src/vs/editor/common/modes/supports/richEditBrackets.ts index b9cdb4169a7..4763356141f 100644 --- a/src/vs/editor/common/modes/supports/richEditBrackets.ts +++ b/src/vs/editor/common/modes/supports/richEditBrackets.ts @@ -85,14 +85,14 @@ function once<T, R>(keyFn: (input: T) => string, computeFn: (input: T) => R): (i const getRegexForBracketPair = once<ISimpleInternalBracket, RegExp>( (input) => `${input.open};${input.close}`, (input) => { - return createOrRegex([input.open, input.close]); + return createBracketOrRegExp([input.open, input.close]); } ); const getReversedRegexForBracketPair = once<ISimpleInternalBracket, RegExp>( (input) => `${input.open};${input.close}`, (input) => { - return createOrRegex([toReversedString(input.open), toReversedString(input.close)]); + return createBracketOrRegExp([toReversedString(input.open), toReversedString(input.close)]); } ); @@ -104,7 +104,7 @@ const getRegexForBrackets = once<ISimpleInternalBracket[], RegExp>( pieces.push(b.open); pieces.push(b.close); }); - return createOrRegex(pieces); + return createBracketOrRegExp(pieces); } ); @@ -116,12 +116,19 @@ const getReversedRegexForBrackets = once<ISimpleInternalBracket[], RegExp>( pieces.push(toReversedString(b.open)); pieces.push(toReversedString(b.close)); }); - return createOrRegex(pieces); + return createBracketOrRegExp(pieces); } ); -function createOrRegex(pieces: string[]): RegExp { - let regexStr = `(${pieces.map(strings.escapeRegExpCharacters).join(')|(')})`; +function prepareBracketForRegExp(str: string): string { + // This bracket pair uses letters like e.g. "begin" - "end" + const insertWordBoundaries = (/^[\w]+$/.test(str)); + str = strings.escapeRegExpCharacters(str); + return (insertWordBoundaries ? `\\b${str}\\b` : str); +} + +function createBracketOrRegExp(pieces: string[]): RegExp { + let regexStr = `(${pieces.map(prepareBracketForRegExp).join(')|(')})`; return strings.createRegExp(regexStr, true); } diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index be4d9452721..9023f0cc7dc 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -366,6 +366,31 @@ suite('TextModelWithTokens regression tests', () => { model.dispose(); registration.dispose(); }); + + test('issue #11856: Bracket matching does not work as expected if the opening brace symbol is contained in the closing brace symbol', () => { + + const languageIdentifier = new LanguageIdentifier('testMode', LanguageId.PlainText); + + let registration = LanguageConfigurationRegistry.register(languageIdentifier, { + brackets: [ + ['sequence', 'endsequence'], + ['feature', 'endfeature'] + ] + }); + + let model = TextModel.createFromString([ + 'sequence "outer"', + ' sequence "inner"', + ' endsequence', + 'endsequence', + ].join('\n'), undefined, languageIdentifier); + + let actual = model.matchBracket(new Position(3, 9)); + assert.deepEqual(actual, [new Range(3, 6, 3, 17), new Range(2, 6, 2, 14)]); + + model.dispose(); + registration.dispose(); + }); }); suite('TextModel.getLineIndentGuide', () => { From 304079b491452e807eafe76abb63aec115d7450e Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Mon, 23 Apr 2018 10:47:41 +0200 Subject: [PATCH 625/710] debug repl: take into accounts source length for wrapping strategies fixes #46777 --- .../parts/debug/electron-browser/replViewer.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index de6b81819f2..adba2939768 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -107,11 +107,16 @@ export class ReplExpressionsRenderer implements IRenderer { return 2 * ReplExpressionsRenderer.LINE_HEIGHT_PX; } - return this.getHeightForString(element.value) + (element instanceof Expression ? this.getHeightForString(element.name) : 0); + let availableWidth = this.width; + if (element instanceof SimpleReplElement && element.sourceData) { + availableWidth -= `${element.sourceData.source.name}:${element.sourceData.lineNumber}`.length * this.characterWidth; + } + + return this.getHeightForString(element.value, availableWidth) + (element instanceof Expression ? this.getHeightForString(element.name, availableWidth) : 0); } - private getHeightForString(s: string): number { - if (!s || !s.length || !this.width || this.width <= 0 || !this.characterWidth || this.characterWidth <= 0) { + private getHeightForString(s: string, availableWidth: number): number { + if (!s || !s.length || !availableWidth || availableWidth <= 0 || !this.characterWidth || this.characterWidth <= 0) { return ReplExpressionsRenderer.LINE_HEIGHT_PX; } @@ -126,7 +131,7 @@ export class ReplExpressionsRenderer implements IRenderer { lineLength += isFullWidthCharacter(line.charCodeAt(i)) ? 2 : 1; } - return lineCount + Math.floor(lineLength * this.characterWidth / this.width); + return lineCount + Math.floor(lineLength * this.characterWidth / availableWidth); }, lines.length); return ReplExpressionsRenderer.LINE_HEIGHT_PX * numLines; From f3d832c1c0fadec8985ac7f6eb8c2a05ceec5741 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 10:50:45 +0200 Subject: [PATCH 626/710] use `onFileSystem:<scheme>`-activation event, #47475 --- .../services/files/electron-browser/remoteFileService.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 4cb7cde1d24..835ec80fb14 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -240,7 +240,10 @@ export class RemoteFileService extends FileService { // --- stat private _withProvider(resource: URI): TPromise<IFileSystemProvider> { - return this._extensionService.activateByEvent('onFileSystemAccess:' + resource.scheme).then(() => { + return TPromise.join([ + this._extensionService.activateByEvent('onFileSystem:' + resource.scheme), + this._extensionService.activateByEvent('onFileSystemAccess:' + resource.scheme) // todo@remote -> remove + ]).then(() => { const provider = this._provider.get(resource.scheme); if (!provider) { const err = new Error(); From 494a8c315d14ad18e18c7ef76c9633f1ec2f7be2 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Mon, 23 Apr 2018 10:53:19 +0200 Subject: [PATCH 627/710] Fixes #48353: Change order of decorations and indent guides --- src/vs/editor/browser/view/viewImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 22de5aae513..ce4b080de4a 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -177,8 +177,8 @@ export class View extends ViewEventHandler { this.viewParts.push(contentViewOverlays); contentViewOverlays.addDynamicOverlay(new CurrentLineHighlightOverlay(this._context)); contentViewOverlays.addDynamicOverlay(new SelectionsOverlay(this._context)); - contentViewOverlays.addDynamicOverlay(new DecorationsOverlay(this._context)); contentViewOverlays.addDynamicOverlay(new IndentGuidesOverlay(this._context)); + contentViewOverlays.addDynamicOverlay(new DecorationsOverlay(this._context)); let marginViewOverlays = new MarginViewOverlays(this._context); this.viewParts.push(marginViewOverlays); From 09f3922283dfad507e1f13eb92803e5e17d5189c Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 11:03:15 +0200 Subject: [PATCH 628/710] :lipstick: & jsdoc #47475 --- src/vs/vscode.proposed.d.ts | 39 +++++++++++++++++-- .../workbench/api/node/extHostFileSystem.ts | 4 +- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b2c22774a38..e8d2a83f063 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -118,16 +118,45 @@ declare module 'vscode' { Deleted = 3, } - export interface FileChange2 { + /** + * The event filesystem providers must use to signal a file change. + */ + export interface FileChangeEvent { type: FileChangeType2; + + /** + * The uri of the file that has changed. + */ uri: Uri; } + /** + * Metadata about a file. + */ export interface FileStat2 { + /** + * The file is a regular file. + */ isFile: boolean; + + /** + * The file is a directory. + */ isDirectory: boolean; + + /** + * The file is symbolic link to another file. + */ isSymbolicLink: boolean; + + /** + * The modification timestamp in milliseconds. + */ mtime: number; + + /** + * The size in bytes. + */ size: number; } @@ -159,7 +188,11 @@ declare module 'vscode' { } /** - * + * loose notes: + * -activation event `onFileSystem:foo`, + * -paths are hierarchical and the identifier of a file + * -use posix-path-math + * -etc... */ export interface FileSystemProvider2 { @@ -170,7 +203,7 @@ declare module 'vscode' { * event should fire for resources that are being [watched](#FileSystemProvider2.watch) * by clients of this provider. */ - readonly onDidChangeFile: Event<FileChange2[]>; + readonly onDidChangeFile: Event<FileChangeEvent[]>; /** * Subscribe to events in the file or folder denoted by `uri`. diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 0a1264901fa..603fe1e1ee6 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -61,7 +61,7 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { _version: 9 = 9; - onDidChangeFile: vscode.Event<vscode.FileChange2[]>; + onDidChangeFile: vscode.Event<vscode.FileChangeEvent[]>; constructor(private readonly _delegate: vscode.DeprecatedFileSystemProvider) { if (!this._delegate.onDidChange) { @@ -110,7 +110,7 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { return { mtime, size, isFile, isDirectory, isSymbolicLink }; } - private static _modernizeFileChange(e: vscode.DeprecatedFileChange): vscode.FileChange2 { + private static _modernizeFileChange(e: vscode.DeprecatedFileChange): vscode.FileChangeEvent { let { resource, type } = e; let newType: vscode.FileChangeType2; switch (type) { From a5d3e6909f7e8cf2866067d7008b727f17ebc29c Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Mon, 23 Apr 2018 11:08:13 +0200 Subject: [PATCH 629/710] debug: use platform specific line delimiter fixes #46919 --- .../parts/debug/electron-browser/electronDebugActions.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts b/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts index e38f831bf0e..bdc325867d5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts +++ b/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts @@ -11,6 +11,7 @@ import { removeAnsiEscapeCodes } from 'vs/base/common/strings'; import { Variable } from 'vs/workbench/parts/debug/common/debugModel'; import { IDebugService, IStackFrame, IReplElement } from 'vs/workbench/parts/debug/common/debug'; import { clipboard } from 'electron'; +import { isWindows } from 'vs/base/common/platform'; export class CopyValueAction extends Action { static readonly ID = 'workbench.debug.viewlet.action.copyValue'; @@ -60,6 +61,7 @@ export class CopyAction extends Action { } } +const lineDelimiter = isWindows ? '\r\n' : '\n'; export class CopyAllAction extends Action { static readonly ID = 'workbench.debug.action.copyAll'; static LABEL = nls.localize('copyAll', "Copy All"); @@ -74,7 +76,7 @@ export class CopyAllAction extends Action { // skip first navigator element - the root node while (navigator.next()) { if (text) { - text += `\n`; + text += lineDelimiter; } text += (<IReplElement>navigator.current()).toString(); } @@ -89,7 +91,7 @@ export class CopyStackTraceAction extends Action { static LABEL = nls.localize('copyStackTrace', "Copy Call Stack"); public run(frame: IStackFrame): TPromise<any> { - clipboard.writeText(frame.thread.getCallStack().map(sf => sf.toString()).join('\n')); + clipboard.writeText(frame.thread.getCallStack().map(sf => sf.toString()).join(lineDelimiter)); return TPromise.as(null); } } From 7479f88502dcbabbe163384f7ec23726b9f0885a Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Mon, 23 Apr 2018 11:15:12 +0200 Subject: [PATCH 630/710] Fixes Microsoft/monaco-editor#839 --- src/vs/editor/editor.api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/editor.api.ts b/src/vs/editor/editor.api.ts index dbee1649496..96ba99b2d8b 100644 --- a/src/vs/editor/editor.api.ts +++ b/src/vs/editor/editor.api.ts @@ -36,6 +36,7 @@ export const Range = api.Range; export const Selection = api.Selection; export const SelectionDirection = api.SelectionDirection; export const Severity = api.Severity; +export const MarkerSeverity = api.MarkerSeverity; export const Promise = api.Promise; export const Uri = api.Uri; export const Token = api.Token; From a2e0399b2683dc2d110daed02e11a0a33fcb348b Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Mon, 23 Apr 2018 12:03:44 +0200 Subject: [PATCH 631/710] node-debug@1.23.2 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index e33fb0e30c6..67f4bf70372 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -1,7 +1,7 @@ [ { "name": "ms-vscode.node-debug", - "version": "1.23.1", + "version": "1.23.2", "repo": "https://github.com/Microsoft/vscode-node-debug" }, { From d2c4286669a4237ef21dadc747c302d23cd60480 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Mon, 23 Apr 2018 12:21:55 +0200 Subject: [PATCH 632/710] Ask user to install core language packe extension --- .../localizations/common/localizations.ts | 7 ++- .../localizations/common/localizationsIpc.ts | 8 +-- .../localizations/node/localizations.ts | 9 ++- .../localizations.contribution.ts | 56 ++++++++++++++++--- .../localizationsActions.ts | 0 src/vs/workbench/workbench.main.ts | 2 +- 6 files changed, 66 insertions(+), 16 deletions(-) rename src/vs/workbench/parts/localizations/{browser => electron-browser}/localizations.contribution.ts (74%) rename src/vs/workbench/parts/localizations/{browser => electron-browser}/localizationsActions.ts (100%) diff --git a/src/vs/platform/localizations/common/localizations.ts b/src/vs/platform/localizations/common/localizations.ts index 10ecbea2021..5f091c4f6f3 100644 --- a/src/vs/platform/localizations/common/localizations.ts +++ b/src/vs/platform/localizations/common/localizations.ts @@ -20,12 +20,17 @@ export interface ITranslation { path: string; } +export enum LanguageType { + Core = 1, + Contributed +} + export const ILocalizationsService = createDecorator<ILocalizationsService>('localizationsService'); export interface ILocalizationsService { _serviceBrand: any; readonly onDidLanguagesChange: Event<void>; - getLanguageIds(): TPromise<string[]>; + getLanguageIds(type?: LanguageType): TPromise<string[]>; } export function isValidLocalization(localization: ILocalization): boolean { diff --git a/src/vs/platform/localizations/common/localizationsIpc.ts b/src/vs/platform/localizations/common/localizationsIpc.ts index ae5305352f7..51b6fb34147 100644 --- a/src/vs/platform/localizations/common/localizationsIpc.ts +++ b/src/vs/platform/localizations/common/localizationsIpc.ts @@ -8,7 +8,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc'; import { Event, buffer } from 'vs/base/common/event'; -import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; +import { ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations'; export interface ILocalizationsChannel extends IChannel { call(command: 'event:onDidLanguagesChange'): TPromise<void>; @@ -27,7 +27,7 @@ export class LocalizationsChannel implements ILocalizationsChannel { call(command: string, arg?: any): TPromise<any> { switch (command) { case 'event:onDidLanguagesChange': return eventToCall(this.onDidLanguagesChange); - case 'getLanguageIds': return this.service.getLanguageIds(); + case 'getLanguageIds': return this.service.getLanguageIds(arg); } return undefined; } @@ -42,7 +42,7 @@ export class LocalizationsChannelClient implements ILocalizationsService { private _onDidLanguagesChange = eventFromCall<void>(this.channel, 'event:onDidLanguagesChange'); get onDidLanguagesChange(): Event<void> { return this._onDidLanguagesChange; } - getLanguageIds(): TPromise<string[]> { - return this.channel.call('getLanguageIds'); + getLanguageIds(type?: LanguageType): TPromise<string[]> { + return this.channel.call('getLanguageIds', type); } } \ No newline at end of file diff --git a/src/vs/platform/localizations/node/localizations.ts b/src/vs/platform/localizations/node/localizations.ts index 608533b89f9..0b9207c60fd 100644 --- a/src/vs/platform/localizations/node/localizations.ts +++ b/src/vs/platform/localizations/node/localizations.ts @@ -13,7 +13,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Limiter } from 'vs/base/common/async'; import { areSameExtensions, getGalleryExtensionIdFromLocal, getIdFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ILogService } from 'vs/platform/log/common/log'; -import { isValidLocalization, ILocalizationsService } from 'vs/platform/localizations/common/localizations'; +import { isValidLocalization, ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations'; import product from 'vs/platform/node/product'; import { distinct, equals } from 'vs/base/common/arrays'; import { Event, Emitter } from 'vs/base/common/event'; @@ -55,10 +55,13 @@ export class LocalizationsService extends Disposable implements ILocalizationsSe this.extensionManagementService.getInstalled().then(installed => this.cache.update(installed)); } - getLanguageIds(): TPromise<string[]> { + getLanguageIds(type: LanguageType): TPromise<string[]> { + if (type === LanguageType.Core) { + return TPromise.as([...systemLanguages]); + } return this.cache.getLanguagePacks() .then(languagePacks => { - const languages = [...systemLanguages, ...Object.keys(languagePacks)]; + const languages = type === LanguageType.Contributed ? Object.keys(languagePacks) : [...systemLanguages, ...Object.keys(languagePacks)]; return TPromise.as(distinct(languages)); }); } diff --git a/src/vs/workbench/parts/localizations/browser/localizations.contribution.ts b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts similarity index 74% rename from src/vs/workbench/parts/localizations/browser/localizations.contribution.ts rename to src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts index 1c89acd7c6f..a745f3b7200 100644 --- a/src/vs/workbench/parts/localizations/browser/localizations.contribution.ts +++ b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts @@ -10,12 +10,12 @@ import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/plat import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ConfigureLocaleAction } from 'vs/workbench/parts/localizations/browser/localizationsActions'; +import { ConfigureLocaleAction } from 'vs/workbench/parts/localizations/electron-browser/localizationsActions'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; +import { ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { language } from 'vs/base/common/platform'; -import { IExtensionManagementService, DidInstallExtensionEvent } from 'vs/platform/extensionManagement/common/extensionManagement'; +import * as platform from 'vs/base/common/platform'; +import { IExtensionManagementService, DidInstallExtensionEvent, LocalExtensionType, IExtensionGalleryService, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { INotificationService } from 'vs/platform/notification/common/notification'; import Severity from 'vs/base/common/severity'; import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing'; @@ -24,6 +24,8 @@ import URI from 'vs/base/common/uri'; import { join } from 'vs/base/common/paths'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IStorageService, } from 'vs/platform/storage/common/storage'; +import { TPromise } from 'vs/base/common/winjs.base'; +import product from 'vs/platform/node/product'; // Register action to configure locale and related settings const registry = Registry.as<IWorkbenchActionRegistry>(Extensions.WorkbenchActions); @@ -37,10 +39,12 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo @IEnvironmentService private environmentService: IEnvironmentService, @IWindowsService private windowsService: IWindowsService, @IStorageService private storageService: IStorageService, - @IExtensionManagementService private extensionManagementService: IExtensionManagementService + @IExtensionManagementService private extensionManagementService: IExtensionManagementService, + @IExtensionGalleryService private galleryService: IExtensionGalleryService, ) { super(); this.updateLocaleDefintionSchema(); + this.checkAndInstall(); this._register(this.localizationService.onDidLanguagesChange(() => this.updateLocaleDefintionSchema())); this._register(this.extensionManagementService.onDidInstallExtension(e => this.onDidInstallExtension(e))); } @@ -63,7 +67,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo const donotAskUpdateKey = 'langugage.update.donotask'; if (!this.storageService.getBoolean(donotAskUpdateKey) && e.local && e.local.manifest.contributes && e.local.manifest.contributes.localizations && e.local.manifest.contributes.localizations.length) { const locale = e.local.manifest.contributes.localizations[0].languageId; - if (language !== locale) { + if (platform.language !== locale) { this.notificationService.prompt( Severity.Info, localize('updateLocale', "Would you like to change VS Code's UI language to {0} and restart?", e.local.manifest.contributes.localizations[0].languageName || e.local.manifest.contributes.localizations[0].languageId), @@ -86,6 +90,44 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo } } } + + private checkAndInstall(): void { + const language = platform.language; + if (language !== 'en' && language !== 'en_us') { + this.isLanguageInstalled(language) + .then(installed => { + if (!installed) { + this.getLanguagePackExtension(language) + .then(extension => { + if (extension) { + this.notificationService.prompt(Severity.Warning, localize('install language pack', "Please install '{0}' extension to continue to show VS Code's UI in '{1}' language. In the future, VS Code will only support language packs from the Marketplace.", extension.displayName || extension.displayName, language), + [ + { label: localize('install', "Install"), run: () => this.extensionManagementService.installFromGallery(extension) }, + { label: localize('more information', "More Information..."), run: () => window.open('https://go.microsoft.com/fwlink/?linkid=830387') } + ]); + } + }); + } + }); + } + } + + private getLanguagePackExtension(language: string): TPromise<IGalleryExtension> { + return this.localizationService.getLanguageIds(LanguageType.Core) + .then(coreLanguages => { + const extensionId = coreLanguages.some(c => c.toLowerCase() === language) ? product.quality !== 'insider' ? `MS-CEINTL.vscode-insiders-language-pack-${language}` : `MS-CEINTL.vscode-language-pack-${language}` : null; + if (extensionId) { + return this.galleryService.query({ names: [extensionId], pageSize: 1 }) + .then(result => result.total === 1 ? result.firstPage[0] : null); + } + return null; + }); + } + + private isLanguageInstalled(language: string): TPromise<boolean> { + return this.extensionManagementService.getInstalled(LocalExtensionType.User) + .then(installed => installed.some(i => i.manifest && i.manifest.contributes && i.manifest.contributes.localizations && i.manifest.contributes.localizations.length && i.manifest.contributes.localizations.some(l => l.languageId.toLowerCase() === language))); + } } function registerLocaleDefinitionSchema(languages: string[]): void { @@ -111,7 +153,7 @@ function registerLocaleDefinitionSchema(languages: string[]): void { }); } -registerLocaleDefinitionSchema([language]); +registerLocaleDefinitionSchema([platform.language]); const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(LocalizationWorkbenchContribution, LifecyclePhase.Eventually); diff --git a/src/vs/workbench/parts/localizations/browser/localizationsActions.ts b/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.ts similarity index 100% rename from src/vs/workbench/parts/localizations/browser/localizationsActions.ts rename to src/vs/workbench/parts/localizations/electron-browser/localizationsActions.ts diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index f9cf799d7fe..e5cbc7ad2bf 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -23,7 +23,7 @@ import 'vs/workbench/api/browser/viewsContainersExtensionPoint'; import 'vs/workbench/api/browser/viewsExtensionPoint'; // Localizations -import 'vs/workbench/parts/localizations/browser/localizations.contribution'; +import 'vs/workbench/parts/localizations/electron-browser/localizations.contribution'; // Workbench import 'vs/workbench/browser/actions/toggleActivityBarVisibility'; From 2bf25467ad0baf002ca1aa98db0ddc72cc28f23e Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 12:03:04 +0200 Subject: [PATCH 633/710] a bit more jsdoc, #47475 --- src/vs/vscode.proposed.d.ts | 46 +++++++++++++++++++---- src/vs/workbench/api/node/extHostTypes.ts | 24 ++++++------ 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index e8d2a83f063..a32ee446924 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -100,16 +100,44 @@ declare module 'vscode' { //#region Joh: file system provider (new) /** + * A type that filesystem providers should use to signal errors. * + * This class has factory methods for common error-cases, like `EntryNotFound` when + * a file or folder doesn't exist. Use them like so `throw vscode.FileSystemError.EntryNotFound(uri);` */ export class FileSystemError extends Error { - static EntryExists(message?: string): FileSystemError; - static EntryNotFound(message?: string): FileSystemError; - static EntryNotADirectory(message?: string): FileSystemError; - static EntryIsADirectory(message?: string): FileSystemError; + /** + * Create an error to signal that a file or folder wasn't found. + * @param messageOrUri Message or uri. + */ + static EntryNotFound(messageOrUri?: string | Uri): FileSystemError; - constructor(message?: string); + /** + * Create an error to signal that a file or folder already exists, e.g. when + * creating but not overwriting a file. + * @param messageOrUri Message or uri. + */ + static EntryExists(messageOrUri?: string | Uri): FileSystemError; + + /** + * Create an error to signal that a file is not a folder. + * @param messageOrUri Message or uri. + */ + static EntryNotADirectory(messageOrUri?: string | Uri): FileSystemError; + + /** + * Create an error to signal that a file is a folder. + * @param messageOrUri Message or uri. + */ + static EntryIsADirectory(messageOrUri?: string | Uri): FileSystemError; + + /** + * Creates a new filesystem error. + * + * @param messageOrUri Message or uri. + */ + constructor(messageOrUri?: string | Uri); } export enum FileChangeType2 { @@ -122,6 +150,10 @@ declare module 'vscode' { * The event filesystem providers must use to signal a file change. */ export interface FileChangeEvent { + + /** + * + */ type: FileChangeType2; /** @@ -131,7 +163,7 @@ declare module 'vscode' { } /** - * Metadata about a file. + * The `FileStat`-type represents metadata about a file. */ export interface FileStat2 { /** @@ -161,7 +193,7 @@ declare module 'vscode' { } /** - * + * Commonly used options when reading, writing, or stat'ing files or folders. */ export interface FileOptions { diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index f75c83dbe18..491bbf87129 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1834,26 +1834,26 @@ export enum FileType { export class FileSystemError extends Error { - static EntryExists(message?: string): FileSystemError { - return new FileSystemError(message, 'EntryExists', FileSystemError.EntryExists); + static EntryExists(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryExists', FileSystemError.EntryExists); } - static EntryNotFound(message?: string): FileSystemError { - return new FileSystemError(message, 'EntryNotFound', FileSystemError.EntryNotFound); + static EntryNotFound(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryNotFound', FileSystemError.EntryNotFound); } - static EntryNotADirectory(message?: string): FileSystemError { - return new FileSystemError(message, 'EntryNotADirectory', FileSystemError.EntryNotADirectory); + static EntryNotADirectory(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryNotADirectory', FileSystemError.EntryNotADirectory); } - static EntryIsADirectory(message?: string): FileSystemError { - return new FileSystemError(message, 'EntryIsADirectory', FileSystemError.EntryIsADirectory); + static EntryIsADirectory(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryIsADirectory', FileSystemError.EntryIsADirectory); } - constructor(message?: string, code?: string, hide?: Function) { - super(message); + constructor(uriOrMessage?: string | URI, code?: string, terminator?: Function) { + super(URI.isUri(uriOrMessage) ? uriOrMessage.toString(true) : uriOrMessage); this.name = code ? `${code} (FileSystemError)` : `FileSystemError`; - if (typeof Error.captureStackTrace === 'function' && typeof hide === 'function') { + if (typeof Error.captureStackTrace === 'function' && typeof terminator === 'function') { // nice stack traces - Error.captureStackTrace(this, hide); + Error.captureStackTrace(this, terminator); } } } From 73f64b93127e0d297c98db2901d879ce73325c7f Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 12:56:03 +0200 Subject: [PATCH 634/710] first cut of _proposed_ api for hierarchy of document symbols, #34968 --- src/vs/vscode.proposed.d.ts | 18 +++++++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 6 ++++ .../api/node/extHostLanguageFeatures.ts | 5 ++- src/vs/workbench/api/node/extHostTypes.ts | 32 +++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index a32ee446924..d385d7cb075 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -738,4 +738,22 @@ declare module 'vscode' { } //#endregion + + //#region Joh: hierarchical document symbols, https://github.com/Microsoft/vscode/issues/34968 + + export class HierarchicalSymbolInformation { + name: string; + kind: SymbolKind; + location: Location; + range: Range; + children: HierarchicalSymbolInformation[]; + + constructor(name: string, kind: SymbolKind, location: Location, range: Range); + } + + export interface DocumentSymbolProvider { + provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult<HierarchicalSymbolInformation | SymbolInformation[]>; + } + + //#endregion } diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index d477382fdf9..c3205e53724 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -666,6 +666,12 @@ export function createApiFactory( SourceBreakpoint: extHostTypes.SourceBreakpoint, StatusBarAlignment: extHostTypes.StatusBarAlignment, SymbolInformation: extHostTypes.SymbolInformation, + HierarchicalSymbolInformation: class extends extHostTypes.HierarchicalSymbolInformation { + constructor(name, kind, keyof, range) { + checkProposedApiEnabled(extension); + super(name, kind, keyof, range); + } + }, SymbolKind: extHostTypes.SymbolKind, SourceControlInputBoxValidationType: extHostTypes.SourceControlInputBoxValidationType, TextDocumentSaveReason: extHostTypes.TextDocumentSaveReason, diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 2d14359a8b1..ef8b3280235 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { mixin } from 'vs/base/common/objects'; import * as vscode from 'vscode'; import * as TypeConverters from 'vs/workbench/api/node/extHostTypeConverters'; -import { Range, Disposable, CompletionList, SnippetString, CodeActionKind } from 'vs/workbench/api/node/extHostTypes'; +import { Range, Disposable, CompletionList, SnippetString, CodeActionKind, HierarchicalSymbolInformation } from 'vs/workbench/api/node/extHostTypes'; import { ISingleEditOperation } from 'vs/editor/common/model'; import * as modes from 'vs/editor/common/modes'; import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; @@ -39,6 +39,9 @@ class OutlineAdapter { provideDocumentSymbols(resource: URI): TPromise<SymbolInformationDto[]> { let doc = this._documents.getDocumentData(resource).document; return asWinJsPromise(token => this._provider.provideDocumentSymbols(doc, token)).then(value => { + if (value instanceof HierarchicalSymbolInformation) { + value = HierarchicalSymbolInformation.toFlatSymbolInformation(value); + } if (Array.isArray(value)) { return value.map(symbol => IdObject.mixin(TypeConverters.fromSymbolInformation(symbol))); } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 491bbf87129..32a94c5d0ba 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -876,6 +876,38 @@ export class SymbolInformation { } } +export class HierarchicalSymbolInformation { + name: string; + location: Location; + kind: SymbolKind; + range: Range; + children: HierarchicalSymbolInformation[]; + + constructor(name: string, kind: SymbolKind, location: Location, range: Range) { + this.name = name; + this.kind = kind; + this.location = location; + this.range = range; + this.children = []; + } + + static toFlatSymbolInformation(info: HierarchicalSymbolInformation): SymbolInformation[] { + let result: SymbolInformation[] = []; + HierarchicalSymbolInformation._toFlatSymbolInformation(info, undefined, result); + return result; + } + + private static _toFlatSymbolInformation(info: HierarchicalSymbolInformation, containerName: string, bucket: SymbolInformation[]): void { + bucket.push(new SymbolInformation(info.name, info.kind, containerName, new Location(info.location.uri, info.range))); + if (Array.isArray(info.children)) { + for (const child of info.children) { + HierarchicalSymbolInformation._toFlatSymbolInformation(child, info.name, bucket); + } + } + } + +} + export class CodeAction { title: string; From efcc4fb2239a980be1a841035cfb87e8806acf77 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Mon, 23 Apr 2018 13:53:37 +0200 Subject: [PATCH 635/710] Do not set width for viewlet icons --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index 860272a4fa5..a340cf290ad 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -130,7 +130,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${cssClass}`; const iconPath = join(extension.extensionFolderPath, descriptor.icon); - createCSSRule(iconClass, `-webkit-mask: url('${iconPath}') no-repeat 50% 50%; -webkit-mask-size: 22px;`); + createCSSRule(iconClass, `-webkit-mask: url('${iconPath}') no-repeat 50% 50%`); // Register as viewlet class CustomViewlet extends PersistentViewsViewlet { From d1870a401828b732fd39a17bfd278f4ac06356c5 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Mon, 23 Apr 2018 14:42:39 +0200 Subject: [PATCH 636/710] fix bad localize usage of localize --- extensions/npm/src/main.ts | 7 ++----- extensions/npm/src/npmView.ts | 15 ++++++++------- extensions/npm/src/tasks.ts | 13 ++++++++----- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 48b87e23bad..d1331783c55 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -6,9 +6,6 @@ import * as httpRequest from 'request-light'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; - -const localize = nls.loadMessageBundle(); import { addJSONProviders } from './features/jsonContributions'; import { NpmScriptsTreeDataProvider } from './npmView'; @@ -27,7 +24,7 @@ function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposab if (vscode.workspace.workspaceFolders) { let provider: vscode.TaskProvider = { provideTasks: () => { - return provideNpmScripts(localize); + return provideNpmScripts(); }, resolveTask(_task: vscode.Task): vscode.Task | undefined { return undefined; @@ -42,7 +39,7 @@ function registerTaskProvider(context: vscode.ExtensionContext): vscode.Disposab async function registerExplorer(context: vscode.ExtensionContext, provider: vscode.TaskProvider) { if (explorerIsEnabled()) { - let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider, localize)); + let treeDataProvider = vscode.window.registerTreeDataProvider('npm', new NpmScriptsTreeDataProvider(context, provider)); context.subscriptions.push(treeDataProvider); if (await hasNpmScripts()) { vscode.commands.executeCommand('setContext', 'hasNpmScripts', true); diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 3bc7e0958e6..58293583ffe 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -12,6 +12,9 @@ import { } from 'vscode'; import { visit, JSONVisitor } from 'jsonc-parser'; import { NpmTaskDefinition, getPackageJsonUriFromTask, getScripts, isWorkspaceFolder, getPackageManager, getTaskName } from './tasks'; +import * as nls from 'vscode-nls'; + +const localize = nls.loadMessageBundle(); class Folder extends TreeItem { packages: PackageJSON[] = []; @@ -90,15 +93,13 @@ class NpmScript extends TreeItem { export class NpmScriptsTreeDataProvider implements TreeDataProvider<TreeItem> { private taskTree: Folder[] | PackageJSON[] | null = null; private taskProvider: TaskProvider; - private localize: any; private extensionContext: ExtensionContext; private _onDidChangeTreeData: EventEmitter<TreeItem | null> = new EventEmitter<TreeItem | null>(); readonly onDidChangeTreeData: Event<TreeItem | null> = this._onDidChangeTreeData.event; - constructor(context: ExtensionContext, taskProvider: TaskProvider, localize: any) { + constructor(context: ExtensionContext, taskProvider: TaskProvider) { const subscriptions = context.subscriptions; this.taskProvider = taskProvider; - this.localize = localize; this.extensionContext = context; subscriptions.push(commands.registerCommand('npm.runScript', this.runScript, this)); subscriptions.push(commands.registerCommand('npm.debugScript', this.debugScript, this)); @@ -119,7 +120,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider<TreeItem> { private async runScript(script: NpmScript) { let task = script.task; let uri = getPackageJsonUriFromTask(task); - let scripts = await getScripts(uri!, this.localize); + let scripts = await getScripts(uri!); if (!this.scriptIsValid(scripts, task)) { this.scriptNotValid(task); @@ -149,7 +150,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider<TreeItem> { private async debugScript(script: NpmScript) { let task = script.task; let uri = getPackageJsonUriFromTask(task); - let scripts = await getScripts(uri!, this.localize); + let scripts = await getScripts(uri!); if (!this.scriptIsValid(scripts, task)) { this.scriptNotValid(task); @@ -158,7 +159,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider<TreeItem> { let debugArg = await this.extractDebugArg(scripts, task); if (!debugArg) { - let message = this.localize('npm.noDebugOptions', 'Could not launch "{0}" for debugging, the script needs to include the node debug options: "--nolazy --inspect-brk=port", [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).', task.name); + let message = localize('npm.noDebugOptions', 'Could not launch "{0}" for debugging, the script needs to include the node debug options: "--nolazy --inspect-brk=port", [learn more](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_launch-configuration-support-for-npm-and-other-tools).', task.name); window.showErrorMessage(message); return; } @@ -182,7 +183,7 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider<TreeItem> { } private scriptNotValid(task: Task) { - let message = this.localize('npm.scriptInvalid', 'Could not find the script "{0}". Try to refresh the view.', task.name); + let message = localize('npm.scriptInvalid', 'Could not find the script "{0}". Try to refresh the view.', task.name); window.showErrorMessage(message); } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index a0403824e49..bde3743692d 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -8,6 +8,9 @@ import { TaskDefinition, Task, TaskGroup, WorkspaceFolder, RelativePattern, Shel import * as path from 'path'; import * as fs from 'fs'; import * as minimatch from 'minimatch'; +import * as nls from 'vscode-nls'; + +const localize = nls.loadMessageBundle(); export interface NpmTaskDefinition extends TaskDefinition { script: string; @@ -84,7 +87,7 @@ export async function hasNpmScripts(): Promise<boolean> { } } -export async function provideNpmScripts(localize: any): Promise<Task[]> { +export async function provideNpmScripts(): Promise<Task[]> { let emptyTasks: Task[] = []; let allTasks: Task[] = []; @@ -100,7 +103,7 @@ export async function provideNpmScripts(localize: any): Promise<Task[]> { let paths = await workspace.findFiles(relativePattern, '**/node_modules/**'); for (let j = 0; j < paths.length; j++) { if (!isExcluded(folder, paths[j])) { - let tasks = await provideNpmScriptsForFolder(localize, paths[j]); + let tasks = await provideNpmScriptsForFolder(paths[j]); allTasks.push(...tasks); } } @@ -137,14 +140,14 @@ function isExcluded(folder: WorkspaceFolder, packageJsonUri: Uri) { return false; } -async function provideNpmScriptsForFolder(localize: any, packageJsonUri: Uri): Promise<Task[]> { +async function provideNpmScriptsForFolder(packageJsonUri: Uri): Promise<Task[]> { let emptyTasks: Task[] = []; let folder = workspace.getWorkspaceFolder(packageJsonUri); if (!folder) { return emptyTasks; } - let scripts = await getScripts(packageJsonUri, localize); + let scripts = await getScripts(packageJsonUri); if (!scripts) { return emptyTasks; } @@ -232,7 +235,7 @@ async function readFile(file: string): Promise<string> { }); } -export async function getScripts(packageJsonUri: Uri, localize: any): Promise<any> { +export async function getScripts(packageJsonUri: Uri): Promise<any> { if (packageJsonUri.scheme !== 'file') { return null; From 21700be50716bd230c161dbb6adc7f69a9f5e51f Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 15:10:27 +0200 Subject: [PATCH 637/710] disable terminal smoke test --- .../smoke/src/areas/terminal/terminal.test.ts | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/test/smoke/src/areas/terminal/terminal.test.ts b/test/smoke/src/areas/terminal/terminal.test.ts index 4c8c27e3794..767e1db734d 100644 --- a/test/smoke/src/areas/terminal/terminal.test.ts +++ b/test/smoke/src/areas/terminal/terminal.test.ts @@ -3,24 +3,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Application } from '../../application'; +// import { Application } from '../../application'; export function setup() { describe('Terminal', () => { - it(`opens terminal, runs 'echo' and verifies the output`, async function () { - const app = this.app as Application; + // it(`opens terminal, runs 'echo' and verifies the output`, async function () { + // const app = this.app as Application; - const expected = new Date().getTime().toString(); - await app.workbench.terminal.showTerminal(); - await app.workbench.terminal.runCommand(`echo ${expected}`); - await app.workbench.terminal.waitForTerminalText(terminalText => { - for (let index = terminalText.length - 2; index >= 0; index--) { - if (!!terminalText[index] && terminalText[index].trim() === expected) { - return true; - } - } - return false; - }); - }); + // const expected = new Date().getTime().toString(); + // await app.workbench.terminal.showTerminal(); + // await app.workbench.terminal.runCommand(`echo ${expected}`); + // await app.workbench.terminal.waitForTerminalText(terminalText => { + // for (let index = terminalText.length - 2; index >= 0; index--) { + // if (!!terminalText[index] && terminalText[index].trim() === expected) { + // return true; + // } + // } + // return false; + // }); + // }); }); -} \ No newline at end of file +} From 9e500bbac1588909fcc82be71d183b7579fd039c Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Mon, 23 Apr 2018 15:33:23 +0200 Subject: [PATCH 638/710] Cache debug viewlet actions fixes #46867 --- .../parts/debug/browser/debugActionItems.ts | 40 ++++++++++--------- .../parts/debug/browser/debugViewlet.ts | 21 +++++++--- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index 14ab35e5986..d03d5b361e9 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as lifecycle from 'vs/base/common/lifecycle'; import * as errors from 'vs/base/common/errors'; import { IAction, IActionRunner } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -21,6 +20,7 @@ import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { selectBorder } from 'vs/platform/theme/common/colorRegistry'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; const $ = dom.$; @@ -33,7 +33,8 @@ export class StartDebugActionItem implements IActionItem { private start: HTMLElement; private selectBox: SelectBox; private options: { label: string, handler: (() => boolean) }[]; - private toDispose: lifecycle.IDisposable[]; + private toDispose: IDisposable[]; + private toDisposeOnRender: IDisposable[]; private selected: number; constructor( @@ -47,6 +48,7 @@ export class StartDebugActionItem implements IActionItem { @IContextViewService contextViewService: IContextViewService, ) { this.toDispose = []; + this.toDisposeOnRender = []; this.selectBox = new SelectBox([], -1, contextViewService); this.toDispose.push(attachSelectBoxStyler(this.selectBox, themeService, { selectBackground: SIDE_BAR_BACKGROUND @@ -61,44 +63,37 @@ export class StartDebugActionItem implements IActionItem { this.updateOptions(); } })); - this.toDispose.push(this.selectBox.onDidSelect(e => { - if (this.options[e.index].handler()) { - this.selected = e.index; - } else { - // Some select options should not remain selected https://github.com/Microsoft/vscode/issues/31526 - this.selectBox.select(this.selected); - } - })); this.toDispose.push(this.debugService.getConfigurationManager().onDidSelectConfiguration(() => { this.updateOptions(); })); } public render(container: HTMLElement): void { + this.toDisposeOnRender = dispose(this.toDisposeOnRender); this.container = container; dom.addClass(container, 'start-debug-action-item'); this.start = dom.append(container, $('.icon')); this.start.title = this.action.label; this.start.tabIndex = 0; - this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.CLICK, () => { + this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.CLICK, () => { this.start.blur(); this.actionRunner.run(this.action, this.context).done(null, errors.onUnexpectedError); })); - this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_DOWN, (e: MouseEvent) => { + this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_DOWN, (e: MouseEvent) => { if (this.action.enabled && e.button === 0) { dom.addClass(this.start, 'active'); } })); - this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_UP, () => { + this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_UP, () => { dom.removeClass(this.start, 'active'); })); - this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_OUT, () => { + this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_OUT, () => { dom.removeClass(this.start, 'active'); })); - this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { + this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { const event = new StandardKeyboardEvent(e); if (event.equals(KeyCode.Enter)) { this.actionRunner.run(this.action, this.context).done(null, errors.onUnexpectedError); @@ -108,17 +103,26 @@ export class StartDebugActionItem implements IActionItem { event.stopPropagation(); } })); + this.toDisposeOnRender.push(this.selectBox.onDidSelect(e => { + const shouldBeSelected = this.options[e.index].handler(); + if (shouldBeSelected) { + this.selected = e.index; + } else { + // Some select options should not remain selected https://github.com/Microsoft/vscode/issues/31526 + this.selectBox.select(this.selected); + } + })); const selectBoxContainer = $('.configuration'); this.selectBox.render(dom.append(container, selectBoxContainer)); - this.toDispose.push(dom.addDisposableListener(selectBoxContainer, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { + this.toDisposeOnRender.push(dom.addDisposableListener(selectBoxContainer, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { const event = new StandardKeyboardEvent(e); if (event.equals(KeyCode.LeftArrow)) { this.start.focus(); event.stopPropagation(); } })); - this.toDispose.push(attachStylerCallback(this.themeService, { selectBorder }, colors => { + this.toDisposeOnRender.push(attachStylerCallback(this.themeService, { selectBorder }, colors => { this.container.style.border = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; selectBoxContainer.style.borderLeft = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; })); @@ -147,7 +151,7 @@ export class StartDebugActionItem implements IActionItem { } public dispose(): void { - this.toDispose = lifecycle.dispose(this.toDispose); + this.toDispose = dispose(this.toDispose); } private updateOptions(): void { diff --git a/src/vs/workbench/parts/debug/browser/debugViewlet.ts b/src/vs/workbench/parts/debug/browser/debugViewlet.ts index 35ee37d8769..085f3165be4 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewlet.ts @@ -26,6 +26,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IPartService } from 'vs/workbench/services/part/common/partService'; +import { memoize } from 'vs/base/common/decorators'; export class DebugViewlet extends PersistentViewsViewlet { @@ -69,12 +70,17 @@ export class DebugViewlet extends PersistentViewsViewlet { } } + @memoize + private get actions(): IAction[] { + return [ + this._register(this.instantiationService.createInstance(StartAction, StartAction.ID, StartAction.LABEL)), + this._register(this.instantiationService.createInstance(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL)), + this._register(this.instantiationService.createInstance(ToggleReplAction, ToggleReplAction.ID, ToggleReplAction.LABEL)) + ]; + } + public getActions(): IAction[] { - const actions = []; - actions.push(this.instantiationService.createInstance(StartAction, StartAction.ID, StartAction.LABEL)); - actions.push(this.instantiationService.createInstance(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL)); - actions.push(this._register(this.instantiationService.createInstance(ToggleReplAction, ToggleReplAction.ID, ToggleReplAction.LABEL))); - return actions; + return this.actions; } public getSecondaryActions(): IAction[] { @@ -83,7 +89,10 @@ export class DebugViewlet extends PersistentViewsViewlet { public getActionItem(action: IAction): IActionItem { if (action.id === StartAction.ID) { - this.startDebugActionItem = this.instantiationService.createInstance(StartDebugActionItem, null, action); + if (!this.startDebugActionItem) { + this.startDebugActionItem = this._register(this.instantiationService.createInstance(StartDebugActionItem, null, action)); + } + return this.startDebugActionItem; } From a81269eadf2260775e010761e4325da14ad969e1 Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Fri, 20 Apr 2018 15:19:14 +0200 Subject: [PATCH 639/710] Move text input to QuickInput (#48116) --- .../platform/quickinput/common/quickInput.ts | 3 +- .../electron-browser/mainThreadQuickOpen.ts | 2 +- .../browser/parts/quickinput/quickInput.ts | 265 +++++++++++++----- .../quickinput/quickInputCheckboxList.ts | 4 + 4 files changed, 196 insertions(+), 78 deletions(-) diff --git a/src/vs/platform/quickinput/common/quickInput.ts b/src/vs/platform/quickinput/common/quickInput.ts index c5e05dc6cd4..e8a94713ac6 100644 --- a/src/vs/platform/quickinput/common/quickInput.ts +++ b/src/vs/platform/quickinput/common/quickInput.ts @@ -6,7 +6,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IPickOptions, IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen'; +import { IPickOptions, IPickOpenEntry, IInputOptions } from 'vs/platform/quickOpen/common/quickOpen'; import { CancellationToken } from 'vs/base/common/cancellation'; export const IQuickInputService = createDecorator<IQuickInputService>('quickInputService'); @@ -16,4 +16,5 @@ export interface IQuickInputService { _serviceBrand: any; pick<T extends IPickOpenEntry>(picks: TPromise<T[]>, options?: IPickOptions, token?: CancellationToken): TPromise<T[]>; + input(options?: IInputOptions, token?: CancellationToken): TPromise<string>; } diff --git a/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts b/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts index c84d6a8e5f3..9ececdacf95 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts @@ -114,6 +114,6 @@ export class MainThreadQuickOpen implements MainThreadQuickOpenShape { }; } - return asWinJsPromise(token => this._quickOpenService.input(inputOptions, token)); + return asWinJsPromise(token => this._quickInputService.input(inputOptions, token)); } } diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 8d4d6642e47..4e938ce673a 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -14,7 +14,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; -import { IQuickOpenService, IPickOpenEntry, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; +import { IQuickOpenService, IPickOpenEntry, IPickOptions, IInputOptions } from 'vs/platform/quickOpen/common/quickOpen'; import { TPromise } from 'vs/base/common/winjs.base'; import { CancellationToken } from 'vs/base/common/cancellation'; import { QuickInputCheckboxList } from './quickInputCheckboxList'; @@ -30,28 +30,124 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { chain } from 'vs/base/common/event'; import { Button } from 'vs/base/browser/ui/button/button'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; const $ = dom.$; +type InputParameters = SelectManyParameters | TextInputParameters; + +export interface BaseInputParameters { + readonly type: 'selectMany' | 'textInput'; + readonly placeHolder?: string; + readonly ignoreFocusLost?: boolean; +} + +export interface SelectManyParameters<T extends IPickOpenEntry = IPickOpenEntry> extends BaseInputParameters { + readonly type: 'selectMany'; + readonly picks: TPromise<T[]>; + readonly matchOnDescription?: boolean; + readonly matchOnDetail?: boolean; +} + +export interface TextInputParameters extends BaseInputParameters { + readonly type: 'textInput'; + readonly value?: string; + readonly validateInput?: (input: string) => TPromise<string>; +} + +interface QuickInputUI { + checkAll: HTMLInputElement; + inputBox: QuickInputBox; + count: CountBadge; + checkboxList: QuickInputCheckboxList; +} + +interface InputController<R> { + readonly showUI: { [k in keyof QuickInputUI]?: boolean; } & { ok?: boolean; }; + readonly result: TPromise<R>; + readonly ready: TPromise<void>; + readonly resolve: (ok?: true | Thenable<never>) => void; +} + +class SelectManyController<T extends IPickOpenEntry> implements InputController<T[]> { + public showUI = { checkAll: true, inputBox: true, count: true, ok: true, checkboxList: true }; + public result: TPromise<T[]>; + public ready: TPromise<void>; + public resolve: (ok?: true | Thenable<never>) => void; + public progress: (value: T) => void; + private closed = false; + + constructor(ui: QuickInputUI, parameters: SelectManyParameters<T>) { + this.result = new TPromise<T[]>((resolve, reject, progress) => { + this.resolve = ok => resolve(ok === true ? <T[]>ui.checkboxList.getCheckedElements() : ok); + this.progress = progress; + }); + this.result.then(() => this.closed = true, () => this.closed = true); + + ui.checkboxList.matchOnDescription = parameters.matchOnDescription; + ui.checkboxList.matchOnDetail = parameters.matchOnDetail; + ui.checkboxList.setElements([]); + ui.checkAll.checked = ui.checkboxList.getAllVisibleChecked(); + ui.count.setCount(ui.checkboxList.getCheckedCount()); + + this.ready = parameters.picks.then(elements => { + if (this.closed) { + return; + } + + ui.checkboxList.setElements(elements); + ui.checkboxList.filter(ui.inputBox.value); + ui.checkAll.checked = ui.checkboxList.getAllVisibleChecked(); + ui.count.setCount(ui.checkboxList.getCheckedCount()); + }); + } +} + +class TextInputController implements InputController<string> { + public showUI = { inputBox: true }; + public result: TPromise<string>; + public ready = TPromise.as(null); + public resolve: (ok?: true | Thenable<never>) => void; + private disposables: IDisposable[] = []; + + constructor(ui: QuickInputUI, parameters: TextInputParameters) { + this.result = new TPromise<string>((resolve, reject, progress) => { + this.resolve = ok => resolve(ok === true ? ui.inputBox.value : ok); + }); + this.result.then(() => this.dispose()); + + ui.inputBox.value = parameters.value || ''; + if (parameters.validateInput) { + this.disposables.push(ui.inputBox.onDidChange(value => { + parameters.validateInput(value); + // TODO + })); + } + } + + private dispose() { + this.disposables = dispose(this.disposables); + } +} + export class QuickInputService extends Component implements IQuickInputService { public _serviceBrand: any; private static readonly ID = 'workbench.component.quickinput'; - private static readonly MAX_WIDTH = 600; // Max total width of quick open widget + private static readonly MAX_WIDTH = 600; // Max total width of quick open widget private layoutDimensions: dom.Dimension; private container: HTMLElement; - private checkAll: HTMLInputElement; - private inputBox: QuickInputBox; - private count: CountBadge; + private filterContainer: HTMLElement; + private countContainer: HTMLElement; + private okContainer: HTMLElement; + private ui: QuickInputUI; private ready = false; private progressBar: ProgressBar; - private checkboxList: QuickInputCheckboxList; private ignoreFocusLost = false; - private resolve: (value?: IPickOpenEntry[] | Thenable<IPickOpenEntry[]>) => void; - private progress: (value: IPickOpenEntry) => void; + private controller: InputController<any>; constructor( @IEnvironmentService private environmentService: IEnvironmentService, @@ -76,49 +172,49 @@ export class QuickInputService extends Component implements IQuickInputService { const headerContainer = dom.append(this.container, $('.quick-input-header')); - this.checkAll = <HTMLInputElement>dom.append(headerContainer, $('input.quick-input-check-all')); - this.checkAll.type = 'checkbox'; - this.toUnbind.push(dom.addStandardDisposableListener(this.checkAll, dom.EventType.CHANGE, e => { - const checked = this.checkAll.checked; - this.checkboxList.setAllVisibleChecked(checked); + const checkAll = <HTMLInputElement>dom.append(headerContainer, $('input.quick-input-check-all')); + checkAll.type = 'checkbox'; + this.toUnbind.push(dom.addStandardDisposableListener(checkAll, dom.EventType.CHANGE, e => { + const checked = checkAll.checked; + checkboxList.setAllVisibleChecked(checked); })); - this.toUnbind.push(dom.addDisposableListener(this.checkAll, dom.EventType.CLICK, e => { + this.toUnbind.push(dom.addDisposableListener(checkAll, dom.EventType.CLICK, e => { if (e.x || e.y) { // Avoid 'click' triggered by 'space'... - this.inputBox.setFocus(); + inputBox.setFocus(); } })); - const filterContainer = dom.append(headerContainer, $('.quick-input-filter')); + this.filterContainer = dom.append(headerContainer, $('.quick-input-filter')); - this.inputBox = new QuickInputBox(filterContainer); - this.toUnbind.push(this.inputBox); - this.inputBox.onDidChange(value => { - this.checkboxList.filter(value); + const inputBox = new QuickInputBox(this.filterContainer); + this.toUnbind.push(inputBox); + inputBox.onDidChange(value => { + checkboxList.filter(value); }); - this.toUnbind.push(this.inputBox.onKeyDown(event => { + this.toUnbind.push(inputBox.onKeyDown(event => { switch (event.keyCode) { case KeyCode.DownArrow: - this.checkboxList.focus('First'); - this.checkboxList.domFocus(); + checkboxList.focus('First'); + checkboxList.domFocus(); break; case KeyCode.UpArrow: - this.checkboxList.focus('Last'); - this.checkboxList.domFocus(); + checkboxList.focus('Last'); + checkboxList.domFocus(); break; } })); - const badgeContainer = dom.append(filterContainer, $('.quick-input-count')); - this.count = new CountBadge(badgeContainer, { countFormat: localize('quickInput.countSelected', "{0} Selected") }); - this.toUnbind.push(attachBadgeStyler(this.count, this.themeService)); + this.countContainer = dom.append(this.filterContainer, $('.quick-input-count')); + const count = new CountBadge(this.countContainer, { countFormat: localize('quickInput.countSelected', "{0} Selected") }); + this.toUnbind.push(attachBadgeStyler(count, this.themeService)); - const okContainer = dom.append(headerContainer, $('.quick-input-action')); - const ok = new Button(okContainer); + this.okContainer = dom.append(headerContainer, $('.quick-input-action')); + const ok = new Button(this.okContainer); attachButtonStyler(ok, this.themeService); ok.label = localize('ok', "OK"); this.toUnbind.push(ok.onDidClick(e => { if (this.ready) { - this.close(this.checkboxList.getCheckedElements()); + this.close(true); } })); @@ -126,27 +222,27 @@ export class QuickInputService extends Component implements IQuickInputService { dom.addClass(this.progressBar.getContainer(), 'quick-input-progress'); this.toUnbind.push(attachProgressBarStyler(this.progressBar, this.themeService)); - this.checkboxList = this.instantiationService.createInstance(QuickInputCheckboxList, this.container); - this.toUnbind.push(this.checkboxList); - this.toUnbind.push(this.checkboxList.onAllVisibleCheckedChanged(checked => { - this.checkAll.checked = checked; + const checkboxList = this.instantiationService.createInstance(QuickInputCheckboxList, this.container); + this.toUnbind.push(checkboxList); + this.toUnbind.push(checkboxList.onAllVisibleCheckedChanged(checked => { + checkAll.checked = checked; })); - this.toUnbind.push(this.checkboxList.onCheckedCountChanged(count => { - this.count.setCount(count); + this.toUnbind.push(checkboxList.onCheckedCountChanged(c => { + count.setCount(c); })); - this.toUnbind.push(this.checkboxList.onLeave(() => { + this.toUnbind.push(checkboxList.onLeave(() => { // Defer to avoid the input field reacting to the triggering key. setTimeout(() => { - this.inputBox.setFocus(); - this.checkboxList.clearFocus(); + inputBox.setFocus(); + checkboxList.clearFocus(); }, 0); })); this.toUnbind.push( - chain(this.checkboxList.onFocusChange) + chain(checkboxList.onFocusChange) .map(e => e[0]) .filter(e => !!e) .latch() - .on(e => this.progress && this.progress(e)) + .on(e => this.controller instanceof SelectManyController && this.controller.progress(e)) // TODO ); this.toUnbind.push(dom.addDisposableListener(this.container, 'focusout', (e: FocusEvent) => { @@ -169,7 +265,7 @@ export class QuickInputService extends Component implements IQuickInputService { case KeyCode.Enter: if (this.ready) { dom.EventHelper.stop(e, true); - this.close(this.checkboxList.getCheckedElements()); + this.close(true); } break; case KeyCode.Escape: @@ -193,69 +289,86 @@ export class QuickInputService extends Component implements IQuickInputService { this.toUnbind.push(this.quickOpenService.onShow(() => this.close())); + this.ui = { checkAll, inputBox, count, checkboxList }; this.updateStyles(); } - private close(value?: IPickOpenEntry[] | Thenable<IPickOpenEntry[]>) { - if (this.resolve) { - this.resolve(value); + private close(ok?: true | Thenable<never>) { + if (this.controller) { + this.controller.resolve(ok); } this.container.style.display = 'none'; } - pick<T extends IPickOpenEntry>(picks: TPromise<T[]>, options: IPickOptions = {}, token: CancellationToken = CancellationToken.None): TPromise<T[]> { + pick<T extends IPickOpenEntry>(picks: TPromise<T[]>, options: IPickOptions = {}, token?: CancellationToken): TPromise<T[]> { + return this.show({ + type: 'selectMany', + picks, + placeHolder: options.placeHolder, + matchOnDescription: options.matchOnDescription, + matchOnDetail: options.matchOnDetail, + ignoreFocusLost: options.ignoreFocusLost + }, token); + } + + input(options: IInputOptions = {}, token?: CancellationToken): TPromise<string> { + return this.show({ + type: 'textInput', + value: options.value, + placeHolder: options.placeHolder, + ignoreFocusLost: options.ignoreFocusLost, + validateInput: options.validateInput, + }, token); + } + + show<T extends IPickOpenEntry>(parameters: SelectManyParameters<T>, token?: CancellationToken): TPromise<T[]>; + show(parameters: TextInputParameters, token?: CancellationToken): TPromise<string>; + show<R>(parameters: InputParameters, token: CancellationToken = CancellationToken.None): TPromise<R> { this.create(); this.quickOpenService.close(); - if (this.resolve) { - this.resolve(); + if (this.controller) { + this.controller.resolve(); } - this.inputBox.value = ''; - this.inputBox.setPlaceholder(options.placeHolder || ''); - this.checkboxList.matchOnDescription = options.matchOnDescription; - this.checkboxList.matchOnDetail = options.matchOnDetail; - this.ignoreFocusLost = options.ignoreFocusLost; + this.ignoreFocusLost = parameters.ignoreFocusLost; + + this.ui.inputBox.value = ''; + this.ui.inputBox.setPlaceholder(parameters.placeHolder || ''); this.progressBar.stop(); this.ready = false; - this.checkboxList.setElements([]); - this.checkAll.checked = this.checkboxList.getAllVisibleChecked(); - this.count.setCount(this.checkboxList.getCheckedCount()); + this.controller = parameters.type === 'selectMany' ? new SelectManyController(this.ui, parameters) : new TextInputController(this.ui, parameters); + this.ui.checkAll.style.display = this.controller.showUI.checkAll ? null : 'none'; + this.filterContainer.style.display = this.controller.showUI.inputBox ? null : 'none'; + this.countContainer.style.display = this.controller.showUI.count ? null : 'none'; + this.okContainer.style.display = this.controller.showUI.ok ? null : 'none'; + this.ui.checkboxList.display(this.controller.showUI.checkboxList); this.container.style.display = null; this.updateLayout(); - this.inputBox.setFocus(); + this.ui.inputBox.setFocus(); - const result = new TPromise<T[]>((resolve, reject, progress) => { - this.resolve = resolve; - this.progress = progress; - }); const d = token.onCancellationRequested(() => this.close()); - result.then(() => d.dispose(), () => d.dispose()); + this.controller.result.then(() => d.dispose(), () => d.dispose()); const delay = TPromise.timeout(800); delay.then(() => this.progressBar.infinite(), () => { /* ignore */ }); - const wasResolve = this.resolve; - picks.then(elements => { + const wasController = this.controller; + this.controller.ready.then(() => { delay.cancel(); - if (this.resolve !== wasResolve) { + if (this.controller !== wasController) { return; } this.progressBar.stop(); this.ready = true; - this.checkboxList.setElements(elements); - this.checkboxList.filter(this.inputBox.value); - this.checkAll.checked = this.checkboxList.getAllVisibleChecked(); - this.count.setCount(this.checkboxList.getCheckedCount()); - this.updateLayout(); }).then(null, reason => this.close(TPromise.wrapError(reason))); - return result; + return this.controller.result; } public layout(dimension: dom.Dimension): void { @@ -273,15 +386,15 @@ export class QuickInputService extends Component implements IQuickInputService { style.width = width + 'px'; style.marginLeft = '-' + (width / 2) + 'px'; - this.inputBox.layout(); - this.checkboxList.layout(); + this.ui.inputBox.layout(); + this.ui.checkboxList.layout(); } } protected updateStyles() { const theme = this.themeService.getTheme(); - if (this.inputBox) { - this.inputBox.style(theme); + if (this.ui.inputBox) { + this.ui.inputBox.style(theme); } if (this.container) { const sideBarBackground = theme.getColor(SIDE_BAR_BACKGROUND); diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts b/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts index fa0763bf1af..c4a2553db8c 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts @@ -352,6 +352,10 @@ export class QuickInputCheckboxList { } } + display(display: boolean) { + this.container.style.display = display ? null : 'none'; + } + dispose() { this.elementDisposables = dispose(this.elementDisposables); this.disposables = dispose(this.disposables); From 2b4dfcc34cb9cb2a5621398433505d1b03384023 Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Fri, 20 Apr 2018 16:40:05 +0200 Subject: [PATCH 640/710] Prompt and validation message (#48116) --- .../browser/parts/quickinput/quickInput.css | 7 ++++ .../browser/parts/quickinput/quickInput.ts | 35 +++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.css b/src/vs/workbench/browser/parts/quickinput/quickInput.css index 28ec8b5c3dd..240530d12b2 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.css +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.css @@ -30,6 +30,9 @@ .quick-input-box { flex-grow: 1; +} + +.quick-input-widget[data-type=selectMany] .quick-input-box { margin-left: 5px; } @@ -53,6 +56,10 @@ line-height: initial; } +.quick-input-message { + margin: 0px 11px; +} + .quick-input-progress.monaco-progress-container, .quick-input-progress.monaco-progress-container .progress-bit { height: 2px; diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 4e938ce673a..dfd57a3fe56 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -31,6 +31,7 @@ import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { chain } from 'vs/base/common/event'; import { Button } from 'vs/base/browser/ui/button/button'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { onUnexpectedError } from 'vs/base/common/errors'; const $ = dom.$; @@ -52,6 +53,7 @@ export interface SelectManyParameters<T extends IPickOpenEntry = IPickOpenEntry> export interface TextInputParameters extends BaseInputParameters { readonly type: 'textInput'; readonly value?: string; + readonly prompt?: string; readonly validateInput?: (input: string) => TPromise<string>; } @@ -59,6 +61,7 @@ interface QuickInputUI { checkAll: HTMLInputElement; inputBox: QuickInputBox; count: CountBadge; + message: HTMLElement; checkboxList: QuickInputCheckboxList; } @@ -84,6 +87,8 @@ class SelectManyController<T extends IPickOpenEntry> implements InputController< }); this.result.then(() => this.closed = true, () => this.closed = true); + ui.inputBox.value = ''; + ui.inputBox.setPlaceholder(parameters.placeHolder || ''); ui.checkboxList.matchOnDescription = parameters.matchOnDescription; ui.checkboxList.matchOnDetail = parameters.matchOnDetail; ui.checkboxList.setElements([]); @@ -104,10 +109,11 @@ class SelectManyController<T extends IPickOpenEntry> implements InputController< } class TextInputController implements InputController<string> { - public showUI = { inputBox: true }; + public showUI = { inputBox: true, message: true }; public result: TPromise<string>; public ready = TPromise.as(null); public resolve: (ok?: true | Thenable<never>) => void; + private validationValue: string; private disposables: IDisposable[] = []; constructor(ui: QuickInputUI, parameters: TextInputParameters) { @@ -117,10 +123,22 @@ class TextInputController implements InputController<string> { this.result.then(() => this.dispose()); ui.inputBox.value = parameters.value || ''; + ui.inputBox.setPlaceholder(parameters.placeHolder || ''); + const defaultMessage = parameters.prompt + ? localize('inputModeEntryDescription', "{0} (Press 'Enter' to confirm or 'Escape' to cancel)", parameters.prompt) + : localize('inputModeEntry', "Press 'Enter' to confirm your input or 'Escape' to cancel"); + ui.message.textContent = defaultMessage; + if (parameters.validateInput) { this.disposables.push(ui.inputBox.onDidChange(value => { - parameters.validateInput(value); - // TODO + this.validationValue = value; + parameters.validateInput(value) + .then(validationError => { + if (this.validationValue === value) { + ui.message.textContent = validationError || defaultMessage; + } + }) + .then(null, onUnexpectedError); })); } } @@ -218,6 +236,8 @@ export class QuickInputService extends Component implements IQuickInputService { } })); + const message = dom.append(this.container, $('.quick-input-message')); + this.progressBar = new ProgressBar(this.container); dom.addClass(this.progressBar.getContainer(), 'quick-input-progress'); this.toUnbind.push(attachProgressBarStyler(this.progressBar, this.themeService)); @@ -289,7 +309,7 @@ export class QuickInputService extends Component implements IQuickInputService { this.toUnbind.push(this.quickOpenService.onShow(() => this.close())); - this.ui = { checkAll, inputBox, count, checkboxList }; + this.ui = { checkAll, inputBox, count, message, checkboxList }; this.updateStyles(); } @@ -315,6 +335,7 @@ export class QuickInputService extends Component implements IQuickInputService { return this.show({ type: 'textInput', value: options.value, + prompt: options.prompt, placeHolder: options.placeHolder, ignoreFocusLost: options.ignoreFocusLost, validateInput: options.validateInput, @@ -330,10 +351,9 @@ export class QuickInputService extends Component implements IQuickInputService { this.controller.resolve(); } - this.ignoreFocusLost = parameters.ignoreFocusLost; + this.container.setAttribute('data-type', parameters.type); - this.ui.inputBox.value = ''; - this.ui.inputBox.setPlaceholder(parameters.placeHolder || ''); + this.ignoreFocusLost = parameters.ignoreFocusLost; this.progressBar.stop(); this.ready = false; @@ -343,6 +363,7 @@ export class QuickInputService extends Component implements IQuickInputService { this.filterContainer.style.display = this.controller.showUI.inputBox ? null : 'none'; this.countContainer.style.display = this.controller.showUI.count ? null : 'none'; this.okContainer.style.display = this.controller.showUI.ok ? null : 'none'; + this.ui.message.style.display = this.controller.showUI.message ? null : 'none'; this.ui.checkboxList.display(this.controller.showUI.checkboxList); this.container.style.display = null; From d3cb5b21cb10e07ad4e6355cb98880fef15a2f8a Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Mon, 23 Apr 2018 11:31:49 +0200 Subject: [PATCH 641/710] Validate input on Enter (#48116) --- .../browser/parts/quickinput/quickInput.ts | 65 +++++++++++++++---- .../browser/parts/quickinput/quickInputBox.ts | 4 +- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index dfd57a3fe56..cbe059709d6 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -28,10 +28,10 @@ import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { attachBadgeStyler, attachProgressBarStyler, attachButtonStyler } from 'vs/platform/theme/common/styler'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; -import { chain } from 'vs/base/common/event'; +import { chain, debounceEvent } from 'vs/base/common/event'; import { Button } from 'vs/base/browser/ui/button/button'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { onUnexpectedError } from 'vs/base/common/errors'; +import { onUnexpectedError, canceled } from 'vs/base/common/errors'; const $ = dom.$; @@ -69,7 +69,7 @@ interface InputController<R> { readonly showUI: { [k in keyof QuickInputUI]?: boolean; } & { ok?: boolean; }; readonly result: TPromise<R>; readonly ready: TPromise<void>; - readonly resolve: (ok?: true | Thenable<never>) => void; + readonly resolve: (ok?: true | Thenable<never>) => void | TPromise<void>; } class SelectManyController<T extends IPickOpenEntry> implements InputController<T[]> { @@ -112,13 +112,14 @@ class TextInputController implements InputController<string> { public showUI = { inputBox: true, message: true }; public result: TPromise<string>; public ready = TPromise.as(null); - public resolve: (ok?: true | Thenable<never>) => void; + public resolveResult: (string) => void; private validationValue: string; + private validation: TPromise<string>; private disposables: IDisposable[] = []; - constructor(ui: QuickInputUI, parameters: TextInputParameters) { + constructor(private ui: QuickInputUI, private parameters: TextInputParameters) { this.result = new TPromise<string>((resolve, reject, progress) => { - this.resolve = ok => resolve(ok === true ? ui.inputBox.value : ok); + this.resolveResult = resolve; }); this.result.then(() => this.dispose()); @@ -130,19 +131,51 @@ class TextInputController implements InputController<string> { ui.message.textContent = defaultMessage; if (parameters.validateInput) { - this.disposables.push(ui.inputBox.onDidChange(value => { - this.validationValue = value; - parameters.validateInput(value) + const onDidChange = debounceEvent(ui.inputBox.onDidChange, (last, cur) => cur, 100); + this.disposables.push(onDidChange(() => { + this.updatedValidation() .then(validationError => { - if (this.validationValue === value) { - ui.message.textContent = validationError || defaultMessage; - } + ui.message.textContent = validationError || defaultMessage; }) .then(null, onUnexpectedError); })); } } + resolve(ok?: true | Thenable<never>) { + if (ok === true) { + return this.updatedValidation() + .then(validationError => { + if (validationError) { + throw canceled(); + } + this.resolveResult(this.ui.inputBox.value); + }); + } else { + this.resolveResult(ok); + } + return null; + } + + private updatedValidation() { + if (this.parameters.validateInput) { + const value = this.ui.inputBox.value; + if (value !== this.validationValue) { + this.validationValue = value; + this.validation = this.parameters.validateInput(value) + .then(validationError => { + if (this.validationValue !== value) { + throw canceled(); + } + return validationError; + }); + } + } else if (!this.validation) { + this.validation = TPromise.as(null); + } + return this.validation; + } + private dispose() { this.disposables = dispose(this.disposables); } @@ -315,7 +348,13 @@ export class QuickInputService extends Component implements IQuickInputService { private close(ok?: true | Thenable<never>) { if (this.controller) { - this.controller.resolve(ok); + const resolved = this.controller.resolve(ok); + if (resolved) { + resolved + .then(() => this.container.style.display = 'none') + .then(null, onUnexpectedError); + return; + } } this.container.style.display = 'none'; } diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts index 0acd72de5f9..92e632c5fad 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts @@ -40,13 +40,13 @@ export class QuickInputBox { inputElement.setAttribute('aria-autocomplete', 'list'); } - onKeyDown(handler: (event: StandardKeyboardEvent) => void): IDisposable { + onKeyDown = (handler: (event: StandardKeyboardEvent) => void): IDisposable => { return dom.addDisposableListener(this.inputBox.inputElement, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { handler(new StandardKeyboardEvent(e)); }); } - onDidChange(handler: (event: string) => void): IDisposable { + onDidChange = (handler: (event: string) => void): IDisposable => { return this.inputBox.onDidChange(handler); } From 876825059b0f1f9dc2be871839b54d90c74ef11f Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Mon, 23 Apr 2018 11:44:32 +0200 Subject: [PATCH 642/710] Implement valueSelection (#48116) --- src/vs/workbench/browser/parts/quickinput/quickInput.ts | 4 ++++ src/vs/workbench/browser/parts/quickinput/quickInputBox.ts | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index cbe059709d6..7c99ce4f6fb 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -53,6 +53,7 @@ export interface SelectManyParameters<T extends IPickOpenEntry = IPickOpenEntry> export interface TextInputParameters extends BaseInputParameters { readonly type: 'textInput'; readonly value?: string; + readonly valueSelection?: [number, number]; readonly prompt?: string; readonly validateInput?: (input: string) => TPromise<string>; } @@ -124,6 +125,8 @@ class TextInputController implements InputController<string> { this.result.then(() => this.dispose()); ui.inputBox.value = parameters.value || ''; + const selection = parameters.valueSelection; + ui.inputBox.select(selection && { start: selection[0], end: selection[1] }); ui.inputBox.setPlaceholder(parameters.placeHolder || ''); const defaultMessage = parameters.prompt ? localize('inputModeEntryDescription', "{0} (Press 'Enter' to confirm or 'Escape' to cancel)", parameters.prompt) @@ -374,6 +377,7 @@ export class QuickInputService extends Component implements IQuickInputService { return this.show({ type: 'textInput', value: options.value, + valueSelection: options.valueSelection, prompt: options.prompt, placeHolder: options.placeHolder, ignoreFocusLost: options.ignoreFocusLost, diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts index 92e632c5fad..3779d54c057 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts @@ -7,7 +7,7 @@ import 'vs/css!./quickInput'; import * as dom from 'vs/base/browser/dom'; -import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; +import { InputBox, IRange } from 'vs/base/browser/ui/inputbox/inputBox'; import { localize } from 'vs/nls'; import { inputBackground, inputForeground, inputBorder } from 'vs/platform/theme/common/colorRegistry'; import { ITheme } from 'vs/platform/theme/common/themeService'; @@ -58,6 +58,10 @@ export class QuickInputBox { this.inputBox.value = value; } + select(range: IRange = null): void { + this.inputBox.select(range); + } + setPlaceholder(placeholder: string) { this.inputBox.setPlaceHolder(placeholder); } From a8633b27394af23c23d7740dc02a1f6a8cef93c7 Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Mon, 23 Apr 2018 12:04:07 +0200 Subject: [PATCH 643/710] Implement password (#48116) --- src/vs/workbench/browser/parts/quickinput/quickInput.ts | 6 +++++- src/vs/workbench/browser/parts/quickinput/quickInputBox.ts | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 7c99ce4f6fb..e73e69e9dfe 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -39,7 +39,6 @@ type InputParameters = SelectManyParameters | TextInputParameters; export interface BaseInputParameters { readonly type: 'selectMany' | 'textInput'; - readonly placeHolder?: string; readonly ignoreFocusLost?: boolean; } @@ -48,6 +47,7 @@ export interface SelectManyParameters<T extends IPickOpenEntry = IPickOpenEntry> readonly picks: TPromise<T[]>; readonly matchOnDescription?: boolean; readonly matchOnDetail?: boolean; + readonly placeHolder?: string; } export interface TextInputParameters extends BaseInputParameters { @@ -55,6 +55,8 @@ export interface TextInputParameters extends BaseInputParameters { readonly value?: string; readonly valueSelection?: [number, number]; readonly prompt?: string; + readonly placeHolder?: string; + readonly password?: boolean; readonly validateInput?: (input: string) => TPromise<string>; } @@ -132,6 +134,7 @@ class TextInputController implements InputController<string> { ? localize('inputModeEntryDescription', "{0} (Press 'Enter' to confirm or 'Escape' to cancel)", parameters.prompt) : localize('inputModeEntry', "Press 'Enter' to confirm your input or 'Escape' to cancel"); ui.message.textContent = defaultMessage; + ui.inputBox.setPassword(parameters.password); if (parameters.validateInput) { const onDidChange = debounceEvent(ui.inputBox.onDidChange, (last, cur) => cur, 100); @@ -380,6 +383,7 @@ export class QuickInputService extends Component implements IQuickInputService { valueSelection: options.valueSelection, prompt: options.prompt, placeHolder: options.placeHolder, + password: options.password, ignoreFocusLost: options.ignoreFocusLost, validateInput: options.validateInput, }, token); diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts index 3779d54c057..5cbc246695b 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts @@ -66,6 +66,10 @@ export class QuickInputBox { this.inputBox.setPlaceHolder(placeholder); } + setPassword(isPassword: boolean): void { + this.inputBox.inputElement.type = isPassword ? 'password' : 'text'; + } + setFocus(): void { this.inputBox.focus(); } From adbdec9ee5bbf38d68681c5e9cd429cf25e804e8 Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Mon, 23 Apr 2018 12:46:54 +0200 Subject: [PATCH 644/710] Error decoration (#48116) --- .../browser/parts/quickinput/quickInput.ts | 3 +++ .../browser/parts/quickinput/quickInputBox.ts | 21 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index e73e69e9dfe..b5a6e9b24d2 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -32,6 +32,7 @@ import { chain, debounceEvent } from 'vs/base/common/event'; import { Button } from 'vs/base/browser/ui/button/button'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { onUnexpectedError, canceled } from 'vs/base/common/errors'; +import Severity from 'vs/base/common/severity'; const $ = dom.$; @@ -142,6 +143,7 @@ class TextInputController implements InputController<string> { this.updatedValidation() .then(validationError => { ui.message.textContent = validationError || defaultMessage; + ui.inputBox.showDecoration(validationError ? Severity.Error : Severity.Ignore); }) .then(null, onUnexpectedError); })); @@ -408,6 +410,7 @@ export class QuickInputService extends Component implements IQuickInputService { this.controller = parameters.type === 'selectMany' ? new SelectManyController(this.ui, parameters) : new TextInputController(this.ui, parameters); this.ui.checkAll.style.display = this.controller.showUI.checkAll ? null : 'none'; this.filterContainer.style.display = this.controller.showUI.inputBox ? null : 'none'; + this.ui.inputBox.showDecoration(Severity.Ignore); this.countContainer.style.display = this.controller.showUI.count ? null : 'none'; this.okContainer.style.display = this.controller.showUI.ok ? null : 'none'; this.ui.message.style.display = this.controller.showUI.message ? null : 'none'; diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts index 5cbc246695b..b99245aece5 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputBox.ts @@ -7,12 +7,13 @@ import 'vs/css!./quickInput'; import * as dom from 'vs/base/browser/dom'; -import { InputBox, IRange } from 'vs/base/browser/ui/inputbox/inputBox'; +import { InputBox, IRange, MessageType } from 'vs/base/browser/ui/inputbox/inputBox'; import { localize } from 'vs/nls'; -import { inputBackground, inputForeground, inputBorder } from 'vs/platform/theme/common/colorRegistry'; +import { inputBackground, inputForeground, inputBorder, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationErrorBackground, inputValidationErrorBorder } from 'vs/platform/theme/common/colorRegistry'; import { ITheme } from 'vs/platform/theme/common/themeService'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import Severity from 'vs/base/common/severity'; const $ = dom.$; @@ -70,6 +71,14 @@ export class QuickInputBox { this.inputBox.inputElement.type = isPassword ? 'password' : 'text'; } + showDecoration(decoration: Severity): void { + if (decoration === Severity.Ignore) { + this.inputBox.hideMessage(); + } else { + this.inputBox.showMessage({ type: decoration === Severity.Info ? MessageType.INFO : decoration === Severity.Warning ? MessageType.WARNING : MessageType.ERROR, content: '' }); + } + } + setFocus(): void { this.inputBox.focus(); } @@ -82,7 +91,13 @@ export class QuickInputBox { this.inputBox.style({ inputForeground: theme.getColor(inputForeground), inputBackground: theme.getColor(inputBackground), - inputBorder: theme.getColor(inputBorder) + inputBorder: theme.getColor(inputBorder), + inputValidationInfoBackground: theme.getColor(inputValidationInfoBackground), + inputValidationInfoBorder: theme.getColor(inputValidationInfoBorder), + inputValidationWarningBackground: theme.getColor(inputValidationWarningBackground), + inputValidationWarningBorder: theme.getColor(inputValidationWarningBorder), + inputValidationErrorBackground: theme.getColor(inputValidationErrorBackground), + inputValidationErrorBorder: theme.getColor(inputValidationErrorBorder), }); } From 32ebc3c465b4fbc48e1f752b1b19c6f0853a6749 Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Mon, 23 Apr 2018 12:50:49 +0200 Subject: [PATCH 645/710] Send non-empty default value through validation to replicate old behavior (#48116) --- .../browser/parts/quickinput/quickInput.ts | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index b5a6e9b24d2..bcfae173a10 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -119,6 +119,7 @@ class TextInputController implements InputController<string> { public resolveResult: (string) => void; private validationValue: string; private validation: TPromise<string>; + private defaultMessage: string; private disposables: IDisposable[] = []; constructor(private ui: QuickInputUI, private parameters: TextInputParameters) { @@ -131,25 +132,31 @@ class TextInputController implements InputController<string> { const selection = parameters.valueSelection; ui.inputBox.select(selection && { start: selection[0], end: selection[1] }); ui.inputBox.setPlaceholder(parameters.placeHolder || ''); - const defaultMessage = parameters.prompt + this.defaultMessage = parameters.prompt ? localize('inputModeEntryDescription', "{0} (Press 'Enter' to confirm or 'Escape' to cancel)", parameters.prompt) : localize('inputModeEntry', "Press 'Enter' to confirm your input or 'Escape' to cancel"); - ui.message.textContent = defaultMessage; + ui.message.textContent = this.defaultMessage; ui.inputBox.setPassword(parameters.password); if (parameters.validateInput) { const onDidChange = debounceEvent(ui.inputBox.onDidChange, (last, cur) => cur, 100); - this.disposables.push(onDidChange(() => { - this.updatedValidation() - .then(validationError => { - ui.message.textContent = validationError || defaultMessage; - ui.inputBox.showDecoration(validationError ? Severity.Error : Severity.Ignore); - }) - .then(null, onUnexpectedError); - })); + this.disposables.push(onDidChange(() => this.didChange())); + if (ui.inputBox.value) { + // Replicating old behavior: only fire if value is not empty. + this.didChange(); + } } } + didChange() { + this.updatedValidation() + .then(validationError => { + this.ui.message.textContent = validationError || this.defaultMessage; + this.ui.inputBox.showDecoration(validationError ? Severity.Error : Severity.Ignore); + }) + .then(null, onUnexpectedError); + } + resolve(ok?: true | Thenable<never>) { if (ok === true) { return this.updatedValidation() From f4b63ac06955bd1ea220b851a79bd0ae5315fb0c Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Mon, 23 Apr 2018 15:35:36 +0200 Subject: [PATCH 646/710] Update for tests (#48116) --- .../src/singlefolder-tests/window.test.ts | 17 +++++++++--- .../platform/quickinput/common/quickInput.ts | 3 +++ .../browser/parts/quickinput/quickInput.ts | 27 +++++++++++++++---- .../parts/quickopen/quickopen.contribution.ts | 7 +++++ 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index 97bace17e73..286936c8659 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -369,12 +369,21 @@ suite('window namespace tests', () => { } return null; } - }).then(value => { - assert.equal(value, undefined); }); - const exec = commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); - return Promise.all([result, exec]); + const accept = commands.executeCommand('workbench.action.acceptSelectedQuickOpenItem'); + return Promise.race([ + result.then(() => assert.ok(false)), + accept.then(() => assert.ok(false), err => assert.ok(err)) + .then(() => new Promise(resolve => setTimeout(resolve, 10))) + ]) + .then(() => { + const close = commands.executeCommand('workbench.action.closeQuickOpen'); + return Promise.all([result, close]) + .then(([value]) => { + assert.equal(value, undefined); + }); + }); }); diff --git a/src/vs/platform/quickinput/common/quickInput.ts b/src/vs/platform/quickinput/common/quickInput.ts index e8a94713ac6..cd9097598e1 100644 --- a/src/vs/platform/quickinput/common/quickInput.ts +++ b/src/vs/platform/quickinput/common/quickInput.ts @@ -17,4 +17,7 @@ export interface IQuickInputService { pick<T extends IPickOpenEntry>(picks: TPromise<T[]>, options?: IPickOptions, token?: CancellationToken): TPromise<T[]>; input(options?: IInputOptions, token?: CancellationToken): TPromise<string>; + focus(): void; + accept(): TPromise<void>; + cancel(): TPromise<void>; } diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index bcfae173a10..5e801b93870 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -365,13 +365,16 @@ export class QuickInputService extends Component implements IQuickInputService { if (this.controller) { const resolved = this.controller.resolve(ok); if (resolved) { - resolved - .then(() => this.container.style.display = 'none') - .then(null, onUnexpectedError); - return; + const result = resolved + .then(() => { + this.container.style.display = 'none'; + }); + result.then(null, onUnexpectedError); + return result; } } this.container.style.display = 'none'; + return TPromise.as(undefined); } pick<T extends IPickOpenEntry>(picks: TPromise<T[]>, options: IPickOptions = {}, token?: CancellationToken): TPromise<T[]> { @@ -449,7 +452,21 @@ export class QuickInputService extends Component implements IQuickInputService { return this.controller.result; } - public layout(dimension: dom.Dimension): void { + focus() { + if (this.ui) { + this.ui.inputBox.setFocus(); + } + } + + accept() { + return this.close(true); + } + + cancel() { + return this.close(); + } + + layout(dimension: dom.Dimension): void { this.layoutDimensions = dimension; this.updateLayout(); } diff --git a/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.ts b/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.ts index 63545e09e78..3f4ad79d9b0 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.ts @@ -12,6 +12,7 @@ import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/wor import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { RemoveFromEditorHistoryAction } from 'vs/workbench/browser/parts/quickopen/quickOpenController'; import { QuickOpenSelectNextAction, QuickOpenSelectPreviousAction, inQuickOpenContext, getQuickNavigateHandler, QuickOpenNavigateNextAction, QuickOpenNavigatePreviousAction, defaultQuickOpenContext, QUICKOPEN_ACTION_ID, QUICKOPEN_ACION_LABEL } from 'vs/workbench/browser/parts/quickopen/quickopen'; +import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'workbench.action.closeQuickOpen', @@ -21,6 +22,8 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: accessor => { const quickOpenService = accessor.get(IQuickOpenService); quickOpenService.close(); + const quickInputService = accessor.get(IQuickInputService); + return quickInputService.cancel(); } }); @@ -32,6 +35,8 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: accessor => { const quickOpenService = accessor.get(IQuickOpenService); quickOpenService.accept(); + const quickInputService = accessor.get(IQuickInputService); + return quickInputService.accept(); } }); @@ -43,6 +48,8 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: accessor => { const quickOpenService = accessor.get(IQuickOpenService); quickOpenService.focus(); + const quickInputService = accessor.get(IQuickInputService); + quickInputService.focus(); } }); From d5297fcad4a1898c15c60100efed49001b92b854 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Mon, 23 Apr 2018 15:52:26 +0200 Subject: [PATCH 647/710] Fixes #47490: Maintain compatibility for API commands that can be serialized as markdown links --- .../extensionHost.contribution.ts | 1 + src/vs/workbench/api/node/apiCommands.ts | 99 +++++++++++++ .../workbench/api/node/extHostApiCommands.ts | 134 +++++++----------- 3 files changed, 155 insertions(+), 79 deletions(-) create mode 100644 src/vs/workbench/api/node/apiCommands.ts diff --git a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts index 73eabaddf52..4fcf427745c 100644 --- a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts @@ -16,6 +16,7 @@ import { ColorExtensionPoint } from 'vs/workbench/services/themes/common/colorEx import { LanguageConfigurationFileHandler } from 'vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint'; // --- mainThread participants +import 'vs/workbench/api/node/apiCommands'; import './mainThreadCommands'; import './mainThreadConfiguration'; import './mainThreadDebugService'; diff --git a/src/vs/workbench/api/node/apiCommands.ts b/src/vs/workbench/api/node/apiCommands.ts new file mode 100644 index 00000000000..9908cf76a63 --- /dev/null +++ b/src/vs/workbench/api/node/apiCommands.ts @@ -0,0 +1,99 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import URI from 'vs/base/common/uri'; +import * as vscode from 'vscode'; +import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; +import { CommandsRegistry, ICommandService, ICommandHandler } from 'vs/platform/commands/common/commands'; +import { Position as EditorPosition, ITextEditorOptions } from 'vs/platform/editor/common/editor'; + +// ----------------------------------------------------------------- +// The following commands are registered on both sides separately. +// +// We are trying to maintain backwards compatibility for cases where +// API commands are encoded as markdown links, for example. +// ----------------------------------------------------------------- + +export interface ICommandsExecutor { + executeCommand<T>(id: string, ...args: any[]): Thenable<T>; +} + +function adjustHandler(handler: (executor: ICommandsExecutor, ...args: any[]) => any): ICommandHandler { + return (accessor, ...args: any[]) => { + return handler(accessor.get(ICommandService), ...args); + }; +} + +export class PreviewHTMLAPICommand { + public static ID = 'vscode.previewHtml'; + public static execute(executor: ICommandsExecutor, uri: URI, position?: vscode.ViewColumn, label?: string, options?: any): Thenable<any> { + return executor.executeCommand('_workbench.previewHtml', + uri, + typeof position === 'number' && typeConverters.fromViewColumn(position), + label, + options + ); + } +} +CommandsRegistry.registerCommand(PreviewHTMLAPICommand.ID, adjustHandler(PreviewHTMLAPICommand.execute)); + +export class OpenFolderAPICommand { + public static ID = 'vscode.openFolder'; + public static execute(executor: ICommandsExecutor, uri?: URI, forceNewWindow?: boolean): Thenable<any> { + if (!uri) { + return executor.executeCommand('_files.pickFolderAndOpen', forceNewWindow); + } + + return executor.executeCommand('_files.windowOpen', [uri.fsPath], forceNewWindow); + } +} +CommandsRegistry.registerCommand(OpenFolderAPICommand.ID, adjustHandler(OpenFolderAPICommand.execute)); + +export class DiffAPICommand { + public static ID = 'vscode.diff'; + public static execute(executor: ICommandsExecutor, left: URI, right: URI, label: string, options?: vscode.TextDocumentShowOptions): Thenable<any> { + return executor.executeCommand('_workbench.diff', [ + left, right, + label, + undefined, + typeConverters.toTextEditorOptions(options), + options ? typeConverters.fromViewColumn(options.viewColumn) : undefined + ]); + } +} +CommandsRegistry.registerCommand(DiffAPICommand.ID, adjustHandler(DiffAPICommand.execute)); + +export class OpenAPICommand { + public static ID = 'vscode.open'; + public static execute(executor: ICommandsExecutor, resource: URI, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions): Thenable<any> { + let options: ITextEditorOptions; + let column: EditorPosition; + + if (columnOrOptions) { + if (typeof columnOrOptions === 'number') { + column = typeConverters.fromViewColumn(columnOrOptions); + } else { + options = typeConverters.toTextEditorOptions(columnOrOptions); + column = typeConverters.fromViewColumn(columnOrOptions.viewColumn); + } + } + + return executor.executeCommand('_workbench.open', [ + resource, + options, + column + ]); + } +} +CommandsRegistry.registerCommand(OpenAPICommand.ID, adjustHandler(OpenAPICommand.execute)); + +export class RemoveFromRecentlyOpenedAPICommand { + public static ID = 'vscode.removeFromRecentlyOpened'; + public static execute(executor: ICommandsExecutor, path: string): Thenable<any> { + return executor.executeCommand('_workbench.removeFromRecentlyOpened', path); + } +} +CommandsRegistry.registerCommand(RemoveFromRecentlyOpenedAPICommand.ID, adjustHandler(RemoveFromRecentlyOpenedAPICommand.execute)); diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index 4fdd04533c5..16eb310b740 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -17,9 +17,9 @@ import * as modes from 'vs/editor/common/modes'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { IWorkspaceSymbolProvider } from 'vs/workbench/parts/search/common/search'; -import { Position as EditorPosition, ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { CustomCodeAction } from 'vs/workbench/api/node/extHostLanguageFeatures'; import { ExtHostTask } from './extHostTask'; +import { ICommandsExecutor, PreviewHTMLAPICommand, OpenFolderAPICommand, DiffAPICommand, OpenAPICommand, RemoveFromRecentlyOpenedAPICommand } from './apiCommands'; export class ExtHostApiCommands { @@ -196,92 +196,68 @@ export class ExtHostApiCommands { ], returns: 'A promise that resolves to an array of ColorPresentation objects.' }); - this._register('vscode.previewHtml', (uri: URI, position?: vscode.ViewColumn, label?: string, options?: any) => { - return this._commands.executeCommand('_workbench.previewHtml', - uri, - typeof position === 'number' && typeConverters.fromViewColumn(position), - label, - options); - }, { - description: ` + + + // ----------------------------------------------------------------- + // The following commands are registered on both sides separately. + // + // We are trying to maintain backwards compatibility for cases where + // API commands are encoded as markdown links, for example. + // ----------------------------------------------------------------- + + type ICommandHandler = (...args: any[]) => any; + const adjustHandler = (handler: (executor: ICommandsExecutor, ...args: any[]) => any): ICommandHandler => { + return (...args: any[]) => { + return handler(this._commands, ...args); + }; + }; + + this._register(PreviewHTMLAPICommand.ID, adjustHandler(PreviewHTMLAPICommand.execute), { + description: ` Render the HTML of the resource in an editor view. See [working with the HTML preview](https://code.visualstudio.com/docs/extensionAPI/vscode-api-commands#working-with-the-html-preview) for more information about the HTML preview's integration with the editor and for best practices for extension authors. `, - args: [ - { name: 'uri', description: 'Uri of the resource to preview.', constraint: value => value instanceof URI || typeof value === 'string' }, - { name: 'column', description: '(optional) Column in which to preview.', constraint: value => typeof value === 'undefined' || (typeof value === 'number' && typeof types.ViewColumn[value] === 'string') }, - { name: 'label', description: '(optional) An human readable string that is used as title for the preview.', constraint: v => typeof v === 'string' || typeof v === 'undefined' }, - { name: 'options', description: '(optional) Options for controlling webview environment.', constraint: v => typeof v === 'object' || typeof v === 'undefined' } - ] - }); + args: [ + { name: 'uri', description: 'Uri of the resource to preview.', constraint: value => value instanceof URI || typeof value === 'string' }, + { name: 'column', description: '(optional) Column in which to preview.', constraint: value => typeof value === 'undefined' || (typeof value === 'number' && typeof types.ViewColumn[value] === 'string') }, + { name: 'label', description: '(optional) An human readable string that is used as title for the preview.', constraint: v => typeof v === 'string' || typeof v === 'undefined' }, + { name: 'options', description: '(optional) Options for controlling webview environment.', constraint: v => typeof v === 'object' || typeof v === 'undefined' } + ] + }); - this._register('vscode.openFolder', (uri?: URI, forceNewWindow?: boolean) => { - if (!uri) { - return this._commands.executeCommand('_files.pickFolderAndOpen', forceNewWindow); - } + this._register(OpenFolderAPICommand.ID, adjustHandler(OpenFolderAPICommand.execute), { + description: 'Open a folder or workspace in the current window or new window depending on the newWindow argument. Note that opening in the same window will shutdown the current extension host process and start a new one on the given folder/workspace unless the newWindow parameter is set to true.', + args: [ + { name: 'uri', description: '(optional) Uri of the folder or workspace file to open. If not provided, a native dialog will ask the user for the folder', constraint: value => value === void 0 || value instanceof URI }, + { name: 'newWindow', description: '(optional) Whether to open the folder/workspace in a new window or the same. Defaults to opening in the same window.', constraint: value => value === void 0 || typeof value === 'boolean' } + ] + }); - return this._commands.executeCommand('_files.windowOpen', [uri.fsPath], forceNewWindow); - }, { - description: 'Open a folder or workspace in the current window or new window depending on the newWindow argument. Note that opening in the same window will shutdown the current extension host process and start a new one on the given folder/workspace unless the newWindow parameter is set to true.', - args: [ - { name: 'uri', description: '(optional) Uri of the folder or workspace file to open. If not provided, a native dialog will ask the user for the folder', constraint: value => value === void 0 || value instanceof URI }, - { name: 'newWindow', description: '(optional) Whether to open the folder/workspace in a new window or the same. Defaults to opening in the same window.', constraint: value => value === void 0 || typeof value === 'boolean' } - ] - }); + this._register(DiffAPICommand.ID, adjustHandler(DiffAPICommand.execute), { + description: 'Opens the provided resources in the diff editor to compare their contents.', + args: [ + { name: 'left', description: 'Left-hand side resource of the diff editor', constraint: URI }, + { name: 'right', description: 'Right-hand side resource of the diff editor', constraint: URI }, + { name: 'title', description: '(optional) Human readable title for the diff editor', constraint: v => v === void 0 || typeof v === 'string' }, + { name: 'options', description: '(optional) Editor options, see vscode.TextDocumentShowOptions' } + ] + }); - this._register('vscode.diff', (left: URI, right: URI, label: string, options?: vscode.TextDocumentShowOptions) => { - return this._commands.executeCommand('_workbench.diff', [ - left, right, - label, - undefined, - typeConverters.toTextEditorOptions(options), - options ? typeConverters.fromViewColumn(options.viewColumn) : undefined - ]); - }, { - description: 'Opens the provided resources in the diff editor to compare their contents.', - args: [ - { name: 'left', description: 'Left-hand side resource of the diff editor', constraint: URI }, - { name: 'right', description: 'Right-hand side resource of the diff editor', constraint: URI }, - { name: 'title', description: '(optional) Human readable title for the diff editor', constraint: v => v === void 0 || typeof v === 'string' }, - { name: 'options', description: '(optional) Editor options, see vscode.TextDocumentShowOptions' } - ] - }); + this._register(OpenAPICommand.ID, adjustHandler(OpenAPICommand.execute), { + description: 'Opens the provided resource in the editor. Can be a text or binary file, or a http(s) url. If you need more control over the options for opening a text file, use vscode.window.showTextDocument instead.', + args: [ + { name: 'resource', description: 'Resource to open', constraint: URI }, + { name: 'columnOrOptions', description: '(optional) Either the column in which to open or editor options, see vscode.TextDocumentShowOptions', constraint: v => v === void 0 || typeof v === 'number' || typeof v === 'object' } + ] + }); - this._register('vscode.open', (resource: URI, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions) => { - let options: ITextEditorOptions; - let column: EditorPosition; - - if (columnOrOptions) { - if (typeof columnOrOptions === 'number') { - column = typeConverters.fromViewColumn(columnOrOptions); - } else { - options = typeConverters.toTextEditorOptions(columnOrOptions); - column = typeConverters.fromViewColumn(columnOrOptions.viewColumn); - } - } - - return this._commands.executeCommand('_workbench.open', [ - resource, - options, - column - ]); - }, { - description: 'Opens the provided resource in the editor. Can be a text or binary file, or a http(s) url. If you need more control over the options for opening a text file, use vscode.window.showTextDocument instead.', - args: [ - { name: 'resource', description: 'Resource to open', constraint: URI }, - { name: 'columnOrOptions', description: '(optional) Either the column in which to open or editor options, see vscode.TextDocumentShowOptions', constraint: v => v === void 0 || typeof v === 'number' || typeof v === 'object' } - ] - }); - - this._register('vscode.removeFromRecentlyOpened', (path: string) => { - return this._commands.executeCommand('_workbench.removeFromRecentlyOpened', path); - }, { - description: 'Removes an entry with the given path from the recently opened list.', - args: [ - { name: 'path', description: 'Path to remove from recently opened.', constraint: value => typeof value === 'string' } - ] - }); + this._register(RemoveFromRecentlyOpenedAPICommand.ID, adjustHandler(RemoveFromRecentlyOpenedAPICommand.execute), { + description: 'Removes an entry with the given path from the recently opened list.', + args: [ + { name: 'path', description: 'Path to remove from recently opened.', constraint: value => typeof value === 'string' } + ] + }); } // --- command impl From 1891516706d10064b5a2282ec73cce1076188432 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Mon, 23 Apr 2018 15:58:32 +0200 Subject: [PATCH 648/710] fixes #48393 --- build/gulpfile.extensions.js | 8 ++++ build/lib/reporter.js | 9 ++++- build/lib/reporter.ts | 11 ++++- package.json | 1 + yarn.lock | 78 ++++++++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 4 deletions(-) diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 3bb9b02f3af..3ec638c2f22 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -21,6 +21,7 @@ const nlsDev = require('vscode-nls-dev'); const root = path.dirname(__dirname); const commit = util.getVersion(root); const i18n = require('./lib/i18n'); +const plumber = require('gulp-plumber'); const extensionsPath = path.join(path.dirname(__dirname), 'extensions'); @@ -82,6 +83,13 @@ const tasks = compilations.map(function (tsconfigFile) { const input = es.through(); const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true }); const output = input + .pipe(plumber({ + errorHandler: function (err) { + if (err && !err.__reporter__) { + reporter(err); + } + } + })) .pipe(tsFilter) .pipe(util.loadSourcemaps()) .pipe(compilation()) diff --git a/build/lib/reporter.js b/build/lib/reporter.js index 7dc3f50e038..18b06ec7c07 100644 --- a/build/lib/reporter.js +++ b/build/lib/reporter.js @@ -73,8 +73,13 @@ function createReporter() { return es.through(null, function () { onEnd(); if (emitError && errors.length > 0) { - log(); - this.emit('error'); + errors.__logged__ = true; + if (!errors.__logged__) { + log(); + } + var err = new Error("Found " + errors.length + " errors"); + err.__reporter__ = true; + this.emit('error', err); } else { this.emit('end'); diff --git a/build/lib/reporter.ts b/build/lib/reporter.ts index e4be8549ddb..8dc87b00858 100644 --- a/build/lib/reporter.ts +++ b/build/lib/reporter.ts @@ -94,8 +94,15 @@ export function createReporter(): IReporter { onEnd(); if (emitError && errors.length > 0) { - log(); - this.emit('error'); + (errors as any).__logged__ = true; + + if (!(errors as any).__logged__) { + log(); + } + + const err = new Error(`Found ${errors.length} errors`); + (err as any).__reporter__ = true; + this.emit('error', err); } else { this.emit('end'); } diff --git a/package.json b/package.json index 5714b70e29c..620ae7ea445 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "gulp-image-resize": "^0.10.0", "gulp-json-editor": "^2.2.1", "gulp-mocha": "^2.1.3", + "gulp-plumber": "^1.2.0", "gulp-remote-src": "^0.4.0", "gulp-rename": "^1.2.0", "gulp-replace": "^0.5.4", diff --git a/yarn.lock b/yarn.lock index 139077c5c6b..6a63dc20696 100644 --- a/yarn.lock +++ b/yarn.lock @@ -120,10 +120,28 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" @@ -150,6 +168,10 @@ ansi-styles@^3.1.0: dependencies: color-convert "^1.9.0" +ansi-wrap@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" @@ -171,6 +193,13 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -181,6 +210,10 @@ arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -205,6 +238,10 @@ array-series@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/array-series/-/array-series-0.1.5.tgz#df5d37bfc5c2ef0755e2aa4f92feae7d4b5a972f" +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + array-slice@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" @@ -737,6 +774,10 @@ color-string@^0.3.0: dependencies: color-name "^1.0.0" +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + color@^0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" @@ -1579,6 +1620,12 @@ express@^4.13.1: utils-merge "1.0.1" vary "~1.1.2" +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -1629,6 +1676,14 @@ fancy-log@^1.1.0: chalk "^1.1.1" time-stamp "^1.0.0" +fancy-log@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2249,6 +2304,15 @@ gulp-mocha@^2.1.3: temp "^0.8.3" through "^2.3.4" +gulp-plumber@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.0.tgz#18ea03912c9ee483f8a5499973b5954cd90f6ad8" + dependencies: + chalk "^1.1.3" + fancy-log "^1.3.2" + plugin-error "^0.1.2" + through2 "^2.0.3" + gulp-remote-src@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz#5728cfd643433dd4845ddef0969f0f971a2ab4a1" @@ -3102,6 +3166,10 @@ keytar@^4.0.5: dependencies: nan "2.5.1" +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + kind-of@^3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" @@ -4172,6 +4240,16 @@ plist@^1.1.0: xmlbuilder "4.0.0" xmldom "0.1.x" +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + plur@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" From 56ad4b39530ba324373e07e80e706f085739e03b Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Mon, 23 Apr 2018 16:20:08 +0200 Subject: [PATCH 649/710] clone repo by url --- extensions/git/package.json | 4 +-- extensions/git/src/main.ts | 4 ++- extensions/git/src/protocolHandler.ts | 39 +++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 extensions/git/src/protocolHandler.ts diff --git a/extensions/git/package.json b/extensions/git/package.json index f6d86f0a91b..8717d6e4af4 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -13,7 +13,7 @@ "Other" ], "activationEvents": [ - "*" + "onUri" ], "main": "./out/main", "icon": "resources/icons/git.png", @@ -1126,4 +1126,4 @@ "@types/which": "^1.0.28", "mocha": "^3.2.0" } -} +} \ No newline at end of file diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 9c915942b7b..49b201053a2 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -17,6 +17,7 @@ import { Askpass } from './askpass'; import { toDisposable, filterEvent, eventToPromise } from './util'; import TelemetryReporter from 'vscode-extension-telemetry'; import { API, createApi } from './api'; +import { GitProtocolHandler } from './protocolHandler'; let telemetryReporter: TelemetryReporter; @@ -51,7 +52,8 @@ async function init(context: ExtensionContext, outputChannel: OutputChannel, dis disposables.push( new CommandCenter(git, model, outputChannel, telemetryReporter), new GitContentProvider(model), - new GitDecorations(model) + new GitDecorations(model), + new GitProtocolHandler(model) ); await checkGitVersion(info); diff --git a/extensions/git/src/protocolHandler.ts b/extensions/git/src/protocolHandler.ts new file mode 100644 index 00000000000..b84d6620068 --- /dev/null +++ b/extensions/git/src/protocolHandler.ts @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { ProtocolHandler, Uri, window, Disposable, commands } from 'vscode'; +import { dispose } from './util'; +import * as querystring from 'querystring'; + +export class GitProtocolHandler implements ProtocolHandler { + + private disposables: Disposable[] = []; + + constructor() { + this.disposables.push(window.registerProtocolHandler(this)); + } + + handleUri(uri: Uri): void { + switch (uri.path) { + case '/clone': this.clone(uri); + } + } + + private clone(uri: Uri): void { + const data = querystring.parse(uri.query); + + if (!data.url) { + console.warn('Failed to open URI:', uri); + } + + commands.executeCommand('git.clone', data.url); + } + + dispose(): void { + this.disposables = dispose(this.disposables); + } +} \ No newline at end of file From 0ed3e197c7bce2f946bae85be3a40610bc9bf2b0 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Mon, 23 Apr 2018 16:28:38 +0200 Subject: [PATCH 650/710] make product build scripts stop when any command fails --- build/tfs/product-build.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/build/tfs/product-build.yml b/build/tfs/product-build.yml index 2a0f41bb644..29fc43598e3 100644 --- a/build/tfs/product-build.yml +++ b/build/tfs/product-build.yml @@ -20,6 +20,7 @@ phases: versionSpec: "1.3.2" - powershell: | + $ErrorActionPreference = "Stop" "machine monacotools.visualstudio.com password $(VSO_PAT)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII $env:npm_config_arch="$(VSCODE_ARCH)" $env:CHILD_CONCURRENCY="1" @@ -32,12 +33,14 @@ phases: node build/lib/builtInExtensions.js - powershell: | + $ErrorActionPreference = "Stop" $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-min" npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-copy-inno-updater" name: build - powershell: | + $ErrorActionPreference = "Stop" npm run gulp -- "electron-$(VSCODE_ARCH)" .\scripts\test.bat --build --tfs # yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)" @@ -123,6 +126,7 @@ phases: SessionTimeout: 120 - powershell: | + $ErrorActionPreference = "Stop" npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-archive" "vscode-win32-$(VSCODE_ARCH)-setup" - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1 @@ -205,6 +209,7 @@ phases: SessionTimeout: 120 - powershell: | + $ErrorActionPreference = "Stop" $Repo = "$(pwd)" $Root = "$Repo\.." $Exe = "$Repo\.build\win32-$(VSCODE_ARCH)\setup\VSCodeSetup.exe" @@ -244,6 +249,7 @@ phases: versionSpec: "1.3.2" - script: | + set -e export npm_config_arch="$(VSCODE_ARCH)" if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" @@ -258,16 +264,19 @@ phases: node build/lib/builtInExtensions.js - script: | + set -e VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min name: build - script: | + set -e npm run gulp -- "electron-$(VSCODE_ARCH)" DISPLAY=:10 ./scripts/test.sh --build --tfs # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" name: test - script: | + set -e npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb" npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm" #npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-snap" @@ -296,6 +305,7 @@ phases: versionSpec: "1.3.2" - script: | + set -e export npm_config_arch="$(VSCODE_ARCH)" if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" @@ -310,16 +320,19 @@ phases: node build/lib/builtInExtensions.js - script: | + set -e VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min name: build - script: | + set -e npm run gulp -- "electron-$(VSCODE_ARCH)" DISPLAY=:10 ./scripts/test.sh --build --tfs # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)" name: test - script: | + set -e npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb" npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm" #npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-snap" @@ -345,6 +358,7 @@ phases: versionSpec: "1.3.2" - script: | + set -e echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc yarn npm run gulp -- hygiene @@ -354,18 +368,21 @@ phases: node build/lib/builtInExtensions.js - script: | + set -e VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \ AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \ npm run gulp -- vscode-darwin-min upload-vscode-sourcemaps name: build - script: | + set -e ./scripts/test.sh --build --tfs APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`" # yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME" name: test - script: | + set -e # archive the unsigned build pushd ../VSCode-darwin && zip -r -X -y ../VSCode-darwin-unsigned.zip * && popd From 35f1c86f16cee1b79e5ceb37f73ae06020ab5ec6 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Mon, 23 Apr 2018 16:30:17 +0200 Subject: [PATCH 651/710] fix compile error --- extensions/git/src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 49b201053a2..230d9be2015 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -53,7 +53,7 @@ async function init(context: ExtensionContext, outputChannel: OutputChannel, dis new CommandCenter(git, model, outputChannel, telemetryReporter), new GitContentProvider(model), new GitDecorations(model), - new GitProtocolHandler(model) + new GitProtocolHandler() ); await checkGitVersion(info); From 0f1c97b1510348770c2ee89611dd2f8feb05f660 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 16:36:09 +0200 Subject: [PATCH 652/710] rename FileSystemProvider2 to FileSystemProvider and the whole ripple. keep the old proposed api as DeprecatedXYZ #47475 --- src/vs/platform/files/common/files.ts | 6 +- src/vs/vscode.proposed.d.ts | 119 +++++++----------- src/vs/workbench/api/node/extHost.api.impl.ts | 13 +- .../workbench/api/node/extHostFileSystem.ts | 62 ++++----- src/vs/workbench/api/node/extHostTypes.ts | 6 +- 5 files changed, 78 insertions(+), 128 deletions(-) diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index e9f5c6e78d6..256d1e8e899 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -185,9 +185,9 @@ export interface FileOptions { } export interface IStat { - isFile: boolean; - isDirectory: boolean; - isSymbolicLink: boolean; + isFile?: boolean; + isDirectory?: boolean; + isSymbolicLink?: boolean; mtime: number; size: number; } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index d385d7cb075..4015a72c944 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -13,86 +13,40 @@ declare module 'vscode' { //#region Joh: file system provider (OLD) - export enum FileChangeType { + export enum DeprecatedFileChangeType { Updated = 0, Added = 1, Deleted = 2 } - - export interface FileChange { - type: FileChangeType; + export interface DeprecatedFileChange { + type: DeprecatedFileChangeType; resource: Uri; } - - export enum FileType { + export enum DeprecatedFileType { File = 0, Dir = 1, Symlink = 2 } - - export interface FileStat { + export interface DeprecatedFileStat { id: number | string; mtime: number; - // atime: number; size: number; - type: FileType; + type: DeprecatedFileType; } - - // todo@joh discover files etc - // todo@joh CancellationToken everywhere - // todo@joh add open/close calls? - export interface FileSystemProvider { - - readonly onDidChange?: Event<FileChange[]>; - - // more... - // @deprecated - will go away - utimes(resource: Uri, mtime: number, atime: number): Thenable<FileStat>; - - stat(resource: Uri): Thenable<FileStat>; - + export interface DeprecatedFileSystemProvider { + readonly onDidChange?: Event<DeprecatedFileChange[]>; + utimes(resource: Uri, mtime: number, atime: number): Thenable<DeprecatedFileStat>; + stat(resource: Uri): Thenable<DeprecatedFileStat>; read(resource: Uri, offset: number, length: number, progress: Progress<Uint8Array>): Thenable<number>; - - // todo@joh - have an option to create iff not exist - // todo@remote - // offset - byte offset to start - // count - number of bytes to write - // Thenable<number> - number of bytes actually written write(resource: Uri, content: Uint8Array): Thenable<void>; - - // todo@remote - // Thenable<FileStat> - move(resource: Uri, target: Uri): Thenable<FileStat>; - - // todo@remote - // helps with performance bigly - // copy?(from: Uri, to: Uri): Thenable<void>; - - // todo@remote - // Thenable<FileStat> - mkdir(resource: Uri): Thenable<FileStat>; - - readdir(resource: Uri): Thenable<[Uri, FileStat][]>; - - // todo@remote - // ? merge both - // ? recursive del + move(resource: Uri, target: Uri): Thenable<DeprecatedFileStat>; + mkdir(resource: Uri): Thenable<DeprecatedFileStat>; + readdir(resource: Uri): Thenable<[Uri, DeprecatedFileStat][]>; rmdir(resource: Uri): Thenable<void>; unlink(resource: Uri): Thenable<void>; - - // todo@remote - // create(resource: Uri): Thenable<FileStat>; } - - export type DeprecatedFileChangeType = FileChangeType; - export type DeprecatedFileType = FileType; - export type DeprecatedFileChange = FileChange; - export type DeprecatedFileStat = FileStat; - export type DeprecatedFileSystemProvider = FileSystemProvider; - export namespace workspace { export function registerDeprecatedFileSystemProvider(scheme: string, provider: DeprecatedFileSystemProvider): Disposable; - export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, newProvider?: FileSystemProvider2): Disposable; } //#endregion @@ -103,7 +57,7 @@ declare module 'vscode' { * A type that filesystem providers should use to signal errors. * * This class has factory methods for common error-cases, like `EntryNotFound` when - * a file or folder doesn't exist. Use them like so `throw vscode.FileSystemError.EntryNotFound(uri);` + * a file or folder doesn't exist, use them like so: `throw vscode.FileSystemError.EntryNotFound(someUri);` */ export class FileSystemError extends Error { @@ -140,9 +94,24 @@ declare module 'vscode' { constructor(messageOrUri?: string | Uri); } - export enum FileChangeType2 { + /** + * Enumeration of file change types. + */ + export enum FileChangeType { + + /** + * The contents or metadata of a file have changed. + */ Changed = 1, + + /** + * A file has been created. + */ Created = 2, + + /** + * A file has been deleted. + */ Deleted = 3, } @@ -152,9 +121,9 @@ declare module 'vscode' { export interface FileChangeEvent { /** - * + * The type of change. */ - type: FileChangeType2; + type: FileChangeType; /** * The uri of the file that has changed. @@ -165,21 +134,21 @@ declare module 'vscode' { /** * The `FileStat`-type represents metadata about a file. */ - export interface FileStat2 { + export interface FileStat { /** * The file is a regular file. */ - isFile: boolean; + isFile?: boolean; /** * The file is a directory. */ - isDirectory: boolean; + isDirectory?: boolean; /** * The file is symbolic link to another file. */ - isSymbolicLink: boolean; + isSymbolicLink?: boolean; /** * The modification timestamp in milliseconds. @@ -226,9 +195,7 @@ declare module 'vscode' { * -use posix-path-math * -etc... */ - export interface FileSystemProvider2 { - - _version: 9; + export interface FileSystemProvider { /** * An event to signal that a resource has been created, changed, or deleted. This @@ -252,7 +219,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return The file metadata about the file. */ - stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat | Thenable<FileStat>; /** * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) @@ -261,7 +228,7 @@ declare module 'vscode' { * @param token A cancellation token. * @return A thenable that resolves to an array of tuples of file names and files stats. */ - readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat2][] | Thenable<[string, FileStat2][]>; + readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat][] | Thenable<[string, FileStat][]>; /** * Create a new directory. *Note* that new files are created via `write`-calls. @@ -269,7 +236,7 @@ declare module 'vscode' { * @param uri The uri of the *new* folder. * @param token A cancellation token. */ - createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat | Thenable<FileStat>; /** * Read the entire contents of a file. @@ -305,7 +272,7 @@ declare module 'vscode' { * @param newUri The target location. * @param token A cancellation token. */ - rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable<FileStat>; /** * Copy files or folders. Implementing this function is optional but it will speedup @@ -315,11 +282,11 @@ declare module 'vscode' { * @param target The target location. * @param token A cancellation token. */ - copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat2 | Thenable<FileStat2>; + copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable<FileStat>; } export namespace workspace { - export function registerFileSystemProvider2(scheme: string, provider: FileSystemProvider2, options: { isCaseSensitive?: boolean }): Disposable; + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options: { isCaseSensitive?: boolean }): Disposable; } //#endregion diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index c3205e53724..62407e69d9d 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -550,11 +550,8 @@ export function createApiFactory( onDidEndTask: (listeners, thisArgs?, disposables?) => { return extHostTask.onDidEndTask(listeners, thisArgs, disposables); }, - registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, newProvider?) => { - return extHostFileSystem.registerFileSystemProvider(scheme, provider, newProvider); - }), - registerFileSystemProvider2: proposedApiFunction(extension, (scheme, provider, options) => { - return extHostFileSystem.registerFileSystemProvider2(scheme, provider, options); + registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, options) => { + return extHostFileSystem.registerFileSystemProvider(scheme, provider, options); }), registerDeprecatedFileSystemProvider: proposedApiFunction(extension, (scheme, provider) => { return extHostFileSystem.registerDeprecatedFileSystemProvider(scheme, provider); @@ -701,11 +698,9 @@ export function createApiFactory( ConfigurationTarget: extHostTypes.ConfigurationTarget, RelativePattern: extHostTypes.RelativePattern, + DeprecatedFileChangeType: extHostTypes.DeprecatedFileChangeType, + DeprecatedFileType: extHostTypes.DeprecatedFileType, FileChangeType: extHostTypes.FileChangeType, - FileType: extHostTypes.FileType, - DeprecatedFileChangeType: extHostTypes.FileChangeType, - DeprecatedFileType: extHostTypes.FileType, - FileChangeType2: extHostTypes.FileChangeType2, FileSystemError: extHostTypes.FileSystemError, FoldingRange: extHostTypes.FoldingRange, FoldingRangeKind: extHostTypes.FoldingRangeKind diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 603fe1e1ee6..1c7356f967b 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -14,7 +14,7 @@ import * as path from 'path'; import { IDisposable } from 'vs/base/common/lifecycle'; import { asWinJsPromise } from 'vs/base/common/async'; import { values } from 'vs/base/common/map'; -import { Range, FileType, FileChangeType, FileChangeType2 } from 'vs/workbench/api/node/extHostTypes'; +import { Range, DeprecatedFileType, DeprecatedFileChangeType, FileChangeType } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; import { Schemas } from 'vs/base/common/network'; @@ -57,9 +57,7 @@ class FsLinkProvider implements vscode.DocumentLinkProvider { } } -class FileSystemProviderShim implements vscode.FileSystemProvider2 { - - _version: 9 = 9; +class FileSystemProviderShim implements vscode.FileSystemProvider { onDidChangeFile: vscode.Event<vscode.FileChangeEvent[]>; @@ -77,19 +75,19 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { return { dispose() { } }; } - stat(resource: vscode.Uri): Thenable<vscode.FileStat2> { + stat(resource: vscode.Uri): Thenable<vscode.FileStat> { return this._delegate.stat(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable<vscode.FileStat2> { + rename(oldUri: vscode.Uri, newUri: vscode.Uri): Thenable<vscode.FileStat> { return this._delegate.move(oldUri, newUri).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } - readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileStat2][]> { + readDirectory(resource: vscode.Uri): Thenable<[string, vscode.FileStat][]> { return this._delegate.readdir(resource).then(tuples => { - return tuples.map(tuple => <[string, vscode.FileStat2]>[path.posix.basename(tuple[0].path), FileSystemProviderShim._modernizeFileStat(tuple[1])]); + return tuples.map(tuple => <[string, vscode.FileStat]>[path.posix.basename(tuple[0].path), FileSystemProviderShim._modernizeFileStat(tuple[1])]); }); } - private static _modernizeFileStat(stat: vscode.DeprecatedFileStat): vscode.FileStat2 { + private static _modernizeFileStat(stat: vscode.DeprecatedFileStat): vscode.FileStat { let { mtime, size, type } = stat; let isFile = false; let isDirectory = false; @@ -97,13 +95,13 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { // no support for bitmask, effectively no support for symlinks switch (type) { - case FileType.Dir: + case DeprecatedFileType.Dir: isDirectory = true; break; - case FileType.File: + case DeprecatedFileType.File: isFile = true; break; - case FileType.Symlink: + case DeprecatedFileType.Symlink: isSymbolicLink = true; break; } @@ -112,16 +110,16 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { private static _modernizeFileChange(e: vscode.DeprecatedFileChange): vscode.FileChangeEvent { let { resource, type } = e; - let newType: vscode.FileChangeType2; + let newType: vscode.FileChangeType; switch (type) { - case FileChangeType.Updated: - newType = FileChangeType2.Changed; + case DeprecatedFileChangeType.Updated: + newType = FileChangeType.Changed; break; - case FileChangeType.Added: - newType = FileChangeType2.Created; + case DeprecatedFileChangeType.Added: + newType = FileChangeType.Created; break; - case FileChangeType.Deleted: - newType = FileChangeType2.Deleted; + case DeprecatedFileChangeType.Deleted: + newType = FileChangeType.Deleted; break; } @@ -132,14 +130,14 @@ class FileSystemProviderShim implements vscode.FileSystemProvider2 { delete(resource: vscode.Uri): Thenable<void> { return this._delegate.stat(resource).then(stat => { - if (stat.type === FileType.Dir) { + if (stat.type === DeprecatedFileType.Dir) { return this._delegate.rmdir(resource); } else { return this._delegate.unlink(resource); } }); } - createDirectory(resource: vscode.Uri): Thenable<vscode.FileStat2> { + createDirectory(resource: vscode.Uri): Thenable<vscode.FileStat> { return this._delegate.mkdir(resource).then(stat => FileSystemProviderShim._modernizeFileStat(stat)); } @@ -165,7 +163,7 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { private readonly _proxy: MainThreadFileSystemShape; private readonly _linkProvider = new FsLinkProvider(); - private readonly _fsProvider = new Map<number, vscode.FileSystemProvider2>(); + private readonly _fsProvider = new Map<number, vscode.FileSystemProvider>(); private readonly _usedSchemes = new Set<string>(); private readonly _watches = new Map<number, IDisposable>(); @@ -187,20 +185,10 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } registerDeprecatedFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider) { - return this.registerFileSystemProvider2(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); + return this.registerFileSystemProvider(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); } - registerFileSystemProvider(scheme: string, provider: vscode.DeprecatedFileSystemProvider, newProvider: vscode.FileSystemProvider2) { - if (newProvider && newProvider._version === 9) { - return this.registerFileSystemProvider2(scheme, newProvider, { isCaseSensitive: false }); - } else if (provider) { - return this.registerFileSystemProvider2(scheme, new FileSystemProviderShim(provider), { isCaseSensitive: false }); - } else { - throw new Error('FAILED to register file system provider, the new provider does not meet the version-constraint and there is no old provider'); - } - } - - registerFileSystemProvider2(scheme: string, provider: vscode.FileSystemProvider2, options: { isCaseSensitive?: boolean }) { + registerFileSystemProvider(scheme: string, provider: vscode.FileSystemProvider, options: { isCaseSensitive?: boolean }) { if (this._usedSchemes.has(scheme)) { throw new Error(`a provider for the scheme '${scheme}' is already registered`); @@ -231,13 +219,13 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { } let newType: files.FileChangeType; switch (type) { - case FileChangeType2.Changed: + case FileChangeType.Changed: newType = files.FileChangeType.UPDATED; break; - case FileChangeType2.Created: + case FileChangeType.Created: newType = files.FileChangeType.ADDED; break; - case FileChangeType2.Deleted: + case FileChangeType.Deleted: newType = files.FileChangeType.DELETED; break; } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 32a94c5d0ba..731189500ed 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1846,19 +1846,19 @@ export enum LogLevel { //#region file api // todo@remote -export enum FileChangeType { +export enum DeprecatedFileChangeType { Updated = 0, Added = 1, Deleted = 2 } -export enum FileChangeType2 { +export enum FileChangeType { Changed = 1, Created = 2, Deleted = 3, } -export enum FileType { +export enum DeprecatedFileType { File = 0, Dir = 1, Symlink = 2 From 12e967938107f4149a7787dd1cdbd68d1ff17cb1 Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Mon, 23 Apr 2018 16:41:52 +0200 Subject: [PATCH 653/710] remove experimental setting --- .../parts/debug/electron-browser/debug.contribution.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 796f6c5e59f..0cf19b4fc6c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -210,11 +210,6 @@ configurationRegistry.registerConfiguration({ description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces"), default: { configurations: [], compounds: [] }, $ref: launchSchemaId - }, - 'debug.extensionHostDebugAdapter': { - type: 'boolean', - description: nls.localize({ comment: ['This is the description for a setting'], key: 'extensionHostDebugAdapter' }, "Run debug adapter in extension host"), - default: false } } }); From 5c96e9fefa244cc5cb230f980144360840fe764f Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Mon, 23 Apr 2018 16:42:35 +0200 Subject: [PATCH 654/710] Fixes #47660: Trigger hover even when the mouse is very close to the content text --- .../editor/browser/controller/mouseTarget.ts | 19 +++++++++++++++---- src/vs/editor/contrib/hover/hover.ts | 14 ++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/controller/mouseTarget.ts b/src/vs/editor/browser/controller/mouseTarget.ts index bab014e28eb..018b2686b73 100644 --- a/src/vs/editor/browser/controller/mouseTarget.ts +++ b/src/vs/editor/browser/controller/mouseTarget.ts @@ -35,6 +35,7 @@ export interface IMarginData { export interface IEmptyContentData { isAfterLines: boolean; + horizontalDistanceToText?: number; } interface IETextRange { @@ -415,7 +416,13 @@ class HitTestRequest extends BareHitTestRequest { } const EMPTY_CONTENT_AFTER_LINES: IEmptyContentData = { isAfterLines: true }; -const EMPTY_CONTENT_IN_LINES: IEmptyContentData = { isAfterLines: false }; + +function createEmptyContentDataInLines(horizontalDistanceToText: number): IEmptyContentData { + return { + isAfterLines: false, + horizontalDistanceToText: horizontalDistanceToText + }; +} export class MouseTargetFactory { @@ -639,7 +646,9 @@ export class MouseTargetFactory { if (ElementPath.isStrictChildOfViewLines(request.targetPath)) { const lineNumber = ctx.getLineNumberAtVerticalOffset(request.mouseVerticalOffset); if (ctx.model.getLineLength(lineNumber) === 0) { - return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineNumber, 1), void 0, EMPTY_CONTENT_IN_LINES); + const lineWidth = ctx.getLineWidth(lineNumber); + const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth); + return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineNumber, 1), void 0, detail); } } @@ -713,9 +722,11 @@ export class MouseTargetFactory { if (request.mouseContentHorizontalOffset > lineWidth) { if (browser.isEdge && pos.column === 1) { // See https://github.com/Microsoft/vscode/issues/10875 - return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineNumber, ctx.model.getLineMaxColumn(lineNumber)), void 0, EMPTY_CONTENT_IN_LINES); + const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth); + return request.fulfill(MouseTargetType.CONTENT_EMPTY, new Position(lineNumber, ctx.model.getLineMaxColumn(lineNumber)), void 0, detail); } - return request.fulfill(MouseTargetType.CONTENT_EMPTY, pos, void 0, EMPTY_CONTENT_IN_LINES); + const detail = createEmptyContentDataInLines(request.mouseContentHorizontalOffset - lineWidth); + return request.fulfill(MouseTargetType.CONTENT_EMPTY, pos, void 0, detail); } const visibleRange = ctx.visibleRangeForPosition2(lineNumber, column); diff --git a/src/vs/editor/contrib/hover/hover.ts b/src/vs/editor/contrib/hover/hover.ts index a48e61cb54f..23eb1cdf5af 100644 --- a/src/vs/editor/contrib/hover/hover.ts +++ b/src/vs/editor/contrib/hover/hover.ts @@ -23,6 +23,7 @@ import { registerThemingParticipant, IThemeService } from 'vs/platform/theme/com import { editorHoverHighlight, editorHoverBackground, editorHoverBorder, textLinkForeground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; +import { IEmptyContentData } from 'vs/editor/browser/controller/mouseTarget'; export class ModesHoverController implements editorCommon.IEditorContribution { @@ -114,8 +115,8 @@ export class ModesHoverController implements editorCommon.IEditorContribution { } private _onEditorMouseMove(mouseEvent: IEditorMouseEvent): void { - var targetType = mouseEvent.target.type; - var stopKey = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; + let targetType = mouseEvent.target.type; + let stopKey = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; if (this._isMouseDown && this._hoverClicked && this.contentWidget.isColorPickerVisible()) { return; @@ -131,6 +132,15 @@ export class ModesHoverController implements editorCommon.IEditorContribution { return; } + if (targetType === MouseTargetType.CONTENT_EMPTY) { + const epsilon = this._editor.getConfiguration().fontInfo.typicalHalfwidthCharacterWidth / 2; + const data = <IEmptyContentData>mouseEvent.target.detail; + if (data && !data.isAfterLines && typeof data.horizontalDistanceToText === 'number' && data.horizontalDistanceToText < epsilon) { + // Let hover kick in even when the mouse is technically in the empty area after a line, given the distance is small enough + targetType = MouseTargetType.CONTENT_TEXT; + } + } + if (this._editor.getConfiguration().contribInfo.hover && targetType === MouseTargetType.CONTENT_TEXT) { this.glyphWidget.hide(); this.contentWidget.startShowingAt(mouseEvent.target.range, false); From 118c3bf4c08374742b47369dc2517fd1c9de5a13 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Mon, 23 Apr 2018 16:44:37 +0200 Subject: [PATCH 655/710] ask user to open extension URL --- .../inactiveExtensionUrlHandler.ts | 31 ++++++++++++++----- .../api/electron-browser/mainThreadUrls.ts | 4 +-- .../workbench/electron-browser/workbench.ts | 4 +-- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts index 54cfc70e05a..5c6ab39a215 100644 --- a/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts +++ b/src/vs/platform/url/electron-browser/inactiveExtensionUrlHandler.ts @@ -9,6 +9,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable, toDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; +import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { localize } from 'vs/nls'; const FIVE_MINUTES = 5 * 60 * 1000; const THIRTY_SECONDS = 30 * 1000; @@ -17,9 +19,9 @@ function isExtensionId(value: string): boolean { return /^[a-z0-9][a-z0-9\-]*\.[a-z0-9][a-z0-9\-]*$/i.test(value); } -export const IInactiveExtensionUrlHandler = createDecorator<IInactiveExtensionUrlHandler>('inactiveExtensionUrlHandler'); +export const IExtensionUrlHandler = createDecorator<IExtensionUrlHandler>('inactiveExtensionUrlHandler'); -export interface IInactiveExtensionUrlHandler { +export interface IExtensionUrlHandler { readonly _serviceBrand: any; registerExtensionHandler(extensionId: string, handler: IURLHandler): void; unregisterExtensionHandler(extensionId: string): void; @@ -31,8 +33,10 @@ export interface IInactiveExtensionUrlHandler { * activates the extension and re-opens the URL once the extension registers * a URL handler. If the extension never registers a URL handler, the urls * will eventually be garbage collected. + * + * It also makes sure the user confirms opening URLs directed towards extensions. */ -export class InactiveExtensionUrlHandler implements IInactiveExtensionUrlHandler, IURLHandler { +export class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { readonly _serviceBrand: any; @@ -42,7 +46,8 @@ export class InactiveExtensionUrlHandler implements IInactiveExtensionUrlHandler constructor( @IURLService urlService: IURLService, - @IExtensionService private extensionService: IExtensionService + @IExtensionService private extensionService: IExtensionService, + @IDialogService private dialogService: IDialogService ) { const interval = setInterval(() => this.garbageCollect(), THIRTY_SECONDS); @@ -52,13 +57,22 @@ export class InactiveExtensionUrlHandler implements IInactiveExtensionUrlHandler ]); } - handleURL(uri: URI): TPromise<boolean> { + async handleURL(uri: URI): TPromise<boolean> { if (!isExtensionId(uri.authority)) { - return TPromise.as(false); + return false; } const extensionId = uri.authority; + const result = await this.dialogService.confirm({ + message: localize('confirmUrl', "Do you want to let the {0} extension open the following URL?", extensionId), + detail: uri.toString() + }); + + if (!result.confirmed) { + return true; + } + // let the ExtensionUrlHandler instance handle this if (this.extensionIds.has(extensionId)) { return TPromise.as(false); @@ -76,8 +90,9 @@ export class InactiveExtensionUrlHandler implements IInactiveExtensionUrlHandler uris.push({ timestamp, uri }); // activate the extension - return this.extensionService.activateByEvent(`onUri:${extensionId}`) - .then(() => true); + await this.extensionService.activateByEvent(`onUri:${extensionId}`); + + return true; } registerExtensionHandler(extensionId: string, handler: IURLHandler): void { diff --git a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts index c9fc7ab862b..7ba2ed813b1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts @@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import URI from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IInactiveExtensionUrlHandler } from 'vs/platform/url/electron-browser/inactiveExtensionUrlHandler'; +import { IExtensionUrlHandler } from 'vs/platform/url/electron-browser/inactiveExtensionUrlHandler'; class ExtensionUrlHandler implements IURLHandler { @@ -37,7 +37,7 @@ export class MainThreadUrls implements MainThreadUrlsShape { constructor( context: IExtHostContext, @IURLService private urlService: IURLService, - @IInactiveExtensionUrlHandler private inactiveExtensionUrlHandler: IInactiveExtensionUrlHandler + @IExtensionUrlHandler private inactiveExtensionUrlHandler: IExtensionUrlHandler ) { this.proxy = context.getProxy(ExtHostContext.ExtHostUrls); } diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 4ea24f29b42..d196ddd2ca5 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -110,7 +110,7 @@ import { IPCClient } from 'vs/base/parts/ipc/common/ipc'; import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { PreferencesService } from 'vs/workbench/services/preferences/browser/preferencesService'; -import { IInactiveExtensionUrlHandler, InactiveExtensionUrlHandler } from 'vs/platform/url/electron-browser/inactiveExtensionUrlHandler'; +import { IExtensionUrlHandler, ExtensionUrlHandler } from 'vs/platform/url/electron-browser/inactiveExtensionUrlHandler'; export const EditorsVisibleContext = new RawContextKey<boolean>('editorIsOpen', false); export const InZenModeContext = new RawContextKey<boolean>('inZenMode', false); @@ -618,7 +618,7 @@ export class Workbench implements IPartService { serviceCollection.set(ISCMService, new SyncDescriptor(SCMService)); // Inactive extension URL handler - serviceCollection.set(IInactiveExtensionUrlHandler, new SyncDescriptor(InactiveExtensionUrlHandler)); + serviceCollection.set(IExtensionUrlHandler, new SyncDescriptor(ExtensionUrlHandler)); // Text Model Resolver Service serviceCollection.set(ITextModelService, new SyncDescriptor(TextModelResolverService)); From 77082177dbc8a6903fac45ef7c488eb8db198e3f Mon Sep 17 00:00:00 2001 From: Dirk Baeumer <dirkb@microsoft.com> Date: Mon, 23 Apr 2018 16:53:57 +0200 Subject: [PATCH 656/710] Fixes #48404: Perfer language packs over built in languages even for core languages --- src/main.js | 191 ++++++++++++++++++++++++++-------------------------- 1 file changed, 96 insertions(+), 95 deletions(-) diff --git a/src/main.js b/src/main.js index 1dcd38660cd..beeae6f79be 100644 --- a/src/main.js +++ b/src/main.js @@ -280,111 +280,112 @@ function getNLSConfiguration(locale) { return undefined; } - let isCoreLanguage = true; - if (locale) { - isCoreLanguage = ['de', 'es', 'fr', 'it', 'ja', 'ko', 'ru', 'zh-cn', 'zh-tw'].some((language) => { - return locale === language || locale.startsWith(language + '-'); - }); - } - - if (isCoreLanguage) { - return Promise.resolve(resolveLocale(locale)); - } else { - perf.mark('nlsGeneration:start'); - let defaultResult = function() { + perf.mark('nlsGeneration:start'); + let defaultResult = function(locale) { + let isCoreLanguage = true; + if (locale) { + isCoreLanguage = ['de', 'es', 'fr', 'it', 'ja', 'ko', 'ru', 'zh-cn', 'zh-tw'].some((language) => { + return locale === language || locale.startsWith(language + '-'); + }); + } + if (isCoreLanguage) { + let result = resolveLocale(locale); + perf.mark('nlsGeneration:end'); + return Promise.resolve(result); + } else { perf.mark('nlsGeneration:end'); return Promise.resolve({ locale: locale, availableLanguages: {} }); - }; - try { - let commit = getCommit(); - if (!commit) { - return defaultResult(); + } + }; + try { + let commit = getCommit(); + if (!commit) { + return defaultResult(locale); + } + let configs = getLanguagePackConfigurations(); + if (!configs) { + return defaultResult(locale); + } + let initialLocale = locale; + locale = resolveLanguagePackLocale(configs, locale); + if (!locale) { + return defaultResult(initialLocale); + } + let packConfig = configs[locale]; + let mainPack; + if (!packConfig || typeof packConfig.hash !== 'string' || !packConfig.translations || typeof (mainPack = packConfig.translations['vscode']) !== 'string') { + return defaultResult(locale); + } + return exists(mainPack).then((fileExists) => { + if (!fileExists) { + return defaultResult(locale); } - let configs = getLanguagePackConfigurations(); - if (!configs) { - return defaultResult(); - } - let initialLocale = locale; - locale = resolveLanguagePackLocale(configs, locale); - if (!locale) { - return defaultResult(); - } - let packConfig = configs[locale]; - let mainPack; - if (!packConfig || typeof packConfig.hash !== 'string' || !packConfig.translations || typeof (mainPack = packConfig.translations['vscode']) !== 'string') { - return defaultResult(); - } - return exists(mainPack).then((fileExists) => { - if (!fileExists) { - return defaultResult(); + let packId = packConfig.hash + '.' + locale; + let cacheRoot = path.join(userData, 'clp', packId); + let coreLocation = path.join(cacheRoot, commit); + let translationsConfigFile = path.join(cacheRoot, 'tcf.json'); + let result = { + locale: initialLocale, + availableLanguages: { '*': locale }, + _languagePackId: packId, + _translationsConfigFile: translationsConfigFile, + _cacheRoot: cacheRoot, + _resolvedLanguagePackCoreLocation: coreLocation + }; + return exists(coreLocation).then((fileExists) => { + if (fileExists) { + // We don't wait for this. No big harm if we can't touch + touch(coreLocation).catch(() => {}); + perf.mark('nlsGeneration:end'); + return result; } - let packId = packConfig.hash + '.' + locale; - let cacheRoot = path.join(userData, 'clp', packId); - let coreLocation = path.join(cacheRoot, commit); - let translationsConfigFile = path.join(cacheRoot, 'tcf.json'); - let result = { - locale: initialLocale, - availableLanguages: { '*': locale }, - _languagePackId: packId, - _translationsConfigFile: translationsConfigFile, - _cacheRoot: cacheRoot, - _resolvedLanguagePackCoreLocation: coreLocation - }; - return exists(coreLocation).then((fileExists) => { - if (fileExists) { - // We don't wait for this. No big harm if we can't touch - touch(coreLocation).catch(() => {}); - perf.mark('nlsGeneration:end'); - return result; - } - return mkdirp(coreLocation).then(() => { - return Promise.all([readFile(path.join(__dirname, 'nls.metadata.json')), readFile(mainPack)]); - }).then((values) => { - let metadata = JSON.parse(values[0]); - let packData = JSON.parse(values[1]).contents; - let bundles = Object.keys(metadata.bundles); - let writes = []; - for (let bundle of bundles) { - let modules = metadata.bundles[bundle]; - let target = Object.create(null); - for (let module of modules) { - let keys = metadata.keys[module]; - let defaultMessages = metadata.messages[module]; - let translations = packData[module]; - let targetStrings; - if (translations) { - targetStrings = []; - for (let i = 0; i < keys.length; i++) { - let elem = keys[i]; - let key = typeof elem === 'string' ? elem : elem.key; - let translatedMessage = translations[key]; - if (translatedMessage === undefined) { - translatedMessage = defaultMessages[i]; - } - targetStrings.push(translatedMessage); + return mkdirp(coreLocation).then(() => { + return Promise.all([readFile(path.join(__dirname, 'nls.metadata.json')), readFile(mainPack)]); + }).then((values) => { + let metadata = JSON.parse(values[0]); + let packData = JSON.parse(values[1]).contents; + let bundles = Object.keys(metadata.bundles); + let writes = []; + for (let bundle of bundles) { + let modules = metadata.bundles[bundle]; + let target = Object.create(null); + for (let module of modules) { + let keys = metadata.keys[module]; + let defaultMessages = metadata.messages[module]; + let translations = packData[module]; + let targetStrings; + if (translations) { + targetStrings = []; + for (let i = 0; i < keys.length; i++) { + let elem = keys[i]; + let key = typeof elem === 'string' ? elem : elem.key; + let translatedMessage = translations[key]; + if (translatedMessage === undefined) { + translatedMessage = defaultMessages[i]; } - } else { - targetStrings = defaultMessages; + targetStrings.push(translatedMessage); } - target[module] = targetStrings; + } else { + targetStrings = defaultMessages; } - writes.push(writeFile(path.join(coreLocation, bundle.replace(/\//g, '!') + '.nls.json'), JSON.stringify(target))); + target[module] = targetStrings; } - writes.push(writeFile(translationsConfigFile, JSON.stringify(packConfig.translations))); - return Promise.all(writes); - }).then(() => { - perf.mark('nlsGeneration:end'); - return result; - }).catch((err) => { - console.error('Generating translation files failed.', err); - return defaultResult(); - }); + writes.push(writeFile(path.join(coreLocation, bundle.replace(/\//g, '!') + '.nls.json'), JSON.stringify(target))); + } + writes.push(writeFile(translationsConfigFile, JSON.stringify(packConfig.translations))); + return Promise.all(writes); + }).then(() => { + perf.mark('nlsGeneration:end'); + return result; + }).catch((err) => { + console.error('Generating translation files failed.', err); + return defaultResult(locale); }); }); - } catch (err) { - console.error('Generating translation files failed.', err); - return defaultResult(); - } + }); + } catch (err) { + console.error('Generating translation files failed.', err); + return defaultResult(locale); } } From 3b951162e9c81191dacfa7538925390c0061ea9e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Mon, 23 Apr 2018 16:35:42 +0200 Subject: [PATCH 657/710] :lipstick: --- src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts index a340cf290ad..1cdced5ea47 100644 --- a/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsContainersExtensionPoint.ts @@ -79,7 +79,7 @@ class ViewsContainersExtensionHandler implements IWorkbenchContribution { for (let extension of extensions) { const { value, collector } = extension; if (!extension.description.enableProposedApi) { - collector.error(localize({ key: 'proposed', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "'{0}' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {1}", 'viewsContainer', extension.description.id)); + collector.error(localize({ key: 'proposed', comment: ['Contribution refers to those that an extension contributes to VS Code through an extension/contribution point. '] }, "'viewsContainer' contribution is only available when running out of dev or with the following command line switch: --enable-proposed-api {0}", extension.description.id)); continue; } forEach(value, entry => { From df0cd9fc4e73253c964401c71200364084490d8e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Mon, 23 Apr 2018 17:06:55 +0200 Subject: [PATCH 658/710] Fix #48207 --- src/vs/workbench/browser/parts/compositebar/compositeBar.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts index ac68fe3ff8e..cb576934bac 100644 --- a/src/vs/workbench/browser/parts/compositebar/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositebar/compositeBar.ts @@ -140,6 +140,7 @@ export class CompositeBar implements ICompositeBar { this.activeCompositeId = undefined; } if (this.activeUnpinnedCompositeId === id) { + this.updateCompositeSwitcher(); this.activeUnpinnedCompositeId = undefined; } } From 00b0acb9fd237042e15e27c4264f68d1bbf90884 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 17:20:31 +0200 Subject: [PATCH 659/710] more jsdoc, #47475 --- src/vs/vscode.proposed.d.ts | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 4015a72c944..f0e96338258 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -189,11 +189,15 @@ declare module 'vscode' { } /** - * loose notes: - * -activation event `onFileSystem:foo`, - * -paths are hierarchical and the identifier of a file - * -use posix-path-math - * -etc... + * The filesystem provider defines what the editor needs to read, write, discover, + * and to manage files and folders. It allows extensions to serve files from remote places, + * like ftp-servers, and to seamlessly integrate those into the editor. + * + * * *Note 1:* The filesystem provider API works with [uris](#Uri) and assumes hierarchical + * paths, e.g. `foo:/my/path` is a child of `foo:/my/` and a parent of `foo:/my/path/deeper`. + * * *Note 2:* There is an activation event `onFileSystem:<scheme>` that fires when a file + * or folder is being accessed. + * */ export interface FileSystemProvider { @@ -286,6 +290,17 @@ declare module 'vscode' { } export namespace workspace { + /** + * Register a filesystem provider for a given scheme, e.g. `ftp`. + * + * There can only be one provider per scheme and an error is being thrown when a scheme + * has been claimed by another provider or when it is reserved. + * + * @param scheme The uri-[scheme](#Uri.scheme) the provider registers for. + * @param provider The filesystem provider. + * @param options Immutable metadata about the provider. + * @return A [disposable](#Disposable) that unregisters this provider when being disposed. + */ export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options: { isCaseSensitive?: boolean }): Disposable; } From bf6155555d6276ce479b3cfafaff4f3a62073ef2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 17:32:10 +0200 Subject: [PATCH 660/710] talk about `File`, not `Entry` #47475 --- src/vs/vscode.proposed.d.ts | 8 ++++---- src/vs/workbench/api/node/extHostTypes.ts | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index f0e96338258..40c99e7bcd2 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -65,26 +65,26 @@ declare module 'vscode' { * Create an error to signal that a file or folder wasn't found. * @param messageOrUri Message or uri. */ - static EntryNotFound(messageOrUri?: string | Uri): FileSystemError; + static FileNotFound(messageOrUri?: string | Uri): FileSystemError; /** * Create an error to signal that a file or folder already exists, e.g. when * creating but not overwriting a file. * @param messageOrUri Message or uri. */ - static EntryExists(messageOrUri?: string | Uri): FileSystemError; + static FileExists(messageOrUri?: string | Uri): FileSystemError; /** * Create an error to signal that a file is not a folder. * @param messageOrUri Message or uri. */ - static EntryNotADirectory(messageOrUri?: string | Uri): FileSystemError; + static FileNotADirectory(messageOrUri?: string | Uri): FileSystemError; /** * Create an error to signal that a file is a folder. * @param messageOrUri Message or uri. */ - static EntryIsADirectory(messageOrUri?: string | Uri): FileSystemError; + static FileIsADirectory(messageOrUri?: string | Uri): FileSystemError; /** * Creates a new filesystem error. diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 731189500ed..b1cb67d05c0 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1866,17 +1866,17 @@ export enum DeprecatedFileType { export class FileSystemError extends Error { - static EntryExists(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryExists', FileSystemError.EntryExists); + static FileExists(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryExists', FileSystemError.FileExists); } - static EntryNotFound(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryNotFound', FileSystemError.EntryNotFound); + static FileNotFound(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryNotFound', FileSystemError.FileNotFound); } - static EntryNotADirectory(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryNotADirectory', FileSystemError.EntryNotADirectory); + static FileNotADirectory(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryNotADirectory', FileSystemError.FileNotADirectory); } - static EntryIsADirectory(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryIsADirectory', FileSystemError.EntryIsADirectory); + static FileIsADirectory(messageOrUri?: string | URI): FileSystemError { + return new FileSystemError(messageOrUri, 'EntryIsADirectory', FileSystemError.FileIsADirectory); } constructor(uriOrMessage?: string | URI, code?: string, terminator?: Function) { From dc0be2064c781bba142b67e750f3f1020fe0d2be Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Mon, 23 Apr 2018 17:48:22 +0200 Subject: [PATCH 661/710] move filesystem provider api to stable, #47475 --- src/vs/vscode.d.ts | 248 +++++++++++++++++ src/vs/vscode.proposed.d.ts | 255 ------------------ src/vs/workbench/api/node/extHost.api.impl.ts | 4 +- 3 files changed, 250 insertions(+), 257 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 93650ca4d4c..01ad4607951 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4820,6 +4820,241 @@ declare module 'vscode' { resolveTask(task: Task, token?: CancellationToken): ProviderResult<Task>; } + /** + * The `FileStat`-type represents metadata about a file. + */ + export interface FileStat { + /** + * The file is a regular file. + */ + isFile?: boolean; + + /** + * The file is a directory. + */ + isDirectory?: boolean; + + /** + * The file is symbolic link to another file. + */ + isSymbolicLink?: boolean; + + /** + * The modification timestamp in milliseconds. + */ + mtime: number; + + /** + * The size in bytes. + */ + size: number; + } + + /** + * A type that filesystem providers should use to signal errors. + * + * This class has factory methods for common error-cases, like `EntryNotFound` when + * a file or folder doesn't exist, use them like so: `throw vscode.FileSystemError.EntryNotFound(someUri);` + */ + export class FileSystemError extends Error { + + /** + * Create an error to signal that a file or folder wasn't found. + * @param messageOrUri Message or uri. + */ + static FileNotFound(messageOrUri?: string | Uri): FileSystemError; + + /** + * Create an error to signal that a file or folder already exists, e.g. when + * creating but not overwriting a file. + * @param messageOrUri Message or uri. + */ + static FileExists(messageOrUri?: string | Uri): FileSystemError; + + /** + * Create an error to signal that a file is not a folder. + * @param messageOrUri Message or uri. + */ + static FileNotADirectory(messageOrUri?: string | Uri): FileSystemError; + + /** + * Create an error to signal that a file is a folder. + * @param messageOrUri Message or uri. + */ + static FileIsADirectory(messageOrUri?: string | Uri): FileSystemError; + + /** + * Creates a new filesystem error. + * + * @param messageOrUri Message or uri. + */ + constructor(messageOrUri?: string | Uri); + } + + /** + * Enumeration of file change types. + */ + export enum FileChangeType { + + /** + * The contents or metadata of a file have changed. + */ + Changed = 1, + + /** + * A file has been created. + */ + Created = 2, + + /** + * A file has been deleted. + */ + Deleted = 3, + } + + /** + * The event filesystem providers must use to signal a file change. + */ + export interface FileChangeEvent { + + /** + * The type of change. + */ + type: FileChangeType; + + /** + * The uri of the file that has changed. + */ + uri: Uri; + } + /** + * Commonly used options when reading, writing, or stat'ing files or folders. + */ + export interface FileOptions { + + /** + * Create a file when it doesn't exists + */ + create?: boolean; + + /** + * In combination with [`create`](FileOptions.create) but + * the operation should fail when a file already exists. + */ + exclusive?: boolean; + + /** + * Open a file for reading. + */ + read?: boolean; + + /** + * Open a file for writing. + */ + write?: boolean; + } + + /** + * The filesystem provider defines what the editor needs to read, write, discover, + * and to manage files and folders. It allows extensions to serve files from remote places, + * like ftp-servers, and to seamlessly integrate those into the editor. + * + * * *Note 1:* The filesystem provider API works with [uris](#Uri) and assumes hierarchical + * paths, e.g. `foo:/my/path` is a child of `foo:/my/` and a parent of `foo:/my/path/deeper`. + * * *Note 2:* There is an activation event `onFileSystem:<scheme>` that fires when a file + * or folder is being accessed. + * + */ + export interface FileSystemProvider { + + /** + * An event to signal that a resource has been created, changed, or deleted. This + * event should fire for resources that are being [watched](#FileSystemProvider2.watch) + * by clients of this provider. + */ + readonly onDidChangeFile: Event<FileChangeEvent[]>; + + /** + * Subscribe to events in the file or folder denoted by `uri`. + * @param uri + * @param options + */ + watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; + + /** + * Retrieve metadata about a file. Throw an [`EntryNotFound`](#FileError.EntryNotFound)-error + * in case the file does not exist. + * + * @param uri The uri of the file to retrieve meta data about. + * @param token A cancellation token. + * @return The file metadata about the file. + */ + stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat | Thenable<FileStat>; + + /** + * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) + * + * @param uri The uri of the folder. + * @param token A cancellation token. + * @return A thenable that resolves to an array of tuples of file names and files stats. + */ + readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat][] | Thenable<[string, FileStat][]>; + + /** + * Create a new directory. *Note* that new files are created via `write`-calls. + * + * @param uri The uri of the *new* folder. + * @param token A cancellation token. + */ + createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat | Thenable<FileStat>; + + /** + * Read the entire contents of a file. + * + * @param uri The uri of the file. + * @param token A cancellation token. + * @return A thenable that resolves to an array of bytes. + */ + readFile(uri: Uri, options: FileOptions, token: CancellationToken): Uint8Array | Thenable<Uint8Array>; + + /** + * Write data to a file, replacing its entire contents. + * + * @param uri The uri of the file. + * @param content The new content of the file. + * @param token A cancellation token. + */ + writeFile(uri: Uri, content: Uint8Array, options: FileOptions, token: CancellationToken): void | Thenable<void>; + + /** + * Delete a file or folder from the underlying storage. + * + * @param uri The resource that is to be deleted + * @param options Options bag for future use + * @param token A cancellation token. + */ + delete(uri: Uri, options: { /*future: useTrash?, followSymlinks?*/ }, token: CancellationToken): void | Thenable<void>; + + /** + * Rename a file or folder. + * + * @param oldUri The existing file or folder. + * @param newUri The target location. + * @param token A cancellation token. + */ + rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable<FileStat>; + + /** + * Copy files or folders. Implementing this function is optional but it will speedup + * the copy operation. + * + * @param uri The existing file or folder. + * @param target The target location. + * @param token A cancellation token. + */ + copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable<FileStat>; + } + /** * Content settings for a webview. */ @@ -6273,6 +6508,19 @@ declare module 'vscode' { * @return A [disposable](#Disposable) that unregisters this provider when being disposed. */ export function registerTaskProvider(type: string, provider: TaskProvider): Disposable; + + /** + * Register a filesystem provider for a given scheme, e.g. `ftp`. + * + * There can only be one provider per scheme and an error is being thrown when a scheme + * has been claimed by another provider or when it is reserved. + * + * @param scheme The uri-[scheme](#Uri.scheme) the provider registers for. + * @param provider The filesystem provider. + * @param options Immutable metadata about the provider. + * @return A [disposable](#Disposable) that unregisters this provider when being disposed. + */ + export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options: { isCaseSensitive?: boolean }): Disposable; } /** diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 40c99e7bcd2..fee4fe35746 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -51,261 +51,6 @@ declare module 'vscode' { //#endregion - //#region Joh: file system provider (new) - - /** - * A type that filesystem providers should use to signal errors. - * - * This class has factory methods for common error-cases, like `EntryNotFound` when - * a file or folder doesn't exist, use them like so: `throw vscode.FileSystemError.EntryNotFound(someUri);` - */ - export class FileSystemError extends Error { - - /** - * Create an error to signal that a file or folder wasn't found. - * @param messageOrUri Message or uri. - */ - static FileNotFound(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file or folder already exists, e.g. when - * creating but not overwriting a file. - * @param messageOrUri Message or uri. - */ - static FileExists(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file is not a folder. - * @param messageOrUri Message or uri. - */ - static FileNotADirectory(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file is a folder. - * @param messageOrUri Message or uri. - */ - static FileIsADirectory(messageOrUri?: string | Uri): FileSystemError; - - /** - * Creates a new filesystem error. - * - * @param messageOrUri Message or uri. - */ - constructor(messageOrUri?: string | Uri); - } - - /** - * Enumeration of file change types. - */ - export enum FileChangeType { - - /** - * The contents or metadata of a file have changed. - */ - Changed = 1, - - /** - * A file has been created. - */ - Created = 2, - - /** - * A file has been deleted. - */ - Deleted = 3, - } - - /** - * The event filesystem providers must use to signal a file change. - */ - export interface FileChangeEvent { - - /** - * The type of change. - */ - type: FileChangeType; - - /** - * The uri of the file that has changed. - */ - uri: Uri; - } - - /** - * The `FileStat`-type represents metadata about a file. - */ - export interface FileStat { - /** - * The file is a regular file. - */ - isFile?: boolean; - - /** - * The file is a directory. - */ - isDirectory?: boolean; - - /** - * The file is symbolic link to another file. - */ - isSymbolicLink?: boolean; - - /** - * The modification timestamp in milliseconds. - */ - mtime: number; - - /** - * The size in bytes. - */ - size: number; - } - - /** - * Commonly used options when reading, writing, or stat'ing files or folders. - */ - export interface FileOptions { - - /** - * Create a file when it doesn't exists - */ - create?: boolean; - - /** - * In combination with [`create`](FileOptions.create) but - * the operation should fail when a file already exists. - */ - exclusive?: boolean; - - /** - * Open a file for reading. - */ - read?: boolean; - - /** - * Open a file for writing. - */ - write?: boolean; - } - - /** - * The filesystem provider defines what the editor needs to read, write, discover, - * and to manage files and folders. It allows extensions to serve files from remote places, - * like ftp-servers, and to seamlessly integrate those into the editor. - * - * * *Note 1:* The filesystem provider API works with [uris](#Uri) and assumes hierarchical - * paths, e.g. `foo:/my/path` is a child of `foo:/my/` and a parent of `foo:/my/path/deeper`. - * * *Note 2:* There is an activation event `onFileSystem:<scheme>` that fires when a file - * or folder is being accessed. - * - */ - export interface FileSystemProvider { - - /** - * An event to signal that a resource has been created, changed, or deleted. This - * event should fire for resources that are being [watched](#FileSystemProvider2.watch) - * by clients of this provider. - */ - readonly onDidChangeFile: Event<FileChangeEvent[]>; - - /** - * Subscribe to events in the file or folder denoted by `uri`. - * @param uri - * @param options - */ - watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; - - /** - * Retrieve metadata about a file. Throw an [`EntryNotFound`](#FileError.EntryNotFound)-error - * in case the file does not exist. - * - * @param uri The uri of the file to retrieve meta data about. - * @param token A cancellation token. - * @return The file metadata about the file. - */ - stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat | Thenable<FileStat>; - - /** - * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) - * - * @param uri The uri of the folder. - * @param token A cancellation token. - * @return A thenable that resolves to an array of tuples of file names and files stats. - */ - readDirectory(uri: Uri, options: { /*future: onlyType?*/ }, token: CancellationToken): [string, FileStat][] | Thenable<[string, FileStat][]>; - - /** - * Create a new directory. *Note* that new files are created via `write`-calls. - * - * @param uri The uri of the *new* folder. - * @param token A cancellation token. - */ - createDirectory(uri: Uri, options: { /*future: permissions?*/ }, token: CancellationToken): FileStat | Thenable<FileStat>; - - /** - * Read the entire contents of a file. - * - * @param uri The uri of the file. - * @param token A cancellation token. - * @return A thenable that resolves to an array of bytes. - */ - readFile(uri: Uri, options: FileOptions, token: CancellationToken): Uint8Array | Thenable<Uint8Array>; - - /** - * Write data to a file, replacing its entire contents. - * - * @param uri The uri of the file. - * @param content The new content of the file. - * @param token A cancellation token. - */ - writeFile(uri: Uri, content: Uint8Array, options: FileOptions, token: CancellationToken): void | Thenable<void>; - - /** - * Delete a file or folder from the underlying storage. - * - * @param uri The resource that is to be deleted - * @param options Options bag for future use - * @param token A cancellation token. - */ - delete(uri: Uri, options: { /*future: useTrash?, followSymlinks?*/ }, token: CancellationToken): void | Thenable<void>; - - /** - * Rename a file or folder. - * - * @param oldUri The existing file or folder. - * @param newUri The target location. - * @param token A cancellation token. - */ - rename(oldUri: Uri, newUri: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable<FileStat>; - - /** - * Copy files or folders. Implementing this function is optional but it will speedup - * the copy operation. - * - * @param uri The existing file or folder. - * @param target The target location. - * @param token A cancellation token. - */ - copy?(uri: Uri, target: Uri, options: FileOptions, token: CancellationToken): FileStat | Thenable<FileStat>; - } - - export namespace workspace { - /** - * Register a filesystem provider for a given scheme, e.g. `ftp`. - * - * There can only be one provider per scheme and an error is being thrown when a scheme - * has been claimed by another provider or when it is reserved. - * - * @param scheme The uri-[scheme](#Uri.scheme) the provider registers for. - * @param provider The filesystem provider. - * @param options Immutable metadata about the provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options: { isCaseSensitive?: boolean }): Disposable; - } - - //#endregion - //#region Joh: remote, search provider export interface TextSearchQuery { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 62407e69d9d..728a0255f68 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -550,9 +550,9 @@ export function createApiFactory( onDidEndTask: (listeners, thisArgs?, disposables?) => { return extHostTask.onDidEndTask(listeners, thisArgs, disposables); }, - registerFileSystemProvider: proposedApiFunction(extension, (scheme, provider, options) => { + registerFileSystemProvider(scheme, provider, options) { return extHostFileSystem.registerFileSystemProvider(scheme, provider, options); - }), + }, registerDeprecatedFileSystemProvider: proposedApiFunction(extension, (scheme, provider) => { return extHostFileSystem.registerDeprecatedFileSystemProvider(scheme, provider); }), From 306390b79dbe075cd8e54f01304e01a68cd468ba Mon Sep 17 00:00:00 2001 From: Rachel Macfarlane <ramacfar@microsoft.com> Date: Mon, 23 Apr 2018 09:26:31 -0700 Subject: [PATCH 662/710] Update issue template to mention feature requests --- .github/issue_template.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/issue_template.md b/.github/issue_template.md index b1a98a132ec..72e663ea733 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,4 +1,8 @@ -<!-- Do you have a question? Please ask it on https://stackoverflow.com/questions/tagged/vscode. --> +<!-- +Do you have a question? Please ask it on https://stackoverflow.com/questions/tagged/vscode. + +For bug reports, please fill in the details below. For feature requests, please describe the desired feature. +--> <!-- Use Help > Report Issue to prefill these. --> - VSCode Version: From 7e343b00ca929fd1e3818293fe1c52a6523a25ce Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Mon, 23 Apr 2018 10:01:04 -0700 Subject: [PATCH 663/710] Fix webview not firing viewStateChange events when it is first created --- src/vs/workbench/api/electron-browser/mainThreadWebview.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 501549b3bbc..109cc18b03c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -80,6 +80,7 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv }; this._webviews.set(handle, webview); + this._activeWebview = handle; } $disposeWebview(handle: WebviewPanelHandle): void { From e0a44567231d9c28725cf482b6e3c0bf2c7c0ab1 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Mon, 23 Apr 2018 10:12:43 -0700 Subject: [PATCH 664/710] Make sure we fire view state updates when changing the webview position #48246 --- src/vs/workbench/api/electron-browser/mainThreadWebview.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index 109cc18b03c..08911045ce0 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -208,7 +208,8 @@ export class MainThreadWebviews implements MainThreadWebviewsShape, WebviewReviv } if (newActiveWebview && newActiveWebview.handle === this._activeWebview) { - // No change + // Webview itself unchanged but position may have changed + this._proxy.$onDidChangeWebviewPanelViewState(newActiveWebview.handle, true, newActiveWebview.input.position); return; } From 6527ca299ef4e7360f1f6d0274219998dd3a0e46 Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Mon, 23 Apr 2018 11:30:16 -0700 Subject: [PATCH 665/710] Fix #48282 - increase size of search history buffer and add "Clear search history" command --- src/vs/base/common/history.ts | 5 ++ src/vs/base/test/common/history.test.ts | 55 +++++++++++-------- .../search/browser/patternInputWidget.ts | 8 ++- .../parts/search/browser/searchActions.ts | 10 +++- .../parts/search/browser/searchView.ts | 21 +++++-- .../parts/search/browser/searchWidget.ts | 7 ++- .../parts/search/common/constants.ts | 1 + .../electron-browser/search.contribution.ts | 15 ++++- 8 files changed, 87 insertions(+), 35 deletions(-) diff --git a/src/vs/base/common/history.ts b/src/vs/base/common/history.ts index bf71cca3ef1..b9993be4f3f 100644 --- a/src/vs/base/common/history.ts +++ b/src/vs/base/common/history.ts @@ -65,6 +65,11 @@ export class HistoryNavigator<T> implements INavigator<T> { return this._navigator.last(); } + public clear(): void { + this._initialize([]); + this._onChange(); + } + private _onChange() { this._reduceToLimit(); this._navigator = new ArrayNavigator(this._elements); diff --git a/src/vs/base/test/common/history.test.ts b/src/vs/base/test/common/history.test.ts index f8f3b388d3b..4cf1324146f 100644 --- a/src/vs/base/test/common/history.test.ts +++ b/src/vs/base/test/common/history.test.ts @@ -9,36 +9,36 @@ import { HistoryNavigator } from 'vs/base/common/history'; suite('History Navigator', () => { - test('create reduces the input to limit', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 2); + test('create reduces the input to limit', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 2); assert.deepEqual(['3', '4'], toArray(testObject)); }); - test('create sets the position to last', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('create sets the position to last', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); assert.equal('4', testObject.current()); assert.equal(null, testObject.next()); assert.equal('3', testObject.previous()); }); - test('last returns last element', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('last returns last element', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); testObject.first(); assert.equal('4', testObject.last()); }); - test('first returns first element', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('first returns first element', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); assert.equal('2', testObject.first()); }); - test('next returns next element', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('next returns next element', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); testObject.first(); @@ -47,16 +47,16 @@ suite('History Navigator', () => { assert.equal(null, testObject.next()); }); - test('previous returns previous element', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('previous returns previous element', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); assert.equal('3', testObject.previous()); assert.equal('2', testObject.previous()); assert.equal(null, testObject.previous()); }); - test('next on last element returs null and remains on last', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('next on last element returs null and remains on last', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); testObject.first(); testObject.last(); @@ -65,8 +65,8 @@ suite('History Navigator', () => { assert.equal(null, testObject.next()); }); - test('previous on first element returs null and remains on first', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('previous on first element returs null and remains on first', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); testObject.first(); @@ -74,24 +74,24 @@ suite('History Navigator', () => { assert.equal(null, testObject.previous()); }); - test('add reduces the input to limit', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 2); + test('add reduces the input to limit', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 2); testObject.add('5'); assert.deepEqual(['4', '5'], toArray(testObject)); }); - test('adding existing element changes the position', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 5); + test('adding existing element changes the position', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 5); testObject.add('2'); assert.deepEqual(['1', '3', '4', '2'], toArray(testObject)); }); - test('add resets the navigator to last', function () { - let testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); + test('add resets the navigator to last', () => { + const testObject = new HistoryNavigator(['1', '2', '3', '4'], 3); testObject.first(); testObject.add('5'); @@ -100,14 +100,21 @@ suite('History Navigator', () => { assert.equal(null, testObject.next()); }); - test('adding an existing item changes the order', function () { - let testObject = new HistoryNavigator(['1', '2', '3']); + test('adding an existing item changes the order', () => { + const testObject = new HistoryNavigator(['1', '2', '3']); testObject.add('1'); assert.deepEqual(['2', '3', '1'], toArray(testObject)); }); + test('clear', () => { + const testObject = new HistoryNavigator(['a', 'b', 'c']); + assert.equal('c', testObject.current()); + testObject.clear(); + assert.equal(undefined, testObject.current()); + }); + function toArray(historyNavigator: HistoryNavigator<string>): string[] { let result = []; historyNavigator.first(); diff --git a/src/vs/workbench/parts/search/browser/patternInputWidget.ts b/src/vs/workbench/parts/search/browser/patternInputWidget.ts index 2b900f9f3c9..d58686be4c2 100644 --- a/src/vs/workbench/parts/search/browser/patternInputWidget.ts +++ b/src/vs/workbench/parts/search/browser/patternInputWidget.ts @@ -21,6 +21,8 @@ export interface IOptions { width?: number; validation?: IInputValidator; ariaLabel?: string; + history?: string[]; + historyLimit?: number; } export class PatternInputWidget extends Widget { @@ -47,7 +49,7 @@ export class PatternInputWidget extends Widget { constructor(parent: HTMLElement, private contextViewProvider: IContextViewProvider, protected themeService: IThemeService, options: IOptions = Object.create(null)) { super(); - this.history = new HistoryNavigator<string>(); + this.history = new HistoryNavigator<string>(options.history || [], options.historyLimit); this.onOptionChange = null; this.width = options.width || 100; this.placeholder = options.placeholder || ''; @@ -123,8 +125,8 @@ export class PatternInputWidget extends Widget { return this.history.getHistory(); } - public setHistory(history: string[]) { - this.history = new HistoryNavigator<string>(history); + public clearHistory(): void { + this.history.clear(); } public onSearchSubmit(): void { diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index 2b42bba2c68..a7ae367a32b 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -750,7 +750,7 @@ function allFolderMatchesToString(folderMatches: FolderMatch[], maxMatches: numb return folderResults.join(lineDelimiter + lineDelimiter); } -export const copyAllCommand: ICommandHandler = (accessor) => { +export const copyAllCommand: ICommandHandler = accessor => { const viewletService = accessor.get(IViewletService); const panelService = accessor.get(IPanelService); const clipboardService = accessor.get(IClipboardService); @@ -761,3 +761,11 @@ export const copyAllCommand: ICommandHandler = (accessor) => { const text = allFolderMatchesToString(root.folderMatches(), maxClipboardMatches); clipboardService.writeText(text); }; + +export const clearHistoryCommand: ICommandHandler = accessor => { + const viewletService = accessor.get(IViewletService); + const panelService = accessor.get(IPanelService); + const searchView = getSearchView(viewletService, panelService); + + searchView.clearHistory(); +}; diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/parts/search/browser/searchView.ts index f367e4aae41..a2aab9a43d0 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/parts/search/browser/searchView.ts @@ -65,6 +65,8 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; export class SearchView extends Viewlet implements IViewlet, IPanel { + private static readonly MAX_HISTORY_ITEMS = 100; + private static readonly MAX_TEXT_RESULTS = 10000; private static readonly SHOW_REPLACE_STORAGE_KEY = 'vs.search.show.replace'; @@ -240,11 +242,12 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { builder.element('h4', { text: title }); this.inputPatternIncludes = new PatternInputWidget(builder.getContainer(), this.contextViewService, this.themeService, { - ariaLabel: nls.localize('label.includes', 'Search Include Patterns') + ariaLabel: nls.localize('label.includes', 'Search Include Patterns'), + history: patternIncludesHistory, + historyLimit: SearchView.MAX_HISTORY_ITEMS }); this.inputPatternIncludes.setValue(patternIncludes); - this.inputPatternIncludes.setHistory(patternIncludesHistory); this.inputPatternIncludes .on(FindInput.OPTION_CHANGE, (e) => { @@ -262,12 +265,13 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { builder.element('h4', { text: title }); this.inputPatternExcludes = new ExcludePatternInputWidget(builder.getContainer(), this.contextViewService, this.themeService, { - ariaLabel: nls.localize('label.excludes', 'Search Exclude Patterns') + ariaLabel: nls.localize('label.excludes', 'Search Exclude Patterns'), + history: patternExclusionsHistory, + historyLimit: SearchView.MAX_HISTORY_ITEMS }); this.inputPatternExcludes.setValue(patternExclusions); this.inputPatternExcludes.setUseExcludesAndIgnoreFiles(useExcludesAndIgnoreFiles); - this.inputPatternExcludes.setHistory(patternExclusionsHistory); this.inputPatternExcludes .on(FindInput.OPTION_CHANGE, (e) => { @@ -333,7 +337,8 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { isRegex: isRegex, isCaseSensitive: isCaseSensitive, isWholeWords: isWholeWords, - history: searchHistory + history: searchHistory, + historyLimit: SearchView.MAX_HISTORY_ITEMS }); if (this.storageService.getBoolean(SearchView.SHOW_REPLACE_STORAGE_KEY, StorageScope.WORKSPACE, true)) { @@ -1500,6 +1505,12 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.updateTitleArea(); } + public clearHistory(): void { + this.searchWidget.clearHistory(); + this.inputPatternExcludes.clearHistory(); + this.inputPatternIncludes.clearHistory(); + } + public shutdown(): void { const isRegex = this.searchWidget.searchInput.getRegex(); const isWholeWords = this.searchWidget.searchInput.getWholeWords(); diff --git a/src/vs/workbench/parts/search/browser/searchWidget.ts b/src/vs/workbench/parts/search/browser/searchWidget.ts index 4c4edcbcd6e..0b79c602d5b 100644 --- a/src/vs/workbench/parts/search/browser/searchWidget.ts +++ b/src/vs/workbench/parts/search/browser/searchWidget.ts @@ -39,6 +39,7 @@ export interface ISearchWidgetOptions { isCaseSensitive?: boolean; isWholeWords?: boolean; history?: string[]; + historyLimit?: number; } class ReplaceAllAction extends Action { @@ -127,7 +128,7 @@ export class SearchWidget extends Widget { @IConfigurationService private configurationService: IConfigurationService ) { super(); - this.searchHistory = new HistoryNavigator<string>(options.history); + this.searchHistory = new HistoryNavigator<string>(options.history, options.historyLimit); this.replaceActive = Constants.ReplaceActiveKey.bindTo(this.keyBindingService); this.searchInputBoxFocused = Constants.SearchInputBoxFocusedKey.bindTo(this.keyBindingService); this.replaceInputBoxFocused = Constants.ReplaceInputBoxFocusedKey.bindTo(this.keyBindingService); @@ -179,6 +180,10 @@ export class SearchWidget extends Widget { return this.searchHistory.getHistory(); } + public clearHistory(): void { + this.searchHistory.clear(); + } + public showNextSearchTerm() { let next = this.searchHistory.next(); if (next) { diff --git a/src/vs/workbench/parts/search/common/constants.ts b/src/vs/workbench/parts/search/common/constants.ts index b8ca4a9aa84..39abb302748 100644 --- a/src/vs/workbench/parts/search/common/constants.ts +++ b/src/vs/workbench/parts/search/common/constants.ts @@ -15,6 +15,7 @@ export const RemoveActionId = 'search.action.remove'; export const CopyPathCommandId = 'search.action.copyPath'; export const CopyMatchCommandId = 'search.action.copyMatch'; export const CopyAllCommandId = 'search.action.copyAll'; +export const ClearSearchHistoryCommandId = 'search.action.clearHistory'; export const ReplaceActionId = 'search.action.replace'; export const ReplaceAllInFileActionId = 'search.action.replaceAllInFile'; export const ReplaceAllInFolderActionId = 'search.action.replaceAllInFolder'; diff --git a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts index b575b602528..c9c92f4e17a 100644 --- a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/electron-browser/search.contribution.ts @@ -53,7 +53,7 @@ import { getMultiSelectedResources } from 'vs/workbench/parts/files/browser/file import { Schemas } from 'vs/base/common/network'; import { PanelRegistry, Extensions as PanelExtensions, PanelDescriptor } from 'vs/workbench/browser/panel'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { openSearchView, getSearchView, ReplaceAllInFolderAction, ReplaceAllAction, CloseReplaceAction, FocusNextInputAction, FocusPreviousInputAction, FocusNextSearchResultAction, FocusPreviousSearchResultAction, ReplaceInFilesAction, FindInFilesAction, FocusActiveEditorCommand, toggleCaseSensitiveCommand, ShowNextSearchTermAction, ShowPreviousSearchTermAction, toggleRegexCommand, ShowPreviousSearchIncludeAction, ShowNextSearchIncludeAction, CollapseDeepestExpandedLevelAction, toggleWholeWordCommand, RemoveAction, ReplaceAction, ClearSearchResultsAction, copyPathCommand, copyMatchCommand, copyAllCommand, ShowNextSearchExcludeAction, ShowPreviousSearchExcludeAction } from 'vs/workbench/parts/search/browser/searchActions'; +import { openSearchView, getSearchView, ReplaceAllInFolderAction, ReplaceAllAction, CloseReplaceAction, FocusNextInputAction, FocusPreviousInputAction, FocusNextSearchResultAction, FocusPreviousSearchResultAction, ReplaceInFilesAction, FindInFilesAction, FocusActiveEditorCommand, toggleCaseSensitiveCommand, ShowNextSearchTermAction, ShowPreviousSearchTermAction, toggleRegexCommand, ShowPreviousSearchIncludeAction, ShowNextSearchIncludeAction, CollapseDeepestExpandedLevelAction, toggleWholeWordCommand, RemoveAction, ReplaceAction, ClearSearchResultsAction, copyPathCommand, copyMatchCommand, copyAllCommand, ShowNextSearchExcludeAction, ShowPreviousSearchExcludeAction, clearHistoryCommand } from 'vs/workbench/parts/search/browser/searchActions'; import { VIEW_ID, ISearchConfigurationProperties } from 'vs/platform/search/common/search'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; @@ -291,6 +291,19 @@ CommandsRegistry.registerCommand({ handler: copyAllCommand }); +CommandsRegistry.registerCommand({ + id: Constants.ClearSearchHistoryCommandId, + handler: clearHistoryCommand +}); + +const clearSearchHistoryLabel = nls.localize('clearSearchHistoryLabel', "Clear Search History"); +const ClearSearchHistoryCommand: ICommandAction = { + id: Constants.ClearSearchHistoryCommandId, + title: clearSearchHistoryLabel, + category +}; +MenuRegistry.addCommand(ClearSearchHistoryCommand); + CommandsRegistry.registerCommand({ id: Constants.ToggleSearchViewPositionCommandId, handler: (accessor) => { From 6d6585a2130300a51721fbe89d8f5c17b93e6611 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao <ramyar@microsoft.com> Date: Mon, 23 Apr 2018 11:53:57 -0700 Subject: [PATCH 666/710] Bug fix from emmet helper --- extensions/emmet/package.json | 2 +- extensions/emmet/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 024c94d10da..1f08cd37111 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -444,7 +444,7 @@ "@emmetio/html-matcher": "^0.3.3", "@emmetio/css-parser": "ramya-rao-a/css-parser#vscode", "@emmetio/math-expression": "^0.1.1", - "vscode-emmet-helper": "^1.2.6", + "vscode-emmet-helper": "^1.2.7", "vscode-languageserver-types": "^3.5.0", "image-size": "^0.5.2", "vscode-nls": "3.2.1" diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock index 90db3c63673..a2825a65b1d 100644 --- a/extensions/emmet/yarn.lock +++ b/extensions/emmet/yarn.lock @@ -2052,9 +2052,9 @@ vinyl@~2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vscode-emmet-helper@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.6.tgz#6cc7293765af7136d409d0d62ef17c66e8b9cf45" +vscode-emmet-helper@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/vscode-emmet-helper/-/vscode-emmet-helper-1.2.7.tgz#603505fd59393fbbaf799086203cdfb8bad953d0" dependencies: "@emmetio/extract-abbreviation" "0.1.6" jsonc-parser "^1.0.0" From 9ce5816cc30ee24de47ef8313c202416b7406d68 Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Mon, 23 Apr 2018 13:54:49 -0700 Subject: [PATCH 667/710] Fix #46733 - context menu opens search menu --- src/vs/platform/list/browser/listService.ts | 2 +- src/vs/workbench/parts/search/browser/searchResultsView.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 541c6ce3b34..f59e23ce4ce 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -480,7 +480,7 @@ export class TreeResourceNavigator extends Disposable { const isMouseEvent = payload && payload.origin === 'mouse'; const isDoubleClick = isMouseEvent && originalEvent && originalEvent.detail === 2; - if (!isMouseEvent || this.tree.openOnSingleClick || isDoubleClick) { + if (!payload.preventOpenOnFocus && (!isMouseEvent || this.tree.openOnSingleClick || isDoubleClick)) { this._openResource.fire({ editorOptions: { preserveFocus: true, diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/parts/search/browser/searchResultsView.ts index 4515d7d943d..c8bbca11130 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/parts/search/browser/searchResultsView.ts @@ -378,7 +378,7 @@ export class SearchTreeController extends WorkbenchTreeController { this.contextMenu = this.menuService.createMenu(MenuId.SearchContext, tree.contextKeyService); } - tree.setFocus(element); + tree.setFocus(element, { preventOpenOnFocus: true }); const anchor = { x: event.posx, y: event.posy }; this.contextMenuService.showContextMenu({ From d5bf933c27bbfa21d8555e871767617f12ef85f2 Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Mon, 23 Apr 2018 13:57:03 -0700 Subject: [PATCH 668/710] Fix #46733 for markers tree as well --- .../parts/markers/electron-browser/markersTreeController.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/markers/electron-browser/markersTreeController.ts b/src/vs/workbench/parts/markers/electron-browser/markersTreeController.ts index 4ea6240d32a..930f8c9ee45 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersTreeController.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersTreeController.ts @@ -43,7 +43,8 @@ export class Controller extends WorkbenchTreeController { } public onContextMenu(tree: WorkbenchTree, element: any, event: tree.ContextMenuEvent): boolean { - tree.setFocus(element); + tree.setFocus(element, { preventOpenOnFocus: true }); + const actions = this._getMenuActions(tree); if (!actions.length) { return true; From e0617bbf4afd8114b8f325b856c1bbb5be4f2edd Mon Sep 17 00:00:00 2001 From: Pine Wu <octref@gmail.com> Date: Mon, 23 Apr 2018 14:24:20 -0700 Subject: [PATCH 669/710] [css] update service --- extensions/css-language-features/server/package.json | 2 +- extensions/css-language-features/server/yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 97379871be5..fee6cb6868f 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.9-next.10", + "vscode-css-languageservice": "^3.0.9-next.11", "vscode-languageserver": "^4.0.0", "vscode-languageserver-protocol-foldingprovider": "^2.0.0-next.2" }, diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 9cf05dd88ee..6a25dff9f61 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -10,9 +10,9 @@ version "7.0.43" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.43.tgz#a187e08495a075f200ca946079c914e1a5fe962c" -vscode-css-languageservice@^3.0.9-next.10: - version "3.0.9-next.10" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.10.tgz#be73d571221176b43d2c398a4a27f7d38206952d" +vscode-css-languageservice@^3.0.9-next.11: + version "3.0.9-next.11" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.9-next.11.tgz#a71af12086a1b534bd75341306a0046b7d3d22f2" dependencies: vscode-languageserver-types "^3.6.1" vscode-nls "^3.2.1" From 401826a39951b9f7cffad6a571158710f5a027e5 Mon Sep 17 00:00:00 2001 From: Pine Wu <octref@gmail.com> Date: Mon, 23 Apr 2018 14:28:27 -0700 Subject: [PATCH 670/710] Task 2.0.0 --- .../css-language-features/.vscode/launch.json | 4 +- .../css-language-features/.vscode/tasks.json | 44 +++++++------------ extensions/css-language-features/package.json | 2 +- 3 files changed, 19 insertions(+), 31 deletions(-) diff --git a/extensions/css-language-features/.vscode/launch.json b/extensions/css-language-features/.vscode/launch.json index 68f7c70e450..5472c605b69 100644 --- a/extensions/css-language-features/.vscode/launch.json +++ b/extensions/css-language-features/.vscode/launch.json @@ -18,7 +18,7 @@ "stopOnEntry": false, "sourceMaps": true, "outFiles": ["${workspaceFolder}/client/out/**/*.js"], - "preLaunchTask": "npm" + "preLaunchTask": "npm: compile" }, { "name": "Launch Tests", @@ -29,7 +29,7 @@ "stopOnEntry": false, "sourceMaps": true, "outFiles": ["${workspaceFolder}/client/out/test/**/*.js"], - "preLaunchTask": "npm" + "preLaunchTask": "npm: compile" }, { "name": "Attach Language Server", diff --git a/extensions/css-language-features/.vscode/tasks.json b/extensions/css-language-features/.vscode/tasks.json index 9e5593ade83..9984afdba4e 100644 --- a/extensions/css-language-features/.vscode/tasks.json +++ b/extensions/css-language-features/.vscode/tasks.json @@ -1,30 +1,18 @@ -// Available variables which can be used inside of strings. -// ${workspaceFolder}: the root folder of the team -// ${file}: the current opened file -// ${fileBasename}: the current opened file's basename -// ${fileDirname}: the current opened file's dirname -// ${fileExtname}: the current opened file's extension -// ${cwd}: the current working directory of the spawned process - -// A task runner that calls a custom npm script that compiles the extension. { - "version": "0.1.0", - - // we want to run npm - "command": "npm", - - // the command is a shell script - "isShellCommand": true, - - // show the output window only if unrecognized errors occur. - "showOutput": "silent", - - // we run the custom script "compile" as defined in package.json - "args": ["run", "compile"], - - // The tsc compiler is started in watching mode - "isWatching": true, - - // use the standard tsc in watch mode problem matcher to find compile problems in the output. - "problemMatcher": "$tsc-watch" + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "compile", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] } \ No newline at end of file diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 4179c9fef2c..b6662751be0 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -17,7 +17,7 @@ "enableProposedApi": true, "main": "./client/out/cssMain", "scripts": { - "compile": "gulp compile-extension:css-language-features-client & gulp compile-extension:css-language-features-server", + "compile": "gulp compile-extension:css-language-features-client && gulp compile-extension:css-language-features-server", "postinstall": "cd server && yarn install", "install-client-next": "yarn add vscode-languageclient@next" }, From 4e9ef72b73e2ac9d79031199d262e5d15323bc8a Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Mon, 23 Apr 2018 14:28:54 -0700 Subject: [PATCH 671/710] For #46733 - fix npe from 9ce5816 --- src/vs/platform/list/browser/listService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index f59e23ce4ce..bc246f6ed0c 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -480,7 +480,8 @@ export class TreeResourceNavigator extends Disposable { const isMouseEvent = payload && payload.origin === 'mouse'; const isDoubleClick = isMouseEvent && originalEvent && originalEvent.detail === 2; - if (!payload.preventOpenOnFocus && (!isMouseEvent || this.tree.openOnSingleClick || isDoubleClick)) { + const preventOpen = payload && payload.preventOpenOnFocus; + if (!preventOpen && (!isMouseEvent || this.tree.openOnSingleClick || isDoubleClick)) { this._openResource.fire({ editorOptions: { preserveFocus: true, From 00fea432b215dbcf1b8cdef9cf4fd6fc2ae9157e Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Mon, 23 Apr 2018 14:31:34 -0700 Subject: [PATCH 672/710] Fix #43976 - Search: dismissing a search result should move to next result --- src/vs/workbench/parts/search/browser/searchActions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index a7ae367a32b..4d60b042603 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -491,7 +491,9 @@ export abstract class AbstractSearchAndReplaceAction extends Action { // If file match is removed then next element is the next file match while (!!navigator.next() && !(navigator.current() instanceof FileMatch)) { } } else { - navigator.next(); + while (navigator.next() && !(navigator.current() instanceof Match)) { + viewer.expand(navigator.current()); + } } return navigator.current(); } From b3b53e1c11bc7c2902ce7ea37d1603aeb2228dbd Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Mon, 23 Apr 2018 23:28:17 +0200 Subject: [PATCH 673/710] Use correct extension id for zh languages --- .../electron-browser/localizations.contribution.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts index a745f3b7200..742315db0be 100644 --- a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts +++ b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts @@ -115,8 +115,9 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo private getLanguagePackExtension(language: string): TPromise<IGalleryExtension> { return this.localizationService.getLanguageIds(LanguageType.Core) .then(coreLanguages => { - const extensionId = coreLanguages.some(c => c.toLowerCase() === language) ? product.quality !== 'insider' ? `MS-CEINTL.vscode-insiders-language-pack-${language}` : `MS-CEINTL.vscode-language-pack-${language}` : null; - if (extensionId) { + if (coreLanguages.some(c => c.toLowerCase() === language)) { + const extensionIdPrefix = language === 'zh-cn' ? 'zh-hans' : language === 'zh-tw' ? 'zh-hant' : language; + const extensionId = product.quality !== 'insider' ? `MS-CEINTL.vscode-insiders-language-pack-${extensionIdPrefix}` : `MS-CEINTL.vscode-language-pack-${extensionIdPrefix}`; return this.galleryService.query({ names: [extensionId], pageSize: 1 }) .then(result => result.total === 1 ? result.firstPage[0] : null); } From 04e2708ec10feaec863f37c32476f4d25b61e683 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Mon, 23 Apr 2018 23:38:06 +0200 Subject: [PATCH 674/710] Add new locale ids for zh --- src/vs/platform/localizations/node/localizations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/localizations/node/localizations.ts b/src/vs/platform/localizations/node/localizations.ts index 0b9207c60fd..b736df9096d 100644 --- a/src/vs/platform/localizations/node/localizations.ts +++ b/src/vs/platform/localizations/node/localizations.ts @@ -27,7 +27,7 @@ interface ILanguagePack { translations: { [id: string]: string }; } -const systemLanguages: string[] = ['de', 'en', 'en-US', 'es', 'fr', 'it', 'ja', 'ko', 'ru', 'zh-CN', 'zh-TW']; +const systemLanguages: string[] = ['de', 'en', 'en-US', 'es', 'fr', 'it', 'ja', 'ko', 'ru', 'zh-CN', 'zh-Hans', 'zh-TW', 'zh-Hant']; if (product.quality !== 'stable') { systemLanguages.push('hu'); } From 846bd67cdb66422422bded6313206d40a5d7c2de Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Mon, 23 Apr 2018 14:48:31 -0700 Subject: [PATCH 675/710] Fix ReplaceAction test --- .../workbench/parts/search/test/browser/searchActions.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/search/test/browser/searchActions.test.ts b/src/vs/workbench/parts/search/test/browser/searchActions.test.ts index 912ef150a05..47f5db6be49 100644 --- a/src/vs/workbench/parts/search/test/browser/searchActions.test.ts +++ b/src/vs/workbench/parts/search/test/browser/searchActions.test.ts @@ -35,7 +35,7 @@ suite('Search Actions', () => { counter = 0; }); - test('get next element to focus after removing a match when it has next sibling match', function () { + test('get next element to focus after removing a match when it has next sibling file', function () { let fileMatch1 = aFileMatch(); let fileMatch2 = aFileMatch(); let data = [fileMatch1, aMatch(fileMatch1), aMatch(fileMatch1), fileMatch2, aMatch(fileMatch2), aMatch(fileMatch2)]; @@ -45,7 +45,7 @@ suite('Search Actions', () => { let actual = testObject.getElementToFocusAfterRemoved(tree, target); - assert.equal(data[3], actual); + assert.equal(data[4], actual); }); test('get next element to focus after removing a match when it does not have next sibling match', function () { From 9ca84c86354b1709e41eb62afec6993786c2784e Mon Sep 17 00:00:00 2001 From: Rob Lourens <roblourens@gmail.com> Date: Mon, 23 Apr 2018 14:58:54 -0700 Subject: [PATCH 676/710] Bump node-debug2 --- build/builtInExtensions.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/builtInExtensions.json b/build/builtInExtensions.json index 67f4bf70372..2d610acc638 100644 --- a/build/builtInExtensions.json +++ b/build/builtInExtensions.json @@ -6,7 +6,7 @@ }, { "name": "ms-vscode.node-debug2", - "version": "1.23.1", + "version": "1.23.2", "repo": "https://github.com/Microsoft/vscode-node-debug2" } ] From cc7e2819027c143ea8d1186f7d2724235debfd88 Mon Sep 17 00:00:00 2001 From: Bowden <wilkelly@microsoft.com> Date: Thu, 19 Apr 2018 14:29:33 -0700 Subject: [PATCH 677/710] changed package.json scan to look for list of packages instead of just react-native --- .../workbench/parts/stats/node/workspaceStats.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index 686fea24971..fb56bda49b6 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -284,7 +284,18 @@ export class WorkspaceStats implements IWorkbenchContribution { content => { try { const packageJsonContents = JSON.parse(content.value); - return !!(packageJsonContents['dependencies'] && packageJsonContents['dependencies']['react-native']); + let modulesToLookFor = [ + 'react-native', + 'azure-storage' + //add more packages here + ]; + + if (packageJsonContents['dependencies']) { + for (let module of modulesToLookFor) { + tags['workspace.npm.' + module] = packageJsonContents['dependencies'][module] ? true : false; + } + } + return false; } catch (e) { } @@ -294,9 +305,6 @@ export class WorkspaceStats implements IWorkbenchContribution { ); }, err => false); })).then(reactNatives => { - if (reactNatives.indexOf(true) !== -1) { - tags['workspace.reactNative'] = true; - } return tags; }); } From b70d783a4f6d0f45c1e0a27ded12d9ec5331a8e3 Mon Sep 17 00:00:00 2001 From: Bowden <wilkelly@microsoft.com> Date: Thu, 19 Apr 2018 15:52:58 -0700 Subject: [PATCH 678/710] refactored to use async await --- .../parts/stats/node/workspaceStats.ts | 152 ++++++++---------- 1 file changed, 68 insertions(+), 84 deletions(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index fb56bda49b6..94e84048c2c 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -9,7 +9,7 @@ import * as crypto from 'crypto'; import { TPromise } from 'vs/base/common/winjs.base'; import { onUnexpectedError } from 'vs/base/common/errors'; import URI from 'vs/base/common/uri'; -import { IFileService, IFileStat } from 'vs/platform/files/common/files'; +import { IFileService, IFileStat, IResolveFileResult } from 'vs/platform/files/common/files'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -192,7 +192,7 @@ export class WorkspaceStats implements IWorkbenchContribution { "workspace.reactNative" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } } */ - private getWorkspaceTags(configuration: IWindowConfiguration): TPromise<Tags> { + private async getWorkspaceTags(configuration: IWindowConfiguration): TPromise<Tags> { const tags: Tags = Object.create(null); const state = this.contextService.getWorkbenchState(); @@ -223,97 +223,81 @@ export class WorkspaceStats implements IWorkbenchContribution { const folders = !isEmpty ? workspace.folders.map(folder => folder.uri) : this.environmentService.appQuality !== 'stable' && this.findFolders(configuration); if (folders && folders.length && this.fileService) { - return this.fileService.resolveFiles(folders.map(resource => ({ resource }))).then(results => { - const names = (<IFileStat[]>[]).concat(...results.map(result => result.success ? (result.stat.children || []) : [])).map(c => c.name); - const nameSet = names.reduce((s, n) => s.add(n.toLowerCase()), new Set()); + //return + let files: IResolveFileResult[] = await this.fileService.resolveFiles(folders.map(resource => ({ resource }))); + const names = (<IFileStat[]>[]).concat(...files.map(result => result.success ? (result.stat.children || []) : [])).map(c => c.name); + const nameSet = names.reduce((s, n) => s.add(n.toLowerCase()), new Set()); - tags['workspace.grunt'] = nameSet.has('gruntfile.js'); - tags['workspace.gulp'] = nameSet.has('gulpfile.js'); - tags['workspace.jake'] = nameSet.has('jakefile.js'); + tags['workspace.grunt'] = nameSet.has('gruntfile.js'); + tags['workspace.gulp'] = nameSet.has('gulpfile.js'); + tags['workspace.jake'] = nameSet.has('jakefile.js'); - tags['workspace.tsconfig'] = nameSet.has('tsconfig.json'); - tags['workspace.jsconfig'] = nameSet.has('jsconfig.json'); - tags['workspace.config.xml'] = nameSet.has('config.xml'); - tags['workspace.vsc.extension'] = nameSet.has('vsc-extension-quickstart.md'); + tags['workspace.tsconfig'] = nameSet.has('tsconfig.json'); + tags['workspace.jsconfig'] = nameSet.has('jsconfig.json'); + tags['workspace.config.xml'] = nameSet.has('config.xml'); + tags['workspace.vsc.extension'] = nameSet.has('vsc-extension-quickstart.md'); - tags['workspace.ASP5'] = nameSet.has('project.json') && this.searchArray(names, /^.+\.cs$/i); - tags['workspace.sln'] = this.searchArray(names, /^.+\.sln$|^.+\.csproj$/i); - tags['workspace.unity'] = nameSet.has('assets') && nameSet.has('library') && nameSet.has('projectsettings'); - tags['workspace.npm'] = nameSet.has('package.json') || nameSet.has('node_modules'); - tags['workspace.bower'] = nameSet.has('bower.json') || nameSet.has('bower_components'); + tags['workspace.ASP5'] = nameSet.has('project.json') && this.searchArray(names, /^.+\.cs$/i); + tags['workspace.sln'] = this.searchArray(names, /^.+\.sln$|^.+\.csproj$/i); + tags['workspace.unity'] = nameSet.has('assets') && nameSet.has('library') && nameSet.has('projectsettings'); + tags['workspace.npm'] = nameSet.has('package.json') || nameSet.has('node_modules'); + tags['workspace.bower'] = nameSet.has('bower.json') || nameSet.has('bower_components'); - tags['workspace.yeoman.code.ext'] = nameSet.has('vsc-extension-quickstart.md'); + tags['workspace.yeoman.code.ext'] = nameSet.has('vsc-extension-quickstart.md'); - let mainActivity = nameSet.has('mainactivity.cs') || nameSet.has('mainactivity.fs'); - let appDelegate = nameSet.has('appdelegate.cs') || nameSet.has('appdelegate.fs'); - let androidManifest = nameSet.has('androidmanifest.xml'); + let mainActivity = nameSet.has('mainactivity.cs') || nameSet.has('mainactivity.fs'); + let appDelegate = nameSet.has('appdelegate.cs') || nameSet.has('appdelegate.fs'); + let androidManifest = nameSet.has('androidmanifest.xml'); - let platforms = nameSet.has('platforms'); - let plugins = nameSet.has('plugins'); - let www = nameSet.has('www'); - let properties = nameSet.has('properties'); - let resources = nameSet.has('resources'); - let jni = nameSet.has('jni'); + let platforms = nameSet.has('platforms'); + let plugins = nameSet.has('plugins'); + let www = nameSet.has('www'); + let properties = nameSet.has('properties'); + let resources = nameSet.has('resources'); + let jni = nameSet.has('jni'); - if (tags['workspace.config.xml'] && - !tags['workspace.language.cs'] && !tags['workspace.language.vb'] && !tags['workspace.language.aspx']) { - if (platforms && plugins && www) { - tags['workspace.cordova.high'] = true; - } else { - tags['workspace.cordova.low'] = true; + if (tags['workspace.config.xml'] && + !tags['workspace.language.cs'] && !tags['workspace.language.vb'] && !tags['workspace.language.aspx']) { + if (platforms && plugins && www) { + tags['workspace.cordova.high'] = true; + } else { + tags['workspace.cordova.low'] = true; + } + } + + if (mainActivity && properties && resources) { + tags['workspace.xamarin.android'] = true; + } + + if (appDelegate && resources) { + tags['workspace.xamarin.ios'] = true; + } + + if (androidManifest && jni) { + tags['workspace.android.cpp'] = true; + } + + if (nameSet.has('package.json')) { + await TPromise.join(folders.map(async workspaceUri => { + const uri = workspaceUri.with({ path: `${workspaceUri.path !== '/' ? workspaceUri.path : ''}/package.json` }); + //let stats = await this.fileService.resolveFile(uri); + let content = await this.fileService.resolveContent(uri, { acceptTextOnly: true }); + const packageJsonContents = JSON.parse(content.value); + let modulesToLookFor = [ + 'react-native', + 'azure-storage' + //add more packages here + ]; + + if (packageJsonContents['dependencies']) { + for (let module of modulesToLookFor) { + tags['workspace.npm.' + module] = packageJsonContents['dependencies'][module] ? true : false; + } } - } - - if (mainActivity && properties && resources) { - tags['workspace.xamarin.android'] = true; - } - - if (appDelegate && resources) { - tags['workspace.xamarin.ios'] = true; - } - - if (androidManifest && jni) { - tags['workspace.android.cpp'] = true; - } - - if (nameSet.has('package.json')) { - return TPromise.join(folders.map(workspaceUri => { - const uri = workspaceUri.with({ path: `${workspaceUri.path !== '/' ? workspaceUri.path : ''}/package.json` }); - return this.fileService.resolveFile(uri).then(stats => { - return this.fileService.resolveContent(uri, { acceptTextOnly: true }).then( - content => { - try { - const packageJsonContents = JSON.parse(content.value); - let modulesToLookFor = [ - 'react-native', - 'azure-storage' - //add more packages here - ]; - - if (packageJsonContents['dependencies']) { - for (let module of modulesToLookFor) { - tags['workspace.npm.' + module] = packageJsonContents['dependencies'][module] ? true : false; - } - } - return false; - } catch (e) { - - } - return false; - }, - err => false - ); - }, err => false); - })).then(reactNatives => { - return tags; - }); - } - - return tags; - }, error => { onUnexpectedError(error); return null; }); - } else { - return TPromise.as(tags); + })); + } } + return TPromise.as(tags); } private findFolders(configuration: IWindowConfiguration): URI[] { From 1947282c9bcfea68c66e0fd2706ab0e4cd87145a Mon Sep 17 00:00:00 2001 From: Bowden <wilkelly@microsoft.com> Date: Thu, 19 Apr 2018 15:53:28 -0700 Subject: [PATCH 679/710] added remaining azure packages to look for --- src/vs/workbench/parts/stats/node/workspaceStats.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index 94e84048c2c..064a38412e1 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -285,8 +285,17 @@ export class WorkspaceStats implements IWorkbenchContribution { const packageJsonContents = JSON.parse(content.value); let modulesToLookFor = [ 'react-native', - 'azure-storage' - //add more packages here + // Azure service modules + 'azure-gallery', + 'azure-graph', + 'azure-keyvault', + 'azure-monitoring', + 'azure-scheduler', + 'azure-servicefabric', + 'azure-sb', + 'azure-storage', + 'azure-monitor', + 'azure-batch' ]; if (packageJsonContents['dependencies']) { From c27b6e50f168594e64087ca7885ee01430beeb5a Mon Sep 17 00:00:00 2001 From: Bowden <wilkelly@microsoft.com> Date: Thu, 19 Apr 2018 16:07:12 -0700 Subject: [PATCH 680/710] added gdpr tag comments --- src/vs/workbench/parts/stats/node/workspaceStats.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index 064a38412e1..aa3e9d680e7 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -182,6 +182,17 @@ export class WorkspaceStats implements IWorkbenchContribution { "workspace.sln" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.unity" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.react-native" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-gallery" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-graph" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-keyvault" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-monitoring" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-scheduler" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-servicefabric" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-sb" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-storage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-monitor" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-batch" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.bower" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.yeoman.code.ext" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.cordova.high" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, From 762f647d19e2d84073952ced5af3afe2359c2715 Mon Sep 17 00:00:00 2001 From: Bowden <wilkelly@microsoft.com> Date: Fri, 20 Apr 2018 10:14:57 -0700 Subject: [PATCH 681/710] changed packages from azure packages to node server packages --- .../parts/stats/node/workspaceStats.ts | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index aa3e9d680e7..067bfafd210 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -182,17 +182,17 @@ export class WorkspaceStats implements IWorkbenchContribution { "workspace.sln" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.unity" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.express" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.sails" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.koa" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.hapi" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.socket.io" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.restify" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.react" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.react-native" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-gallery" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-graph" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-keyvault" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-monitoring" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-scheduler" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-servicefabric" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-sb" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-storage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-monitor" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.azure-batch" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@angular/core" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.vue" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.aws-sdk" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.bower" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.yeoman.code.ext" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.cordova.high" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, @@ -291,22 +291,23 @@ export class WorkspaceStats implements IWorkbenchContribution { if (nameSet.has('package.json')) { await TPromise.join(folders.map(async workspaceUri => { const uri = workspaceUri.with({ path: `${workspaceUri.path !== '/' ? workspaceUri.path : ''}/package.json` }); - //let stats = await this.fileService.resolveFile(uri); let content = await this.fileService.resolveContent(uri, { acceptTextOnly: true }); const packageJsonContents = JSON.parse(content.value); let modulesToLookFor = [ + // Packages that suggest a node server + 'express', + 'sails', + 'koa', + 'hapi', + 'socket.io', + 'restify', + // JS frameworks + 'react', 'react-native', - // Azure service modules - 'azure-gallery', - 'azure-graph', - 'azure-keyvault', - 'azure-monitoring', - 'azure-scheduler', - 'azure-servicefabric', - 'azure-sb', - 'azure-storage', - 'azure-monitor', - 'azure-batch' + '@angular/core', + 'vue', + // Other interesting packages + 'aws-sdk' ]; if (packageJsonContents['dependencies']) { From 7ca1fea73866089e4949314b456291a37bb2a4cf Mon Sep 17 00:00:00 2001 From: Bowden <wilkelly@microsoft.com> Date: Fri, 20 Apr 2018 11:51:43 -0700 Subject: [PATCH 682/710] added some additional interesting packages --- src/vs/workbench/parts/stats/node/workspaceStats.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index 067bfafd210..4016b6a55b5 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -193,6 +193,10 @@ export class WorkspaceStats implements IWorkbenchContribution { "workspace.npm.@angular/core" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.vue" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.aws-sdk" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.azure-storage" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.@google-cloud/common" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.heroku-cli" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.bower" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.yeoman.code.ext" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.cordova.high" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, @@ -307,7 +311,11 @@ export class WorkspaceStats implements IWorkbenchContribution { '@angular/core', 'vue', // Other interesting packages - 'aws-sdk' + 'aws-sdk', + 'azure', + 'azure-storage', + '@google-cloud/common', + 'heroku-cli' ]; if (packageJsonContents['dependencies']) { From a05e0f354d20a5511b1b5897eab4c0ee78edd0e5 Mon Sep 17 00:00:00 2001 From: kieferrm <kieferrm@gmail.com> Date: Mon, 23 Apr 2018 16:11:51 -0700 Subject: [PATCH 683/710] follow-up on #48296 --- .../parts/stats/node/workspaceStats.ts | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/parts/stats/node/workspaceStats.ts index 4016b6a55b5..7c64c805596 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/parts/stats/node/workspaceStats.ts @@ -37,6 +37,26 @@ const SecondLevelDomainWhitelist = [ 'rhcloud.com', 'google.com' ]; +const ModulesToLookFor = [ + // Packages that suggest a node server + 'express', + 'sails', + 'koa', + 'hapi', + 'socket.io', + 'restify', + // JS frameworks + 'react', + 'react-native', + '@angular/core', + 'vue', + // Other interesting packages + 'aws-sdk', + 'azure', + 'azure-storage', + '@google-cloud/common', + 'heroku-cli' +]; type Tags = { [index: string]: boolean | number | string }; @@ -189,7 +209,6 @@ export class WorkspaceStats implements IWorkbenchContribution { "workspace.npm.socket.io" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.restify" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.react" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, - "workspace.npm.react-native" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.@angular/core" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.vue" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.aws-sdk" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, @@ -239,7 +258,7 @@ export class WorkspaceStats implements IWorkbenchContribution { const folders = !isEmpty ? workspace.folders.map(folder => folder.uri) : this.environmentService.appQuality !== 'stable' && this.findFolders(configuration); if (folders && folders.length && this.fileService) { //return - let files: IResolveFileResult[] = await this.fileService.resolveFiles(folders.map(resource => ({ resource }))); + const files: IResolveFileResult[] = await this.fileService.resolveFiles(folders.map(resource => ({ resource }))); const names = (<IFileStat[]>[]).concat(...files.map(result => result.success ? (result.stat.children || []) : [])).map(c => c.name); const nameSet = names.reduce((s, n) => s.add(n.toLowerCase()), new Set()); @@ -295,32 +314,19 @@ export class WorkspaceStats implements IWorkbenchContribution { if (nameSet.has('package.json')) { await TPromise.join(folders.map(async workspaceUri => { const uri = workspaceUri.with({ path: `${workspaceUri.path !== '/' ? workspaceUri.path : ''}/package.json` }); - let content = await this.fileService.resolveContent(uri, { acceptTextOnly: true }); + const content = await this.fileService.resolveContent(uri, { acceptTextOnly: true }); const packageJsonContents = JSON.parse(content.value); - let modulesToLookFor = [ - // Packages that suggest a node server - 'express', - 'sails', - 'koa', - 'hapi', - 'socket.io', - 'restify', - // JS frameworks - 'react', - 'react-native', - '@angular/core', - 'vue', - // Other interesting packages - 'aws-sdk', - 'azure', - 'azure-storage', - '@google-cloud/common', - 'heroku-cli' - ]; - if (packageJsonContents['dependencies']) { - for (let module of modulesToLookFor) { - tags['workspace.npm.' + module] = packageJsonContents['dependencies'][module] ? true : false; + for (let module of ModulesToLookFor) { + if ('react-native' === module) { + if (packageJsonContents['dependencies'][module]) { + tags['workspace.reactNative'] = true; + } + } else { + if (packageJsonContents['dependencies'][module]) { + tags['workspace.npm.' + module] = true; + } + } } } })); From 93ff0d0c14040c10eeb986202e65a13ef59b1c87 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Mon, 23 Apr 2018 17:43:33 -0700 Subject: [PATCH 684/710] Catch errors on signature help provider Part of #46852 --- .../src/features/signatureHelpProvider.ts | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/extensions/typescript-language-features/src/features/signatureHelpProvider.ts b/extensions/typescript-language-features/src/features/signatureHelpProvider.ts index 5942c69286a..f23de59d5d6 100644 --- a/extensions/typescript-language-features/src/features/signatureHelpProvider.ts +++ b/extensions/typescript-language-features/src/features/signatureHelpProvider.ts @@ -3,13 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SignatureHelpProvider, SignatureHelp, SignatureInformation, ParameterInformation, TextDocument, Position, CancellationToken } from 'vscode'; - -import * as Previewer from '../utils/previewer'; +import { CancellationToken, ParameterInformation, Position, SignatureHelp, SignatureHelpProvider, SignatureInformation, TextDocument } from 'vscode'; import * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; +import * as Previewer from '../utils/previewer'; import * as typeConverters from '../utils/typeConverters'; + export default class TypeScriptSignatureHelpProvider implements SignatureHelpProvider { public constructor( @@ -23,9 +23,14 @@ export default class TypeScriptSignatureHelpProvider implements SignatureHelpPro } const args: Proto.SignatureHelpRequestArgs = typeConverters.Position.toFileLocationRequestArgs(filepath, position); - const response = await this.client.execute('signatureHelp', args, token); - const info = response.body; - if (!info) { + let info: Proto.SignatureHelpItems | undefined = undefined; + try { + const response = await this.client.execute('signatureHelp', args, token); + info = response.body; + if (!info) { + return null; + } + } catch { return null; } @@ -35,8 +40,8 @@ export default class TypeScriptSignatureHelpProvider implements SignatureHelpPro info.items.forEach((item, i) => { // keep active parameter in bounds - if (i === info.selectedItemIndex && item.isVariadic) { - result.activeParameter = Math.min(info.argumentIndex, item.parameters.length - 1); + if (i === info!.selectedItemIndex && item.isVariadic) { + result.activeParameter = Math.min(info!.argumentIndex, item.parameters.length - 1); } const signature = new SignatureInformation(''); From 1ae3ab394d83ddb78f9a7d3fa3cfbdbb6dd8cc0b Mon Sep 17 00:00:00 2001 From: Peng Lyu <penn.lv@gmail.com> Date: Mon, 23 Apr 2018 17:52:39 -0700 Subject: [PATCH 685/710] disable failing smoke test. --- test/smoke/src/areas/git/git.test.ts | 6 ++++-- test/smoke/src/areas/statusbar/statusbar.test.ts | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 498bfd7780e..2dc7803d19c 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -6,8 +6,8 @@ import * as cp from 'child_process'; import { Application } from '../../application'; -const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; -const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; +// const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; +// const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; export function setup() { describe('Git', () => { @@ -18,6 +18,7 @@ export function setup() { cp.execSync('git config user.email monacotools@microsoft.com', { cwd: app.workspacePath }); }); + /* it('reflects working tree changes', async function () { const app = this.app as Application; @@ -78,5 +79,6 @@ export function setup() { cp.execSync('git reset --hard origin/master', { cwd: app.workspacePath }); }); + */ }); } \ No newline at end of file diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 9fcd47bf9b5..a8eaa852dfe 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -11,7 +11,7 @@ export function setup() { it('verifies presence of all default status bar elements', async function () { const app = this.app as Application; - await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); + // await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); if (app.quality !== Quality.Dev) { await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.FEEDBACK_ICON); } @@ -26,6 +26,7 @@ export function setup() { await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.SELECTION_STATUS); }); + /* it(`verifies that 'quick open' opens when clicking on status bar elements`, async function () { const app = this.app as Application; @@ -47,6 +48,7 @@ export function setup() { await app.workbench.quickopen.waitForQuickOpenOpened(); await app.workbench.quickopen.closeQuickOpen(); }); + */ it(`verifies that 'Problems View' appears when clicking on 'Problems' status element`, async function () { const app = this.app as Application; From 81c2b441fbc5de7881b2d742a2df663b4eba005a Mon Sep 17 00:00:00 2001 From: Peng Lyu <penn.lv@gmail.com> Date: Mon, 23 Apr 2018 17:57:31 -0700 Subject: [PATCH 686/710] Revert "disable failing smoke test." This reverts commit 1ae3ab394d83ddb78f9a7d3fa3cfbdbb6dd8cc0b. --- test/smoke/src/areas/git/git.test.ts | 6 ++---- test/smoke/src/areas/statusbar/statusbar.test.ts | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/test/smoke/src/areas/git/git.test.ts b/test/smoke/src/areas/git/git.test.ts index 2dc7803d19c..498bfd7780e 100644 --- a/test/smoke/src/areas/git/git.test.ts +++ b/test/smoke/src/areas/git/git.test.ts @@ -6,8 +6,8 @@ import * as cp from 'child_process'; import { Application } from '../../application'; -// const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; -// const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; +const DIFF_EDITOR_LINE_INSERT = '.monaco-diff-editor .editor.modified .line-insert'; +const SYNC_STATUSBAR = 'div[id="workbench.parts.statusbar"] .statusbar-entry a[title$="Synchronize Changes"]'; export function setup() { describe('Git', () => { @@ -18,7 +18,6 @@ export function setup() { cp.execSync('git config user.email monacotools@microsoft.com', { cwd: app.workspacePath }); }); - /* it('reflects working tree changes', async function () { const app = this.app as Application; @@ -79,6 +78,5 @@ export function setup() { cp.execSync('git reset --hard origin/master', { cwd: app.workspacePath }); }); - */ }); } \ No newline at end of file diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index a8eaa852dfe..9fcd47bf9b5 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -11,7 +11,7 @@ export function setup() { it('verifies presence of all default status bar elements', async function () { const app = this.app as Application; - // await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); + await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.BRANCH_STATUS); if (app.quality !== Quality.Dev) { await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.FEEDBACK_ICON); } @@ -26,7 +26,6 @@ export function setup() { await app.workbench.statusbar.waitForStatusbarElement(StatusBarElement.SELECTION_STATUS); }); - /* it(`verifies that 'quick open' opens when clicking on status bar elements`, async function () { const app = this.app as Application; @@ -48,7 +47,6 @@ export function setup() { await app.workbench.quickopen.waitForQuickOpenOpened(); await app.workbench.quickopen.closeQuickOpen(); }); - */ it(`verifies that 'Problems View' appears when clicking on 'Problems' status element`, async function () { const app = this.app as Application; From c69deaccd0b90b824bd0cc39829f989e3dc59602 Mon Sep 17 00:00:00 2001 From: Peng Lyu <penn.lv@gmail.com> Date: Mon, 23 Apr 2018 17:58:54 -0700 Subject: [PATCH 687/710] activate git by * --- extensions/git/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 8717d6e4af4..f6d86f0a91b 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -13,7 +13,7 @@ "Other" ], "activationEvents": [ - "onUri" + "*" ], "main": "./out/main", "icon": "resources/icons/git.png", @@ -1126,4 +1126,4 @@ "@types/which": "^1.0.28", "mocha": "^3.2.0" } -} \ No newline at end of file +} From 42222536709fb8bea6e9333e09485a87b459090a Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Mon, 23 Apr 2018 17:55:55 -0700 Subject: [PATCH 688/710] Make sure we update markdown workspace results when editing a file wihtout saving --- .../src/features/workspaceSymbolProvider.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts index ecf6f1b2140..c19ac824714 100644 --- a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts @@ -71,18 +71,24 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume if (isMarkdownFile(document)) { this._onDidChangeMarkdownDocumentEmitter.fire(document); } - }, this, this._disposables); + }, null, this._disposables); this._watcher.onDidCreate(async resource => { const document = await vscode.workspace.openTextDocument(resource); if (isMarkdownFile(document)) { this._onDidCreateMarkdownDocumentEmitter.fire(document); } - }, this, this._disposables); + }, null, this._disposables); this._watcher.onDidDelete(async resource => { this._onDidDeleteMarkdownDocumentEmitter.fire(resource); - }, this, this._disposables); + }, null, this._disposables); + + vscode.workspace.onDidChangeTextDocument(e => { + if (isMarkdownFile(e.document)) { + this._onDidChangeMarkdownDocumentEmitter.fire(e.document); + } + }, null, this._disposables); } } From b845ce918f2689344795e845ae6ef691916c3079 Mon Sep 17 00:00:00 2001 From: Matt Bierner <matb@microsoft.com> Date: Mon, 23 Apr 2018 18:03:19 -0700 Subject: [PATCH 689/710] Don't include node_modules in markdown results --- .../src/features/workspaceSymbolProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts index c19ac824714..6a392e9b0df 100644 --- a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts @@ -38,7 +38,7 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume } async getAllMarkdownDocuments() { - const resources = await vscode.workspace.findFiles('**/*.md'); + const resources = await vscode.workspace.findFiles('**/*.md', '**/node_modules/**'); const documents = await Promise.all( resources.map(resource => vscode.workspace.openTextDocument(resource).then(x => x, () => undefined))); return documents.filter(doc => doc && isMarkdownFile(doc)) as vscode.TextDocument[]; From ab13671c5847d1457547b638e688266e56d6b459 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Tue, 24 Apr 2018 07:04:12 +0200 Subject: [PATCH 690/710] update classifier --- .github/classifier.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/classifier.yml b/.github/classifier.yml index a83c95ad2ba..af9e2f84e41 100644 --- a/.github/classifier.yml +++ b/.github/classifier.yml @@ -89,6 +89,10 @@ assignees: [], assignLabel: false }, + workbench-diagnostics: { + assignees: [], + assignLabel: false + }, workbench-dnd: { assignees: [], assignLabel: false From e56acedabebffc8bfa1c685a0848e980aa224173 Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Tue, 24 Apr 2018 08:55:44 +0200 Subject: [PATCH 691/710] allow resolve for all, not just for proposed-api-users, #7340 --- src/vs/workbench/api/node/extHost.api.impl.ts | 2 +- src/vs/workbench/api/node/extHostLanguageFeatures.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 728a0255f68..2ce97028827 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -277,7 +277,7 @@ export function createApiFactory( return extHostLanguageFeatures.registerReferenceProvider(checkSelector(selector), provider); }, registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable { - return extHostLanguageFeatures.registerRenameProvider(checkSelector(selector), provider, extension.enableProposedApi); + return extHostLanguageFeatures.registerRenameProvider(checkSelector(selector), provider); }, registerDocumentSymbolProvider(selector: vscode.DocumentSelector, provider: vscode.DocumentSymbolProvider): vscode.Disposable { return extHostLanguageFeatures.registerDocumentSymbolProvider(checkSelector(selector), provider); diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index ef8b3280235..708a8059d54 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -1105,9 +1105,9 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { // --- rename - registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider, canUseProposedApi = false): vscode.Disposable { + registerRenameProvider(selector: vscode.DocumentSelector, provider: vscode.RenameProvider): vscode.Disposable { const handle = this._addNewAdapter(new RenameAdapter(this._documents, provider)); - this._proxy.$registerRenameSupport(handle, this._transformDocumentSelector(selector), canUseProposedApi && RenameAdapter.supportsResolving(provider)); + this._proxy.$registerRenameSupport(handle, this._transformDocumentSelector(selector), RenameAdapter.supportsResolving(provider)); return this._createDisposable(handle); } From fc5c36d2ee9e75183a16e68bd129e8132d9b8d75 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Tue, 24 Apr 2018 10:17:07 +0200 Subject: [PATCH 692/710] debug: tweak confirmation text for breakpoint deletion fixes #47643 --- .../parts/debug/electron-browser/debugEditorContribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index 0b5f26ba2ed..c421fa40b66 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -197,7 +197,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { if (breakpoints.some(bp => !!bp.condition || !!bp.logMessage || !!bp.hitCondition)) { const logPoint = breakpoints.every(bp => !!bp.logMessage); const breakpointType = logPoint ? nls.localize('logPoint', "Log Point") : nls.localize('breakpoint', "Breakpoint"); - this.dialogService.show(severity.Info, nls.localize('breakpointHasCondition', "This {0} has a valuable {1} that will get lost on remove. Consider disabling the {0} instead.", + this.dialogService.show(severity.Info, nls.localize('breakpointHasCondition', "This {0} has a {1} that will get lost on remove. Consider disabling the {0} instead.", breakpointType.toLowerCase(), logPoint ? nls.localize('message', "message") : nls.localize('condition', "condition")), [ nls.localize('removeLogPoint', "Remove {0}", breakpointType), nls.localize('disableLogPoint', "Disable {0}", breakpointType), From d920490181a47fe423266e37e935921ab606c488 Mon Sep 17 00:00:00 2001 From: Andre Weinand <aweinand@microsoft.com> Date: Tue, 24 Apr 2018 10:39:06 +0200 Subject: [PATCH 693/710] fix broken auto-attach; fixes #48452 --- src/vs/workbench/parts/debug/electron-browser/debugService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index b70f399d972..d666b3aad27 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -792,11 +792,11 @@ export class DebugService implements debug.IDebugService { }); } - private substituteVariables(launch: debug.ILaunch, config: debug.IConfig): TPromise<debug.IConfig> { + private substituteVariables(launch: debug.ILaunch | undefined, config: debug.IConfig): TPromise<debug.IConfig> { const dbg = this.configurationManager.getDebugger(config.type); if (dbg) { let folder: IWorkspaceFolder = undefined; - if (launch.workspace) { + if (launch && launch.workspace) { folder = launch.workspace; } else { const folders = this.contextService.getWorkspace().folders; From 7dd299d7cf25c7e2f7252d9502a00724d0dab378 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Tue, 24 Apr 2018 11:34:12 +0200 Subject: [PATCH 694/710] fixes #48504 --- .../workbench/services/extensions/common/extensionsRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index cfa52243d64..21c541c470f 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -228,7 +228,7 @@ const schema: IJSONSchema = { }, { label: 'onUri', - body: 'onView', + body: 'onUri', description: nls.localize('vscode.extension.activationEvents.onUri', 'An activation event emitted whenever a system-wide Uri directed towards this extension is open.'), }, { From 098eb8db2b3531437d4b688b69f5e06e813e7949 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero <benjpas@microsoft.com> Date: Tue, 24 Apr 2018 12:20:48 +0200 Subject: [PATCH 695/710] remove localStorage migration code --- src/vs/code/electron-main/app.ts | 99 ++++++++++++-------------------- 1 file changed, 38 insertions(+), 61 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 2060846bfc5..7ea899cd82d 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -61,8 +61,6 @@ import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; -import { join } from 'path'; -import { exists, rename } from 'vs/base/node/pfs'; export class CodeApplication { @@ -264,54 +262,50 @@ export class CodeApplication { this.logService.debug(`from: ${this.environmentService.appRoot}`); this.logService.debug('args:', this.environmentService.args); - // Handle local storage (TODO@Ben remove me after a while) - return this.handleLocalStorage().then(() => { + // Make sure we associate the program with the app user model id + // This will help Windows to associate the running program with + // any shortcut that is pinned to the taskbar and prevent showing + // two icons in the taskbar for the same app. + if (platform.isWindows && product.win32AppUserModelId) { + app.setAppUserModelId(product.win32AppUserModelId); + } - // Make sure we associate the program with the app user model id - // This will help Windows to associate the running program with - // any shortcut that is pinned to the taskbar and prevent showing - // two icons in the taskbar for the same app. - if (platform.isWindows && product.win32AppUserModelId) { - app.setAppUserModelId(product.win32AppUserModelId); + // Create Electron IPC Server + this.electronIpcServer = new ElectronIPCServer(); + + // Resolve unique machine ID + this.logService.trace('Resolving machine identifier...'); + return this.resolveMachineId().then(machineId => { + this.logService.trace(`Resolved machine identifier: ${machineId}`); + + // Spawn shared process + this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); + this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); + + // Services + const appInstantiationService = this.initServices(machineId); + + let promise: TPromise<any> = TPromise.as(null); + + // Create driver + if (this.environmentService.driverHandle) { + serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { + this.logService.info('Driver started at:', this.environmentService.driverHandle); + this.toDispose.push(server); + }); } - // Create Electron IPC Server - this.electronIpcServer = new ElectronIPCServer(); + return promise.then(() => { - // Resolve unique machine ID - this.logService.trace('Resolving machine identifier...'); - return this.resolveMachineId().then(machineId => { - this.logService.trace(`Resolved machine identifier: ${machineId}`); + // Setup Auth Handler + const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); + this.toDispose.push(authHandler); - // Spawn shared process - this.sharedProcess = new SharedProcess(this.environmentService, this.lifecycleService, this.logService, machineId, this.userEnv); - this.sharedProcessClient = this.sharedProcess.whenReady().then(() => connect(this.environmentService.sharedIPCHandle, 'main')); + // Open Windows + appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); - // Services - const appInstantiationService = this.initServices(machineId); - - let promise: TPromise<any> = TPromise.as(null); - - // Create driver - if (this.environmentService.driverHandle) { - serveDriver(this.electronIpcServer, this.environmentService.driverHandle, appInstantiationService).then(server => { - this.logService.info('Driver started at:', this.environmentService.driverHandle); - this.toDispose.push(server); - }); - } - - return promise.then(() => { - - // Setup Auth Handler - const authHandler = appInstantiationService.createInstance(ProxyAuthHandler); - this.toDispose.push(authHandler); - - // Open Windows - appInstantiationService.invokeFunction(accessor => this.openFirstWindow(accessor)); - - // Post Open Windows Tasks - appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); - }); + // Post Open Windows Tasks + appInstantiationService.invokeFunction(accessor => this.afterWindowOpen(accessor)); }); }); } @@ -331,23 +325,6 @@ export class CodeApplication { }); } - private handleLocalStorage(): TPromise<void> { - const localStorageFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage'); - const localStorageJournalFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal'); - const localStorageBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage.vscbak'); - const localStorageJournalBackupFile = join(this.environmentService.userDataPath, 'Local Storage', 'file__0.localstorage-journal.vscbak'); - - // Electron 1.7.12: Restore storage - return exists(localStorageBackupFile).then(localStorageBackupFileExists => { - return exists(localStorageJournalBackupFile).then(localStorageJournalBackupFileExists => { - return TPromise.join([ - localStorageBackupFileExists ? rename(localStorageBackupFile, localStorageFile) : TPromise.as(void 0), - localStorageJournalBackupFileExists ? rename(localStorageJournalBackupFile, localStorageJournalFile) : TPromise.as(void 0) - ]); - }); - }).then(() => void 0, () => void 0); - } - private initServices(machineId: string): IInstantiationService { const services = new ServiceCollection(); From e7c9974b554d052d5bf369e2cb82936a024928bb Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Tue, 24 Apr 2018 12:24:27 +0200 Subject: [PATCH 696/710] explorer: ExplorerItem initialize children when a child is being added fixes #48496 --- src/vs/workbench/parts/files/common/explorerModel.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/parts/files/common/explorerModel.ts b/src/vs/workbench/parts/files/common/explorerModel.ts index df76d082ac3..afcf1bbefb3 100644 --- a/src/vs/workbench/parts/files/common/explorerModel.ts +++ b/src/vs/workbench/parts/files/common/explorerModel.ts @@ -216,6 +216,9 @@ export class ExplorerItem { * Adds a child element to this folder. */ public addChild(child: ExplorerItem): void { + if (!this.children) { + this.isDirectory = true; + } // Inherit some parent properties to child child.parent = this; From e00cc4d32accccdd95887ec38c1643d2d294133f Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Tue, 24 Apr 2018 12:36:06 +0200 Subject: [PATCH 697/710] debugL fix select box lifecycle fixes #48487 --- .../parts/debug/browser/debugActionItems.ts | 20 +++++++++---------- .../parts/debug/browser/debugViewlet.ts | 5 +---- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index d03d5b361e9..fa1fd7f5649 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -34,7 +34,6 @@ export class StartDebugActionItem implements IActionItem { private selectBox: SelectBox; private options: { label: string, handler: (() => boolean) }[]; private toDispose: IDisposable[]; - private toDisposeOnRender: IDisposable[]; private selected: number; constructor( @@ -48,8 +47,8 @@ export class StartDebugActionItem implements IActionItem { @IContextViewService contextViewService: IContextViewService, ) { this.toDispose = []; - this.toDisposeOnRender = []; this.selectBox = new SelectBox([], -1, contextViewService); + this.toDispose.push(this.selectBox); this.toDispose.push(attachSelectBoxStyler(this.selectBox, themeService, { selectBackground: SIDE_BAR_BACKGROUND })); @@ -69,31 +68,30 @@ export class StartDebugActionItem implements IActionItem { } public render(container: HTMLElement): void { - this.toDisposeOnRender = dispose(this.toDisposeOnRender); this.container = container; dom.addClass(container, 'start-debug-action-item'); this.start = dom.append(container, $('.icon')); this.start.title = this.action.label; this.start.tabIndex = 0; - this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.CLICK, () => { + this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.CLICK, () => { this.start.blur(); this.actionRunner.run(this.action, this.context).done(null, errors.onUnexpectedError); })); - this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_DOWN, (e: MouseEvent) => { + this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_DOWN, (e: MouseEvent) => { if (this.action.enabled && e.button === 0) { dom.addClass(this.start, 'active'); } })); - this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_UP, () => { + this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_UP, () => { dom.removeClass(this.start, 'active'); })); - this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_OUT, () => { + this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.MOUSE_OUT, () => { dom.removeClass(this.start, 'active'); })); - this.toDisposeOnRender.push(dom.addDisposableListener(this.start, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { + this.toDispose.push(dom.addDisposableListener(this.start, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { const event = new StandardKeyboardEvent(e); if (event.equals(KeyCode.Enter)) { this.actionRunner.run(this.action, this.context).done(null, errors.onUnexpectedError); @@ -103,7 +101,7 @@ export class StartDebugActionItem implements IActionItem { event.stopPropagation(); } })); - this.toDisposeOnRender.push(this.selectBox.onDidSelect(e => { + this.toDispose.push(this.selectBox.onDidSelect(e => { const shouldBeSelected = this.options[e.index].handler(); if (shouldBeSelected) { this.selected = e.index; @@ -115,14 +113,14 @@ export class StartDebugActionItem implements IActionItem { const selectBoxContainer = $('.configuration'); this.selectBox.render(dom.append(container, selectBoxContainer)); - this.toDisposeOnRender.push(dom.addDisposableListener(selectBoxContainer, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { + this.toDispose.push(dom.addDisposableListener(selectBoxContainer, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => { const event = new StandardKeyboardEvent(e); if (event.equals(KeyCode.LeftArrow)) { this.start.focus(); event.stopPropagation(); } })); - this.toDisposeOnRender.push(attachStylerCallback(this.themeService, { selectBorder }, colors => { + this.toDispose.push(attachStylerCallback(this.themeService, { selectBorder }, colors => { this.container.style.border = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; selectBoxContainer.style.borderLeft = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; })); diff --git a/src/vs/workbench/parts/debug/browser/debugViewlet.ts b/src/vs/workbench/parts/debug/browser/debugViewlet.ts index 085f3165be4..084942d2955 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewlet.ts @@ -89,10 +89,7 @@ export class DebugViewlet extends PersistentViewsViewlet { public getActionItem(action: IAction): IActionItem { if (action.id === StartAction.ID) { - if (!this.startDebugActionItem) { - this.startDebugActionItem = this._register(this.instantiationService.createInstance(StartDebugActionItem, null, action)); - } - + this.startDebugActionItem = this.instantiationService.createInstance(StartDebugActionItem, null, action); return this.startDebugActionItem; } From a7389569a50c78b63e9eb7a4249e311cbbe211c4 Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Tue, 24 Apr 2018 12:43:29 +0200 Subject: [PATCH 698/710] polish message fixes #47892 --- .../workbench/parts/files/electron-browser/fileActions.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/parts/files/electron-browser/fileActions.ts index 5e58cd18646..76a6aacb07f 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileActions.ts @@ -736,12 +736,12 @@ class BaseDeleteFileAction extends BaseFileAction { private getMoveToTrashMessage(distinctElements: ExplorerItem[]): string { if (this.containsBothDirectoryAndFile(distinctElements)) { - return getConfirmMessage(nls.localize('confirmMoveTrashMessageFilesAndDirectories', "Are you sure you want to delete the following {0} files/directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + return getConfirmMessage(nls.localize('confirmMoveTrashMessageFilesAndDirectories', "Are you sure you want to delete the following {0} files/directories and their contents?", distinctElements.length), distinctElements.map(e => e.resource)); } if (distinctElements.length > 1) { if (distinctElements[0].isDirectory) { - return getConfirmMessage(nls.localize('confirmMoveTrashMessageMultipleDirectories', "Are you sure you want to delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + return getConfirmMessage(nls.localize('confirmMoveTrashMessageMultipleDirectories', "Are you sure you want to delete the following {0} directories and their contents?", distinctElements.length), distinctElements.map(e => e.resource)); } return getConfirmMessage(nls.localize('confirmMoveTrashMessageMultiple', "Are you sure you want to delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); @@ -756,12 +756,12 @@ class BaseDeleteFileAction extends BaseFileAction { private getDeleteMessage(distinctElements: ExplorerItem[]): string { if (this.containsBothDirectoryAndFile(distinctElements)) { - return getConfirmMessage(nls.localize('confirmDeleteMessageFilesAndDirectories', "Are you sure you want to permanently delete the following {0} files/directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + return getConfirmMessage(nls.localize('confirmDeleteMessageFilesAndDirectories', "Are you sure you want to permanently delete the following {0} files/directories and their contents?", distinctElements.length), distinctElements.map(e => e.resource)); } if (distinctElements.length > 1) { if (distinctElements[0].isDirectory) { - return getConfirmMessage(nls.localize('confirmDeleteMessageMultipleDirectories', "Are you sure you want to permanently delete the following {0} directories and its contents?", distinctElements.length), distinctElements.map(e => e.resource)); + return getConfirmMessage(nls.localize('confirmDeleteMessageMultipleDirectories', "Are you sure you want to permanently delete the following {0} directories and their contents?", distinctElements.length), distinctElements.map(e => e.resource)); } return getConfirmMessage(nls.localize('confirmDeleteMessageMultiple', "Are you sure you want to permanently delete the following {0} files?", distinctElements.length), distinctElements.map(e => e.resource)); From 675d4fb94e38a5230c21b19421616a37bed2dda2 Mon Sep 17 00:00:00 2001 From: Alex Dima <alexdima@microsoft.com> Date: Tue, 24 Apr 2018 12:54:31 +0200 Subject: [PATCH 699/710] Fixes #48144. --- src/vs/editor/browser/widget/diffReview.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/widget/diffReview.ts b/src/vs/editor/browser/widget/diffReview.ts index f1d0c81f619..ad7a63bd821 100644 --- a/src/vs/editor/browser/widget/diffReview.ts +++ b/src/vs/editor/browser/widget/diffReview.ts @@ -609,7 +609,7 @@ export class DiffReview extends Disposable { 'That encodes that at original line 154 (which is now line 159), 12 lines were removed/changed with 39 lines.', 'Variables 0 and 1 refer to the diff index out of total number of diffs.', 'Variables 2 and 4 will be numbers (a line number).', - 'Variables 3 and 4 will be "no lines", "1 line" or "X lines", localized separately.' + 'Variables 3 and 5 will be "no lines", "1 line" or "X lines", localized separately.' ] }, "Difference {0} of {1}: original {2}, {3}, modified {4}, {5}", (diffIndex + 1), this._diffs.length, minOriginalLine, originalChangedLinesCntAria, minModifiedLine, modifiedChangedLinesCntAria)); header.appendChild(cell); From a9e16bab72ad8dda0fffb9bdcb44eac96679005b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Tue, 24 Apr 2018 14:41:03 +0200 Subject: [PATCH 700/710] #48373 Add logs --- src/vs/base/node/zip.ts | 9 ++++++--- src/vs/base/test/node/zip/zip.test.ts | 3 ++- .../node/extensionManagementService.ts | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/base/node/zip.ts b/src/vs/base/node/zip.ts index 7561e28471f..cd7ec2c2612 100644 --- a/src/vs/base/node/zip.ts +++ b/src/vs/base/node/zip.ts @@ -11,6 +11,7 @@ import { nfcall, ninvoke, SimpleThrottler } from 'vs/base/common/async'; import { mkdirp, rimraf } from 'vs/base/node/pfs'; import { TPromise } from 'vs/base/common/winjs.base'; import { open as _openZip, Entry, ZipFile } from 'yauzl'; +import { ILogService } from 'vs/platform/log/common/log'; export interface IExtractOptions { overwrite?: boolean; @@ -87,7 +88,7 @@ function extractEntry(stream: Readable, fileName: string, mode: number, targetPa })); } -function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions): TPromise<void> { +function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions, logService: ILogService): TPromise<void> { let isCanceled = false; let last = TPromise.wrap<any>(null); let extractedEntriesCount = 0; @@ -108,6 +109,8 @@ function extractZip(zipfile: ZipFile, targetPath: string, options: IOptions): TP return; } + logService.debug(targetPath, 'Extracting', entry.fileName); + if (!options.sourcePathRegex.test(entry.fileName)) { extractedEntriesCount++; return; @@ -139,7 +142,7 @@ function openZip(zipFile: string): TPromise<ZipFile> { .then(null, err => TPromise.wrapError(toExtractError(err))); } -export function extract(zipPath: string, targetPath: string, options: IExtractOptions = {}): TPromise<void> { +export function extract(zipPath: string, targetPath: string, options: IExtractOptions = {}, logService: ILogService): TPromise<void> { const sourcePathRegex = new RegExp(options.sourcePath ? `^${options.sourcePath}` : ''); let promise = openZip(zipPath); @@ -148,7 +151,7 @@ export function extract(zipPath: string, targetPath: string, options: IExtractOp promise = promise.then(zipfile => rimraf(targetPath).then(() => zipfile)); } - return promise.then(zipfile => extractZip(zipfile, targetPath, { sourcePathRegex })); + return promise.then(zipfile => extractZip(zipfile, targetPath, { sourcePathRegex }, logService)); } function read(zipPath: string, filePath: string): TPromise<Readable> { diff --git a/src/vs/base/test/node/zip/zip.test.ts b/src/vs/base/test/node/zip/zip.test.ts index ae5de698346..1ea865f432a 100644 --- a/src/vs/base/test/node/zip/zip.test.ts +++ b/src/vs/base/test/node/zip/zip.test.ts @@ -12,6 +12,7 @@ import URI from 'vs/base/common/uri'; import { extract } from 'vs/base/node/zip'; import { generateUuid } from 'vs/base/common/uuid'; import { rimraf, exists } from 'vs/base/node/pfs'; +import { NullLogService } from '../../../../platform/log/common/log'; const fixtures = URI.parse(require.toUrl('./fixtures')).fsPath; @@ -21,7 +22,7 @@ suite('Zip', () => { const fixture = path.join(fixtures, 'extract.zip'); const target = path.join(os.tmpdir(), generateUuid()); - return extract(fixture, target) + return extract(fixture, target, {}, new NullLogService()) .then(() => exists(path.join(target, 'extension'))) .then(exists => assert(exists)) .then(() => rimraf(target)); diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 96e5006095a..61eb637d98c 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -444,7 +444,7 @@ export class ExtensionManagementService extends Disposable implements IExtension this.logService.trace(`Started extracting the extension from ${zipPath} to ${extractPath}`); return pfs.rimraf(extractPath) .then( - () => extract(zipPath, extractPath, { sourcePath: 'extension', overwrite: true }) + () => extract(zipPath, extractPath, { sourcePath: 'extension', overwrite: true }, this.logService) .then( () => this.logService.info(`Extracted extension to ${extractPath}:`, id), e => always(pfs.rimraf(extractPath), () => null) From be5147eae4f67c8a3a5c7f0ccb231e0f52d44537 Mon Sep 17 00:00:00 2001 From: Joao Moreno <jomo@microsoft.com> Date: Tue, 24 Apr 2018 14:51:56 +0200 Subject: [PATCH 701/710] fix bad relative import --- src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 17c764c629e..c506ab44454 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -60,7 +60,7 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IViewDescriptorRef, PersistentContributableViewsModel, IAddedViewDescriptorRef } from 'vs/workbench/browser/parts/views/contributableViews'; import { ViewLocation, IViewDescriptor } from 'vs/workbench/common/views'; import { ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IPanelDndController, Panel } from '../../../../base/browser/ui/splitview/panelview'; +import { IPanelDndController, Panel } from 'vs/base/browser/ui/splitview/panelview'; export interface ISpliceEvent<T> { index: number; From c88e58fc7a6aa47293ced091122f2afe9dadce1f Mon Sep 17 00:00:00 2001 From: isidor <inikolic@microsoft.com> Date: Tue, 24 Apr 2018 15:24:04 +0200 Subject: [PATCH 702/710] do not steal keybindings from find widget fixes #47947 --- .../workbench/parts/files/electron-browser/fileCommands.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts index 06a87609635..271b64ec68c 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/parts/files/electron-browser/fileCommands.ts @@ -41,6 +41,7 @@ import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common import { getMultiSelectedEditorContexts } from 'vs/workbench/browser/parts/editor/editorCommands'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; // Commands @@ -398,7 +399,7 @@ function revealResourcesInOS(resources: URI[], windowsService: IWindowsService, KeybindingsRegistry.registerCommandAndKeybindingRule({ id: REVEAL_IN_OS_COMMAND_ID, weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: undefined, + when: EditorContextKeys.editorTextFocus.toNegated(), primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R, win: { primary: KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_R @@ -410,7 +411,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ }); KeybindingsRegistry.registerCommandAndKeybindingRule({ weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: undefined, + when: EditorContextKeys.editorTextFocus.toNegated(), primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_R), id: 'workbench.action.files.revealActiveFileInWindows', handler: (accessor: ServicesAccessor) => { From 3bf15f5d02d855c03cd164a49393597127b1d072 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Tue, 24 Apr 2018 15:28:44 +0200 Subject: [PATCH 703/710] #43645 Fix reveal when view is in custom viewlet --- .../electron-browser/mainThreadTreeViews.ts | 4 ++-- .../browser/parts/views/customView.ts | 19 +++++++++++-------- .../browser/parts/views/customViewPanel.ts | 6 +++--- src/vs/workbench/common/views.ts | 4 ++-- .../workbench/electron-browser/workbench.ts | 4 ++-- .../quickopen/browser/viewPickerHandler.ts | 7 ++++--- 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts index 828bd6e2e33..a43537e66b0 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts @@ -8,7 +8,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import { Disposable } from 'vs/base/common/lifecycle'; import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; -import { ITreeViewDataProvider, ITreeItem, ICustomViewsService } from 'vs/workbench/common/views'; +import { ITreeViewDataProvider, ITreeItem, IViewsService } from 'vs/workbench/common/views'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { distinct } from 'vs/base/common/arrays'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -21,7 +21,7 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie constructor( extHostContext: IExtHostContext, - @ICustomViewsService private viewsService: ICustomViewsService, + @IViewsService private viewsService: IViewsService, @INotificationService private notificationService: INotificationService ) { super(); diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index c064cc0bccd..7c67ec99ee5 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -11,7 +11,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as DOM from 'vs/base/browser/dom'; import { LIGHT, FileThemeIcon, FolderThemeIcon } from 'vs/platform/theme/common/themeService'; import { ITree, IDataSource, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; -import { TreeItemCollapsibleState, ITreeItem, ITreeViewer, ICustomViewsService, ITreeViewDataProvider, ViewsRegistry, IViewDescriptor, TreeViewItemHandleArg, ICustomViewDescriptor, IViewsViewlet } from 'vs/workbench/common/views'; +import { TreeItemCollapsibleState, ITreeItem, ITreeViewer, IViewsService, ITreeViewDataProvider, ViewsRegistry, IViewDescriptor, TreeViewItemHandleArg, ICustomViewDescriptor, IViewsViewlet } from 'vs/workbench/common/views'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IProgressService2, ProgressLocation } from 'vs/platform/progress/common/progress'; @@ -33,7 +33,7 @@ import { FileIconThemableWorkbenchTree } from 'vs/workbench/browser/parts/views/ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { isUndefinedOrNull } from 'vs/base/common/types'; -export class CustomViewsService extends Disposable implements ICustomViewsService { +export class CustomViewsService extends Disposable implements IViewsService { _serviceBrand: any; @@ -56,12 +56,15 @@ export class CustomViewsService extends Disposable implements ICustomViewsServic openView(id: string, focus: boolean): TPromise<void> { const viewDescriptor = ViewsRegistry.getView(id); if (viewDescriptor) { - return this.viewletService.openViewlet(viewDescriptor.id) - .then((viewlet: IViewsViewlet) => { - if (viewlet && viewlet.openView) { - viewlet.openView(id, focus); - } - }); + const viewletDescriptor = this.viewletService.getViewlet(viewDescriptor.location.id); + if (viewletDescriptor) { + return this.viewletService.openViewlet(viewletDescriptor.id) + .then((viewlet: IViewsViewlet) => { + if (viewlet && viewlet.openView) { + viewlet.openView(id, focus); + } + }); + } } return TPromise.as(null); } diff --git a/src/vs/workbench/browser/parts/views/customViewPanel.ts b/src/vs/workbench/browser/parts/views/customViewPanel.ts index 95ec2b4816e..0c20d845f1b 100644 --- a/src/vs/workbench/browser/parts/views/customViewPanel.ts +++ b/src/vs/workbench/browser/parts/views/customViewPanel.ts @@ -14,7 +14,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { fillInActions, ContextAwareMenuItemActionItem } from 'vs/platform/actions/browser/menuItemActionItem'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ICustomViewsService, ITreeViewer } from 'vs/workbench/common/views'; +import { IViewsService, ITreeViewer } from 'vs/workbench/common/views'; import { IViewletViewOptions, IViewOptions, ViewsViewletPanel } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -31,10 +31,10 @@ export class CustomTreeViewPanel extends ViewsViewletPanel { @IContextMenuService contextMenuService: IContextMenuService, @IInstantiationService private instantiationService: IInstantiationService, @IConfigurationService configurationService: IConfigurationService, - @ICustomViewsService customViewsService: ICustomViewsService, + @IViewsService viewsService: IViewsService, ) { super({ ...(options as IViewOptions), ariaHeaderLabel: options.name }, keybindingService, contextMenuService, configurationService); - this.treeViewer = customViewsService.getTreeViewer(this.id); + this.treeViewer = viewsService.getTreeViewer(this.id); this.disposables.push(toDisposable(() => this.treeViewer.setVisibility(false))); this.menus = this.instantiationService.createInstance(Menus, this.id); this.menus.onDidChangeTitle(() => this.updateActions(), this, this.disposables); diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index c72806df4fb..8fb99569d83 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -182,9 +182,9 @@ export interface ICustomViewDescriptor extends IViewDescriptor { } -export const ICustomViewsService = createDecorator<ICustomViewsService>('customViewsService'); +export const IViewsService = createDecorator<IViewsService>('viewsService'); -export interface ICustomViewsService { +export interface IViewsService { _serviceBrand: any; getTreeViewer(id: string): ITreeViewer; diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index d196ddd2ca5..3523c79cce5 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -97,7 +97,7 @@ import URI from 'vs/base/common/uri'; import { IListService, ListService } from 'vs/platform/list/browser/listService'; import { domEvent } from 'vs/base/browser/event'; import { InputFocusedContext } from 'vs/platform/workbench/common/contextkeys'; -import { ICustomViewsService } from 'vs/workbench/common/views'; +import { IViewsService } from 'vs/workbench/common/views'; import { CustomViewsService } from 'vs/workbench/browser/parts/views/customView'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { NotificationService } from 'vs/workbench/services/notification/common/notificationService'; @@ -576,7 +576,7 @@ export class Workbench implements IPartService { // Custom views service const customViewsService = this.instantiationService.createInstance(CustomViewsService); - serviceCollection.set(ICustomViewsService, customViewsService); + serviceCollection.set(IViewsService, customViewsService); // Activity service (activitybar part) this.activitybarPart = this.instantiationService.createInstance(ActivitybarPart, Identifiers.ACTIVITYBAR_PART); diff --git a/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts b/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts index d349a73809e..8ec84daa300 100644 --- a/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts @@ -19,7 +19,7 @@ import { Action } from 'vs/base/common/actions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { fuzzyContains, stripWildcards } from 'vs/base/common/strings'; import { matchesFuzzy } from 'vs/base/common/filters'; -import { ViewsRegistry, ViewLocation, IViewsViewlet } from 'vs/workbench/common/views'; +import { ViewsRegistry, ViewLocation, IViewsService } from 'vs/workbench/common/views'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; @@ -70,6 +70,7 @@ export class ViewPickerHandler extends QuickOpenHandler { constructor( @IViewletService private viewletService: IViewletService, + @IViewsService private viewsService: IViewsService, @IOutputService private outputService: IOutputService, @ITerminalService private terminalService: ITerminalService, @IPanelService private panelService: IPanelService, @@ -126,7 +127,7 @@ export class ViewPickerHandler extends QuickOpenHandler { if (views.length) { for (const view of views) { if (this.contextKeyService.contextMatchesRules(view.when)) { - result.push(new ViewEntry(view.name, viewlet.name, () => this.viewletService.openViewlet(viewlet.id, true).done(viewlet => (<IViewsViewlet>viewlet).openView(view.id, true), errors.onUnexpectedError))); + result.push(new ViewEntry(view.name, viewlet.name, () => this.viewsService.openView(view.id, true))); } } } @@ -141,7 +142,7 @@ export class ViewPickerHandler extends QuickOpenHandler { const panels = this.panelService.getPanels(); panels.forEach((panel, index) => viewEntries.push(new ViewEntry(panel.name, nls.localize('panels', "Panels"), () => this.panelService.openPanel(panel.id, true).done(null, errors.onUnexpectedError)))); - // Views + // Viewlet Views viewlets.forEach((viewlet, index) => { const viewLocation: ViewLocation = ViewLocation.get(viewlet.id); if (viewLocation) { From 7b531850bf1218f56fbd07ad30eae8a3cdb9678a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Tue, 24 Apr 2018 15:33:03 +0200 Subject: [PATCH 704/710] Fix #48549 --- .../electron-browser/localizations.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts index 742315db0be..50fee6790be 100644 --- a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts +++ b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts @@ -100,7 +100,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo this.getLanguagePackExtension(language) .then(extension => { if (extension) { - this.notificationService.prompt(Severity.Warning, localize('install language pack', "Please install '{0}' extension to continue to show VS Code's UI in '{1}' language. In the future, VS Code will only support language packs from the Marketplace.", extension.displayName || extension.displayName, language), + this.notificationService.prompt(Severity.Warning, localize('install language pack', "In the near future, VS Code will only support language packs in the form of Marketplace extensions. Please install the '{0}' extension in order to continue to use the currently configured language. ", extension.displayName || extension.displayName), [ { label: localize('install', "Install"), run: () => this.extensionManagementService.installFromGallery(extension) }, { label: localize('more information', "More Information..."), run: () => window.open('https://go.microsoft.com/fwlink/?linkid=830387') } From d02495163463bc5b38f863178550beafacbba2d4 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Tue, 24 Apr 2018 15:46:26 +0200 Subject: [PATCH 705/710] Fix #48551 --- .../electron-browser/localizations.contribution.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts index 50fee6790be..616b8369470 100644 --- a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts +++ b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts @@ -26,6 +26,8 @@ import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IStorageService, } from 'vs/platform/storage/common/storage'; import { TPromise } from 'vs/base/common/winjs.base'; import product from 'vs/platform/node/product'; +import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; +import { VIEWLET_ID as EXTENSIONS_VIEWLET_ID, IExtensionsViewlet } from 'vs/workbench/parts/extensions/common/extensions'; // Register action to configure locale and related settings const registry = Registry.as<IWorkbenchActionRegistry>(Extensions.WorkbenchActions); @@ -41,6 +43,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo @IStorageService private storageService: IStorageService, @IExtensionManagementService private extensionManagementService: IExtensionManagementService, @IExtensionGalleryService private galleryService: IExtensionGalleryService, + @IViewletService private viewletService: IViewletService ) { super(); this.updateLocaleDefintionSchema(); @@ -102,7 +105,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo if (extension) { this.notificationService.prompt(Severity.Warning, localize('install language pack', "In the near future, VS Code will only support language packs in the form of Marketplace extensions. Please install the '{0}' extension in order to continue to use the currently configured language. ", extension.displayName || extension.displayName), [ - { label: localize('install', "Install"), run: () => this.extensionManagementService.installFromGallery(extension) }, + { label: localize('install', "Install"), run: () => this.installExtension(extension) }, { label: localize('more information', "More Information..."), run: () => window.open('https://go.microsoft.com/fwlink/?linkid=830387') } ]); } @@ -129,6 +132,14 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo return this.extensionManagementService.getInstalled(LocalExtensionType.User) .then(installed => installed.some(i => i.manifest && i.manifest.contributes && i.manifest.contributes.localizations && i.manifest.contributes.localizations.length && i.manifest.contributes.localizations.some(l => l.languageId.toLowerCase() === language))); } + + private installExtension(extension: IGalleryExtension): TPromise<void> { + return this.viewletService.openViewlet(EXTENSIONS_VIEWLET_ID) + .then(viewlet => viewlet as IExtensionsViewlet) + .then(viewlet => viewlet.search(`@id:${extension.identifier.id}`)) + .then(() => this.extensionManagementService.installFromGallery(extension)) + .then(() => null, err => this.notificationService.error(err)); + } } function registerLocaleDefinitionSchema(languages: string[]): void { From 85b344c99f666c29a914089b22e988a5f3697cc1 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Tue, 24 Apr 2018 15:57:52 +0200 Subject: [PATCH 706/710] Fix the id regex --- .../parts/extensions/electron-browser/extensionsViews.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts index 1065c40b80d..e269563125d 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts @@ -209,7 +209,7 @@ export class ExtensionsListView extends ViewsViewletPanel { return new PagedModel(this.sortExtensions(result, options)); } - const idMatch = /@id:([a-z0-9][a-z0-9\-]*\.[a-z0-9][a-z0-9\-]*)/.exec(value); + const idMatch = /@id:(([a-z0-9A-Z][a-z0-9\-A-Z]*)\.([a-z0-9A-Z][a-z0-9\-A-Z]*))/.exec(value); if (idMatch) { const name = idMatch[1]; From 59454c77922acee8ff5f32078191db51dd0659cf Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Tue, 24 Apr 2018 16:09:55 +0200 Subject: [PATCH 707/710] Fix #48438 --- .../parts/markers/electron-browser/markersPanelActions.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts index 074b2b70348..3c14e0e1e49 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts @@ -41,7 +41,6 @@ export class ToggleMarkersPanelAction extends TogglePanelAction { @IMarkersWorkbenchService markersWorkbenchService: IMarkersWorkbenchService ) { super(id, label, Constants.MARKERS_PANEL_ID, panelService, partService); - this.enabled = markersWorkbenchService.markersModel.hasFilteredResources(); } } From a41c09611365b9f06a822a32953e297d659d149d Mon Sep 17 00:00:00 2001 From: Christof Marti <chrmarti@microsoft.com> Date: Tue, 24 Apr 2018 16:10:54 +0200 Subject: [PATCH 708/710] Fix check for undefined (fixes #48523) --- src/vs/workbench/browser/parts/quickinput/quickInput.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 5e801b93870..d7c8a08d479 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -488,7 +488,7 @@ export class QuickInputService extends Component implements IQuickInputService { protected updateStyles() { const theme = this.themeService.getTheme(); - if (this.ui.inputBox) { + if (this.ui) { this.ui.inputBox.style(theme); } if (this.container) { From d2944d7575693cd73e04cef88c8999367c86e07a Mon Sep 17 00:00:00 2001 From: Johannes Rieken <johannes.rieken@gmail.com> Date: Tue, 24 Apr 2018 16:21:08 +0200 Subject: [PATCH 709/710] fix markdown-links in vscode.d.ts, #48527 --- src/vs/vscode.d.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 01ad4607951..2f09e079a4f 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3988,7 +3988,7 @@ declare module 'vscode' { * modify the diagnostics-array returned from this call. * * @param uri A resource identifier. - * @returns An immutable array of [diagnostics](#Diagnxostic) or `undefined`. + * @returns An immutable array of [diagnostics](#Diagnostic) or `undefined`. */ get(uri: Uri): Diagnostic[] | undefined; @@ -4969,7 +4969,7 @@ declare module 'vscode' { /** * An event to signal that a resource has been created, changed, or deleted. This - * event should fire for resources that are being [watched](#FileSystemProvider2.watch) + * event should fire for resources that are being [watched](#FileSystemProvider.watch) * by clients of this provider. */ readonly onDidChangeFile: Event<FileChangeEvent[]>; @@ -4982,7 +4982,7 @@ declare module 'vscode' { watch(uri: Uri, options: { recursive?: boolean; excludes?: string[] }): Disposable; /** - * Retrieve metadata about a file. Throw an [`EntryNotFound`](#FileError.EntryNotFound)-error + * Retrieve metadata about a file. Throw an [`FileNotFound`](#FileSystemError.FileNotFound)-error * in case the file does not exist. * * @param uri The uri of the file to retrieve meta data about. @@ -4992,7 +4992,7 @@ declare module 'vscode' { stat(uri: Uri, options: { /*future: followSymlinks*/ }, token: CancellationToken): FileStat | Thenable<FileStat>; /** - * Retrieve the meta data of all entries of a [directory](#FileType2.Directory) + * Retrieve the meta data of all entries of a [directory](#FileStat.isDirectory) * * @param uri The uri of the folder. * @param token A cancellation token. @@ -7263,7 +7263,7 @@ declare module 'vscode' { } /** - * An event describing the changes to the set of [breakpoints](#debug.Breakpoint). + * An event describing the changes to the set of [breakpoints](#Breakpoint). */ export interface BreakpointsChangeEvent { /** From 8aa6fe9ff4cbe3d7a710dafc2f00b39cc9d2be92 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu <sasomava@microsoft.com> Date: Tue, 24 Apr 2018 16:26:12 +0200 Subject: [PATCH 710/710] #48535 Get progress location from view location --- .../browser/parts/views/customView.ts | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index 7c67ec99ee5..c9b52390c63 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -11,7 +11,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as DOM from 'vs/base/browser/dom'; import { LIGHT, FileThemeIcon, FolderThemeIcon } from 'vs/platform/theme/common/themeService'; import { ITree, IDataSource, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; -import { TreeItemCollapsibleState, ITreeItem, ITreeViewer, IViewsService, ITreeViewDataProvider, ViewsRegistry, IViewDescriptor, TreeViewItemHandleArg, ICustomViewDescriptor, IViewsViewlet } from 'vs/workbench/common/views'; +import { TreeItemCollapsibleState, ITreeItem, ITreeViewer, IViewsService, ITreeViewDataProvider, ViewsRegistry, IViewDescriptor, TreeViewItemHandleArg, ICustomViewDescriptor, IViewsViewlet, ViewLocation } from 'vs/workbench/common/views'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IProgressService2, ProgressLocation } from 'vs/platform/progress/common/progress'; @@ -72,7 +72,7 @@ export class CustomViewsService extends Disposable implements IViewsService { private createViewers(viewDescriptors: IViewDescriptor[]): void { for (const viewDescriptor of viewDescriptors) { if ((<ICustomViewDescriptor>viewDescriptor).treeView) { - this.viewers.set(viewDescriptor.id, this.instantiationService.createInstance(CustomTreeViewer, viewDescriptor.id)); + this.viewers.set(viewDescriptor.id, this.instantiationService.createInstance(CustomTreeViewer, viewDescriptor.id, viewDescriptor.location)); } } } @@ -113,6 +113,7 @@ class CustomTreeViewer extends Disposable implements ITreeViewer { constructor( private id: string, + private location: ViewLocation, @IExtensionService private extensionService: IExtensionService, @IWorkbenchThemeService private themeService: IWorkbenchThemeService, @IInstantiationService private instantiationService: IInstantiationService, @@ -215,7 +216,7 @@ class CustomTreeViewer extends Disposable implements ITreeViewer { this.treeContainer = DOM.$('.tree-explorer-viewlet-tree-view'); const actionItemProvider = (action: IAction) => action instanceof MenuItemAction ? this.instantiationService.createInstance(ContextAwareMenuItemActionItem, action) : undefined; const menus = this.instantiationService.createInstance(Menus, this.id); - const dataSource = this.instantiationService.createInstance(TreeDataSource, this); + const dataSource = this.instantiationService.createInstance(TreeDataSource, this, this.getProgressLocation()); const renderer = this.instantiationService.createInstance(TreeRenderer, this.id, menus, actionItemProvider); const controller = this.instantiationService.createInstance(TreeController, this.id, menus); this.tree = this.instantiationService.createInstance(FileIconThemableWorkbenchTree, this.treeContainer, { dataSource, renderer, controller }, {}); @@ -225,6 +226,18 @@ class CustomTreeViewer extends Disposable implements ITreeViewer { this.tree.setInput(this.root); } + private getProgressLocation(): ProgressLocation { + switch (this.location.id) { + case ViewLocation.Explorer.id: + return ProgressLocation.Explorer; + case ViewLocation.SCM.id: + return ProgressLocation.Scm; + case ViewLocation.Debug.id: + return null /* No debug progress location yet */; + } + return null; + } + layout(size: number) { if (this.tree) { this.treeContainer.style.height = size + 'px'; @@ -311,6 +324,7 @@ class TreeDataSource implements IDataSource { constructor( private treeView: ITreeViewer, + private location: ProgressLocation, @IProgressService2 private progressService: IProgressService2 ) { } @@ -325,7 +339,7 @@ class TreeDataSource implements IDataSource { public getChildren(tree: ITree, node: ITreeItem): TPromise<any[]> { if (this.treeView.dataProvider) { - return this.progressService.withProgress({ location: ProgressLocation.Explorer }, () => this.treeView.dataProvider.getChildren(node)); + return this.location ? this.treeView.dataProvider.getChildren(node) : this.progressService.withProgress({ location: this.location }, () => this.treeView.dataProvider.getChildren(node)); } return TPromise.as([]); }