From b0ac7e40bbda9b2b232b7ce9616469f3e0178af4 Mon Sep 17 00:00:00 2001 From: Sebastian Pfitzner Date: Thu, 28 Jan 2021 16:55:22 +0100 Subject: [PATCH 01/86] add Julia grammar --- extensions/julia/.vscodeignore | 2 + extensions/julia/cgmanifest.json | 17 + extensions/julia/language-configuration.json | 31 + extensions/julia/package.json | 54 + extensions/julia/package.nls.json | 4 + .../julia/syntaxes/julia.tmLanguage.json | 1113 +++++++++++++++++ 6 files changed, 1221 insertions(+) create mode 100644 extensions/julia/.vscodeignore create mode 100644 extensions/julia/cgmanifest.json create mode 100644 extensions/julia/language-configuration.json create mode 100644 extensions/julia/package.json create mode 100644 extensions/julia/package.nls.json create mode 100644 extensions/julia/syntaxes/julia.tmLanguage.json diff --git a/extensions/julia/.vscodeignore b/extensions/julia/.vscodeignore new file mode 100644 index 00000000000..d9011becfb6 --- /dev/null +++ b/extensions/julia/.vscodeignore @@ -0,0 +1,2 @@ +build/** +cgmanifest.json diff --git a/extensions/julia/cgmanifest.json b/extensions/julia/cgmanifest.json new file mode 100644 index 00000000000..ef8a78a5761 --- /dev/null +++ b/extensions/julia/cgmanifest.json @@ -0,0 +1,17 @@ +{ + "registrations": [ + { + "component": { + "type": "git", + "git": { + "name": " JuliaEditorSupport/atom-language-julia", + "repositoryUrl": "https://github.com/JuliaEditorSupport/atom-language-julia", + "commitHash": "df335e026376acd722439aa1ac08f0889ada022e" + } + }, + "license": "MIT", + "version": "0.20.2" + } + ], + "version": 1 +} \ No newline at end of file diff --git a/extensions/julia/language-configuration.json b/extensions/julia/language-configuration.json new file mode 100644 index 00000000000..ea2f5011739 --- /dev/null +++ b/extensions/julia/language-configuration.json @@ -0,0 +1,31 @@ +{ + "comments": { + "lineComment": "#", + "blockComment": [ "#=", "=#" ] + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["`", "`"], + { "open": "\"", "close": "\"", "notIn": ["string", "comment"] } + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["`", "`"] + ], + "folding": { + "markers": { + "start": "^\\s*#region", + "end": "^\\s*#endregion" + } + } +} diff --git a/extensions/julia/package.json b/extensions/julia/package.json new file mode 100644 index 00000000000..fdf0ce01a7e --- /dev/null +++ b/extensions/julia/package.json @@ -0,0 +1,54 @@ +{ + "name": "julia", + "displayName": "%displayName%", + "description": "%description%", + "version": "1.0.0", + "publisher": "vscode", + "license": "MIT", + "engines": { + "vscode": "0.10.x" + }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js JuliaEditorSupport/atom-language-julia grammars/julia_vscode.json ./syntaxes/julia.tmLanguage.json" + }, + "contributes": { + "languages": [ + { + "id": "julia", + "aliases": [ + "Julia", + "julia" + ], + "extensions": [ + ".jl" + ], + "firstLine": "^#!\\s*/.*\\bjulia[0-9.-]*\\b", + "configuration": "./language-configuration.json" + }, + { + "id": "juliamarkdown", + "aliases": [ + "Julia Markdown", + "juliamarkdown" + ], + "extensions": [ + ".jmd" + ] + } + ], + "grammars": [ + { + "language": "julia", + "scopeName": "source.julia", + "path": "./syntaxes/julia.tmLanguage.json", + "embeddedLanguages": { + "meta.embedded.inline.cpp": "cpp", + "meta.embedded.inline.javascript": "javascript", + "meta.embedded.inline.python": "python", + "meta.embedded.inline.r": "r", + "meta.embedded.inline.sql": "sql" + } + } + ] + } +} diff --git a/extensions/julia/package.nls.json b/extensions/julia/package.nls.json new file mode 100644 index 00000000000..0da344107c1 --- /dev/null +++ b/extensions/julia/package.nls.json @@ -0,0 +1,4 @@ +{ + "displayName": "Julia Language Basics", + "description": "Provides syntax highlighting & bracket matching in Julia files." +} diff --git a/extensions/julia/syntaxes/julia.tmLanguage.json b/extensions/julia/syntaxes/julia.tmLanguage.json new file mode 100644 index 00000000000..a5a26c969d5 --- /dev/null +++ b/extensions/julia/syntaxes/julia.tmLanguage.json @@ -0,0 +1,1113 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/JuliaEditorSupport/atom-language-julia/blob/master/grammars/julia_vscode.json", + "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/JuliaEditorSupport/atom-language-julia/commit/df335e026376acd722439aa1ac08f0889ada022e", + "name": "Julia", + "scopeName": "source.julia", + "comment": "This grammar is used by Atom (Oniguruma), GitHub (PCRE), and VSCode (Oniguruma),\nso all regexps must be compatible with both engines.\n\nSpecs:\n- https://github.com/kkos/oniguruma/blob/master/doc/RE\n- https://www.pcre.org/current/doc/html/", + "patterns": [ + { + "include": "#operator" + }, + { + "include": "#array" + }, + { + "include": "#string" + }, + { + "include": "#bracket" + }, + { + "include": "#function_decl" + }, + { + "include": "#function_call" + }, + { + "include": "#keyword" + }, + { + "include": "#number" + }, + { + "include": "#comment" + }, + { + "include": "#type_decl" + }, + { + "include": "#symbol" + } + ], + "repository": { + "array": { + "patterns": [ + { + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "meta.bracket.julia" + } + }, + "end": "(?:\\])(?:(\\.)?'*)", + "endCaptures": { + "0": { + "name": "meta.bracket.julia" + }, + "1": { + "name": "keyword.operator.transpose.julia" + } + }, + "name": "meta.array.julia", + "patterns": [ + { + "match": "\\bbegin\\b", + "name": "constant.numeric.julia" + }, + { + "match": "\\bend\\b", + "name": "constant.numeric.julia" + }, + { + "match": "\\bfor\\b", + "name": "keyword.control.julia" + }, + { + "include": "$self" + } + ] + } + ] + }, + "bracket": { + "patterns": [ + { + "match": "(?:\\(|\\)|\\[|\\]|\\{|\\}|,|;)(?!('|(?:\\.'))*\\.?')", + "name": "meta.bracket.julia" + } + ] + }, + "comment": { + "patterns": [ + { + "include": "#comment_block" + }, + { + "begin": "#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.julia" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.julia" + } + ] + }, + "comment_block": { + "patterns": [ + { + "begin": "#=", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.begin.julia" + } + }, + "end": "=#", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.end.julia" + } + }, + "name": "comment.block.number-sign-equals.julia", + "patterns": [ + { + "include": "#comment_block" + } + ] + } + ] + }, + "function_call": { + "patterns": [ + { + "begin": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?\\.?(?=\\()", + "beginCaptures": { + "1": { + "name": "support.function.julia" + }, + "2": { + "name": "support.type.julia" + } + }, + "end": "\\)(('|(\\.'))*\\.?')?", + "endCaptures": { + "0": { + "name": "meta.bracket.julia" + }, + "1": { + "name": "keyword.operator.transposed-func.julia" + } + }, + "patterns": [ + { + "match": "\\bfor\\b", + "name": "keyword.control.julia" + }, + { + "include": "$self" + } + ] + } + ] + }, + "function_decl": { + "patterns": [ + { + "captures": { + "1": { + "name": "entity.name.function.julia" + }, + "2": { + "name": "support.type.julia" + } + }, + "match": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?(?=\\(.*\\)(::[^\\s]+)?(\\s*\\bwhere\\b\\s+.+?)?\\s*?=(?![=>]))", + "comment": "first group is function name\nSecond group is type parameters (e.g. {T<:Number, S})\nThen open parens\nThen a lookahead ensures that we are followed by:\n - anything (function argumnets)\n - 0 or more spaces\n - Finally an equal sign\nNegative lookahead ensures we don't have another equal sign (not `==`)" + }, + { + "captures": { + "1": { + "name": "keyword.other.julia" + }, + "2": { + "name": "keyword.operator.dots.julia" + }, + "3": { + "name": "entity.name.function.julia" + }, + "4": { + "name": "support.type.julia" + } + }, + "match": "\\b(function|macro)(?:\\s+(?:(?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*(\\.))?((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)({(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})?|\\s*)(?=\\()", + "comment": "similar regex to previous, but with keyword not 1-line syntax" + } + ] + }, + "keyword": { + "patterns": [ + { + "match": "\\b(?|<-|-->|=>)", + "name": "keyword.operator.arrow.julia" + }, + { + "match": "(?::=|\\+=|-=|\\*=|//=|/=|\\.//=|\\./=|\\.\\*=|\\\\=|\\.\\\\=|\\^=|\\.\\^=|%=|\\.%=|÷=|\\.÷=|\\|=|&=|\\.&=|⊻=|\\.⊻=|\\$=|<<=|>>=|>>>=|=(?!=))", + "name": "keyword.operator.update.julia" + }, + { + "match": "(?:<<|>>>|>>|\\.>>>|\\.>>|\\.<<)", + "name": "keyword.operator.shift.julia" + }, + { + "match": "(?:\\s*(::|>:|<:)\\s*((?:(?:Union)?\\([^)]*\\)|[[:alpha:]_$∇][[:word:]⁺-ₜ!′\\.]*(?:(?:{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})|(?:\".+?(?=|\\.>|\\.<=|\\.<|\\.≤|\\.≥|==|\\.!=|\\.=|\\.!|<:|>:|:>|(?)>=|(?|<|≥|≤)", + "name": "keyword.operator.relation.julia" + }, + { + "match": "(?<=\\s)(?:\\?)(?=\\s)", + "name": "keyword.operator.ternary.julia" + }, + { + "match": "(?<=\\s)(?:\\:)(?=\\s)", + "name": "keyword.operator.ternary.julia" + }, + { + "match": "(?:\\|\\||&&|(?)", + "name": "keyword.operator.applies.julia" + }, + { + "match": "(?:\\||\\.\\||\\&|\\.\\&|~|\\.~|⊻|\\.⊻)", + "name": "keyword.operator.bitwise.julia" + }, + { + "match": "(?:\\+\\+|--|\\+|\\.\\+|-|\\.\\-|\\*|\\.\\*|//(?!=)|\\.//(?!=)|/|\\./|%|\\.%|\\\\|\\.\\\\|\\^|\\.\\^|÷|\\.÷|⋅|\\.⋅|∩|\\.∩|∪|\\.∪|×|√|∛)", + "name": "keyword.operator.arithmetic.julia" + }, + { + "match": "(?:∘)", + "name": "keyword.operator.compose.julia" + }, + { + "match": "(?:::|(?<=\\s)isa(?=\\s))", + "name": "keyword.operator.isa.julia" + }, + { + "match": "(?:(?<=\\s)in(?=\\s))", + "name": "keyword.operator.relation.in.julia" + }, + { + "match": "(?:\\.(?=(?:@|_|\\p{L}))|\\.\\.+)", + "name": "keyword.operator.dots.julia" + }, + { + "match": "(?:\\$(?=.+))", + "name": "keyword.operator.interpolation.julia" + }, + { + "captures": { + "2": { + "name": "keyword.operator.transposed-variable.julia" + } + }, + "match": "((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-��]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)(('|(\\.'))*\\.?')" + }, + { + "captures": { + "1": { + "name": "bracket.end.julia" + }, + "2": { + "name": "keyword.operator.transposed-matrix.julia" + } + }, + "match": "(\\])((?:'|(?:\\.'))*\\.?')" + }, + { + "captures": { + "1": { + "name": "bracket.end.julia" + }, + "2": { + "name": "keyword.operator.transposed-parens.julia" + } + }, + "match": "(\\))((?:'|(?:\\.'))*\\.?')" + } + ] + }, + "string": { + "patterns": [ + { + "begin": "(?:(@doc)\\s((?:doc)?\"\"\")|(doc\"\"\"))", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\"\"\") ?(->)?", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.julia" + }, + "2": { + "name": "keyword.operator.arrow.julia" + } + }, + "name": "string.docstring.julia", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(i?cxx)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.cxx.julia", + "contentName": "meta.embedded.inline.cpp", + "patterns": [ + { + "include": "source.cpp#root_context" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "((i?cxxt?)|([rpv]cpp))(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "4": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.cxx.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.cpp", + "patterns": [ + { + "include": "source.cpp#root_context" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(py)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "([\\s\\w]*)(\"\"\")", + "endCaptures": { + "2": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.python.julia", + "contentName": "meta.embedded.inline.python", + "patterns": [ + { + "include": "source.python" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(py)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\\w*)(\")", + "name": "embed.python.julia", + "endCaptures": { + "2": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.python", + "patterns": [ + { + "include": "source.python" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(js)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.js.julia", + "contentName": "meta.embedded.inline.javascript", + "patterns": [ + { + "include": "source.js" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(js)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.js.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.javascript", + "patterns": [ + { + "include": "source.js" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(R)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.R.julia", + "contentName": "meta.embedded.inline.r", + "patterns": [ + { + "include": "source.r" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(R)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.R.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.r", + "patterns": [ + { + "include": "source.r" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(raw)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "name": "string.quoted.other.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + } + }, + { + "begin": "(raw)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "string.quoted.other.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + } + }, + { + "begin": "(sql)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.sql.julia", + "contentName": "meta.embedded.inline.sql", + "patterns": [ + { + "include": "source.sql" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(sql)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.sql.julia", + "contentName": "meta.embedded.inline.sql", + "patterns": [ + { + "include": "source.sql" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "var\"\"\"", + "end": "\"\"\"", + "name": "constant.other.symbol.julia" + }, + { + "begin": "var\"", + "end": "\"", + "name": "constant.other.symbol.julia" + }, + { + "begin": "(md)(\"\"\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "embed.markdown.julia", + "contentName": "meta.embedded.inline.markdown", + "patterns": [ + { + "include": "text.md" + }, + { + "include": "text.html.markdown.julia" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "(md)(\")", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "\"", + "name": "embed.markdown.julia", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "contentName": "meta.embedded.inline.markdown", + "patterns": [ + { + "include": "text.md" + }, + { + "include": "text.html.markdown.julia" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "^\\s?(doc)?(\"\"\")\\s?$", + "beginCaptures": { + "1": { + "name": "support.function.macro.julia" + }, + "2": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "(\"\"\")", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "string.docstring.julia", + "comment": "This only matches docstrings that start and end with triple quotes on\ntheir own line in the void", + "patterns": [ + { + "include": "#string_escaped_char" + }, + { + "include": "#string_dollar_sign_interpolate" + } + ] + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.julia" + } + }, + "end": "'(?!')", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.julia" + } + }, + "name": "string.quoted.single.julia", + "patterns": [ + { + "include": "#string_escaped_char" + } + ] + }, + { + "begin": "(?!:_)(?:struct|mutable\\s+struct|abstract\\s+type|primitive\\s+type)\\s+((?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*)(\\s*(<:)\\s*(?:[[:alpha:]_\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{So}←-⇿])(?:[[:word:]_!\\p{Lu}\\p{Ll}\\p{Lt}\\p{Lm}\\p{Lo}\\p{Nl}\\p{Sc}⅀-⅄∿⊾⊿⊤⊥∂∅-∇∎∏∐∑∞∟∫-∳⋀-⋃◸-◿♯⟘⟙⟀⟁⦰-⦴⨀-⨆⨉-⨖⨛⨜𝛁𝛛𝛻𝜕𝜵𝝏𝝯𝞉𝞩𝟃ⁱ-⁾₁-₎∠-∢⦛-⦯℘℮゛-゜𝟎-𝟡]|[^\\P{Mn}\u0001-¡]|[^\\P{Mc}\u0001-¡]|[^\\P{Nd}\u0001-¡]|[^\\P{Pc}\u0001-¡]|[^\\P{Sk}\u0001-¡]|[^\\P{Me}\u0001-¡]|[^\\P{No}\u0001-¡]|[′-‷⁗]|[^\\P{So}←-⇿])*(?:{.*})?)?", + "name": "meta.type.julia" + } + ] + } + } +} \ No newline at end of file From e60bc310b8e4c15b011474571a99f3e98b663cf3 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 Feb 2021 17:50:59 +0100 Subject: [PATCH 02/86] move window logging to main --- src/vs/code/electron-main/app.ts | 4 +- src/vs/code/electron-main/main.ts | 5 +- src/vs/platform/log/common/log.ts | 69 ++++++++++++++++++ src/vs/platform/log/common/logIpc.ts | 43 +++++++++-- src/vs/platform/log/node/spdlogLog.ts | 67 +---------------- .../electron-sandbox/remote.contribution.ts | 5 +- .../electron-browser/desktop.main.ts | 4 +- .../log/electron-browser/logService.ts | 72 ------------------- .../log/electron-sandbox/logService.ts | 42 +++++++++++ 9 files changed, 163 insertions(+), 148 deletions(-) delete mode 100644 src/vs/workbench/services/log/electron-browser/logService.ts create mode 100644 src/vs/workbench/services/log/electron-sandbox/logService.ts diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 3f85072d571..add198ff2c1 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -21,7 +21,7 @@ import { LaunchMainService, ILaunchMainService } from 'vs/platform/launch/electr import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { ILogService } from 'vs/platform/log/common/log'; +import { ILoggerService, ILogService } from 'vs/platform/log/common/log'; import { IStateService } from 'vs/platform/state/node/state'; import { IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -660,7 +660,7 @@ export class CodeApplication extends Disposable { electronIpcServer.registerChannel('storage', storageChannel); sharedProcessClient.then(client => client.registerChannel('storage', storageChannel)); - const loggerChannel = new LoggerChannel(accessor.get(ILogService)); + const loggerChannel = new LoggerChannel(accessor.get(ILogService), accessor.get(ILoggerService)); electronIpcServer.registerChannel('logger', loggerChannel); sharedProcessClient.then(client => client.registerChannel('logger', loggerChannel)); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 3da94d9c531..581d8df94ad 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -20,7 +20,7 @@ import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiati import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { ILogService, ConsoleMainLogger, MultiplexLogService, getLogLevel } from 'vs/platform/log/common/log'; +import { ILogService, ConsoleMainLogger, MultiplexLogService, getLogLevel, ILoggerService } from 'vs/platform/log/common/log'; import { StateService } from 'vs/platform/state/node/stateService'; import { IStateService } from 'vs/platform/state/node/state'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -54,6 +54,7 @@ import { coalesce, distinct } from 'vs/base/common/arrays'; import { EnvironmentMainService, IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { LoggerService } from 'vs/platform/log/node/loggerService'; class ExpectedError extends Error { readonly isExpected = true; @@ -163,6 +164,8 @@ class CodeMain { const diskFileSystemProvider = new DiskFileSystemProvider(logService); fileService.registerProvider(Schemas.file, diskFileSystemProvider); + services.set(ILoggerService, new LoggerService(logService, fileService)); + services.set(IConfigurationService, new ConfigurationService(environmentService.settingsResource, fileService)); services.set(ILifecycleMainService, new SyncDescriptor(LifecycleMainService)); services.set(IStateService, new SyncDescriptor(StateService)); diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index 5301e86a089..79e1d362337 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -78,6 +78,75 @@ export abstract class AbstractLogger extends Disposable { } +export abstract class AbstractMessageLogger extends AbstractLogger implements ILogger { + + protected abstract log(level: LogLevel, message: string): void; + + trace(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Trace) { + this.log(LogLevel.Trace, this.format([message, ...args])); + } + } + + debug(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Debug) { + this.log(LogLevel.Debug, this.format([message, ...args])); + } + } + + info(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Info) { + this.log(LogLevel.Info, this.format([message, ...args])); + } + } + + warn(message: string, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Warning) { + this.log(LogLevel.Warning, this.format([message, ...args])); + } + } + + error(message: string | Error, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Error) { + + if (message instanceof Error) { + const array = Array.prototype.slice.call(arguments) as any[]; + array[0] = message.stack; + this.log(LogLevel.Error, this.format(array)); + } else { + this.log(LogLevel.Error, this.format([message, ...args])); + } + } + } + + critical(message: string | Error, ...args: any[]): void { + if (this.getLevel() <= LogLevel.Critical) { + this.log(LogLevel.Critical, this.format([message, ...args])); + } + } + + flush(): void { } + + private format(args: any): string { + let result = ''; + + for (let i = 0; i < args.length; i++) { + let a = args[i]; + + if (typeof a === 'object') { + try { + a = JSON.stringify(a); + } catch (e) { } + } + + result += (i > 0 ? ' ' : '') + a; + } + + return result; + } +} + + export class ConsoleMainLogger extends AbstractLogger implements ILogger { private useColors: boolean; diff --git a/src/vs/platform/log/common/logIpc.ts b/src/vs/platform/log/common/logIpc.ts index e97ece3ca01..8d42e71591f 100644 --- a/src/vs/platform/log/common/logIpc.ts +++ b/src/vs/platform/log/common/logIpc.ts @@ -4,14 +4,18 @@ *--------------------------------------------------------------------------------------------*/ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -import { LogLevel, ILogService, LogService } from 'vs/platform/log/common/log'; +import { LogLevel, ILogService, LogService, ILoggerService, ILogger, AbstractMessageLogger } from 'vs/platform/log/common/log'; import { Event } from 'vs/base/common/event'; +import { URI } from 'vs/base/common/uri'; export class LoggerChannel implements IServerChannel { onDidChangeLogLevel: Event; - constructor(private service: ILogService) { + constructor( + private service: ILogService, + private readonly loggerService: ILoggerService, + ) { this.onDidChangeLogLevel = Event.buffer(service.onDidChangeLogLevel, true); } @@ -23,10 +27,12 @@ export class LoggerChannel implements IServerChannel { throw new Error(`Event not found: ${event}`); } - call(_: unknown, command: string, arg?: any): Promise { + async call(_: unknown, command: string, arg?: any): Promise { switch (command) { - case 'setLevel': this.service.setLevel(arg); return Promise.resolve(); - case 'consoleLog': this.consoleLog(arg[0], arg[1]); return Promise.resolve(); + case 'setLevel': return this.service.setLevel(arg); + case 'consoleLog': return this.consoleLog(arg[0], arg[1]); + case 'initLogger': this.getLogger(URI.revive(arg[0])); return; + case 'log': return this.log(URI.revive(arg[0]), arg[1], arg[2]); } throw new Error(`Call not found: ${command}`); @@ -49,6 +55,23 @@ export class LoggerChannel implements IServerChannel { consoleFn.call(console, ...args); } + + private getLogger(file: URI): ILogger { + return this.loggerService.getLogger(file); + } + + private log(file: URI, level: LogLevel, message: string): void { + const logger = this.getLogger(file); + switch (level) { + case LogLevel.Trace: logger.trace(message); break; + case LogLevel.Debug: logger.debug(message); break; + case LogLevel.Info: logger.info(message); break; + case LogLevel.Warning: logger.warn(message); break; + case LogLevel.Error: logger.error(message); break; + case LogLevel.Critical: logger.critical(message); break; + default: throw new Error('Invalid log level'); + } + } } export class LoggerChannelClient { @@ -70,6 +93,16 @@ export class LoggerChannelClient { consoleLog(severity: string, args: string[]): void { this.channel.call('consoleLog', [severity, args]); } + + getLogger(file: URI): ILogger { + this.channel.call('initLogger', [file]); + const that = this; + return new class extends AbstractMessageLogger { + protected log(level: LogLevel, message: string) { + that.channel.call('log', [file, level, message]); + } + }; + } } export class FollowerLogService extends LogService implements ILogService { diff --git a/src/vs/platform/log/node/spdlogLog.ts b/src/vs/platform/log/node/spdlogLog.ts index 55f70e7dc0f..f3e566c5c21 100644 --- a/src/vs/platform/log/node/spdlogLog.ts +++ b/src/vs/platform/log/node/spdlogLog.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as path from 'vs/base/common/path'; -import { LogLevel, AbstractLogger, ILogger } from 'vs/platform/log/common/log'; +import { LogLevel, ILogger, AbstractMessageLogger } from 'vs/platform/log/common/log'; import * as spdlog from 'spdlog'; import { ByteSize } from 'vs/platform/files/common/files'; @@ -43,7 +43,7 @@ function log(logger: spdlog.RotatingLogger, level: LogLevel, message: string): v } } -export class SpdLogLogger extends AbstractLogger implements ILogger { +export class SpdLogLogger extends AbstractMessageLogger implements ILogger { private buffer: ILog[] = []; private _loggerCreationPromise: Promise | undefined = undefined; @@ -77,7 +77,7 @@ export class SpdLogLogger extends AbstractLogger implements ILogger { return this._loggerCreationPromise; } - private _log(level: LogLevel, message: string): void { + protected log(level: LogLevel, message: string): void { if (this._logger) { log(this._logger, level, message); } else if (this.getLevel() <= level) { @@ -85,49 +85,6 @@ export class SpdLogLogger extends AbstractLogger implements ILogger { } } - trace(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Trace) { - this._log(LogLevel.Trace, this.format([message, ...args])); - } - } - - debug(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Debug) { - this._log(LogLevel.Debug, this.format([message, ...args])); - } - } - - info(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Info) { - this._log(LogLevel.Info, this.format([message, ...args])); - } - } - - warn(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Warning) { - this._log(LogLevel.Warning, this.format([message, ...args])); - } - } - - error(message: string | Error, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Error) { - - if (message instanceof Error) { - const array = Array.prototype.slice.call(arguments) as any[]; - array[0] = message.stack; - this._log(LogLevel.Error, this.format(array)); - } else { - this._log(LogLevel.Error, this.format([message, ...args])); - } - } - } - - critical(message: string | Error, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { - this._log(LogLevel.Critical, this.format([message, ...args])); - } - } - flush(): void { if (this._logger) { this._logger.flush(); @@ -151,22 +108,4 @@ export class SpdLogLogger extends AbstractLogger implements ILogger { this._logger = undefined; } } - - private format(args: any): string { - let result = ''; - - for (let i = 0; i < args.length; i++) { - let a = args[i]; - - if (typeof a === 'object') { - try { - a = JSON.stringify(a); - } catch (e) { } - } - - result += (i > 0 ? ' ' : '') + a; - } - - return result; - } } diff --git a/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts b/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts index 9539d660d85..0b9e209d249 100644 --- a/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts @@ -16,7 +16,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { Schemas } from 'vs/base/common/network'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { ILogService } from 'vs/platform/log/common/log'; +import { ILoggerService, ILogService } from 'vs/platform/log/common/log'; import { DownloadServiceChannel } from 'vs/platform/download/common/downloadIpc'; import { LoggerChannel } from 'vs/platform/log/common/logIpc'; import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; @@ -34,13 +34,14 @@ class RemoteChannelsContribution implements IWorkbenchContribution { constructor( @ILogService logService: ILogService, + @ILogService loggerService: ILoggerService, @IRemoteAgentService remoteAgentService: IRemoteAgentService, @IDownloadService downloadService: IDownloadService ) { const connection = remoteAgentService.getConnection(); if (connection) { connection.registerChannel('download', new DownloadServiceChannel(downloadService)); - connection.registerChannel('logger', new LoggerChannel(logService)); + connection.registerChannel('logger', new LoggerChannel(logService, loggerService)); } } } diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 465542118c5..8e89ce8d535 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -44,7 +44,7 @@ import { FileUserDataProvider } from 'vs/workbench/services/userData/common/file import { basename } from 'vs/base/common/path'; import { IProductService } from 'vs/platform/product/common/productService'; import product from 'vs/platform/product/common/product'; -import { NativeLogService } from 'vs/workbench/services/log/electron-browser/logService'; +import { NativeLogService } from 'vs/workbench/services/log/electron-sandbox/logService'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import { NativeHostService } from 'vs/platform/native/electron-sandbox/nativeHostService'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; @@ -164,7 +164,7 @@ class DesktopMain extends Disposable { serviceCollection.set(IProductService, this.productService); // Log - const logService = this._register(new NativeLogService(this.configuration.windowId, mainProcessService, this.environmentService)); + const logService = this._register(new NativeLogService(mainProcessService, this.environmentService)); serviceCollection.set(ILogService, logService); // Remote diff --git a/src/vs/workbench/services/log/electron-browser/logService.ts b/src/vs/workbench/services/log/electron-browser/logService.ts deleted file mode 100644 index 038bf46b550..00000000000 --- a/src/vs/workbench/services/log/electron-browser/logService.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. - *--------------------------------------------------------------------------------------------*/ - -import { LogService, ILogService, ConsoleLogger, MultiplexLogService, ILogger, AdapterLogger } from 'vs/platform/log/common/log'; -import { BufferLogService } from 'vs/platform/log/common/bufferLog'; -import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; -import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; -import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; -import { SpdLogLogger } from 'vs/platform/log/node/spdlogLog'; -import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; - -export class NativeLogService extends LogService { - - private readonly bufferSpdLogService: BufferLogService | undefined; - private readonly windowId: number; - private readonly environmentService: INativeWorkbenchEnvironmentService; - - constructor(windowId: number, mainProcessService: IMainProcessService, environmentService: INativeWorkbenchEnvironmentService) { - - const disposables = new DisposableStore(); - const loggerClient = new LoggerChannelClient(mainProcessService.getChannel('logger')); - let bufferSpdLogService: BufferLogService | undefined; - - // Extension development test CLI: forward everything to main side - const loggers: ILogger[] = []; - if (environmentService.isExtensionDevelopment && !!environmentService.extensionTestsLocationURI) { - loggers.push( - disposables.add(new AdapterLogger({ log: (type, args) => loggerClient.consoleLog(type, args) }, environmentService.configuration.logLevel)) - ); - } - - // Normal logger: spdylog and console - else { - bufferSpdLogService = disposables.add(new BufferLogService(environmentService.configuration.logLevel)); - loggers.push( - disposables.add(new ConsoleLogger(environmentService.configuration.logLevel)), - bufferSpdLogService - ); - } - - const multiplexLogger = disposables.add(new MultiplexLogService(loggers)); - const followerLogger = disposables.add(new FollowerLogService(loggerClient, multiplexLogger)); - super(followerLogger); - - this.bufferSpdLogService = bufferSpdLogService; - this.windowId = windowId; - this.environmentService = environmentService; - - this._register(disposables); - } - - init(): void { - if (this.bufferSpdLogService) { - this.bufferSpdLogService.logger = this._register(new SpdLogLogger(`renderer${this.windowId}`, this.environmentService.logsPath, this.getLevel())); - this.trace('Created Spdlogger'); - } - } -} - -class NativeLogServiceInitContribution implements IWorkbenchContribution { - constructor(@ILogService logService: ILogService) { - if (logService instanceof NativeLogService) { - logService.init(); - } - } -} -Registry.as(Extensions.Workbench).registerWorkbenchContribution(NativeLogServiceInitContribution, LifecyclePhase.Restored); diff --git a/src/vs/workbench/services/log/electron-sandbox/logService.ts b/src/vs/workbench/services/log/electron-sandbox/logService.ts new file mode 100644 index 00000000000..a7538d944f0 --- /dev/null +++ b/src/vs/workbench/services/log/electron-sandbox/logService.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 { LogService, ConsoleLogger, MultiplexLogService, ILogger, AdapterLogger } from 'vs/platform/log/common/log'; +import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; +import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; +import { DisposableStore } from 'vs/base/common/lifecycle'; + +export class NativeLogService extends LogService { + + constructor(mainProcessService: IMainProcessService, environmentService: INativeWorkbenchEnvironmentService) { + + const disposables = new DisposableStore(); + const loggerClient = new LoggerChannelClient(mainProcessService.getChannel('logger')); + + // Extension development test CLI: forward everything to main side + const loggers: ILogger[] = []; + if (environmentService.isExtensionDevelopment && !!environmentService.extensionTestsLocationURI) { + loggers.push( + disposables.add(new AdapterLogger({ log: (type, args) => loggerClient.consoleLog(type, args) }, environmentService.configuration.logLevel)) + ); + } + + // Normal logger: spdylog and console + else { + loggers.push( + disposables.add(new ConsoleLogger(environmentService.configuration.logLevel)), + disposables.add(loggerClient.getLogger(environmentService.logFile)) + ); + } + + const multiplexLogger = disposables.add(new MultiplexLogService(loggers)); + const followerLogger = disposables.add(new FollowerLogService(loggerClient, multiplexLogger)); + super(followerLogger); + + this._register(disposables); + } + +} From 2baf63ad00125c89b3fce1835b881a8ab1d98992 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 7 Feb 2021 13:10:15 +0100 Subject: [PATCH 03/86] use logger service for output appenders --- .../sharedProcess/sharedProcessMain.ts | 9 +- src/vs/code/electron-main/app.ts | 9 +- src/vs/code/electron-main/main.ts | 4 +- src/vs/code/node/cliProcessMain.ts | 2 +- src/vs/platform/log/common/fileLog.ts | 2 +- src/vs/platform/log/common/log.ts | 36 ++++-- src/vs/platform/log/common/logIpc.ts | 113 ++++++++++-------- src/vs/platform/log/node/loggerService.ts | 25 ++-- src/vs/platform/log/node/spdlogLog.ts | 55 +++++---- .../telemetry/common/telemetryLogAppender.ts | 2 +- .../test/common/telemetryLogAppender.test.ts | 2 +- .../userDataSync/common/userDataSyncLog.ts | 2 +- .../workbench/api/node/extHostLogService.ts | 3 +- .../api/node/extHostOutputService.ts | 23 +++- .../outputChannelModelService.ts | 18 +-- .../remote/common/remote.contribution.ts | 4 +- .../electron-sandbox/remote.contribution.ts | 4 +- .../electron-browser/desktop.main.ts | 9 +- .../log/electron-sandbox/logService.ts | 17 ++- .../log/electron-sandbox/loggerService.ts | 61 ++++++++++ .../services/output/node/outputAppender.ts | 25 ---- src/vs/workbench/workbench.desktop.main.ts | 2 +- 22 files changed, 271 insertions(+), 156 deletions(-) rename src/vs/workbench/contrib/output/{electron-browser => electron-sandbox}/outputChannelModelService.ts (93%) create mode 100644 src/vs/workbench/services/log/electron-sandbox/loggerService.ts delete mode 100644 src/vs/workbench/services/output/node/outputAppender.ts diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index c01735c558e..b825abc624f 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -30,7 +30,7 @@ import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService' import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ILogService, ILoggerService, MultiplexLogService, ConsoleLogger } from 'vs/platform/log/common/log'; -import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; +import { LogLevelChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { LocalizationsService } from 'vs/platform/localizations/node/localizations'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { combinedDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -78,6 +78,7 @@ import { LocalizationsUpdater } from 'vs/code/electron-browser/sharedProcess/con import { DeprecatedExtensionsCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/deprecatedExtensionsCleaner'; import { onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { toErrorMessage } from 'vs/base/common/errorMessage'; +import { join } from 'vs/base/common/path'; class SharedProcessMain extends Disposable { @@ -142,13 +143,13 @@ class SharedProcessMain extends Disposable { // Log const mainRouter = new StaticRouter(ctx => ctx === 'main'); - const loggerClient = new LoggerChannelClient(this.server.getChannel('logger', mainRouter)); // we only use this for log levels + const logLevelClient = new LogLevelChannelClient(this.server.getChannel('logLevel', mainRouter)); // we only use this for log levels const multiplexLogger = this._register(new MultiplexLogService([ this._register(new ConsoleLogger(this.configuration.logLevel)), - this._register(new SpdLogLogger('sharedprocess', environmentService.logsPath, this.configuration.logLevel)) + this._register(new SpdLogLogger('sharedprocess', join(environmentService.logsPath, 'sharedprocess.log'), true, this.configuration.logLevel)) ])); - const logService = this._register(new FollowerLogService(loggerClient, multiplexLogger)); + const logService = this._register(new FollowerLogService(logLevelClient, multiplexLogger)); services.set(ILogService, logService); // Main Process diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index add198ff2c1..e58125c5f1b 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -45,7 +45,7 @@ import { Win32UpdateService } from 'vs/platform/update/electron-main/updateServi import { LinuxUpdateService } from 'vs/platform/update/electron-main/updateService.linux'; import { DarwinUpdateService } from 'vs/platform/update/electron-main/updateService.darwin'; import { IssueMainService, IIssueMainService } from 'vs/platform/issue/electron-main/issueMainService'; -import { LoggerChannel } from 'vs/platform/log/common/logIpc'; +import { LoggerChannel, LogLevelChannel } from 'vs/platform/log/common/logIpc'; import { setUnexpectedErrorHandler, onUnexpectedError } 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'; @@ -660,9 +660,12 @@ export class CodeApplication extends Disposable { electronIpcServer.registerChannel('storage', storageChannel); sharedProcessClient.then(client => client.registerChannel('storage', storageChannel)); - const loggerChannel = new LoggerChannel(accessor.get(ILogService), accessor.get(ILoggerService)); + const logLevelChannel = new LogLevelChannel(accessor.get(ILogService)); + electronIpcServer.registerChannel('logLevel', logLevelChannel); + sharedProcessClient.then(client => client.registerChannel('logLevel', logLevelChannel)); + + const loggerChannel = new LoggerChannel(accessor.get(ILoggerService),); electronIpcServer.registerChannel('logger', loggerChannel); - sharedProcessClient.then(client => client.registerChannel('logger', loggerChannel)); const windowsMainService = this.windowsMainService = accessor.get(IWindowsMainService); fileProtocolHandler.injectWindowsMainService(windowsMainService); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 581d8df94ad..5194253b49a 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -49,7 +49,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { IPathWithLineAndColumn, isValidBasename, parseLineAndColumnAware, sanitizeFilePath } from 'vs/base/common/extpath'; import { isNumber } from 'vs/base/common/types'; import { rtrim, trim } from 'vs/base/common/strings'; -import { basename, resolve } from 'vs/base/common/path'; +import { basename, join, resolve } from 'vs/base/common/path'; import { coalesce, distinct } from 'vs/base/common/arrays'; import { EnvironmentMainService, IEnvironmentMainService } from 'vs/platform/environment/electron-main/environmentMainService'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -134,7 +134,7 @@ class CodeMain { const mainIpcServer = await this.doStartup(args, logService, environmentService, lifecycleMainService, instantiationService, true); - bufferLogService.logger = new SpdLogLogger('main', environmentService.logsPath, bufferLogService.getLevel()); + bufferLogService.logger = new SpdLogLogger('main', join(environmentService.logsPath, 'main.log'), true, bufferLogService.getLevel()); once(lifecycleMainService.onWillShutdown)(() => { fileService.dispose(); (configurationService as ConfigurationService).dispose(); diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 3ca6c5fa5eb..8c3d305ce5c 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -105,7 +105,7 @@ class CliMain extends Disposable { // Log const logLevel = getLogLevel(environmentService); const loggers: ILogger[] = []; - loggers.push(new SpdLogLogger('cli', environmentService.logsPath, logLevel)); + loggers.push(new SpdLogLogger('cli', join(environmentService.logsPath, 'cli.log'), true, logLevel)); if (logLevel === LogLevel.Trace) { loggers.push(new ConsoleLogger(logLevel)); } diff --git a/src/vs/platform/log/common/fileLog.ts b/src/vs/platform/log/common/fileLog.ts index 36d12ac1109..75e227c2667 100644 --- a/src/vs/platform/log/common/fileLog.ts +++ b/src/vs/platform/log/common/fileLog.ts @@ -174,7 +174,7 @@ export class FileLoggerService extends Disposable implements ILoggerService { this._register(logService.onDidChangeLogLevel(level => this.loggers.forEach(logger => logger.setLevel(level)))); } - getLogger(resource: URI): ILogger { + createLogger(resource: URI): ILogger { let logger = this.loggers.get(resource.toString()); if (!logger) { logger = new BufferLogService(this.logService.getLevel()); diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index 79e1d362337..7ba6e459a28 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -8,7 +8,6 @@ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { isWindows } from 'vs/base/common/platform'; import { Event, Emitter } from 'vs/base/common/event'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { LoggerChannelClient } from 'vs/platform/log/common/logIpc'; import { URI } from 'vs/base/common/uri'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -53,10 +52,36 @@ export interface ILogService extends ILogger { readonly _serviceBrand: undefined; } +export interface ILoggerOptions { + + /** + * Name of the logger. + */ + name?: string; + + /** + * Do not create rotating files if max size exceeds. + */ + donotRotate?: boolean; + + /** + * Do not use formatters. + */ + donotUseFormatters?: boolean; + + /** + * If set, logger logs the message always. + */ + always?: boolean; +} + export interface ILoggerService { readonly _serviceBrand: undefined; - getLogger(file: URI): ILogger; + /** + * Creates a logger + */ + createLogger(file: URI, options?: ILoggerOptions): ILogger; } export abstract class AbstractLogger extends Disposable { @@ -339,13 +364,6 @@ export class AdapterLogger extends AbstractLogger implements ILogger { } } -export class ConsoleLogInMainService extends AdapterLogger implements ILogger { - - constructor(client: LoggerChannelClient, logLevel: LogLevel = DEFAULT_LOG_LEVEL) { - super({ log: (type, args) => client.consoleLog(type, args) }, logLevel); - } -} - export class MultiplexLogService extends AbstractLogger implements ILogService { declare readonly _serviceBrand: undefined; diff --git a/src/vs/platform/log/common/logIpc.ts b/src/vs/platform/log/common/logIpc.ts index 8d42e71591f..4c18165d9b4 100644 --- a/src/vs/platform/log/common/logIpc.ts +++ b/src/vs/platform/log/common/logIpc.ts @@ -4,18 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -import { LogLevel, ILogService, LogService, ILoggerService, ILogger, AbstractMessageLogger } from 'vs/platform/log/common/log'; +import { LogLevel, ILogService, LogService, ILoggerService, ILogger, AbstractMessageLogger, ILoggerOptions } from 'vs/platform/log/common/log'; import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; -export class LoggerChannel implements IServerChannel { +export class LogLevelChannel implements IServerChannel { onDidChangeLogLevel: Event; - constructor( - private service: ILogService, - private readonly loggerService: ILoggerService, - ) { + constructor(private service: ILogService) { this.onDidChangeLogLevel = Event.buffer(service.onDidChangeLogLevel, true); } @@ -30,51 +27,80 @@ export class LoggerChannel implements IServerChannel { async call(_: unknown, command: string, arg?: any): Promise { switch (command) { case 'setLevel': return this.service.setLevel(arg); - case 'consoleLog': return this.consoleLog(arg[0], arg[1]); - case 'initLogger': this.getLogger(URI.revive(arg[0])); return; - case 'log': return this.log(URI.revive(arg[0]), arg[1], arg[2]); } throw new Error(`Call not found: ${command}`); } - private consoleLog(severity: string, args: string[]): void { - let consoleFn = console.log; +} - switch (severity) { - case 'error': - consoleFn = console.error; - break; - case 'warn': - consoleFn = console.warn; - break; - case 'info': - consoleFn = console.info; - break; +export class LoggerChannel implements IServerChannel { + + private consoleLogger: ILogger | undefined; + private readonly loggers = new Map(); + + constructor(private readonly loggerService: ILoggerService) { } + + listen(_: unknown, event: string): Event { + throw new Error(`Event not found: ${event}`); + } + + async call(_: unknown, command: string, arg?: any): Promise { + switch (command) { + case 'createConsoleLogger': return this.createConsoleLogger(); + case 'createLogger': this.createLogger(URI.revive(arg[0]), arg[1]); return; + case 'log': return this.log(URI.revive(arg[0]), arg[1]); } - consoleFn.call(console, ...args); + throw new Error(`Call not found: ${command}`); } - private getLogger(file: URI): ILogger { - return this.loggerService.getLogger(file); + private createConsoleLogger(): void { + this.consoleLogger = new class extends AbstractMessageLogger { + protected log(level: LogLevel, message: string) { + let consoleFn = console.log; + + switch (level) { + case LogLevel.Error: + consoleFn = console.error; + break; + case LogLevel.Warning: + consoleFn = console.warn; + break; + case LogLevel.Info: + consoleFn = console.info; + break; + } + + consoleFn.call(console, message); + } + }(); } - private log(file: URI, level: LogLevel, message: string): void { - const logger = this.getLogger(file); - switch (level) { - case LogLevel.Trace: logger.trace(message); break; - case LogLevel.Debug: logger.debug(message); break; - case LogLevel.Info: logger.info(message); break; - case LogLevel.Warning: logger.warn(message); break; - case LogLevel.Error: logger.error(message); break; - case LogLevel.Critical: logger.critical(message); break; - default: throw new Error('Invalid log level'); + private createLogger(file: URI, options: ILoggerOptions): void { + this.loggers.set(file.toString(), this.loggerService.createLogger(file, options)); + } + + private log(file: URI | undefined, messages: [LogLevel, string][]): void { + const logger = file ? this.loggers.get(file.toString()) : this.consoleLogger; + if (!logger) { + throw new Error('Create the logger before logging'); + } + for (const [level, message] of messages) { + switch (level) { + case LogLevel.Trace: logger.trace(message); break; + case LogLevel.Debug: logger.debug(message); break; + case LogLevel.Info: logger.info(message); break; + case LogLevel.Warning: logger.warn(message); break; + case LogLevel.Error: logger.error(message); break; + case LogLevel.Critical: logger.critical(message); break; + default: throw new Error('Invalid log level'); + } } } } -export class LoggerChannelClient { +export class LogLevelChannelClient { constructor(private channel: IChannel) { } @@ -83,32 +109,19 @@ export class LoggerChannelClient { } setLevel(level: LogLevel): void { - LoggerChannelClient.setLevel(this.channel, level); + LogLevelChannelClient.setLevel(this.channel, level); } public static setLevel(channel: IChannel, level: LogLevel): Promise { return channel.call('setLevel', level); } - consoleLog(severity: string, args: string[]): void { - this.channel.call('consoleLog', [severity, args]); - } - - getLogger(file: URI): ILogger { - this.channel.call('initLogger', [file]); - const that = this; - return new class extends AbstractMessageLogger { - protected log(level: LogLevel, message: string) { - that.channel.call('log', [file, level, message]); - } - }; - } } export class FollowerLogService extends LogService implements ILogService { declare readonly _serviceBrand: undefined; - constructor(private parent: LoggerChannelClient, logService: ILogService) { + constructor(private parent: LogLevelChannelClient, logService: ILogService) { super(logService); this._register(parent.onDidChangeLogLevel(level => logService.setLevel(level))); } diff --git a/src/vs/platform/log/node/loggerService.ts b/src/vs/platform/log/node/loggerService.ts index 90a9a30a69b..893025ae407 100644 --- a/src/vs/platform/log/node/loggerService.ts +++ b/src/vs/platform/log/node/loggerService.ts @@ -3,45 +3,54 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ILogService, ILoggerService, ILogger } from 'vs/platform/log/common/log'; +import { ILogService, ILoggerService, ILogger, ILoggerOptions, LogLevel } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { basename, extname, dirname } from 'vs/base/common/resources'; +import { basename } from 'vs/base/common/resources'; import { Schemas } from 'vs/base/common/network'; import { FileLogger } from 'vs/platform/log/common/fileLog'; import { SpdLogLogger } from 'vs/platform/log/node/spdlogLog'; import { IFileService } from 'vs/platform/files/common/files'; +import { generateUuid } from 'vs/base/common/uuid'; export class LoggerService extends Disposable implements ILoggerService { declare readonly _serviceBrand: undefined; private readonly loggers = new Map(); + private readonly logLevelChangeableLoggers: ILogger[] = []; constructor( @ILogService private logService: ILogService, @IFileService private fileService: IFileService ) { super(); - this._register(logService.onDidChangeLogLevel(level => this.loggers.forEach(logger => logger.setLevel(level)))); + this._register(logService.onDidChangeLogLevel(level => this.logLevelChangeableLoggers.forEach(logger => logger.setLevel(level)))); } - getLogger(resource: URI): ILogger { + createLogger(resource: URI, options?: ILoggerOptions): ILogger { let logger = this.loggers.get(resource.toString()); if (!logger) { if (resource.scheme === Schemas.file) { - const baseName = basename(resource); - const ext = extname(resource); - logger = new SpdLogLogger(baseName.substring(0, baseName.length - ext.length), dirname(resource).fsPath, this.logService.getLevel()); + logger = new SpdLogLogger(options?.name || generateUuid(), resource.fsPath, !options?.donotRotate, this.logService.getLevel()); + if (options?.donotUseFormatters) { + (logger).clearFormatters(); + } } else { - logger = new FileLogger(basename(resource), resource, this.logService.getLevel(), this.fileService); + logger = new FileLogger(options?.name ?? basename(resource), resource, this.logService.getLevel(), this.fileService); } this.loggers.set(resource.toString(), logger); + if (options?.always) { + logger.setLevel(LogLevel.Trace); + } else { + this.logLevelChangeableLoggers.push(logger); + } } return logger; } dispose(): void { + this.logLevelChangeableLoggers.splice(0, this.logLevelChangeableLoggers.length); this.loggers.forEach(logger => logger.dispose()); this.loggers.clear(); super.dispose(); diff --git a/src/vs/platform/log/node/spdlogLog.ts b/src/vs/platform/log/node/spdlogLog.ts index f3e566c5c21..5b036c47ce2 100644 --- a/src/vs/platform/log/node/spdlogLog.ts +++ b/src/vs/platform/log/node/spdlogLog.ts @@ -3,18 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as path from 'vs/base/common/path'; import { LogLevel, ILogger, AbstractMessageLogger } from 'vs/platform/log/common/log'; import * as spdlog from 'spdlog'; import { ByteSize } from 'vs/platform/files/common/files'; -async function createSpdLogLogger(processName: string, logsFolder: string): Promise { +async function createSpdLogLogger(name: string, logfilePath: string, filesize: number, filecount: number): Promise { // Do not crash if spdlog cannot be loaded try { const _spdlog = await import('spdlog'); _spdlog.setAsyncMode(8192, 500); - const logfilePath = path.join(logsFolder, `${processName}.log`); - return _spdlog.createRotatingLoggerAsync(processName, logfilePath, 5 * ByteSize.MB, 6); + return _spdlog.createRotatingLoggerAsync(name, logfilePath, filesize, filecount); } catch (e) { console.error(e); } @@ -46,13 +44,18 @@ function log(logger: spdlog.RotatingLogger, level: LogLevel, message: string): v export class SpdLogLogger extends AbstractMessageLogger implements ILogger { private buffer: ILog[] = []; - private _loggerCreationPromise: Promise | undefined = undefined; + private readonly _loggerCreationPromise: Promise; private _logger: spdlog.RotatingLogger | undefined; - constructor(private readonly name: string, private readonly logsFolder: string, level: LogLevel) { + constructor( + private readonly name: string, + private readonly filepath: string, + private readonly rotating: boolean, + level: LogLevel + ) { super(); this.setLevel(level); - this._createSpdLogLogger(); + this._loggerCreationPromise = this._createSpdLogLogger(); this._register(this.onDidChangeLogLevel(level => { if (this._logger) { this._logger.setLevel(level); @@ -61,20 +64,19 @@ export class SpdLogLogger extends AbstractMessageLogger implements ILogger { } private _createSpdLogLogger(): Promise { - if (!this._loggerCreationPromise) { - this._loggerCreationPromise = createSpdLogLogger(this.name, this.logsFolder) - .then(logger => { - if (logger) { - this._logger = logger; - this._logger.setLevel(this.getLevel()); - for (const { level, message } of this.buffer) { - log(this._logger, level, message); - } - this.buffer = []; + const filecount = this.rotating ? 6 : 1; + const filesize = (30 / filecount) * ByteSize.MB; + return createSpdLogLogger(this.name, this.filepath, filesize, filecount) + .then(logger => { + if (logger) { + this._logger = logger; + this._logger.setLevel(this.getLevel()); + for (const { level, message } of this.buffer) { + log(this._logger, level, message); } - }); - } - return this._loggerCreationPromise; + this.buffer = []; + } + }); } protected log(level: LogLevel, message: string): void { @@ -85,10 +87,18 @@ export class SpdLogLogger extends AbstractMessageLogger implements ILogger { } } + clearFormatters(): void { + if (this._logger) { + this._logger.clearFormatters(); + } else { + this._loggerCreationPromise.then(() => this.clearFormatters()); + } + } + flush(): void { if (this._logger) { this._logger.flush(); - } else if (this._loggerCreationPromise) { + } else { this._loggerCreationPromise.then(() => this.flush()); } } @@ -96,10 +106,9 @@ export class SpdLogLogger extends AbstractMessageLogger implements ILogger { dispose(): void { if (this._logger) { this.disposeLogger(); - } else if (this._loggerCreationPromise) { + } else { this._loggerCreationPromise.then(() => this.disposeLogger()); } - this._loggerCreationPromise = undefined; } private disposeLogger(): void { diff --git a/src/vs/platform/telemetry/common/telemetryLogAppender.ts b/src/vs/platform/telemetry/common/telemetryLogAppender.ts index ec95a887333..3d5c23563a1 100644 --- a/src/vs/platform/telemetry/common/telemetryLogAppender.ts +++ b/src/vs/platform/telemetry/common/telemetryLogAppender.ts @@ -17,7 +17,7 @@ export class TelemetryLogAppender extends Disposable implements ITelemetryAppend @IEnvironmentService environmentService: IEnvironmentService ) { super(); - this.logger = this._register(loggerService.getLogger(environmentService.telemetryLogResource)); + this.logger = this._register(loggerService.createLogger(environmentService.telemetryLogResource)); this.logger.info('The below are logs for every telemetry event sent from VS Code once the log level is set to trace.'); this.logger.info('==========================================================='); } diff --git a/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts b/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts index 087c7e3dab7..5d528983e39 100644 --- a/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts +++ b/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts @@ -66,7 +66,7 @@ class TestTelemetryLoggerService implements ILoggerService { this.logger = new TestTelemetryLogger(logLevel); } - getLogger(): ILogger { + createLogger(): ILogger { return this.logger; } } diff --git a/src/vs/platform/userDataSync/common/userDataSyncLog.ts b/src/vs/platform/userDataSync/common/userDataSyncLog.ts index 57284672938..aa32fef6b04 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncLog.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncLog.ts @@ -17,7 +17,7 @@ export class UserDataSyncLogService extends AbstractLogger implements IUserDataS @IEnvironmentService environmentService: IEnvironmentService ) { super(); - this.logger = this._register(loggerService.getLogger(environmentService.userDataSyncLogResource)); + this.logger = this._register(loggerService.createLogger(environmentService.userDataSyncLogResource)); } trace(message: string, ...args: any[]): void { diff --git a/src/vs/workbench/api/node/extHostLogService.ts b/src/vs/workbench/api/node/extHostLogService.ts index 9adf5257282..fb05723b9eb 100644 --- a/src/vs/workbench/api/node/extHostLogService.ts +++ b/src/vs/workbench/api/node/extHostLogService.ts @@ -9,7 +9,6 @@ import { ExtensionHostLogFileName } from 'vs/workbench/services/extensions/commo import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; import { Schemas } from 'vs/base/common/network'; import { SpdLogLogger } from 'vs/platform/log/node/spdlogLog'; -import { dirname } from 'vs/base/common/resources'; export class ExtHostLogService extends LogService implements ILogService, ExtHostLogServiceShape { @@ -17,7 +16,7 @@ export class ExtHostLogService extends LogService implements ILogService, ExtHos @IExtHostInitDataService initData: IExtHostInitDataService, ) { if (initData.logFile.scheme !== Schemas.file) { throw new Error('Only file-logging supported'); } - super(new SpdLogLogger(ExtensionHostLogFileName, dirname(initData.logFile).fsPath, initData.logLevel)); + super(new SpdLogLogger(ExtensionHostLogFileName, initData.logFile.fsPath, true, initData.logLevel)); } $setLevel(level: LogLevel): void { diff --git a/src/vs/workbench/api/node/extHostOutputService.ts b/src/vs/workbench/api/node/extHostOutputService.ts index d18f945141c..51b92b3d367 100644 --- a/src/vs/workbench/api/node/extHostOutputService.ts +++ b/src/vs/workbench/api/node/extHostOutputService.ts @@ -7,7 +7,6 @@ import { MainThreadOutputServiceShape } from '../common/extHost.protocol'; import type * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; import { join } from 'vs/base/common/path'; -import { OutputAppender } from 'vs/workbench/services/output/node/outputAppender'; import { toLocalISOString } from 'vs/base/common/date'; import { SymlinkSupport } from 'vs/base/node/pfs'; import { promises } from 'fs'; @@ -16,6 +15,28 @@ import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitData import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { MutableDisposable } from 'vs/base/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; +import { createRotatingLogger } from 'vs/platform/log/node/spdlogLog'; +import { RotatingLogger } from 'spdlog'; +import { ByteSize } from 'vs/platform/files/common/files'; + +class OutputAppender { + + private appender: RotatingLogger; + + constructor(name: string, readonly file: string) { + this.appender = createRotatingLogger(name, file, 30 * ByteSize.MB, 1); + this.appender.clearFormatters(); + } + + append(content: string): void { + this.appender.critical(content); + } + + flush(): void { + this.appender.flush(); + } +} + export class ExtHostOutputChannelBackedByFile extends AbstractExtHostOutputChannel { diff --git a/src/vs/workbench/contrib/output/electron-browser/outputChannelModelService.ts b/src/vs/workbench/contrib/output/electron-sandbox/outputChannelModelService.ts similarity index 93% rename from src/vs/workbench/contrib/output/electron-browser/outputChannelModelService.ts rename to src/vs/workbench/contrib/output/electron-sandbox/outputChannelModelService.ts index 6613887f709..bd502475437 100644 --- a/src/vs/workbench/contrib/output/electron-browser/outputChannelModelService.ts +++ b/src/vs/workbench/contrib/output/electron-sandbox/outputChannelModelService.ts @@ -13,9 +13,8 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ILogService } from 'vs/platform/log/common/log'; +import { ILogger, ILoggerService, ILogService } from 'vs/platform/log/common/log'; import { IOutputChannelModel, AbstractFileOutputChannelModel, IOutputChannelModelService, AbstractOutputChannelModelService, BufferredOutputChannel } from 'vs/workbench/contrib/output/common/outputChannelModel'; -import { OutputAppender } from 'vs/workbench/services/output/node/outputAppender'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { toLocalISOString } from 'vs/base/common/date'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -25,7 +24,7 @@ import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; class OutputChannelBackedByFile extends AbstractFileOutputChannelModel implements IOutputChannelModel { - private appender: OutputAppender; + private logger: ILogger; private appendedMessage: string; private loadingFromFileInProgress: boolean; private resettingDelayer: ThrottledDelayer; @@ -39,14 +38,14 @@ class OutputChannelBackedByFile extends AbstractFileOutputChannelModel implement @IFileService fileService: IFileService, @IModelService modelService: IModelService, @IModeService modeService: IModeService, - @ILogService logService: ILogService + @ILoggerService loggerService: ILoggerService ) { super(modelUri, mimeType, file, fileService, modelService, modeService); this.appendedMessage = ''; this.loadingFromFileInProgress = false; - // Use one rotating file to check for main file reset - this.appender = new OutputAppender(id, this.file.fsPath); + // Donot rotate to check for the file reset + this.logger = loggerService.createLogger(this.file, { always: true, donotRotate: true, donotUseFormatters: true }); const rotatingFilePathDirectory = resources.dirname(this.file); this.rotatingFilePath = resources.joinPath(rotatingFilePathDirectory, `${id}.1.log`); @@ -130,11 +129,11 @@ class OutputChannelBackedByFile extends AbstractFileOutputChannelModel implement } private write(content: string): void { - this.appender.append(content); + this.logger.info(content); } private flush(): void { - this.appender.flush(); + this.logger.flush(); } } @@ -155,6 +154,7 @@ class DelegatedOutputChannelModel extends Disposable implements IOutputChannelMo outputDir: Promise, @IInstantiationService private readonly instantiationService: IInstantiationService, @ILogService private readonly logService: ILogService, + @IFileService private readonly fileService: IFileService, @ITelemetryService private readonly telemetryService: ITelemetryService, ) { super(); @@ -166,6 +166,8 @@ class DelegatedOutputChannelModel extends Disposable implements IOutputChannelMo try { const outputDir = await outputDirPromise; const file = resources.joinPath(outputDir, `${id}.log`); + // Make sure file exists before creating the channel + await this.fileService.createFile(file); outputChannelModel = this.instantiationService.createInstance(OutputChannelBackedByFile, id, modelUri, mimeType, file); } catch (e) { // Do not crash if spdlog rotating logger cannot be loaded (workaround for https://github.com/microsoft/vscode/issues/47883) diff --git a/src/vs/workbench/contrib/remote/common/remote.contribution.ts b/src/vs/workbench/contrib/remote/common/remote.contribution.ts index 4d0c88698d6..f5aeb0aa452 100644 --- a/src/vs/workbench/contrib/remote/common/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/common/remote.contribution.ts @@ -11,7 +11,7 @@ import { OperatingSystem, isWeb } from 'vs/base/common/platform'; import { Schemas } from 'vs/base/common/network'; import { IRemoteAgentService, RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; import { ILogService } from 'vs/platform/log/common/log'; -import { LoggerChannelClient } from 'vs/platform/log/common/logIpc'; +import { LogLevelChannelClient } from 'vs/platform/log/common/logIpc'; import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/services/output/common/output'; import { localize } from 'vs/nls'; import { joinPath } from 'vs/base/common/resources'; @@ -63,7 +63,7 @@ class RemoteChannelsContribution extends Disposable implements IWorkbenchContrib if (!connection) { return; } - connection.withChannel('logger', (channel) => LoggerChannelClient.setLevel(channel, logService.getLevel())); + connection.withChannel('logger', (channel) => LogLevelChannelClient.setLevel(channel, logService.getLevel())); }; updateRemoteLogLevel(); this._register(logService.onDidChangeLogLevel(updateRemoteLogLevel)); diff --git a/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts b/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts index 0b9e209d249..c301b390786 100644 --- a/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/electron-sandbox/remote.contribution.ts @@ -18,7 +18,7 @@ import { Schemas } from 'vs/base/common/network'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ILoggerService, ILogService } from 'vs/platform/log/common/log'; import { DownloadServiceChannel } from 'vs/platform/download/common/downloadIpc'; -import { LoggerChannel } from 'vs/platform/log/common/logIpc'; +import { LogLevelChannel } from 'vs/platform/log/common/logIpc'; import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { IDiagnosticInfoOptions, IRemoteDiagnosticInfo } from 'vs/platform/diagnostics/common/diagnostics'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; @@ -41,7 +41,7 @@ class RemoteChannelsContribution implements IWorkbenchContribution { const connection = remoteAgentService.getConnection(); if (connection) { connection.registerChannel('download', new DownloadServiceChannel(downloadService)); - connection.registerChannel('logger', new LoggerChannel(logService, loggerService)); + connection.registerChannel('logger', new LogLevelChannel(logService)); } } } diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 8e89ce8d535..4f323918702 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -19,7 +19,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { INativeWorkbenchConfiguration, INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IWorkspaceInitializationPayload, reviveIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { ILogService } from 'vs/platform/log/common/log'; +import { ILoggerService, ILogService } from 'vs/platform/log/common/log'; import { NativeStorageService } from 'vs/platform/storage/node/storageService'; import { Schemas } from 'vs/base/common/network'; import { GlobalStorageDatabaseChannelClient } from 'vs/platform/storage/node/storageIpc'; @@ -51,6 +51,7 @@ import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/ur import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; import { KeyboardLayoutService } from 'vs/workbench/services/keybinding/electron-sandbox/nativeKeyboardLayout'; import { IKeyboardLayoutService } from 'vs/platform/keyboardLayout/common/keyboardLayout'; +import { LoggerService } from 'vs/workbench/services/log/electron-sandbox/loggerService'; class DesktopMain extends Disposable { @@ -163,8 +164,12 @@ class DesktopMain extends Disposable { // Product serviceCollection.set(IProductService, this.productService); + // Logger + const loggerService = new LoggerService(mainProcessService); + serviceCollection.set(ILoggerService, loggerService); + // Log - const logService = this._register(new NativeLogService(mainProcessService, this.environmentService)); + const logService = this._register(new NativeLogService(`renderer${this.configuration.windowId}`, loggerService, mainProcessService, this.environmentService)); serviceCollection.set(ILogService, logService); // Remote diff --git a/src/vs/workbench/services/log/electron-sandbox/logService.ts b/src/vs/workbench/services/log/electron-sandbox/logService.ts index a7538d944f0..39d348eeb85 100644 --- a/src/vs/workbench/services/log/electron-sandbox/logService.ts +++ b/src/vs/workbench/services/log/electron-sandbox/logService.ts @@ -3,32 +3,31 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { LogService, ConsoleLogger, MultiplexLogService, ILogger, AdapterLogger } from 'vs/platform/log/common/log'; +import { LogService, ConsoleLogger, MultiplexLogService, ILogger } from 'vs/platform/log/common/log'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; -import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; -import { LoggerChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; +import { LogLevelChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { LoggerService } from 'vs/workbench/services/log/electron-sandbox/loggerService'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; export class NativeLogService extends LogService { - constructor(mainProcessService: IMainProcessService, environmentService: INativeWorkbenchEnvironmentService) { + constructor(name: string, loggerService: LoggerService, mainProcessService: IMainProcessService, environmentService: INativeWorkbenchEnvironmentService) { const disposables = new DisposableStore(); - const loggerClient = new LoggerChannelClient(mainProcessService.getChannel('logger')); + const loggerClient = new LogLevelChannelClient(mainProcessService.getChannel('logLevel')); // Extension development test CLI: forward everything to main side const loggers: ILogger[] = []; if (environmentService.isExtensionDevelopment && !!environmentService.extensionTestsLocationURI) { - loggers.push( - disposables.add(new AdapterLogger({ log: (type, args) => loggerClient.consoleLog(type, args) }, environmentService.configuration.logLevel)) - ); + loggers.push(loggerService.createConsoleMainLogger()); } // Normal logger: spdylog and console else { loggers.push( disposables.add(new ConsoleLogger(environmentService.configuration.logLevel)), - disposables.add(loggerClient.getLogger(environmentService.logFile)) + disposables.add(loggerService.createLogger(environmentService.logFile, { name })) ); } diff --git a/src/vs/workbench/services/log/electron-sandbox/loggerService.ts b/src/vs/workbench/services/log/electron-sandbox/loggerService.ts new file mode 100644 index 00000000000..32dd1f4b34c --- /dev/null +++ b/src/vs/workbench/services/log/electron-sandbox/loggerService.ts @@ -0,0 +1,61 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; +import { LogLevel, ILoggerService, ILogger, AbstractMessageLogger, ILoggerOptions } from 'vs/platform/log/common/log'; +import { URI } from 'vs/base/common/uri'; +import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; + +export class LoggerService implements ILoggerService { + + declare readonly _serviceBrand: undefined; + private readonly channel: IChannel; + + constructor( + @IMainProcessService mainProcessService: IMainProcessService + ) { + this.channel = mainProcessService.getChannel('logger'); + } + + createConsoleMainLogger(): ILogger { + return new Logger(this.channel); + } + + createLogger(file: URI, options?: ILoggerOptions): ILogger { + return new Logger(this.channel, file, options); + } + +} + +class Logger extends AbstractMessageLogger { + + private isLoggerCreated: boolean = false; + private buffer: [LogLevel, string][] = []; + + constructor( + private readonly channel: IChannel, + private readonly file?: URI, + loggerOptions?: ILoggerOptions, + ) { + super(); + (this.file ? this.channel.call('createLogger', [file, loggerOptions]) : this.channel.call('createConsoleMainLogger', [file, loggerOptions])) + .then(() => { + this._log(this.buffer); + this.isLoggerCreated = true; + }); + } + + protected log(level: LogLevel, message: string) { + this._log([[level, message]]); + } + + private _log(messages: [LogLevel, string][]) { + if (this.isLoggerCreated) { + this.channel.call('log', [this.file, messages]); + } else { + this.buffer.push(...messages); + } + } +} diff --git a/src/vs/workbench/services/output/node/outputAppender.ts b/src/vs/workbench/services/output/node/outputAppender.ts deleted file mode 100644 index fff36fd60bb..00000000000 --- a/src/vs/workbench/services/output/node/outputAppender.ts +++ /dev/null @@ -1,25 +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 { createRotatingLogger } from 'vs/platform/log/node/spdlogLog'; -import { RotatingLogger } from 'spdlog'; -import { ByteSize } from 'vs/platform/files/common/files'; - -export class OutputAppender { - - private appender: RotatingLogger; - - constructor(name: string, readonly file: string) { - this.appender = createRotatingLogger(name, file, 30 * ByteSize.MB, 1); - this.appender.clearFormatters(); - } - - append(content: string): void { - this.appender.critical(content); - } - - flush(): void { - this.appender.flush(); - } -} diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 745412cf175..486fa09ac3f 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -111,7 +111,7 @@ registerSingleton(ISharedProcessService, SharedProcessService, true); //#region --- workbench contributions // Output -import 'vs/workbench/contrib/output/electron-browser/outputChannelModelService'; +import 'vs/workbench/contrib/output/electron-sandbox/outputChannelModelService'; // Tags import 'vs/workbench/contrib/tags/electron-browser/workspaceTagsService'; From 599f7a7031b5e76f2d9a8a358803388a584fe38d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 7 Feb 2021 18:56:10 +0100 Subject: [PATCH 04/86] logger shall log always when created with always option --- src/vs/platform/log/common/log.ts | 20 +++++++++++++------ .../log/electron-sandbox/loggerService.ts | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index 7ba6e459a28..524381951d1 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -107,32 +107,40 @@ export abstract class AbstractMessageLogger extends AbstractLogger implements IL protected abstract log(level: LogLevel, message: string): void; + constructor(private readonly logAlways?: boolean) { + super(); + } + + private checkLogLevel(level: LogLevel): boolean { + return this.logAlways || this.getLevel() <= level; + } + trace(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Trace) { + if (this.checkLogLevel(LogLevel.Trace)) { this.log(LogLevel.Trace, this.format([message, ...args])); } } debug(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Debug) { + if (this.checkLogLevel(LogLevel.Debug)) { this.log(LogLevel.Debug, this.format([message, ...args])); } } info(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Info) { + if (this.checkLogLevel(LogLevel.Info)) { this.log(LogLevel.Info, this.format([message, ...args])); } } warn(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Warning) { + if (this.checkLogLevel(LogLevel.Warning)) { this.log(LogLevel.Warning, this.format([message, ...args])); } } error(message: string | Error, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Error) { + if (this.checkLogLevel(LogLevel.Error)) { if (message instanceof Error) { const array = Array.prototype.slice.call(arguments) as any[]; @@ -145,7 +153,7 @@ export abstract class AbstractMessageLogger extends AbstractLogger implements IL } critical(message: string | Error, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { + if (this.checkLogLevel(LogLevel.Critical)) { this.log(LogLevel.Critical, this.format([message, ...args])); } } diff --git a/src/vs/workbench/services/log/electron-sandbox/loggerService.ts b/src/vs/workbench/services/log/electron-sandbox/loggerService.ts index 32dd1f4b34c..eea18d19747 100644 --- a/src/vs/workbench/services/log/electron-sandbox/loggerService.ts +++ b/src/vs/workbench/services/log/electron-sandbox/loggerService.ts @@ -39,7 +39,7 @@ class Logger extends AbstractMessageLogger { private readonly file?: URI, loggerOptions?: ILoggerOptions, ) { - super(); + super(loggerOptions?.always); (this.file ? this.channel.call('createLogger', [file, loggerOptions]) : this.channel.call('createConsoleMainLogger', [file, loggerOptions])) .then(() => { this._log(this.buffer); From 9dd25c4d196e2920027afa5645003e6ccf245248 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Feb 2021 13:33:30 +0100 Subject: [PATCH 05/86] Don't show browser preview action in Ports view web Part of microsoft/vscode-remote-release#4436 --- src/vs/workbench/contrib/remote/browser/tunnelView.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/remote/browser/tunnelView.ts b/src/vs/workbench/contrib/remote/browser/tunnelView.ts index 0e2cdc942ce..53b3382d388 100644 --- a/src/vs/workbench/contrib/remote/browser/tunnelView.ts +++ b/src/vs/workbench/contrib/remote/browser/tunnelView.ts @@ -45,6 +45,7 @@ import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionViewItems'; import { forwardPortIcon, openBrowserIcon, openPreviewIcon, portsViewIcon, privatePortIcon, publicPortIcon, stopForwardIcon } from 'vs/workbench/contrib/remote/browser/remoteIcons'; import { IExternalUriOpenerService } from 'vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { isWeb } from 'vs/base/common/platform'; export const forwardedPortsViewEnabled = new RawContextKey('forwardedPortsViewEnabled', false); export const PORT_AUTO_FORWARD_SETTING = 'remote.autoForwardPorts'; @@ -553,6 +554,7 @@ const TunnelViewFocusContextKey = new RawContextKey('tunnelViewFocus', const TunnelViewSelectionKeyName = 'tunnelViewSelection'; const TunnelViewSelectionContextKey = new RawContextKey(TunnelViewSelectionKeyName, undefined); const PortChangableContextKey = new RawContextKey('portChangable', false); +const WebContextKey = new RawContextKey('isWeb', isWeb); class TunnelDataTree extends WorkbenchAsyncDataTree { } @@ -1297,7 +1299,7 @@ MenuRegistry.appendMenuItem(MenuId.TunnelContext, ({ id: OpenPortInPreviewAction.ID, title: OpenPortInPreviewAction.LABEL, }, - when: ContextKeyExpr.or(TunnelTypeContextKey.isEqualTo(TunnelType.Forwarded), TunnelTypeContextKey.isEqualTo(TunnelType.Detected)) + when: ContextKeyExpr.and(WebContextKey.negate(), ContextKeyExpr.or(TunnelTypeContextKey.isEqualTo(TunnelType.Forwarded), TunnelTypeContextKey.isEqualTo(TunnelType.Detected))) })); MenuRegistry.appendMenuItem(MenuId.TunnelContext, ({ group: '0_manage', @@ -1370,7 +1372,7 @@ MenuRegistry.appendMenuItem(MenuId.TunnelInline, ({ title: OpenPortInPreviewAction.LABEL, icon: openPreviewIcon }, - when: ContextKeyExpr.or(TunnelTypeContextKey.isEqualTo(TunnelType.Forwarded), TunnelTypeContextKey.isEqualTo(TunnelType.Detected)) + when: ContextKeyExpr.and(WebContextKey.negate(), ContextKeyExpr.or(TunnelTypeContextKey.isEqualTo(TunnelType.Forwarded), TunnelTypeContextKey.isEqualTo(TunnelType.Detected))) })); MenuRegistry.appendMenuItem(MenuId.TunnelInline, ({ order: 0, From 82f3379ac67f3b8e08ecc2dc1836e14c80dc343a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 8 Feb 2021 14:35:58 +0100 Subject: [PATCH 06/86] remove getActions*2 from view pane container --- src/vs/workbench/browser/panecomposite.ts | 30 +++---------------- .../browser/parts/views/viewPaneContainer.ts | 20 +++---------- src/vs/workbench/common/views.ts | 2 -- 3 files changed, 8 insertions(+), 44 deletions(-) diff --git a/src/vs/workbench/browser/panecomposite.ts b/src/vs/workbench/browser/panecomposite.ts index 4a8a1144f38..d7c33b15c77 100644 --- a/src/vs/workbench/browser/panecomposite.ts +++ b/src/vs/workbench/browser/panecomposite.ts @@ -15,7 +15,7 @@ import { Composite } from 'vs/workbench/browser/composite'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ViewPaneContainer } from './parts/views/viewPaneContainer'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; -import { IAction, IActionViewItem, Separator } from 'vs/base/common/actions'; +import { IAction, IActionViewItem } from 'vs/base/common/actions'; export class PaneComposite extends Composite implements IPaneComposite { @@ -64,37 +64,15 @@ export class PaneComposite extends Composite implements IPaneComposite { } getContextMenuActions(): ReadonlyArray { - const result = []; - result.push(...this.viewPaneContainer.getContextMenuActions2()); - - const otherActions = this.viewPaneContainer.getContextMenuActions(); - - if (otherActions.length) { - result.push(new Separator()); - result.push(...otherActions); - } - - return result; + return this.viewPaneContainer.getContextMenuActions(); } getActions(): ReadonlyArray { - const result = []; - result.push(...this.viewPaneContainer.getActions2()); - result.push(...this.viewPaneContainer.getActions()); - return result; + return this.viewPaneContainer.getActions(); } getSecondaryActions(): ReadonlyArray { - const menuActions = this.viewPaneContainer.getSecondaryActions2(); - const viewPaneContainerActions = this.viewPaneContainer.getSecondaryActions(); - if (menuActions.length && viewPaneContainerActions.length) { - return [ - ...menuActions, - new Separator(), - ...viewPaneContainerActions - ]; - } - return menuActions.length ? menuActions : viewPaneContainerActions; + return this.viewPaneContainer.getSecondaryActions(); } getActionViewItem(action: IAction): IActionViewItem | undefined { diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index e71e07d0778..d85abe6e979 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -564,19 +564,15 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { let anchor: { x: number, y: number; } = { x: event.posx, y: event.posy }; this.contextMenuService.showContextMenu({ getAnchor: () => anchor, - getActions: () => [...this.getContextMenuActions2()] + getActions: () => [...this.getContextMenuActions()] }); } - getContextMenuActions2(): ReadonlyArray { + getContextMenuActions(): ReadonlyArray { return this.menuActions.getContextMenuActions(); } - getContextMenuActions(viewDescriptor?: IViewDescriptor): IAction[] { - return []; - } - - getActions2(): IAction[] { + getActions(): IAction[] { const result = []; result.push(...this.menuActions.getPrimaryActions()); if (this.isViewMergedWithContainer()) { @@ -585,11 +581,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return result; } - getActions(): IAction[] { - return []; - } - - getSecondaryActions2(): IAction[] { + getSecondaryActions(): IAction[] { const viewPaneActions = this.isViewMergedWithContainer() ? this.paneItems[0].pane.getSecondaryActions() : []; let menuActions = this.menuActions.getSecondaryActions(); @@ -619,10 +611,6 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return menuActions.length ? menuActions : viewPaneActions; } - getSecondaryActions(): IAction[] { - return []; - } - getActionsContext(): unknown { return undefined; } diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 90a0191738a..fad47a4a92a 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -814,8 +814,6 @@ export interface IViewPaneContainer { setVisible(visible: boolean): void; isVisible(): boolean; focus(): void; - getActions(): IAction[]; - getSecondaryActions(): IAction[]; getActionViewItem(action: IAction): IActionViewItem | undefined; getActionsContext(): unknown; getView(viewId: string): IView | undefined; From 75f4a581b7a840e1cd344351a6609a7b1282620e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Feb 2021 14:44:36 +0100 Subject: [PATCH 07/86] fix https://github.com/microsoft/vscode/issues/116104 --- src/vs/editor/contrib/codelens/codelensController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/codelens/codelensController.ts b/src/vs/editor/contrib/codelens/codelensController.ts index da622e6ef5f..232c4196d1f 100644 --- a/src/vs/editor/contrib/codelens/codelensController.ts +++ b/src/vs/editor/contrib/codelens/codelensController.ts @@ -108,7 +108,7 @@ export class CodeLensContribution implements IEditorContribution { newStyle += `.monaco-editor .codelens-decoration.${this._styleClassName} { font-family: var(${fontFamilyVar})}`; } this._styleElement.textContent = newStyle; - this._editor.getDomNode()?.style.setProperty(fontFamilyVar, fontFamily ?? 'inherit'); + this._editor.getContainerDomNode().style.setProperty(fontFamilyVar, fontFamily ?? 'inherit'); // this._editor.changeViewZones(accessor => { From 2a38ef15feb4042dcd448443b2803a6471e3138f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Feb 2021 14:57:35 +0100 Subject: [PATCH 08/86] remove used code --- src/vs/base/common/actions.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/vs/base/common/actions.ts b/src/vs/base/common/actions.ts index 41b0fd8241a..746aa8a1a15 100644 --- a/src/vs/base/common/actions.ts +++ b/src/vs/base/common/actions.ts @@ -205,25 +205,6 @@ export class ActionRunner extends Disposable implements IActionRunner { } } -export class RadioGroup extends Disposable { - - constructor(readonly actions: Action[]) { - super(); - - for (const action of actions) { - this._register(action.onDidChange(e => { - if (e.checked && action.checked) { - for (const candidate of actions) { - if (candidate !== action) { - candidate.checked = false; - } - } - } - })); - } - } -} - export class Separator extends Action { static readonly ID = 'vs.actions.separator'; From 3fa2ca3f7b0838dfd3bcccca4a1b159bda4c9510 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 8 Feb 2021 06:37:10 -0800 Subject: [PATCH 09/86] Fix new terminal keybinding Fixes #116096 --- .../workbench/contrib/terminal/browser/terminalActions.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 4b4f303f19e..565bda57f2e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1214,6 +1214,12 @@ export function registerTerminalActions() { category, precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, icon: Codicon.plus, + keybinding: { + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, + mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK }, + weight: KeybindingWeight.WorkbenchContrib, + when: KEYBINDING_CONTEXT_TERMINAL_FOCUS + }, menu: { id: MenuId.ViewTitle, group: 'navigation', From 01ace15b27be0abcfa41d2b9b263d6279b7bf9f8 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 8 Feb 2021 06:39:24 -0800 Subject: [PATCH 10/86] Fix clear terminal command ID Fixes #116095 --- src/vs/workbench/contrib/terminal/browser/terminalActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 565bda57f2e..c134548f262 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1308,7 +1308,7 @@ export function registerTerminalActions() { registerAction2(class extends Action2 { constructor() { super({ - id: TERMINAL_COMMAND_ID.KILL, + id: TERMINAL_COMMAND_ID.CLEAR, title: { value: localize('workbench.action.terminal.clear', "Clear"), original: 'Clear' }, f1: true, category, From 0f1700179046f05c78c07020e1256046db52048c Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Feb 2021 15:36:17 +0100 Subject: [PATCH 11/86] Fix update-grammar scripts for cross-platform use --- extensions/bat/package.json | 2 +- extensions/clojure/package.json | 2 +- extensions/coffeescript/package.json | 2 +- extensions/csharp/package.json | 2 +- extensions/css/package.json | 2 +- extensions/docker/package.json | 2 +- extensions/fsharp/package.json | 2 +- extensions/go/package.json | 2 +- extensions/groovy/package.json | 2 +- extensions/handlebars/package.json | 2 +- extensions/hlsl/package.json | 2 +- extensions/ini/package.json | 2 +- extensions/java/package.json | 2 +- extensions/less/package.json | 2 +- extensions/log/package.json | 2 +- extensions/lua/package.json | 2 +- extensions/make/package.json | 2 +- extensions/markdown-basics/package.json | 2 +- extensions/perl/package.json | 2 +- extensions/powershell/package.json | 2 +- extensions/pug/package.json | 2 +- extensions/python/package.json | 2 +- extensions/r/package.json | 2 +- extensions/razor/package.json | 2 +- extensions/ruby/package.json | 2 +- extensions/rust/package.json | 2 +- extensions/scss/package.json | 2 +- extensions/shaderlab/package.json | 2 +- extensions/shellscript/package.json | 2 +- extensions/swift/package.json | 2 +- extensions/vb/package.json | 2 +- extensions/xml/package.json | 2 +- extensions/yaml/package.json | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/extensions/bat/package.json b/extensions/bat/package.json index 5d36ae73ab3..f01e5d35ab2 100644 --- a/extensions/bat/package.json +++ b/extensions/bat/package.json @@ -9,7 +9,7 @@ "vscode": "^1.52.0" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater mmims/language-batchfile grammars/batchfile.cson ./syntaxes/batchfile.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin mmims/language-batchfile grammars/batchfile.cson ./syntaxes/batchfile.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/clojure/package.json b/extensions/clojure/package.json index b2c5cf3a577..4ea659b3b91 100644 --- a/extensions/clojure/package.json +++ b/extensions/clojure/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater atom/language-clojure grammars/clojure.cson ./syntaxes/clojure.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-clojure grammars/clojure.cson ./syntaxes/clojure.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/coffeescript/package.json b/extensions/coffeescript/package.json index 5cfd96f4b86..e8fda02d0a3 100644 --- a/extensions/coffeescript/package.json +++ b/extensions/coffeescript/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater atom/language-coffee-script grammars/coffeescript.cson ./syntaxes/coffeescript.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-coffee-script grammars/coffeescript.cson ./syntaxes/coffeescript.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/csharp/package.json b/extensions/csharp/package.json index 3d79e1ab112..df77c14cdf9 100644 --- a/extensions/csharp/package.json +++ b/extensions/csharp/package.json @@ -9,7 +9,7 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater dotnet/csharp-tmLanguage grammars/csharp.tmLanguage ./syntaxes/csharp.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin dotnet/csharp-tmLanguage grammars/csharp.tmLanguage ./syntaxes/csharp.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/css/package.json b/extensions/css/package.json index 4e7e307e65b..6b3d8aebc8c 100644 --- a/extensions/css/package.json +++ b/extensions/css/package.json @@ -9,7 +9,7 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater octref/language-css grammars/css.cson ./syntaxes/css.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin octref/language-css grammars/css.cson ./syntaxes/css.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/docker/package.json b/extensions/docker/package.json index 9d36db0825e..cdda622a22f 100644 --- a/extensions/docker/package.json +++ b/extensions/docker/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater moby/moby contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin moby/moby contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/fsharp/package.json b/extensions/fsharp/package.json index 3222205ce42..b6c07d40b1b 100644 --- a/extensions/fsharp/package.json +++ b/extensions/fsharp/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater ionide/ionide-fsgrammar grammars/fsharp.json ./syntaxes/fsharp.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin ionide/ionide-fsgrammar grammars/fsharp.json ./syntaxes/fsharp.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/go/package.json b/extensions/go/package.json index 520e13715aa..7b3bc14971a 100644 --- a/extensions/go/package.json +++ b/extensions/go/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater jeff-hykin/better-go-syntax export/generated.tmLanguage.json ./syntaxes/go.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin jeff-hykin/better-go-syntax export/generated.tmLanguage.json ./syntaxes/go.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/groovy/package.json b/extensions/groovy/package.json index ce5ca27ad9d..a7000f89e20 100644 --- a/extensions/groovy/package.json +++ b/extensions/groovy/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/groovy.tmbundle Syntaxes/Groovy.tmLanguage ./syntaxes/groovy.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/groovy.tmbundle Syntaxes/Groovy.tmLanguage ./syntaxes/groovy.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/handlebars/package.json b/extensions/handlebars/package.json index 9d6d6481146..0eb6cb2eb2b 100644 --- a/extensions/handlebars/package.json +++ b/extensions/handlebars/package.json @@ -9,7 +9,7 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater daaain/Handlebars grammars/Handlebars.json ./syntaxes/Handlebars.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin daaain/Handlebars grammars/Handlebars.json ./syntaxes/Handlebars.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/hlsl/package.json b/extensions/hlsl/package.json index 5c8017addbd..046ff9b31c8 100644 --- a/extensions/hlsl/package.json +++ b/extensions/hlsl/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater tgjones/shaders-tmLanguage grammars/hlsl.json ./syntaxes/hlsl.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin tgjones/shaders-tmLanguage grammars/hlsl.json ./syntaxes/hlsl.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/ini/package.json b/extensions/ini/package.json index acc07eff465..324e4c87f6e 100644 --- a/extensions/ini/package.json +++ b/extensions/ini/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/java/package.json b/extensions/java/package.json index 01383db29e9..d71aa1c146c 100644 --- a/extensions/java/package.json +++ b/extensions/java/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater atom/language-java grammars/java.cson ./syntaxes/java.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-java grammars/java.cson ./syntaxes/java.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/less/package.json b/extensions/less/package.json index 577307a75e1..5974be71933 100644 --- a/extensions/less/package.json +++ b/extensions/less/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater atom/language-less grammars/less.cson ./syntaxes/less.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-less grammars/less.cson ./syntaxes/less.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/log/package.json b/extensions/log/package.json index 27b58c51eef..73093e1179a 100644 --- a/extensions/log/package.json +++ b/extensions/log/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater emilast/vscode-logfile-highlighter syntaxes/log.tmLanguage ./syntaxes/log.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin emilast/vscode-logfile-highlighter syntaxes/log.tmLanguage ./syntaxes/log.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/lua/package.json b/extensions/lua/package.json index cb4dfe97fbc..8161da9f705 100644 --- a/extensions/lua/package.json +++ b/extensions/lua/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/make/package.json b/extensions/make/package.json index f5fc2bb9bbc..ef8209df01c 100644 --- a/extensions/make/package.json +++ b/extensions/make/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater fadeevab/make.tmbundle Syntaxes/Makefile.plist ./syntaxes/make.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin fadeevab/make.tmbundle Syntaxes/Makefile.plist ./syntaxes/make.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/markdown-basics/package.json b/extensions/markdown-basics/package.json index 8ea3bff2e3c..e40265339c3 100644 --- a/extensions/markdown-basics/package.json +++ b/extensions/markdown-basics/package.json @@ -90,7 +90,7 @@ ] }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater microsoft/vscode-markdown-tm-grammar syntaxes/markdown.tmLanguage ./syntaxes/markdown.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin microsoft/vscode-markdown-tm-grammar syntaxes/markdown.tmLanguage ./syntaxes/markdown.tmLanguage.json" }, "repository": { "type": "git", diff --git a/extensions/perl/package.json b/extensions/perl/package.json index 6baa327ab35..e195e517e50 100644 --- a/extensions/perl/package.json +++ b/extensions/perl/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/perl.tmbundle Syntaxes/Perl.plist ./syntaxes/perl.tmLanguage.json Syntaxes/Perl%206.tmLanguage ./syntaxes/perl6.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/perl.tmbundle Syntaxes/Perl.plist ./syntaxes/perl.tmLanguage.json Syntaxes/Perl%206.tmLanguage ./syntaxes/perl6.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/powershell/package.json b/extensions/powershell/package.json index e176f7f412c..f9715a8b21f 100644 --- a/extensions/powershell/package.json +++ b/extensions/powershell/package.json @@ -44,7 +44,7 @@ ] }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater PowerShell/EditorSyntax PowerShellSyntax.tmLanguage ./syntaxes/powershell.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin PowerShell/EditorSyntax PowerShellSyntax.tmLanguage ./syntaxes/powershell.tmLanguage.json" }, "repository": { "type": "git", diff --git a/extensions/pug/package.json b/extensions/pug/package.json index 5dd19cfa3e1..fd74f5b915c 100644 --- a/extensions/pug/package.json +++ b/extensions/pug/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater davidrios/pug-tmbundle Syntaxes/Pug.JSON-tmLanguage ./syntaxes/pug.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin davidrios/pug-tmbundle Syntaxes/Pug.JSON-tmLanguage ./syntaxes/pug.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/python/package.json b/extensions/python/package.json index 7413ef788b1..d99a1cefbf7 100644 --- a/extensions/python/package.json +++ b/extensions/python/package.json @@ -53,7 +53,7 @@ ] }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater MagicStack/MagicPython grammars/MagicPython.tmLanguage ./syntaxes/MagicPython.tmLanguage.json grammars/MagicRegExp.tmLanguage ./syntaxes/MagicRegExp.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin MagicStack/MagicPython grammars/MagicPython.tmLanguage ./syntaxes/MagicPython.tmLanguage.json grammars/MagicRegExp.tmLanguage ./syntaxes/MagicRegExp.tmLanguage.json" }, "repository": { "type": "git", diff --git a/extensions/r/package.json b/extensions/r/package.json index 114c2122cec..44884cf3336 100644 --- a/extensions/r/package.json +++ b/extensions/r/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater Ikuyadeu/vscode-R syntax/r.json ./syntaxes/r.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin Ikuyadeu/vscode-R syntax/r.json ./syntaxes/r.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/razor/package.json b/extensions/razor/package.json index ddcbd6e415e..fcae342cfde 100644 --- a/extensions/razor/package.json +++ b/extensions/razor/package.json @@ -9,7 +9,7 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater demyte/language-cshtml grammars/cshtml.json ./syntaxes/cshtml.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin demyte/language-cshtml grammars/cshtml.json ./syntaxes/cshtml.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/ruby/package.json b/extensions/ruby/package.json index 6b5bd195a9a..1ce625ef7c8 100644 --- a/extensions/ruby/package.json +++ b/extensions/ruby/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/ruby.tmbundle Syntaxes/Ruby.plist ./syntaxes/ruby.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/ruby.tmbundle Syntaxes/Ruby.plist ./syntaxes/ruby.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/rust/package.json b/extensions/rust/package.json index ffa36bdabf0..7584298368e 100644 --- a/extensions/rust/package.json +++ b/extensions/rust/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater dustypomerleau/rust-syntax syntaxes/rust.tmLanguage.json ./syntaxes/rust.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin dustypomerleau/rust-syntax syntaxes/rust.tmLanguage.json ./syntaxes/rust.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/scss/package.json b/extensions/scss/package.json index 4eaedeff263..967b790d9e5 100644 --- a/extensions/scss/package.json +++ b/extensions/scss/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater atom/language-sass grammars/scss.cson ./syntaxes/scss.tmLanguage.json grammars/sassdoc.cson ./syntaxes/sassdoc.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-sass grammars/scss.cson ./syntaxes/scss.tmLanguage.json grammars/sassdoc.cson ./syntaxes/sassdoc.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/shaderlab/package.json b/extensions/shaderlab/package.json index 905a059db44..7ffb311bea1 100644 --- a/extensions/shaderlab/package.json +++ b/extensions/shaderlab/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater tgjones/shaders-tmLanguage grammars/shaderlab.json ./syntaxes/shaderlab.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin tgjones/shaders-tmLanguage grammars/shaderlab.json ./syntaxes/shaderlab.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/shellscript/package.json b/extensions/shellscript/package.json index 087d6bbe812..3826f2dd934 100644 --- a/extensions/shellscript/package.json +++ b/extensions/shellscript/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater atom/language-shellscript grammars/shell-unix-bash.cson ./syntaxes/shell-unix-bash.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-shellscript grammars/shell-unix-bash.cson ./syntaxes/shell-unix-bash.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/swift/package.json b/extensions/swift/package.json index 4c7aea0299d..d8786ae14c6 100644 --- a/extensions/swift/package.json +++ b/extensions/swift/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/swift.tmbundle Syntaxes/Swift.tmLanguage ./syntaxes/swift.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/swift.tmbundle Syntaxes/Swift.tmLanguage ./syntaxes/swift.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/vb/package.json b/extensions/vb/package.json index be8464f589c..b3472f80a5a 100644 --- a/extensions/vb/package.json +++ b/extensions/vb/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/asp.vb.net.tmbundle Syntaxes/ASP%20VB.net.plist ./syntaxes/asp-vb-net.tmlanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/asp.vb.net.tmbundle Syntaxes/ASP%20VB.net.plist ./syntaxes/asp-vb-net.tmlanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/xml/package.json b/extensions/xml/package.json index 4555ba757b7..a7a9d2c6422 100644 --- a/extensions/xml/package.json +++ b/extensions/xml/package.json @@ -108,7 +108,7 @@ ] }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater atom/language-xml grammars/xml.cson ./syntaxes/xml.tmLanguage.json grammars/xsl.cson ./syntaxes/xsl.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-xml grammars/xml.cson ./syntaxes/xml.tmLanguage.json grammars/xsl.cson ./syntaxes/xsl.tmLanguage.json" }, "repository": { "type": "git", diff --git a/extensions/yaml/package.json b/extensions/yaml/package.json index 80005a0d77d..0673aeda746 100644 --- a/extensions/yaml/package.json +++ b/extensions/yaml/package.json @@ -9,7 +9,7 @@ "vscode": "*" }, "scripts": { - "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater textmate/yaml.tmbundle Syntaxes/YAML.tmLanguage ./syntaxes/yaml.tmLanguage.json" + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/yaml.tmbundle Syntaxes/YAML.tmLanguage ./syntaxes/yaml.tmLanguage.json" }, "contributes": { "languages": [ From f5381197bf7312c66edbd236a97a3d01db311e6b Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 8 Feb 2021 16:06:54 +0100 Subject: [PATCH 12/86] Improve ports view welcome text Part of #116058 --- src/vs/workbench/contrib/remote/browser/remoteExplorer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts b/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts index d9e0ea9eb73..e197733b40f 100644 --- a/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts +++ b/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts @@ -52,7 +52,7 @@ export class ForwardedPortsView extends Disposable implements IWorkbenchContribu super(); this.tasExperimentService = tasExperimentService; this._register(Registry.as(Extensions.ViewsRegistry).registerViewWelcomeContent(TUNNEL_VIEW_ID, { - content: `Forwarded ports allow you to access your running services locally.\n[Forward a Port](command:${ForwardPortAction.INLINE_ID})`, + content: `No forwarded ports. Forward a port to access your running services locally.\n[Forward a Port](command:${ForwardPortAction.INLINE_ID})`, })); this.enableBadgeAndStatusBar(); this.enableForwardedPortsView(); From 1da95321b14f4fa68e8b3a23b72c12e1fc4a4ca1 Mon Sep 17 00:00:00 2001 From: David Bailey Date: Mon, 8 Feb 2021 15:07:55 +0000 Subject: [PATCH 13/86] RPM: Don't generate build_id links (#116105) * Don't generate build_id links * add comment explaining change --- resources/linux/rpm/code.spec.template | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/linux/rpm/code.spec.template b/resources/linux/rpm/code.spec.template index 3407d4a0c51..03272de1a48 100644 --- a/resources/linux/rpm/code.spec.template +++ b/resources/linux/rpm/code.spec.template @@ -14,6 +14,10 @@ AutoReq: 0 %description Visual Studio Code is a new choice of tool that combines the simplicity of a code editor with what developers need for the core edit-build-debug cycle. See https://code.visualstudio.com/docs/setup/linux for installation instructions and FAQ. +# Don't generate build_id links to prevent conflicts when installing multiple +# versions of VS Code alongside each other (e.g. `code` and `code-insiders`) +%define _build_id_links none + %install mkdir -p %{buildroot}/usr/share/@@NAME@@ mkdir -p %{buildroot}/usr/share/applications From ac7918ed6e27495316847e39cf259216cbc26bc3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 8 Feb 2021 07:18:41 -0800 Subject: [PATCH 14/86] Fix terminal paste command Fixes #116098 --- .../contrib/terminal/browser/terminalActions.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index c134548f262..16064271712 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1437,14 +1437,7 @@ export function registerTerminalActions() { title: switchTerminalTitle, f1: true, category, - precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED, - keybinding: [{ - primary: KeyMod.CtrlCmd | KeyCode.KEY_V, - win: { primary: KeyMod.CtrlCmd | KeyCode.KEY_V, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V] }, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V }, - weight: KeybindingWeight.WorkbenchContrib, - when: KEYBINDING_CONTEXT_TERMINAL_FOCUS - }], + precondition: KEYBINDING_CONTEXT_TERMINAL_PROCESS_SUPPORTED }); } async run(accessor: ServicesAccessor, item?: string) { From 50dc6c3c66f53595b9355c7ab731bd3fccc8a707 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 Feb 2021 16:22:32 +0100 Subject: [PATCH 15/86] add search support --- .../syntaxes/generateTMLanguage.js | 1 + .../syntaxes/searchResult.tmLanguage.json | 89 +++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/extensions/search-result/syntaxes/generateTMLanguage.js b/extensions/search-result/syntaxes/generateTMLanguage.js index c0170e514f9..f42955f9fb1 100644 --- a/extensions/search-result/syntaxes/generateTMLanguage.js +++ b/extensions/search-result/syntaxes/generateTMLanguage.js @@ -22,6 +22,7 @@ const mappings = [ ['html', 'text.html.basic'], ['ini', 'source.ini'], ['java', 'source.java'], + ['jl', 'source.julia'], ['js', 'source.js'], ['json', 'source.json.comments'], ['jsx', 'source.js.jsx'], diff --git a/extensions/search-result/syntaxes/searchResult.tmLanguage.json b/extensions/search-result/syntaxes/searchResult.tmLanguage.json index e319191c41f..68f00cfb2a0 100644 --- a/extensions/search-result/syntaxes/searchResult.tmLanguage.json +++ b/extensions/search-result/syntaxes/searchResult.tmLanguage.json @@ -141,6 +141,9 @@ { "include": "#java" }, + { + "include": "#jl" + }, { "include": "#js" }, @@ -2076,6 +2079,92 @@ } ] }, + "jl": { + "name": "meta.resultBlock.search", + "begin": "^(?!\\s)(.*?)([^\\\\\\/\\n]*\\.jl)(:)$", + "end": "^(?!\\s)", + "beginCaptures": { + "0": { + "name": "string meta.path.search" + }, + "1": { + "name": "meta.path.dirname.search" + }, + "2": { + "name": "meta.path.basename.search" + }, + "3": { + "name": "punctuation.separator" + } + }, + "patterns": [ + { + "name": "meta.resultLine.search meta.resultLine.multiLine.search", + "begin": "^ (?:\\s*)((\\d+) )", + "while": "^ (?:\\s*)(?:((\\d+)(:))|((\\d+) ))", + "beginCaptures": { + "0": { + "name": "constant.numeric.integer meta.resultLinePrefix.search" + }, + "1": { + "name": "meta.resultLinePrefix.contextLinePrefix.search" + }, + "2": { + "name": "meta.resultLinePrefix.lineNumber.search" + } + }, + "whileCaptures": { + "0": { + "name": "constant.numeric.integer meta.resultLinePrefix.search" + }, + "1": { + "name": "meta.resultLinePrefix.matchLinePrefix.search" + }, + "2": { + "name": "meta.resultLinePrefix.lineNumber.search" + }, + "3": { + "name": "punctuation.separator" + }, + "4": { + "name": "meta.resultLinePrefix.contextLinePrefix.search" + }, + "5": { + "name": "meta.resultLinePrefix.lineNumber.search" + } + }, + "patterns": [ + { + "include": "source.julia" + } + ] + }, + { + "begin": "^ (?:\\s*)((\\d+)(:))", + "while": "(?=not)possible", + "name": "meta.resultLine.search meta.resultLine.singleLine.search", + "beginCaptures": { + "0": { + "name": "constant.numeric.integer meta.resultLinePrefix.search" + }, + "1": { + "name": "meta.resultLinePrefix.matchLinePrefix.search" + }, + "2": { + "name": "meta.resultLinePrefix.lineNumber.search" + }, + "3": { + "name": "punctuation.separator" + } + }, + "patterns": [ + { + "include": "source.julia" + } + ] + } + ] + }, "js": { "name": "meta.resultBlock.search", "begin": "^(?!\\s)(.*?)([^\\\\\\/\\n]*\\.js)(:)$", From ebac2cfa10b081837869b203f73d67cb8870daa4 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 Feb 2021 16:33:12 +0100 Subject: [PATCH 16/86] add colorizer test --- .../test/colorize-fixtures/test.jl | 26 + .../test/colorize-results/test_jl.json | 2543 +++++++++++++++++ 2 files changed, 2569 insertions(+) create mode 100644 extensions/vscode-colorize-tests/test/colorize-fixtures/test.jl create mode 100644 extensions/vscode-colorize-tests/test/colorize-results/test_jl.json diff --git a/extensions/vscode-colorize-tests/test/colorize-fixtures/test.jl b/extensions/vscode-colorize-tests/test/colorize-fixtures/test.jl new file mode 100644 index 00000000000..3836db893f7 --- /dev/null +++ b/extensions/vscode-colorize-tests/test/colorize-fixtures/test.jl @@ -0,0 +1,26 @@ +# n-queens (nqueens) solver, for nsquaresx-by-nsquaresy board + +struct Queen + x::Int + y::Int +end +hitshorz(queena, queenb) = queena.x == queenb.x +hitsvert(queena, queenb) = queena.y == queenb.y +hitsdiag(queena, queenb) = abs(queena.x - queenb.x) == abs(queena.y - queenb.y) +hitshvd(qa, qb) = hitshorz(qa, qb) || hitsvert(qa, qb) || hitsdiag(qa, qb) +hitsany(testqueen, queens) = any(q -> hitshvd(testqueen, q), queens) + +function trysolve(nsquaresx, nsquaresy, nqueens, presqueens = ()) + nqueens == 0 && return presqueens + for xsquare in 1:nsquaresx + for ysquare in 1:nsquaresy + testqueen = Queen(xsquare, ysquare) + if !hitsany(testqueen, presqueens) + tryqueens = (presqueens..., testqueen) + maybesol = trysolve(nsquaresx, nsquaresy, nqueens - 1, tryqueens) + maybesol !== nothing && return maybesol + end + end + end + return nothing +end diff --git a/extensions/vscode-colorize-tests/test/colorize-results/test_jl.json b/extensions/vscode-colorize-tests/test/colorize-results/test_jl.json new file mode 100644 index 00000000000..74646b2c782 --- /dev/null +++ b/extensions/vscode-colorize-tests/test/colorize-results/test_jl.json @@ -0,0 +1,2543 @@ +[ + { + "c": "#", + "t": "source.julia comment.line.number-sign.julia punctuation.definition.comment.julia", + "r": { + "dark_plus": "comment: #6A9955", + "light_plus": "comment: #008000", + "dark_vs": "comment: #6A9955", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" + } + }, + { + "c": " n-queens (nqueens) solver, for nsquaresx-by-nsquaresy board", + "t": "source.julia comment.line.number-sign.julia", + "r": { + "dark_plus": "comment: #6A9955", + "light_plus": "comment: #008000", + "dark_vs": "comment: #6A9955", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" + } + }, + { + "c": "struct", + "t": "source.julia keyword.other.julia", + "r": { + "dark_plus": "keyword: #569CD6", + "light_plus": "keyword: #0000FF", + "dark_vs": "keyword: #569CD6", + "light_vs": "keyword: #0000FF", + "hc_black": "keyword: #569CD6" + } + }, + { + "c": " Queen", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " x", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "::", + "t": "source.julia keyword.operator.relation.types.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "Int", + "t": "source.julia support.type.julia", + "r": { + "dark_plus": "support.type: #4EC9B0", + "light_plus": "support.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.type: #4EC9B0" + } + }, + { + "c": " y", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "::", + "t": "source.julia keyword.operator.relation.types.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "Int", + "t": "source.julia support.type.julia", + "r": { + "dark_plus": "support.type: #4EC9B0", + "light_plus": "support.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.type: #4EC9B0" + } + }, + { + "c": "end", + "t": "source.julia keyword.control.end.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": "hitshorz", + "t": "source.julia entity.name.function.julia", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "queena", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " queenb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " queena", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "x ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "==", + "t": "source.julia keyword.operator.relation.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " queenb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "x", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitsvert", + "t": "source.julia entity.name.function.julia", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "queena", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " queenb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " queena", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "y ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "==", + "t": "source.julia keyword.operator.relation.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " queenb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "y", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitsdiag", + "t": "source.julia entity.name.function.julia", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "queena", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " queenb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "abs", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "queena", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "x ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "-", + "t": "source.julia keyword.operator.arithmetic.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " queenb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "x", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "==", + "t": "source.julia keyword.operator.relation.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "abs", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "queena", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "y ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "-", + "t": "source.julia keyword.operator.arithmetic.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " queenb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ".", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "y", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitshvd", + "t": "source.julia entity.name.function.julia", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "qa", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " qb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitshorz", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "qa", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " qb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "||", + "t": "source.julia keyword.operator.boolean.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitsvert", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "qa", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " qb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "||", + "t": "source.julia keyword.operator.boolean.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitsdiag", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "qa", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " qb", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitsany", + "t": "source.julia entity.name.function.julia", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "testqueen", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " queens", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "any", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "q ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "->", + "t": "source.julia keyword.operator.arrow.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hitshvd", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "testqueen", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " q", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "),", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " queens", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "function", + "t": "source.julia keyword.other.julia", + "r": { + "dark_plus": "keyword: #569CD6", + "light_plus": "keyword: #0000FF", + "dark_vs": "keyword: #569CD6", + "light_vs": "keyword: #0000FF", + "hc_black": "keyword: #569CD6" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "trysolve", + "t": "source.julia entity.name.function.julia", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "nsquaresx", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " nsquaresy", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " nqueens", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " presqueens ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "())", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " nqueens ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "==", + "t": "source.julia keyword.operator.relation.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "0", + "t": "source.julia constant.numeric.julia", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #098658", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #098658", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "&&", + "t": "source.julia keyword.operator.boolean.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "return", + "t": "source.julia keyword.control.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " presqueens", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "for", + "t": "source.julia keyword.control.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " xsquare ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "in", + "t": "source.julia keyword.operator.relation.in.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "1", + "t": "source.julia constant.numeric.julia", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #098658", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #098658", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ":", + "t": "source.julia keyword.operator.range.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "nsquaresx", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "for", + "t": "source.julia keyword.control.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ysquare ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "in", + "t": "source.julia keyword.operator.relation.in.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "1", + "t": "source.julia constant.numeric.julia", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #098658", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #098658", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ":", + "t": "source.julia keyword.operator.range.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "nsquaresy", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " testqueen ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Queen", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "xsquare", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ysquare", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "if", + "t": "source.julia keyword.control.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "!", + "t": "source.julia keyword.operator.boolean.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "hitsany", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "testqueen", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " presqueens", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " tryqueens ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "presqueens", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "...", + "t": "source.julia keyword.operator.dots.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " testqueen", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " maybesol ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.julia keyword.operator.update.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "trysolve", + "t": "source.julia support.function.julia", + "r": { + "dark_plus": "support.function: #DCDCAA", + "light_plus": "support.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.function: #DCDCAA" + } + }, + { + "c": "(", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "nsquaresx", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " nsquaresy", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " nqueens ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "-", + "t": "source.julia keyword.operator.arithmetic.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "1", + "t": "source.julia constant.numeric.julia", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #098658", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #098658", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ",", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " tryqueens", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.julia meta.bracket.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " maybesol ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "!==", + "t": "source.julia keyword.operator.relation.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "nothing", + "t": "source.julia constant.language.julia", + "r": { + "dark_plus": "constant.language: #569CD6", + "light_plus": "constant.language: #0000FF", + "dark_vs": "constant.language: #569CD6", + "light_vs": "constant.language: #0000FF", + "hc_black": "constant.language: #569CD6" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "&&", + "t": "source.julia keyword.operator.boolean.julia", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "return", + "t": "source.julia keyword.control.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " maybesol", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "end", + "t": "source.julia keyword.control.end.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "end", + "t": "source.julia keyword.control.end.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "end", + "t": "source.julia keyword.control.end.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "return", + "t": "source.julia keyword.control.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.julia", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "nothing", + "t": "source.julia constant.language.julia", + "r": { + "dark_plus": "constant.language: #569CD6", + "light_plus": "constant.language: #0000FF", + "dark_vs": "constant.language: #569CD6", + "light_vs": "constant.language: #0000FF", + "hc_black": "constant.language: #569CD6" + } + }, + { + "c": "end", + "t": "source.julia keyword.control.end.julia", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + } +] \ No newline at end of file From 1a9635193f626e16d2cc2df469c57872d6f8258b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 Feb 2021 16:33:49 +0100 Subject: [PATCH 17/86] update and fix grammar --- extensions/julia/cgmanifest.json | 4 ++-- extensions/julia/package.json | 2 +- extensions/julia/syntaxes/julia.tmLanguage.json | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/julia/cgmanifest.json b/extensions/julia/cgmanifest.json index ef8a78a5761..9d03ce0d90c 100644 --- a/extensions/julia/cgmanifest.json +++ b/extensions/julia/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": " JuliaEditorSupport/atom-language-julia", "repositoryUrl": "https://github.com/JuliaEditorSupport/atom-language-julia", - "commitHash": "df335e026376acd722439aa1ac08f0889ada022e" + "commitHash": "8ae8d9cac742c65ae0bef1a5e2d068e2cae871bc" } }, "license": "MIT", - "version": "0.20.2" + "version": "0.21.0" } ], "version": 1 diff --git a/extensions/julia/package.json b/extensions/julia/package.json index fdf0ce01a7e..971ad4fe96e 100644 --- a/extensions/julia/package.json +++ b/extensions/julia/package.json @@ -9,7 +9,7 @@ "vscode": "0.10.x" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js JuliaEditorSupport/atom-language-julia grammars/julia_vscode.json ./syntaxes/julia.tmLanguage.json" + "update-grammar": "node ../node_modules/.bin/vscode-grammar-updater JuliaEditorSupport/atom-language-julia grammars/julia_vscode.json ./syntaxes/julia.tmLanguage.json" }, "contributes": { "languages": [ diff --git a/extensions/julia/syntaxes/julia.tmLanguage.json b/extensions/julia/syntaxes/julia.tmLanguage.json index a5a26c969d5..d128f347693 100644 --- a/extensions/julia/syntaxes/julia.tmLanguage.json +++ b/extensions/julia/syntaxes/julia.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/JuliaEditorSupport/atom-language-julia/commit/df335e026376acd722439aa1ac08f0889ada022e", + "version": "https://github.com/JuliaEditorSupport/atom-language-julia/commit/8ae8d9cac742c65ae0bef1a5e2d068e2cae871bc", "name": "Julia", "scopeName": "source.julia", "comment": "This grammar is used by Atom (Oniguruma), GitHub (PCRE), and VSCode (Oniguruma),\nso all regexps must be compatible with both engines.\n\nSpecs:\n- https://github.com/kkos/oniguruma/blob/master/doc/RE\n- https://www.pcre.org/current/doc/html/", @@ -288,7 +288,7 @@ "match": "(?:\\s*(::|>:|<:)\\s*((?:(?:Union)?\\([^)]*\\)|[[:alpha:]_$∇][[:word:]⁺-ₜ!′\\.]*(?:(?:{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})|(?:\".+?(? Date: Mon, 8 Feb 2021 16:43:28 +0100 Subject: [PATCH 18/86] Update gulp-atom-electron (#116119) * update to latest gulp-atom-electron * update gulp-atom-electron again * use latest gulp-atom-electron, electronMirror option * Revert "use latest gulp-atom-electron, electronMirror option" This reverts commit 47ff28a5e1d6e9941f0b2d8656b0af021f355023. * update gulp-atom-electron * update gulp-atom-electron * one more --- package.json | 2 +- yarn.lock | 194 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 157 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index b4e5cfd8a91..a8d93b98375 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "file-loader": "^4.2.0", "glob": "^5.0.13", "gulp": "^4.0.0", - "gulp-atom-electron": "1.22.0", + "gulp-atom-electron": "^1.30.1", "gulp-azure-storage": "^0.11.1", "gulp-bom": "^3.0.0", "gulp-buffer": "0.0.2", diff --git a/yarn.lock b/yarn.lock index 1bf0fd07c68..527de19f3d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -170,6 +170,22 @@ global-agent "^2.0.2" global-tunnel-ng "^2.7.1" +"@electron/get@^1.12.4": + version "1.12.4" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.4.tgz#a5971113fc1bf8fa12a8789dc20152a7359f06ab" + integrity sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^2.0.2" + global-tunnel-ng "^2.7.1" + "@gulp-sourcemaps/identity-map@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz#a6e8b1abec8f790ec6be2b8c500e6e68037c0019" @@ -229,6 +245,109 @@ dependencies: mkdirp "^1.0.4" +"@octokit/auth-token@^2.4.4": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.4.tgz#ee31c69b01d0378c12fd3ffe406030f3d94d3b56" + integrity sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q== + dependencies: + "@octokit/types" "^6.0.0" + +"@octokit/core@^3.2.3": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.4.tgz#5791256057a962eca972e31818f02454897fd106" + integrity sha512-d9dTsqdePBqOn7aGkyRFe7pQpCXdibSJ5SFnrTr0axevObZrpz3qkWm7t/NjYv5a66z6vhfteriaq4FRz3e0Qg== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.4.12" + "@octokit/types" "^6.0.3" + before-after-hook "^2.1.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.10" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.10.tgz#741ce1fa2f4fb77ce8ebe0c6eaf5ce63f565f8e8" + integrity sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q== + dependencies: + "@octokit/types" "^6.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^4.5.8": + version "4.5.8" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.8.tgz#d42373633c3015d0eafce64a8ce196be167fdd9b" + integrity sha512-WnCtNXWOrupfPJgXe+vSmprZJUr0VIu14G58PMlkWGj3cH+KLZEfKMmbUQ6C3Wwx6fdhzVW1CD5RTnBdUHxhhA== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^6.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-3.2.0.tgz#d62d0ff7147dbf4d218616b2484ee2a5d023055d" + integrity sha512-X7yW/fpzF3uTAE+LbPD3HEeeU+/49o0V4kNA/yv8jQ3BDpFayv/osTOhY1y1mLXljW2bOJcOCSGZo4jFKPJ6Vw== + +"@octokit/plugin-paginate-rest@^2.6.2": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.8.0.tgz#2b41e12b494e895bf5fb5b12565d2c80a0ecc6ae" + integrity sha512-HtuEQ2AYE4YFEBQN0iHmMsIvVucd5RsnwJmRKIsfAg1/ZeoMaU+jXMnTAZqIUEmcVJA27LjHUm3f1hxf8Fpdxw== + dependencies: + "@octokit/types" "^6.4.0" + +"@octokit/plugin-request-log@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.2.tgz#394d59ec734cd2f122431fbaf05099861ece3c44" + integrity sha512-oTJSNAmBqyDR41uSMunLQKMX0jmEXbwD1fpz8FG27lScV3RhtGfBa1/BBLym+PxcC16IBlF7KH9vP1BUYxA+Eg== + +"@octokit/plugin-rest-endpoint-methods@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.8.0.tgz#c1f24f940fc265f0021c8f544e3d8755f3253759" + integrity sha512-2zRpXDveJH8HsXkeeMtRW21do8wuSxVn1xXFdvhILyxlLWqGQrdJUA1/dk5DM7iAAYvwT/P3bDOLs90yL4S2AA== + dependencies: + "@octokit/types" "^6.5.0" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.4.tgz#07dd5c0521d2ee975201274c472a127917741262" + integrity sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA== + dependencies: + "@octokit/types" "^6.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": + version "5.4.12" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.12.tgz#b04826fa934670c56b135a81447be2c1723a2ffc" + integrity sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^6.0.3" + deprecation "^2.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" + once "^1.4.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@^18.0.14": + version "18.0.14" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.0.14.tgz#a152478465746542e80697b5a5576ccb6151dc4d" + integrity sha512-62mKIaBb/XD2Z2KCBmAPydEk/d0IBMOnwk6DJVo36ICTnxlRPTdQwFE2LzlpBPDR52xOKPlGqb3Bnhh99atltA== + dependencies: + "@octokit/core" "^3.2.3" + "@octokit/plugin-paginate-rest" "^2.6.2" + "@octokit/plugin-request-log" "^1.0.2" + "@octokit/plugin-rest-endpoint-methods" "4.8.0" + +"@octokit/types@^6.0.0", "@octokit/types@^6.0.3", "@octokit/types@^6.4.0", "@octokit/types@^6.5.0": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.5.0.tgz#8f27c52d57eb4096fb05a290f4afc90194e08b19" + integrity sha512-mzCy7lkYQv+kM58W37uTg/mWoJ4nvRDRCkjSdqlrgA28hJEYNJTMYiGTvmq39cdtnMPJd0hshysBEAaH4D5C7w== + dependencies: + "@octokit/openapi-types" "^3.2.0" + "@types/node" ">= 8" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -371,6 +490,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-4.2.22.tgz#cf488a0f6b4a9c245d09927f4f757ca278b9c8ce" integrity sha512-LXRap3bb4AjtLZ5NOFc4ssVZrQPTgdPcNm++0SEJuJZaOA+xHkojJNYqy33A5q/94BmG5tA6yaMeD4VdCv5aSA== +"@types/node@>= 8": + version "14.14.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18" + integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw== + "@types/node@^10.11.7": version "10.12.21" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" @@ -1304,6 +1428,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^2.1.0: + version "2.1.0" + resolved "https://pkgs.dev.azure.com/terrapin-prod/Terrapin/_packaging/open-source-packages-2/npm/registry/before-after-hook/-/before-after-hook-2.1.0.tgz#0bb562539c98af6479c3e423df1880d022bd9c76" + integrity sha1-C7ViU5yYr2R5w+Qj3xiA0CK9nHY= + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -2066,7 +2195,7 @@ colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== -colors@^1.1.2, colors@^1.3.3: +colors@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -2711,6 +2840,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -4037,16 +4171,6 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -github-releases-ms@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/github-releases-ms/-/github-releases-ms-0.5.0.tgz#a5b36c3f2cfc5336064165d26708df78affc300a" - integrity sha512-cndYTVDF9LiL+LbMiyUfYLbWjpiMqNiTiJTQprlXJ/p8DoGBK8zZ1yGvIEzfV2SvZXgYt2m/ZFnywMHhb+/goQ== - dependencies: - minimatch "^3.0.4" - optimist "^0.6.1" - prettyjson "^1.2.1" - request "^2.88.0" - glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -4286,19 +4410,19 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -gulp-atom-electron@1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/gulp-atom-electron/-/gulp-atom-electron-1.22.0.tgz#0e2f4fe7c7310145c6c81d5660d0277cd8338d27" - integrity sha512-K13Ze2+iRIvC1igl+BIbZdF8M2ZzEIM6LF+/j83oWNGNhe7+en77qT9y9rs6SipYeOyoInlbly+pzbFgvwpSHA== +gulp-atom-electron@^1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/gulp-atom-electron/-/gulp-atom-electron-1.30.1.tgz#d29516d63fa7f0c7841e664a60c6a00c14c6090d" + integrity sha512-lOpvkdS6QwwqtH3CfnoI/uwOc2u1OL9OeH67ZzjfO9cra2dW1GJ6xQl62Pot8fc0kMx+N7qrbGo/+N0hdxfHXg== dependencies: + "@electron/get" "^1.12.4" + "@octokit/rest" "^18.0.14" event-stream "3.3.4" - github-releases-ms "^0.5.0" gulp-filter "^5.1.0" gulp-rename "1.2.2" gulp-symdest "^1.1.1" gulp-vinyl-zip "^2.1.2" mkdirp "^0.5.1" - object-assign "^4.0.1" plist "^3.0.1" progress "^1.1.8" rcedit "^0.3.0" @@ -5251,6 +5375,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + 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" @@ -6214,11 +6343,6 @@ minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -6498,6 +6622,11 @@ node-addon-api@^3.0.0, node-addon-api@^3.0.2: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.2.tgz#04bc7b83fd845ba785bb6eae25bc857e1ef75681" integrity sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg== +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://pkgs.dev.azure.com/terrapin-prod/Terrapin/_packaging/open-source-packages-2/npm/registry/node-fetch/-/node-fetch-2.6.1.tgz#71da3def292fc21adc5670825461ea36c316643c" + integrity sha1-cdo97ykvwhrcVnCCVGHqNsMWZDw= + node-gyp@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.0.tgz#cb8aed7ab772e73ad592ae0c71b0e3741099fe39" @@ -6836,14 +6965,6 @@ optimist@0.3.5: dependencies: wordwrap "~0.0.2" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optionator@^0.8.2, optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -7691,14 +7812,6 @@ pretty-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= -prettyjson@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" - integrity sha1-/P+rQdGcq0365eV15kJGYZsS0ok= - dependencies: - colors "^1.1.2" - minimist "^1.2.0" - process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -9672,6 +9785,11 @@ unique-stream@^2.0.2: json-stable-stringify-without-jsonify "^1.0.1" through2-filter "^3.0.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" From 0293b129e376a683eab7e1cd630e7c0ae6e26e24 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 Feb 2021 16:53:30 +0100 Subject: [PATCH 19/86] add name attribute, https://github.com/microsoft/vscode/issues/115746 --- extensions/vscode-api-tests/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json index 6974a720072..228a9681278 100644 --- a/extensions/vscode-api-tests/package.json +++ b/extensions/vscode-api-tests/package.json @@ -42,6 +42,7 @@ "remote": [ { "id": "test.treeId", + "name": "test-tree", "when": "never" } ] From fb8bced55bdd7eb151ad9c3f15fc712d540db1c8 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 Feb 2021 17:16:43 +0100 Subject: [PATCH 20/86] after fix for grammar importer --- extensions/julia/syntaxes/julia.tmLanguage.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/julia/syntaxes/julia.tmLanguage.json b/extensions/julia/syntaxes/julia.tmLanguage.json index d128f347693..c18a377c8b9 100644 --- a/extensions/julia/syntaxes/julia.tmLanguage.json +++ b/extensions/julia/syntaxes/julia.tmLanguage.json @@ -956,7 +956,7 @@ ] }, { - "begin": "(? Date: Mon, 8 Feb 2021 08:28:29 -0800 Subject: [PATCH 21/86] debug: update js-debug --- product.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product.json b/product.json index d5dca3d856a..47bb865de2e 100644 --- a/product.json +++ b/product.json @@ -91,7 +91,7 @@ }, { "name": "ms-vscode.js-debug", - "version": "1.54.0", + "version": "1.54.1", "repo": "https://github.com/microsoft/vscode-js-debug", "metadata": { "id": "25629058-ddac-4e17-abba-74678e126c5d", From 3334b1534c9a83a4894d7108903dbfd8eed6110d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 8 Feb 2021 18:00:37 +0100 Subject: [PATCH 22/86] #114901 associate scoped context key service to target --- src/vs/base/browser/ui/splitview/paneview.ts | 14 ++-- src/vs/workbench/browser/panecomposite.ts | 34 ++++---- src/vs/workbench/browser/panel.ts | 4 +- .../workbench/browser/parts/views/viewPane.ts | 31 ++----- .../browser/parts/views/viewPaneContainer.ts | 22 +---- .../browser/parts/views/viewsService.ts | 80 ++++++++++++------- src/vs/workbench/browser/viewlet.ts | 13 +-- src/vs/workbench/common/panecomposite.ts | 2 +- src/vs/workbench/test/browser/viewlet.test.ts | 4 +- 9 files changed, 93 insertions(+), 111 deletions(-) diff --git a/src/vs/base/browser/ui/splitview/paneview.ts b/src/vs/base/browser/ui/splitview/paneview.ts index 673094b0c57..15bdc774f69 100644 --- a/src/vs/base/browser/ui/splitview/paneview.ts +++ b/src/vs/base/browser/ui/splitview/paneview.ts @@ -432,7 +432,7 @@ export class PaneView extends Disposable { private dnd: IPaneDndController | undefined; private dndContext: IDndContext = { draggable: null }; - private el: HTMLElement; + readonly element: HTMLElement; private paneItems: IPaneItem[] = []; private orthogonalSize: number = 0; private size: number = 0; @@ -450,8 +450,8 @@ export class PaneView extends Disposable { this.dnd = options.dnd; this.orientation = options.orientation ?? Orientation.VERTICAL; - this.el = append(container, $('.monaco-pane-view')); - this.splitview = this._register(new SplitView(this.el, { orientation: this.orientation })); + this.element = append(container, $('.monaco-pane-view')); + this.splitview = this._register(new SplitView(this.element, { orientation: this.orientation })); this.onDidSashChange = this.splitview.onDidSashChange; } @@ -534,9 +534,9 @@ export class PaneView extends Disposable { const paneSizes = this.paneItems.map(pane => this.getPaneSize(pane.pane)); this.splitview.dispose(); - clearNode(this.el); + clearNode(this.element); - this.splitview = this._register(new SplitView(this.el, { orientation: this.orientation })); + this.splitview = this._register(new SplitView(this.element, { orientation: this.orientation })); const newOrthogonalSize = this.orientation === Orientation.VERTICAL ? width : height; const newSize = this.orientation === Orientation.HORIZONTAL ? width : height; @@ -560,11 +560,11 @@ export class PaneView extends Disposable { window.clearTimeout(this.animationTimer); } - this.el.classList.add('animated'); + this.element.classList.add('animated'); this.animationTimer = window.setTimeout(() => { this.animationTimer = undefined; - this.el.classList.remove('animated'); + this.element.classList.remove('animated'); }, 200); } diff --git a/src/vs/workbench/browser/panecomposite.ts b/src/vs/workbench/browser/panecomposite.ts index d7c33b15c77..700678c478a 100644 --- a/src/vs/workbench/browser/panecomposite.ts +++ b/src/vs/workbench/browser/panecomposite.ts @@ -17,11 +17,12 @@ import { ViewPaneContainer } from './parts/views/viewPaneContainer'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IAction, IActionViewItem } from 'vs/base/common/actions'; -export class PaneComposite extends Composite implements IPaneComposite { +export abstract class PaneComposite extends Composite implements IPaneComposite { + + private viewPaneContainer?: ViewPaneContainer; constructor( id: string, - protected readonly viewPaneContainer: ViewPaneContainer, @ITelemetryService telemetryService: ITelemetryService, @IStorageService protected storageService: IStorageService, @IInstantiationService protected instantiationService: IInstantiationService, @@ -31,56 +32,57 @@ export class PaneComposite extends Composite implements IPaneComposite { @IWorkspaceContextService protected contextService: IWorkspaceContextService ) { super(id, telemetryService, themeService, storageService); - this._register(this.viewPaneContainer.onTitleAreaUpdate(() => this.updateTitleArea())); } create(parent: HTMLElement): void { + this.viewPaneContainer = this._register(this.createViewPaneContainer(parent)); + this._register(this.viewPaneContainer.onTitleAreaUpdate(() => this.updateTitleArea())); this.viewPaneContainer.create(parent); } setVisible(visible: boolean): void { super.setVisible(visible); - this.viewPaneContainer.setVisible(visible); + this.viewPaneContainer?.setVisible(visible); } layout(dimension: Dimension): void { - this.viewPaneContainer.layout(dimension); + this.viewPaneContainer?.layout(dimension); } getOptimalWidth(): number { - return this.viewPaneContainer.getOptimalWidth(); + return this.viewPaneContainer?.getOptimalWidth() ?? 0; } openView(id: string, focus?: boolean): T | undefined { - return this.viewPaneContainer.openView(id, focus) as T; + return this.viewPaneContainer?.openView(id, focus) as T; } - getViewPaneContainer(): ViewPaneContainer { + getViewPaneContainer(): ViewPaneContainer | undefined { return this.viewPaneContainer; } getActionsContext(): unknown { - return this.getViewPaneContainer().getActionsContext(); + return this.getViewPaneContainer()?.getActionsContext(); } getContextMenuActions(): ReadonlyArray { - return this.viewPaneContainer.getContextMenuActions(); + return this.viewPaneContainer?.getContextMenuActions() ?? []; } getActions(): ReadonlyArray { - return this.viewPaneContainer.getActions(); + return this.viewPaneContainer?.getActions() ?? []; } getSecondaryActions(): ReadonlyArray { - return this.viewPaneContainer.getSecondaryActions(); + return this.viewPaneContainer?.getSecondaryActions() ?? []; } getActionViewItem(action: IAction): IActionViewItem | undefined { - return this.viewPaneContainer.getActionViewItem(action); + return this.viewPaneContainer?.getActionViewItem(action); } getTitle(): string { - return this.viewPaneContainer.getTitle(); + return this.viewPaneContainer?.getTitle() ?? ''; } saveState(): void { @@ -88,6 +90,8 @@ export class PaneComposite extends Composite implements IPaneComposite { } focus(): void { - this.viewPaneContainer.focus(); + this.viewPaneContainer?.focus(); } + + protected abstract createViewPaneContainer(parent: HTMLElement): ViewPaneContainer; } diff --git a/src/vs/workbench/browser/panel.ts b/src/vs/workbench/browser/panel.ts index 0d04a6a1ce0..ab678781a3c 100644 --- a/src/vs/workbench/browser/panel.ts +++ b/src/vs/workbench/browser/panel.ts @@ -17,7 +17,6 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export abstract class Panel extends PaneComposite implements IPanel { @@ -25,7 +24,6 @@ export abstract class Panel extends PaneComposite implements IPanel { private readonly panelActions: CompositeMenuActions; constructor(id: string, - viewPaneContainer: ViewPaneContainer, @ITelemetryService telemetryService: ITelemetryService, @IStorageService storageService: IStorageService, @IInstantiationService instantiationService: IInstantiationService, @@ -34,7 +32,7 @@ export abstract class Panel extends PaneComposite implements IPanel { @IExtensionService extensionService: IExtensionService, @IWorkspaceContextService contextService: IWorkspaceContextService, ) { - super(id, viewPaneContainer, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); + super(id, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); this.panelActions = this._register(this.instantiationService.createInstance(CompositeMenuActions, MenuId.PanelTitle, undefined, undefined)); this._register(this.panelActions.onDidChange(() => this.updateTitleArea())); } diff --git a/src/vs/workbench/browser/parts/views/viewPane.ts b/src/vs/workbench/browser/parts/views/viewPane.ts index 27f5af3cfb0..9b6dff584e1 100644 --- a/src/vs/workbench/browser/parts/views/viewPane.ts +++ b/src/vs/workbench/browser/parts/views/viewPane.ts @@ -21,11 +21,11 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IPaneOptions, Pane, IPaneStyles } from 'vs/base/browser/ui/splitview/paneview'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Extensions as ViewContainerExtensions, IView, FocusedViewContext, IViewDescriptorService, ViewContainerLocation, IViewsRegistry, IViewContentDescriptor, defaultViewIcon, IViewsService, ViewContainerLocationToString } from 'vs/workbench/common/views'; +import { Extensions as ViewContainerExtensions, IView, FocusedViewContext, IViewDescriptorService, ViewContainerLocation, IViewsRegistry, IViewContentDescriptor, defaultViewIcon, IViewsService } from 'vs/workbench/common/views'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { assertIsDefined } from 'vs/base/common/types'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { MenuId, Action2, IAction2Options, IMenuService } from 'vs/platform/actions/common/actions'; +import { MenuId, Action2, IAction2Options } from 'vs/platform/actions/common/actions'; import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { parseLinkedText } from 'vs/base/common/linkedText'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -41,6 +41,7 @@ import { URI } from 'vs/base/common/uri'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { Codicon } from 'vs/base/common/codicons'; import { CompositeMenuActions } from 'vs/workbench/browser/menuActions'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; export interface IViewPaneOptions extends IPaneOptions { id: string; @@ -140,25 +141,6 @@ class ViewWelcomeController { } } -class ViewMenuActions extends CompositeMenuActions { - constructor( - viewId: string, - menuId: MenuId, - contextMenuId: MenuId, - @IContextKeyService contextKeyService: IContextKeyService, - @IMenuService menuService: IMenuService, - @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - ) { - const scopedContextKeyService = contextKeyService.createScoped(); - scopedContextKeyService.createKey('view', viewId); - const viewLocationKey = scopedContextKeyService.createKey('viewLocation', ViewContainerLocationToString(viewDescriptorService.getViewLocationById(viewId)!)); - super(menuId, contextMenuId, { shouldForwardArgs: true }, scopedContextKeyService, menuService); - this._register(scopedContextKeyService); - this._register(Event.filter(viewDescriptorService.onDidChangeLocation, e => e.views.some(view => view.id === viewId))(() => viewLocationKey.set(ViewContainerLocationToString(viewDescriptorService.getViewLocationById(viewId)!)))); - } - -} - export abstract class ViewPane extends Pane implements IView { private static readonly AlwaysShowActionsConfig = 'workbench.view.alwaysShowHeaderActions'; @@ -193,7 +175,7 @@ export abstract class ViewPane extends Pane implements IView { return this._titleDescription; } - private readonly menuActions: ViewMenuActions; + private readonly menuActions: CompositeMenuActions; private progressBar!: ProgressBar; private progressIndicator!: IProgressIndicator; @@ -230,7 +212,10 @@ export abstract class ViewPane extends Pane implements IView { this.showActionsAlways = !!options.showActionsAlways; this.focusedViewContextKey = FocusedViewContext.bindTo(contextKeyService); - this.menuActions = this._register(instantiationService.createInstance(ViewMenuActions, this.id, options.titleMenuId || MenuId.ViewTitle, MenuId.ViewTitleContext)); + const scopedContextKeyService = this._register(contextKeyService.createScoped(this.element)); + scopedContextKeyService.createKey('view', this.id); + const scopedInstantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, scopedContextKeyService])); + this.menuActions = this._register(scopedInstantiationService.createInstance(CompositeMenuActions, options.titleMenuId || MenuId.ViewTitle, MenuId.ViewTitleContext, { shouldForwardArgs: true })); this._register(this.menuActions.onDidChange(() => this.updateActions())); this.viewWelcomeController = new ViewWelcomeController(this.id, contextKeyService); diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index d85abe6e979..d24ecdf1eb7 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -28,7 +28,7 @@ import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewl import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { Component } from 'vs/workbench/common/component'; -import { registerAction2, Action2, IAction2Options, IMenuService, MenuId, MenuRegistry, ISubmenuItem, SubmenuItemAction } from 'vs/platform/actions/common/actions'; +import { registerAction2, Action2, IAction2Options, MenuId, MenuRegistry, ISubmenuItem, SubmenuItemAction } from 'vs/platform/actions/common/actions'; import { CompositeDragAndDropObserver, DragAndDropObserver, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; import { RunOnceScheduler } from 'vs/base/common/async'; @@ -293,22 +293,6 @@ class ViewPaneDropOverlay extends Themable { } } -class ViewContainerMenuActions extends CompositeMenuActions { - constructor( - viewContainer: ViewContainer, - @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - @IContextKeyService contextKeyService: IContextKeyService, - @IMenuService menuService: IMenuService, - ) { - const scopedContextKeyService = contextKeyService.createScoped(); - scopedContextKeyService.createKey('viewContainer', viewContainer.id); - const viewContainerLocationKey = scopedContextKeyService.createKey('viewContainerLocation', ViewContainerLocationToString(viewDescriptorService.getViewContainerLocation(viewContainer)!)); - super(MenuId.ViewContainerTitle, MenuId.ViewContainerTitleContext, { shouldForwardArgs: true }, scopedContextKeyService, menuService); - this._register(scopedContextKeyService); - this._register(Event.filter(viewDescriptorService.onDidChangeContainerLocation, e => e.viewContainer === viewContainer)(() => viewContainerLocationKey.set(ViewContainerLocationToString(viewDescriptorService.getViewContainerLocation(viewContainer)!)))); - } -} - export class ViewPaneContainer extends Component implements IViewPaneContainer { readonly viewContainer: ViewContainer; @@ -359,7 +343,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { return this.paneItems.length; } - private readonly menuActions: ViewContainerMenuActions; + private readonly menuActions: CompositeMenuActions; constructor( id: string, @@ -390,7 +374,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { this._register(toDisposable(() => this.viewDisposables = dispose(this.viewDisposables))); this.viewContainerModel = this.viewDescriptorService.getViewContainerModel(container); - this.menuActions = this._register(instantiationService.createInstance(ViewContainerMenuActions, container)); + this.menuActions = this._register(this.instantiationService.createInstance(CompositeMenuActions, MenuId.ViewContainerTitle, MenuId.ViewContainerTitleContext, { shouldForwardArgs: true })); this._register(this.menuActions.onDidChange(() => this.updateTitleArea())); } diff --git a/src/vs/workbench/browser/parts/views/viewsService.ts b/src/vs/workbench/browser/parts/views/viewsService.ts index a76607f2e8e..88ee4b8d2cc 100644 --- a/src/vs/workbench/browser/parts/views/viewsService.ts +++ b/src/vs/workbench/browser/parts/views/viewsService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable, IDisposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { IViewDescriptorService, ViewContainer, IViewDescriptor, IView, ViewContainerLocation, IViewsService, IViewPaneContainer, getVisbileViewContextKey, getEnabledViewContainerContextKey, FocusedViewContext } from 'vs/workbench/common/views'; +import { IViewDescriptorService, ViewContainer, IViewDescriptor, IView, ViewContainerLocation, IViewsService, IViewPaneContainer, getVisbileViewContextKey, getEnabledViewContainerContextKey, FocusedViewContext, ViewContainerLocationToString } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; @@ -32,13 +32,15 @@ import { URI } from 'vs/base/common/uri'; import { IProgressIndicator } from 'vs/platform/progress/common/progress'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { FilterViewPaneContainer } from 'vs/workbench/browser/parts/views/viewsViewlet'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; export class ViewsService extends Disposable implements IViewsService { declare readonly _serviceBrand: undefined; private readonly viewDisposable: Map; - private readonly viewPaneContainers: Map; + private readonly viewPaneContainers: Map; private readonly _onDidChangeViewVisibility: Emitter<{ id: string, visible: boolean }> = this._register(new Emitter<{ id: string, visible: boolean }>()); readonly onDidChangeViewVisibility: Event<{ id: string, visible: boolean }> = this._onDidChangeViewVisibility.event; @@ -59,7 +61,7 @@ export class ViewsService extends Disposable implements IViewsService { this.viewDisposable = new Map(); this.visibleViewContextKeys = new Map>(); - this.viewPaneContainers = new Map(); + this.viewPaneContainers = new Map(); this._register(toDisposable(() => { this.viewDisposable.forEach(disposable => disposable.dispose()); @@ -78,24 +80,6 @@ export class ViewsService extends Disposable implements IViewsService { } - private registerViewPaneContainer(viewPaneContainer: ViewPaneContainer): void { - const disposable = new DisposableStore(); - disposable.add(viewPaneContainer); - disposable.add(viewPaneContainer.onDidAddViews(views => this.onViewsAdded(views))); - disposable.add(viewPaneContainer.onDidChangeViewVisibility(view => this.onViewsVisibilityChanged(view, view.isBodyVisible()))); - disposable.add(viewPaneContainer.onDidRemoveViews(views => this.onViewsRemoved(views))); - - this.viewPaneContainers.set(viewPaneContainer.getId(), { viewPaneContainer, disposable }); - } - - private deregisterViewPaneContainer(id: string): void { - const viewPaneContainerItem = this.viewPaneContainers.get(id); - if (viewPaneContainerItem) { - viewPaneContainerItem.disposable.dispose(); - this.viewPaneContainers.delete(id); - } - } - private onViewsAdded(added: IView[]): void { for (const view of added) { this.onViewsVisibilityChanged(view, view.isBodyVisible()); @@ -340,7 +324,7 @@ export class ViewsService extends Disposable implements IViewsService { return undefined; } - const viewPaneContainer = this.viewPaneContainers.get(viewContainer.id)?.viewPaneContainer; + const viewPaneContainer = this.viewPaneContainers.get(viewContainer.id); if (!viewPaneContainer) { return undefined; } @@ -583,6 +567,24 @@ export class ViewsService extends Disposable implements IViewsService { } } + private createViewPaneContainer(element: HTMLElement, viewContainer: ViewContainer, viewContainerLocation: ViewContainerLocation, disposables: DisposableStore, contextKeyService: IContextKeyService, instantiationService: IInstantiationService): ViewPaneContainer { + const scopedContextKeyService = this._register(contextKeyService.createScoped(element)); + scopedContextKeyService.createKey('viewContainer', viewContainer.id); + scopedContextKeyService.createKey('viewContainerLocation', ViewContainerLocationToString(viewContainerLocation)); + scopedContextKeyService.createKey('viewLocation', ViewContainerLocationToString(viewContainerLocation)); + + const scopedInstantiationService = instantiationService.createChild(new ServiceCollection([IContextKeyService, scopedContextKeyService])); + const viewPaneContainer: ViewPaneContainer = (scopedInstantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || [])); + + this.viewPaneContainers.set(viewPaneContainer.getId(), viewPaneContainer); + disposables.add(toDisposable(() => this.viewPaneContainers.delete(viewPaneContainer.getId()))); + disposables.add(viewPaneContainer.onDidAddViews(views => this.onViewsAdded(views))); + disposables.add(viewPaneContainer.onDidChangeViewVisibility(view => this.onViewsVisibilityChanged(view, view.isBodyVisible()))); + disposables.add(viewPaneContainer.onDidRemoveViews(views => this.onViewsRemoved(views))); + + return viewPaneContainer; + } + private registerPanel(viewContainer: ViewContainer): void { const that = this; class PaneContainerPanel extends Panel { @@ -594,11 +596,16 @@ export class ViewsService extends Disposable implements IViewsService { @IContextMenuService contextMenuService: IContextMenuService, @IExtensionService extensionService: IExtensionService, @IWorkspaceContextService contextService: IWorkspaceContextService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, ) { + super(viewContainer.id, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); + } + + protected createViewPaneContainer(element: HTMLElement): ViewPaneContainer { + const viewPaneContainerDisposables = this._register(new DisposableStore()); + // Use composite's instantiation service to get the editor progress service for any editors instantiated within the composite - const viewPaneContainer = (instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || [])); - super(viewContainer.id, viewPaneContainer, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); - that.registerViewPaneContainer(this.viewPaneContainer); + return that.createViewPaneContainer(element, viewContainer, ViewContainerLocation.Panel, viewPaneContainerDisposables, this.contextKeyService, this.instantiationService); } } Registry.as(PanelExtensions.Panels).registerPanel(PanelDescriptor.create( @@ -612,7 +619,6 @@ export class ViewsService extends Disposable implements IViewsService { } private deregisterPanel(viewContainer: ViewContainer): void { - this.deregisterViewPaneContainer(viewContainer.id); Registry.as(PanelExtensions.Panels).deregisterPanel(viewContainer.id); } @@ -629,11 +635,26 @@ export class ViewsService extends Disposable implements IViewsService { @IThemeService themeService: IThemeService, @IContextMenuService contextMenuService: IContextMenuService, @IExtensionService extensionService: IExtensionService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, ) { + super(viewContainer.id, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService, layoutService, configurationService); + } + + protected createViewPaneContainer(element: HTMLElement): ViewPaneContainer { + const viewPaneContainerDisposables = this._register(new DisposableStore()); + // Use composite's instantiation service to get the editor progress service for any editors instantiated within the composite - const viewPaneContainer = (instantiationService as any).createInstance(viewContainer.ctorDescriptor!.ctor, ...(viewContainer.ctorDescriptor!.staticArguments || [])); - super(viewContainer.id, viewPaneContainer, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService, layoutService, configurationService); - that.registerViewPaneContainer(this.viewPaneContainer); + const viewPaneContainer = that.createViewPaneContainer(element, viewContainer, ViewContainerLocation.Sidebar, viewPaneContainerDisposables, this.contextKeyService, this.instantiationService); + + // Only updateTitleArea for non-filter views: microsoft/vscode-remote-release#3676 + if (!(viewPaneContainer instanceof FilterViewPaneContainer)) { + viewPaneContainerDisposables.add(Event.any(viewPaneContainer.onDidAddViews, viewPaneContainer.onDidRemoveViews, viewPaneContainer.onTitleAreaUpdate)(() => { + // Update title area since there is no better way to update secondary actions + this.updateTitleArea(); + })); + } + + return viewPaneContainer; } } Registry.as(ViewletExtensions.Viewlets).registerViewlet(ViewletDescriptor.create( @@ -648,7 +669,6 @@ export class ViewsService extends Disposable implements IViewsService { } private deregisterViewlet(viewContainer: ViewContainer): void { - this.deregisterViewPaneContainer(viewContainer.id); Registry.as(ViewletExtensions.Viewlets).deregisterViewlet(viewContainer.id); } } diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index c869428ab68..4d1fe97779c 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -12,19 +12,15 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { IThemeService } from 'vs/platform/theme/common/themeService'; import { URI } from 'vs/base/common/uri'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { PaneComposite } from 'vs/workbench/browser/panecomposite'; -import { Event } from 'vs/base/common/event'; -import { FilterViewPaneContainer } from 'vs/workbench/browser/parts/views/viewsViewlet'; export abstract class Viewlet extends PaneComposite implements IViewlet { constructor(id: string, - viewPaneContainer: ViewPaneContainer, @ITelemetryService telemetryService: ITelemetryService, @IStorageService protected storageService: IStorageService, @IInstantiationService protected instantiationService: IInstantiationService, @@ -35,14 +31,7 @@ export abstract class Viewlet extends PaneComposite implements IViewlet { @IWorkbenchLayoutService protected layoutService: IWorkbenchLayoutService, @IConfigurationService protected configurationService: IConfigurationService ) { - super(id, viewPaneContainer, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); - // Only updateTitleArea for non-filter views: microsoft/vscode-remote-release#3676 - if (!(viewPaneContainer instanceof FilterViewPaneContainer)) { - this._register(Event.any(viewPaneContainer.onDidAddViews, viewPaneContainer.onDidRemoveViews, viewPaneContainer.onTitleAreaUpdate)(() => { - // Update title area since there is no better way to update secondary actions - this.updateTitleArea(); - })); - } + super(id, telemetryService, storageService, instantiationService, themeService, contextMenuService, extensionService, contextService); } } diff --git a/src/vs/workbench/common/panecomposite.ts b/src/vs/workbench/common/panecomposite.ts index 89ba7027305..653c2e581e3 100644 --- a/src/vs/workbench/common/panecomposite.ts +++ b/src/vs/workbench/common/panecomposite.ts @@ -8,6 +8,6 @@ import { IComposite } from 'vs/workbench/common/composite'; export interface IPaneComposite extends IComposite { openView(id: string, focus?: boolean): T | undefined; - getViewPaneContainer(): IViewPaneContainer; + getViewPaneContainer(): IViewPaneContainer | undefined; saveState(): void; } diff --git a/src/vs/workbench/test/browser/viewlet.test.ts b/src/vs/workbench/test/browser/viewlet.test.ts index e76dbaa83c4..d3b57ab52e9 100644 --- a/src/vs/workbench/test/browser/viewlet.test.ts +++ b/src/vs/workbench/test/browser/viewlet.test.ts @@ -13,12 +13,14 @@ suite('Viewlets', () => { class TestViewlet extends Viewlet { constructor() { - super('id', null!, null!, null!, null!, null!, null!, null!, null!, null!, null!); + super('id', null!, null!, null!, null!, null!, null!, null!, null!, null!); } layout(dimension: any): void { throw new Error('Method not implemented.'); } + + createViewPaneContainer() { return null!; } } test('ViewletDescriptor API', function () { From 5cfa6b7e263f01d48be0f0605deec629f0853682 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 Feb 2021 18:26:09 +0100 Subject: [PATCH 23/86] update vscode-grammar-updater --- extensions/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/package.json b/extensions/package.json index 5222855bf93..69f8501b208 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -10,6 +10,6 @@ "postinstall": "node ./postinstall" }, "devDependencies": { - "vscode-grammar-updater": "^1.0.2" + "vscode-grammar-updater": "^1.0.3" } } From e146dd28e120fe389370896af22b2b24bb7bbaa2 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 8 Feb 2021 19:50:01 +0100 Subject: [PATCH 24/86] Extension management - refactoring workspace trust signal (#116118) --- .../browser/extensionsWorkbenchService.ts | 67 ++++++------------- .../common/extensionManagementService.ts | 27 +++++++- .../extensionManagementService.ts | 12 +++- 3 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index 6c093794e37..7097869562e 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -41,7 +41,6 @@ import { FileAccess } from 'vs/base/common/network'; import { IIgnoredExtensionsManagementService } from 'vs/platform/userDataSync/common/ignoredExtensions'; import { IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IWorkspaceTrustService, WorkspaceTrustState } from 'vs/platform/workspace/common/workspaceTrust'; interface IExtensionStateProvider { (extension: Extension): T; @@ -525,8 +524,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension @IIgnoredExtensionsManagementService private readonly extensionsSyncManagementService: IIgnoredExtensionsManagementService, @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, @IProductService private readonly productService: IProductService, - @IContextKeyService contextKeyService: IContextKeyService, - @IWorkspaceTrustService private readonly workspaceTrustService: IWorkspaceTrustService + @IContextKeyService contextKeyService: IContextKeyService ) { super(); this.hasOutdatedExtensionsContextKey = HasOutdatedExtensionsContext.bindTo(contextKeyService); @@ -1033,54 +1031,33 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension private async installFromVSIX(vsix: URI): Promise { const manifest = await this.extensionManagementService.getManifest(vsix); - return this.promptForTrustIfNeededAndInstall(manifest, async () => { - const existingExtension = this.local.find(local => areSameExtensions(local.identifier, { id: getGalleryExtensionId(manifest.publisher, manifest.name) })); - const { identifier } = await this.extensionManagementService.install(vsix); + const existingExtension = this.local.find(local => areSameExtensions(local.identifier, { id: getGalleryExtensionId(manifest.publisher, manifest.name) })); + const { identifier } = await this.extensionManagementService.install(vsix); - if (existingExtension && existingExtension.latestVersion !== manifest.version) { - this.ignoreAutoUpdate(new ExtensionIdentifierWithVersion(identifier, manifest.version)); - } + if (existingExtension && existingExtension.latestVersion !== manifest.version) { + this.ignoreAutoUpdate(new ExtensionIdentifierWithVersion(identifier, manifest.version)); + } - return this.local.filter(local => areSameExtensions(local.identifier, identifier))[0]; - }); + return this.local.filter(local => areSameExtensions(local.identifier, identifier))[0]; } private async installFromGallery(extension: IExtension, gallery: IGalleryExtension, installOptions?: InstallOptions): Promise { - const manifest = await extension.getManifest(CancellationToken.None); - - if (manifest) { - this.promptForTrustIfNeededAndInstall(manifest, async () => { - this.installing.push(extension); - this._onChange.fire(extension); - try { - if (extension.state === ExtensionState.Installed && extension.local) { - await this.extensionManagementService.updateFromGallery(gallery, extension.local); - } else { - await this.extensionManagementService.installFromGallery(gallery, installOptions); - } - const ids: string[] | undefined = extension.identifier.uuid ? [extension.identifier.uuid] : undefined; - const names: string[] | undefined = extension.identifier.uuid ? undefined : [extension.identifier.id]; - this.queryGallery({ names, ids, pageSize: 1 }, CancellationToken.None); - return this.local.filter(local => areSameExtensions(local.identifier, gallery.identifier))[0]; - } finally { - this.installing = this.installing.filter(e => e !== extension); - this._onChange.fire(this.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0]); - } - }); + this.installing.push(extension); + this._onChange.fire(extension); + try { + if (extension.state === ExtensionState.Installed && extension.local) { + await this.extensionManagementService.updateFromGallery(gallery, extension.local); + } else { + await this.extensionManagementService.installFromGallery(gallery, installOptions); + } + const ids: string[] | undefined = extension.identifier.uuid ? [extension.identifier.uuid] : undefined; + const names: string[] | undefined = extension.identifier.uuid ? undefined : [extension.identifier.id]; + this.queryGallery({ names, ids, pageSize: 1 }, CancellationToken.None); + return this.local.filter(local => areSameExtensions(local.identifier, gallery.identifier))[0]; + } finally { + this.installing = this.installing.filter(e => e !== extension); + this._onChange.fire(this.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0]); } - return Promise.reject(); - } - - private async promptForTrustIfNeededAndInstall(manifest: IExtensionManifest, installTask: () => Promise): Promise { - if (manifest.requiresWorkspaceTrust === 'onStart') { - const trustState = await this.workspaceTrustService.requireWorkspaceTrust( - { - immediate: true, - message: 'Installing this extension requires you to trust the contents of this workspace.' - }); - return trustState === WorkspaceTrustState.Trusted ? installTask() : Promise.reject(); - } - return installTask(); } private promptAndSetEnablement(extensions: IExtension[], enablementState: EnablementState): Promise { diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index d53559be436..93d35892e9f 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -25,6 +25,7 @@ import Severity from 'vs/base/common/severity'; import { canceled } from 'vs/base/common/errors'; import { IUserDataAutoSyncEnablementService, IUserDataSyncResourceEnablementService, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { Promises } from 'vs/base/common/async'; +import { IWorkspaceTrustService, WorkspaceTrustState } from 'vs/platform/workspace/common/workspaceTrust'; export class ExtensionManagementService extends Disposable implements IWorkbenchExtensioManagementService { @@ -46,6 +47,7 @@ export class ExtensionManagementService extends Disposable implements IWorkbench @IUserDataAutoSyncEnablementService private readonly userDataAutoSyncEnablementService: IUserDataAutoSyncEnablementService, @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IDialogService private readonly dialogService: IDialogService, + @IWorkspaceTrustService private readonly workspaceTrustService: IWorkspaceTrustService ) { super(); if (this.extensionManagementServerService.localExtensionManagementServer) { @@ -128,9 +130,10 @@ export class ExtensionManagementService extends Disposable implements IWorkbench } - reinstallFromGallery(extension: ILocalExtension): Promise { + async reinstallFromGallery(extension: ILocalExtension): Promise { const server = this.getServer(extension); if (server) { + await this.checkForWorkspaceTrust(extension.manifest); return server.extensionManagementService.reinstallFromGallery(extension); } return Promise.reject(`Invalid location ${extension.location.toString()}`); @@ -191,8 +194,13 @@ export class ExtensionManagementService extends Disposable implements IWorkbench return Promise.reject('No Servers to Install'); } - protected installVSIX(vsix: URI, server: IExtensionManagementServer): Promise { - return server.extensionManagementService.install(vsix); + protected async installVSIX(vsix: URI, server: IExtensionManagementServer): Promise { + const manifest = await this.getManifest(vsix); + if (manifest) { + await this.checkForWorkspaceTrust(manifest); + return server.extensionManagementService.install(vsix); + } + return Promise.reject('Unable to get the extension manifest.'); } getManifest(vsix: URI): Promise { @@ -269,6 +277,7 @@ export class ExtensionManagementService extends Disposable implements IWorkbench servers.push(this.extensionManagementServerService.localExtensionManagementServer); } } + await this.checkForWorkspaceTrust(manifest); return Promises.settled(servers.map(server => server.extensionManagementService.installFromGallery(gallery, installOptions))).then(([local]) => local); } @@ -346,4 +355,16 @@ export class ExtensionManagementService extends Disposable implements IWorkbench private getServer(extension: ILocalExtension): IExtensionManagementServer | null { return this.extensionManagementServerService.getExtensionManagementServer(extension); } + + protected async checkForWorkspaceTrust(manifest: IExtensionManifest): Promise { + if (manifest.requiresWorkspaceTrust === 'onStart') { + const trustState = await this.workspaceTrustService.requireWorkspaceTrust( + { + immediate: true, + message: 'Installing this extension requires you to trust the contents of this workspace.' + }); + return trustState === WorkspaceTrustState.Trusted ? Promise.resolve() : Promise.reject(canceled()); + } + return Promise.resolve(); + } } diff --git a/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionManagementService.ts index e8a05aff21b..fc5103a1ad6 100644 --- a/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionManagementService.ts @@ -17,6 +17,7 @@ import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/enviro import { joinPath } from 'vs/base/common/resources'; import { IUserDataAutoSyncEnablementService, IUserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IWorkspaceTrustService } from 'vs/platform/workspace/common/workspaceTrust'; export class ExtensionManagementService extends BaseExtensionManagementService { @@ -30,8 +31,9 @@ export class ExtensionManagementService extends BaseExtensionManagementService { @IUserDataAutoSyncEnablementService userDataAutoSyncEnablementService: IUserDataAutoSyncEnablementService, @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IDialogService dialogService: IDialogService, + @IWorkspaceTrustService workspaceTrustService: IWorkspaceTrustService ) { - super(extensionManagementServerService, extensionGalleryService, configurationService, productService, downloadService, userDataAutoSyncEnablementService, userDataSyncResourceEnablementService, dialogService); + super(extensionManagementServerService, extensionGalleryService, configurationService, productService, downloadService, userDataAutoSyncEnablementService, userDataSyncResourceEnablementService, dialogService, workspaceTrustService); } protected async installVSIX(vsix: URI, server: IExtensionManagementServer): Promise { @@ -40,7 +42,13 @@ export class ExtensionManagementService extends BaseExtensionManagementService { await this.downloadService.download(vsix, downloadedLocation); vsix = downloadedLocation; } - return server.extensionManagementService.install(vsix); + const manifest = await this.getManifest(vsix); + if (manifest) { + await this.checkForWorkspaceTrust(manifest); + return server.extensionManagementService.install(vsix); + } + + return Promise.reject('Unable to get the extension manifest.'); } } From 280cbff391c653ed9e8994be61ff1de5130f1b12 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Mon, 8 Feb 2021 12:20:46 -0800 Subject: [PATCH 25/86] fix home menu items not appearing --- .../browser/parts/titlebar/menubarControl.ts | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 886c2ff68ba..f3587a51a51 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { IMenuService, MenuId, IMenu, SubmenuItemAction, registerAction2, Action2, MenuRegistry, MenuItemAction } from 'vs/platform/actions/common/actions'; +import { IMenuService, MenuId, IMenu, SubmenuItemAction, registerAction2, Action2, MenuItemAction } from 'vs/platform/actions/common/actions'; import { registerThemingParticipant, IThemeService } from 'vs/platform/theme/common/themeService'; import { MenuBarVisibility, getTitleBarStyle, IWindowOpenable, getMenuBarVisibility } from 'vs/platform/windows/common/windows'; -import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IAction, Action, SubmenuAction, Separator } from 'vs/base/common/actions'; import * as DOM from 'vs/base/browser/dom'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -291,6 +291,7 @@ export class CustomMenubarControl extends MenubarControl { private alwaysOnMnemonics: boolean = false; private focusInsideMenubar: boolean = false; private visible: boolean = true; + private readonly webNavigationMenu = this._register(this.menuService.createMenu(MenuId.MenubarHomeMenu, this.contextKeyService)); private readonly _onVisibilityChange: Emitter; private readonly _onFocusStateChange: Emitter; @@ -326,16 +327,6 @@ export class CustomMenubarControl extends MenubarControl { this.registerActions(); - // Register web menu actions to the file menu when its in the title - this.getWebNavigationMenuItemActions().forEach(actionItem => { - this._register(MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { - command: actionItem.item, - title: actionItem.item.title, - group: 'z_Web', - when: ContextKeyExpr.and(IsWebContext, ContextKeyExpr.notEquals('config.window.menuBarVisibility', 'compact')) - })); - }); - registerThemingParticipant((theme, collector) => { const menubarActiveWindowFgColor = theme.getColor(TITLE_BAR_ACTIVE_FOREGROUND); if (menubarActiveWindowFgColor) { @@ -640,6 +631,15 @@ export class CustomMenubarControl extends MenubarControl { target.push(new Separator()); } + // Append web navigation menu items to the file menu when not compact + if (menu === this.menus.File && this.currentCompactMenuMode === undefined) { + const webActions = this.getWebNavigationActions(); + if (webActions.length) { + target.push(...webActions); + target.push(new Separator()); // to account for pop below + } + } + target.pop(); }; @@ -655,6 +655,19 @@ export class CustomMenubarControl extends MenubarControl { } } })); + + // For the file menu, we need to update if the web nav menu updates as well + if (menu === this.menus.File) { + this._register(this.webNavigationMenu.onDidChange(() => { + if (!this.focusInsideMenubar) { + const actions: IAction[] = []; + updateActions(menu, actions, title); + if (this.menubar) { + this.menubar.updateMenu({ actions: actions, label: mnemonicMenuLabel(this.topLevelTitles[title]) }); + } + } + })); + } } const actions: IAction[] = []; @@ -672,24 +685,24 @@ export class CustomMenubarControl extends MenubarControl { } } - private getWebNavigationMenuItemActions(): MenuItemAction[] { + private getWebNavigationActions(): IAction[] { if (!isWeb) { return []; // only for web } const webNavigationActions = []; - const webNavigationMenu = this.menuService.createMenu(MenuId.MenubarHomeMenu, this.contextKeyService); - for (const groups of webNavigationMenu.getActions()) { + for (const groups of this.webNavigationMenu.getActions()) { const [, actions] = groups; for (const action of actions) { if (action instanceof MenuItemAction) { - webNavigationActions.push(action); + const title = typeof action.item.title === 'string' + ? action.item.title + : action.item.title.mnemonicTitle ?? action.item.title.value; + webNavigationActions.push(new Action(action.id, mnemonicMenuLabel(title), action.class, action.enabled, () => this.commandService.executeCommand(action.id))); } } } - webNavigationMenu.dispose(); - return webNavigationActions; } @@ -719,14 +732,7 @@ export class CustomMenubarControl extends MenubarControl { })); } - const otherActions = this.getWebNavigationMenuItemActions().map(action => { - const title = typeof action.item.title === 'string' - ? action.item.title - : action.item.title.mnemonicTitle ?? action.item.title.value; - return new Action(action.id, mnemonicMenuLabel(title), action.class, action.enabled, () => this.commandService.executeCommand(action.id)); - }); - - webNavigationActions.push(...otherActions); + webNavigationActions.push(...this.getWebNavigationActions()); return webNavigationActions; } }; @@ -787,6 +793,7 @@ export class CustomMenubarControl extends MenubarControl { // Mnemonics require fullscreen in web if (isWeb) { this._register(this.layoutService.onFullscreenChange(e => this.updateMenubar())); + this._register(this.webNavigationMenu.onDidChange(() => this.updateMenubar())); } } From c7d527f9cecf0a14edc8ef7bd572e1d65c294e07 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 8 Feb 2021 12:24:20 -0800 Subject: [PATCH 26/86] update yarn.lock --- extensions/yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/yarn.lock b/extensions/yarn.lock index efb462f3c33..3274642a159 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -24,10 +24,10 @@ typescript@^4.2.0-dev.20210201: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.0-dev.20210201.tgz#3d8ae7214cd4b23d3ae400f84d1afe5679f3e2f0" integrity sha512-By8G30ZYs+b/8084cSnjP7ILd8ExUBC4Qi9FY2iRlBApHu/A08ExLlCRnYkHN1PgxcNs4rTaozJsgXHJ6cg92g== -vscode-grammar-updater@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vscode-grammar-updater/-/vscode-grammar-updater-1.0.2.tgz#ad4eba5f69c02ec8bf8143517d736a587e059657" - integrity sha512-gzJ9QQhtcYznm7WaY473hU/wWq7mWhEJJdcJPLZNwL3v0+FlWwXU/oIe7Z/k/DFR8g5dFOhqgQAiX22cneG5VA== +vscode-grammar-updater@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vscode-grammar-updater/-/vscode-grammar-updater-1.0.3.tgz#695ccaf0567c6a000005a969cd87ecc3b5c25018" + integrity sha512-V/OnMGyAk7Ldv5NC2p+NovidsAghdfbFFnimEzQ7F/TYIqDLJCVe28RcvaU2gywCSCtxNfS5MYe0egiaRIWNEw== dependencies: cson-parser "^1.3.3" fast-plist "0.1.2" From 15616c186929f1095992d49dcc7a753428c4ff61 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 8 Feb 2021 22:13:59 +0100 Subject: [PATCH 27/86] focused view context key should be set at global context --- .../workbench/browser/parts/views/viewPane.ts | 20 ++++--------------- .../browser/parts/views/viewPaneContainer.ts | 14 +++++++++++-- .../browser/parts/views/viewsService.ts | 8 ++++++++ 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewPane.ts b/src/vs/workbench/browser/parts/views/viewPane.ts index 9b6dff584e1..04545f944c4 100644 --- a/src/vs/workbench/browser/parts/views/viewPane.ts +++ b/src/vs/workbench/browser/parts/views/viewPane.ts @@ -21,8 +21,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IPaneOptions, Pane, IPaneStyles } from 'vs/base/browser/ui/splitview/paneview'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Extensions as ViewContainerExtensions, IView, FocusedViewContext, IViewDescriptorService, ViewContainerLocation, IViewsRegistry, IViewContentDescriptor, defaultViewIcon, IViewsService } from 'vs/workbench/common/views'; -import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { Extensions as ViewContainerExtensions, IView, IViewDescriptorService, ViewContainerLocation, IViewsRegistry, IViewContentDescriptor, defaultViewIcon, IViewsService } from 'vs/workbench/common/views'; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { assertIsDefined } from 'vs/base/common/types'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { MenuId, Action2, IAction2Options } from 'vs/platform/actions/common/actions'; @@ -160,8 +160,6 @@ export abstract class ViewPane extends Pane implements IView { protected _onDidChangeViewWelcomeState = this._register(new Emitter()); readonly onDidChangeViewWelcomeState: Event = this._onDidChangeViewWelcomeState.event; - private focusedViewContextKey: IContextKey; - private _isVisible: boolean = false; readonly id: string; @@ -210,7 +208,6 @@ export abstract class ViewPane extends Pane implements IView { this._title = options.title; this._titleDescription = options.titleDescription; this.showActionsAlways = !!options.showActionsAlways; - this.focusedViewContextKey = FocusedViewContext.bindTo(contextKeyService); const scopedContextKeyService = this._register(contextKeyService.createScoped(this.element)); scopedContextKeyService.createKey('view', this.id); @@ -265,17 +262,8 @@ export abstract class ViewPane extends Pane implements IView { const focusTracker = trackFocus(this.element); this._register(focusTracker); - this._register(focusTracker.onDidFocus(() => { - this.focusedViewContextKey.set(this.id); - this._onDidFocus.fire(); - })); - this._register(focusTracker.onDidBlur(() => { - if (this.focusedViewContextKey.get() === this.id) { - this.focusedViewContextKey.reset(); - } - - this._onDidBlur.fire(); - })); + this._register(focusTracker.onDidFocus(() => this._onDidFocus.fire())); + this._register(focusTracker.onDidBlur(() => this._onDidBlur.fire())); } protected renderHeader(container: HTMLElement): void { diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index d24ecdf1eb7..a6d4892875c 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -327,6 +327,12 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { private readonly _onDidChangeViewVisibility = this._register(new Emitter()); readonly onDidChangeViewVisibility = this._onDidChangeViewVisibility.event; + private readonly _onDidFocusView = this._register(new Emitter()); + readonly onDidFocusView = this._onDidFocusView.event; + + private readonly _onDidBlurView = this._register(new Emitter()); + readonly onDidBlurView = this._onDidBlurView.event; + get onDidSashChange(): Event { return assertIsDefined(this.paneview).onDidSashChange; } @@ -835,7 +841,11 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { } private addPane(pane: ViewPane, size: number, index = this.paneItems.length - 1): void { - const onDidFocus = pane.onDidFocus(() => this.lastFocusedPane = pane); + const onDidFocus = pane.onDidFocus(() => { + this._onDidFocusView.fire(pane); + this.lastFocusedPane = pane; + }); + const onDidBlur = pane.onDidBlur(() => this._onDidBlurView.fire(pane)); const onDidChangeTitleArea = pane.onDidChangeTitleArea(() => { if (this.isViewMergedWithContainer()) { this.updateTitleArea(); @@ -857,7 +867,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { dropBackground: isPanel ? PANEL_SECTION_DRAG_AND_DROP_BACKGROUND : SIDE_BAR_DRAG_AND_DROP_BACKGROUND, leftBorder: isPanel ? PANEL_SECTION_BORDER : undefined }, pane); - const disposable = combinedDisposable(pane, onDidFocus, onDidChangeTitleArea, paneStyler, onDidChange, onDidChangeVisibility); + const disposable = combinedDisposable(pane, onDidFocus, onDidBlur, onDidChangeTitleArea, paneStyler, onDidChange, onDidChangeVisibility); const paneItem: IViewPaneItem = { pane, disposable }; this.paneItems.splice(index, 0, paneItem); diff --git a/src/vs/workbench/browser/parts/views/viewsService.ts b/src/vs/workbench/browser/parts/views/viewsService.ts index 88ee4b8d2cc..ad98045d32f 100644 --- a/src/vs/workbench/browser/parts/views/viewsService.ts +++ b/src/vs/workbench/browser/parts/views/viewsService.ts @@ -49,6 +49,7 @@ export class ViewsService extends Disposable implements IViewsService { readonly onDidChangeViewContainerVisibility = this._onDidChangeViewContainerVisibility.event; private readonly visibleViewContextKeys: Map>; + private readonly focusedViewContextKey: IContextKey; constructor( @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, @@ -78,6 +79,7 @@ export class ViewsService extends Disposable implements IViewsService { this._register(this.viewletService.onDidViewletClose(viewlet => this._onDidChangeViewContainerVisibility.fire({ id: viewlet.getId(), visible: false, location: ViewContainerLocation.Sidebar }))); this._register(this.panelService.onDidPanelClose(panel => this._onDidChangeViewContainerVisibility.fire({ id: panel.getId(), visible: false, location: ViewContainerLocation.Panel }))); + this.focusedViewContextKey = FocusedViewContext.bindTo(contextKeyService); } private onViewsAdded(added: IView[]): void { @@ -581,6 +583,12 @@ export class ViewsService extends Disposable implements IViewsService { disposables.add(viewPaneContainer.onDidAddViews(views => this.onViewsAdded(views))); disposables.add(viewPaneContainer.onDidChangeViewVisibility(view => this.onViewsVisibilityChanged(view, view.isBodyVisible()))); disposables.add(viewPaneContainer.onDidRemoveViews(views => this.onViewsRemoved(views))); + disposables.add(viewPaneContainer.onDidFocusView(view => this.focusedViewContextKey.set(view.id))); + disposables.add(viewPaneContainer.onDidBlurView(view => { + if (this.focusedViewContextKey.get() === view.id) { + this.focusedViewContextKey.reset(); + } + })); return viewPaneContainer; } From b06d9007ef456a8fa07153ea87919fad6887ed28 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Mon, 8 Feb 2021 14:25:59 -0800 Subject: [PATCH 28/86] chore: bump electron@11.2.3 --- .yarnrc | 2 +- cgmanifest.json | 4 ++-- package.json | 4 ++-- yarn.lock | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.yarnrc b/.yarnrc index 9738cd535ab..c157931dce7 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://electronjs.org/headers" -target "11.2.2" +target "11.2.3" runtime "electron" diff --git a/cgmanifest.json b/cgmanifest.json index f9aa3cd5fb0..0459d39bfe7 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -60,12 +60,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "805e442ff873e10735a1ea18021f491597afa885" + "commitHash": "137f45750f7319442c511183c0ad0f3c4fe7e07a" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "11.2.2" + "version": "11.2.3" }, { "component": { diff --git a/package.json b/package.json index a8d93b98375..7142a61206a 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "compile-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-web", "watch-web": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js watch-web", "eslint": "node build/eslint", - "electron-rebuild": "electron-rebuild --arch=arm64 --force --version=11.2.2", + "electron-rebuild": "electron-rebuild --arch=arm64 --force --version=11.2.3", "playwright-install": "node build/azure-pipelines/common/installPlaywright.js", "compile-build": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-build", "compile-extensions-build": "node --max_old_space_size=4095 ./node_modules/gulp/bin/gulp.js compile-extensions-build", @@ -125,7 +125,7 @@ "cssnano": "^4.1.10", "debounce": "^1.0.0", "deemon": "^1.4.0", - "electron": "11.2.2", + "electron": "11.2.3", "electron-rebuild": "2.0.3", "eslint": "6.8.0", "eslint-plugin-jsdoc": "^19.1.0", diff --git a/yarn.lock b/yarn.lock index 527de19f3d3..8559099a526 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3048,10 +3048,10 @@ electron-to-chromium@^1.3.634: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.642.tgz#8b884f50296c2ae2a9997f024d0e3e57facc2b94" integrity sha512-cev+jOrz/Zm1i+Yh334Hed6lQVOkkemk2wRozfMF4MtTR7pxf3r3L5Rbd7uX1zMcEqVJ7alJBnJL7+JffkC6FQ== -electron@11.2.2: - version "11.2.2" - resolved "https://registry.yarnpkg.com/electron/-/electron-11.2.2.tgz#c2e53eb56bd21ae1dc01bc781f2f6bcbe0c18033" - integrity sha512-+OitkBrnCFwOF5LXAeNnfIJDKhdBm77jboc16WCIpDsCyT+JpGsKK4y6o30nRZq3zC+wZggUm5w6Ujw5n76CGg== +electron@11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/electron/-/electron-11.2.3.tgz#8ad1d9858436cfca0e2e5ea7fea326794ae58ebb" + integrity sha512-6yxOc42nDAptHKNlUG/vcOh2GI9x2fqp2nQbZO0/3sz2CrwsJkwR3i3oMN9XhVJaqI7GK1vSCJz0verOkWlXcQ== dependencies: "@electron/get" "^1.0.1" "@types/node" "^12.0.12" From eb62ecb01e2abace98dadcb02d034ae89822dcf3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Feb 2021 13:58:58 -0800 Subject: [PATCH 29/86] Use white background in simple browser by default --- extensions/simple-browser/media/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/simple-browser/media/main.css b/extensions/simple-browser/media/main.css index 9192d4b6b63..4775dc4a795 100644 --- a/extensions/simple-browser/media/main.css +++ b/extensions/simple-browser/media/main.css @@ -93,6 +93,7 @@ iframe { width: 100%; height: 100%; border: none; + background: white; /* Browsers default to a white background */ } .iframe-focused-alert { From 5b32b280375f9da88ed09078cf40d9f042422647 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Feb 2021 14:26:02 -0800 Subject: [PATCH 30/86] Mark simple browser as a UI extension --- extensions/simple-browser/package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/simple-browser/package.json b/extensions/simple-browser/package.json index a9489bc24c4..4d8cf441f9f 100644 --- a/extensions/simple-browser/package.json +++ b/extensions/simple-browser/package.json @@ -16,6 +16,11 @@ "categories": [ "Other" ], + "extensionKind": [ + "ui", + "workspace", + "web" + ], "activationEvents": [ "onCommand:simpleBrowser.show", "onCommand:simpleBrowser.api.open", From 46e28e3bbea3c33771ca999402350b1b17527d0c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Feb 2021 14:26:58 -0800 Subject: [PATCH 31/86] Copy codicon files directly into sources instead of taking a non dev dependecy on the entire package --- extensions/simple-browser/media/codicon.css | 449 ++++++++++++++++++ extensions/simple-browser/media/codicon.ttf | Bin 0 -> 62792 bytes extensions/simple-browser/package.json | 5 +- .../simple-browser/src/simpleBrowserView.ts | 7 +- extensions/simple-browser/yarn.lock | 8 +- 5 files changed, 461 insertions(+), 8 deletions(-) create mode 100644 extensions/simple-browser/media/codicon.css create mode 100644 extensions/simple-browser/media/codicon.ttf diff --git a/extensions/simple-browser/media/codicon.css b/extensions/simple-browser/media/codicon.css new file mode 100644 index 00000000000..209c4e8f730 --- /dev/null +++ b/extensions/simple-browser/media/codicon.css @@ -0,0 +1,449 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +@font-face { + font-family: "codicon"; + src: url("./codicon.ttf?756fa482df4f1610f1e0548d031e8c29") format("truetype"); +} + +.codicon[class*='codicon-'] { + font: normal normal normal 16px/1 codicon; + display: inline-block; + text-decoration: none; + text-rendering: auto; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + + +.codicon-add:before { content: "\ea60" } +.codicon-plus:before { content: "\ea60" } +.codicon-gist-new:before { content: "\ea60" } +.codicon-repo-create:before { content: "\ea60" } +.codicon-lightbulb:before { content: "\ea61" } +.codicon-light-bulb:before { content: "\ea61" } +.codicon-repo:before { content: "\ea62" } +.codicon-repo-delete:before { content: "\ea62" } +.codicon-gist-fork:before { content: "\ea63" } +.codicon-repo-forked:before { content: "\ea63" } +.codicon-git-pull-request:before { content: "\ea64" } +.codicon-git-pull-request-abandoned:before { content: "\ea64" } +.codicon-record-keys:before { content: "\ea65" } +.codicon-keyboard:before { content: "\ea65" } +.codicon-tag:before { content: "\ea66" } +.codicon-tag-add:before { content: "\ea66" } +.codicon-tag-remove:before { content: "\ea66" } +.codicon-person:before { content: "\ea67" } +.codicon-person-add:before { content: "\ea67" } +.codicon-person-follow:before { content: "\ea67" } +.codicon-person-outline:before { content: "\ea67" } +.codicon-person-filled:before { content: "\ea67" } +.codicon-git-branch:before { content: "\ea68" } +.codicon-git-branch-create:before { content: "\ea68" } +.codicon-git-branch-delete:before { content: "\ea68" } +.codicon-source-control:before { content: "\ea68" } +.codicon-mirror:before { content: "\ea69" } +.codicon-mirror-public:before { content: "\ea69" } +.codicon-star:before { content: "\ea6a" } +.codicon-star-add:before { content: "\ea6a" } +.codicon-star-delete:before { content: "\ea6a" } +.codicon-star-empty:before { content: "\ea6a" } +.codicon-comment:before { content: "\ea6b" } +.codicon-comment-add:before { content: "\ea6b" } +.codicon-alert:before { content: "\ea6c" } +.codicon-warning:before { content: "\ea6c" } +.codicon-search:before { content: "\ea6d" } +.codicon-search-save:before { content: "\ea6d" } +.codicon-log-out:before { content: "\ea6e" } +.codicon-sign-out:before { content: "\ea6e" } +.codicon-log-in:before { content: "\ea6f" } +.codicon-sign-in:before { content: "\ea6f" } +.codicon-eye:before { content: "\ea70" } +.codicon-eye-unwatch:before { content: "\ea70" } +.codicon-eye-watch:before { content: "\ea70" } +.codicon-circle-filled:before { content: "\ea71" } +.codicon-primitive-dot:before { content: "\ea71" } +.codicon-close-dirty:before { content: "\ea71" } +.codicon-debug-breakpoint:before { content: "\ea71" } +.codicon-debug-breakpoint-disabled:before { content: "\ea71" } +.codicon-debug-hint:before { content: "\ea71" } +.codicon-primitive-square:before { content: "\ea72" } +.codicon-edit:before { content: "\ea73" } +.codicon-pencil:before { content: "\ea73" } +.codicon-info:before { content: "\ea74" } +.codicon-issue-opened:before { content: "\ea74" } +.codicon-gist-private:before { content: "\ea75" } +.codicon-git-fork-private:before { content: "\ea75" } +.codicon-lock:before { content: "\ea75" } +.codicon-mirror-private:before { content: "\ea75" } +.codicon-close:before { content: "\ea76" } +.codicon-remove-close:before { content: "\ea76" } +.codicon-x:before { content: "\ea76" } +.codicon-repo-sync:before { content: "\ea77" } +.codicon-sync:before { content: "\ea77" } +.codicon-clone:before { content: "\ea78" } +.codicon-desktop-download:before { content: "\ea78" } +.codicon-beaker:before { content: "\ea79" } +.codicon-microscope:before { content: "\ea79" } +.codicon-vm:before { content: "\ea7a" } +.codicon-device-desktop:before { content: "\ea7a" } +.codicon-file:before { content: "\ea7b" } +.codicon-file-text:before { content: "\ea7b" } +.codicon-more:before { content: "\ea7c" } +.codicon-ellipsis:before { content: "\ea7c" } +.codicon-kebab-horizontal:before { content: "\ea7c" } +.codicon-mail-reply:before { content: "\ea7d" } +.codicon-reply:before { content: "\ea7d" } +.codicon-organization:before { content: "\ea7e" } +.codicon-organization-filled:before { content: "\ea7e" } +.codicon-organization-outline:before { content: "\ea7e" } +.codicon-new-file:before { content: "\ea7f" } +.codicon-file-add:before { content: "\ea7f" } +.codicon-new-folder:before { content: "\ea80" } +.codicon-file-directory-create:before { content: "\ea80" } +.codicon-trash:before { content: "\ea81" } +.codicon-trashcan:before { content: "\ea81" } +.codicon-history:before { content: "\ea82" } +.codicon-clock:before { content: "\ea82" } +.codicon-folder:before { content: "\ea83" } +.codicon-file-directory:before { content: "\ea83" } +.codicon-symbol-folder:before { content: "\ea83" } +.codicon-logo-github:before { content: "\ea84" } +.codicon-mark-github:before { content: "\ea84" } +.codicon-github:before { content: "\ea84" } +.codicon-terminal:before { content: "\ea85" } +.codicon-console:before { content: "\ea85" } +.codicon-repl:before { content: "\ea85" } +.codicon-zap:before { content: "\ea86" } +.codicon-symbol-event:before { content: "\ea86" } +.codicon-error:before { content: "\ea87" } +.codicon-stop:before { content: "\ea87" } +.codicon-variable:before { content: "\ea88" } +.codicon-symbol-variable:before { content: "\ea88" } +.codicon-array:before { content: "\ea8a" } +.codicon-symbol-array:before { content: "\ea8a" } +.codicon-symbol-module:before { content: "\ea8b" } +.codicon-symbol-package:before { content: "\ea8b" } +.codicon-symbol-namespace:before { content: "\ea8b" } +.codicon-symbol-object:before { content: "\ea8b" } +.codicon-symbol-method:before { content: "\ea8c" } +.codicon-symbol-function:before { content: "\ea8c" } +.codicon-symbol-constructor:before { content: "\ea8c" } +.codicon-symbol-boolean:before { content: "\ea8f" } +.codicon-symbol-null:before { content: "\ea8f" } +.codicon-symbol-numeric:before { content: "\ea90" } +.codicon-symbol-number:before { content: "\ea90" } +.codicon-symbol-structure:before { content: "\ea91" } +.codicon-symbol-struct:before { content: "\ea91" } +.codicon-symbol-parameter:before { content: "\ea92" } +.codicon-symbol-type-parameter:before { content: "\ea92" } +.codicon-symbol-key:before { content: "\ea93" } +.codicon-symbol-text:before { content: "\ea93" } +.codicon-symbol-reference:before { content: "\ea94" } +.codicon-go-to-file:before { content: "\ea94" } +.codicon-symbol-enum:before { content: "\ea95" } +.codicon-symbol-value:before { content: "\ea95" } +.codicon-symbol-ruler:before { content: "\ea96" } +.codicon-symbol-unit:before { content: "\ea96" } +.codicon-activate-breakpoints:before { content: "\ea97" } +.codicon-archive:before { content: "\ea98" } +.codicon-arrow-both:before { content: "\ea99" } +.codicon-arrow-down:before { content: "\ea9a" } +.codicon-arrow-left:before { content: "\ea9b" } +.codicon-arrow-right:before { content: "\ea9c" } +.codicon-arrow-small-down:before { content: "\ea9d" } +.codicon-arrow-small-left:before { content: "\ea9e" } +.codicon-arrow-small-right:before { content: "\ea9f" } +.codicon-arrow-small-up:before { content: "\eaa0" } +.codicon-arrow-up:before { content: "\eaa1" } +.codicon-bell:before { content: "\eaa2" } +.codicon-bold:before { content: "\eaa3" } +.codicon-book:before { content: "\eaa4" } +.codicon-bookmark:before { content: "\eaa5" } +.codicon-debug-breakpoint-conditional-unverified:before { content: "\eaa6" } +.codicon-debug-breakpoint-conditional:before { content: "\eaa7" } +.codicon-debug-breakpoint-conditional-disabled:before { content: "\eaa7" } +.codicon-debug-breakpoint-data-unverified:before { content: "\eaa8" } +.codicon-debug-breakpoint-data:before { content: "\eaa9" } +.codicon-debug-breakpoint-data-disabled:before { content: "\eaa9" } +.codicon-debug-breakpoint-log-unverified:before { content: "\eaaa" } +.codicon-debug-breakpoint-log:before { content: "\eaab" } +.codicon-debug-breakpoint-log-disabled:before { content: "\eaab" } +.codicon-briefcase:before { content: "\eaac" } +.codicon-broadcast:before { content: "\eaad" } +.codicon-browser:before { content: "\eaae" } +.codicon-bug:before { content: "\eaaf" } +.codicon-calendar:before { content: "\eab0" } +.codicon-case-sensitive:before { content: "\eab1" } +.codicon-check:before { content: "\eab2" } +.codicon-checklist:before { content: "\eab3" } +.codicon-chevron-down:before { content: "\eab4" } +.codicon-chevron-left:before { content: "\eab5" } +.codicon-chevron-right:before { content: "\eab6" } +.codicon-chevron-up:before { content: "\eab7" } +.codicon-chrome-close:before { content: "\eab8" } +.codicon-chrome-maximize:before { content: "\eab9" } +.codicon-chrome-minimize:before { content: "\eaba" } +.codicon-chrome-restore:before { content: "\eabb" } +.codicon-circle-outline:before { content: "\eabc" } +.codicon-debug-breakpoint-unverified:before { content: "\eabc" } +.codicon-circle-slash:before { content: "\eabd" } +.codicon-circuit-board:before { content: "\eabe" } +.codicon-clear-all:before { content: "\eabf" } +.codicon-clippy:before { content: "\eac0" } +.codicon-close-all:before { content: "\eac1" } +.codicon-cloud-download:before { content: "\eac2" } +.codicon-cloud-upload:before { content: "\eac3" } +.codicon-code:before { content: "\eac4" } +.codicon-collapse-all:before { content: "\eac5" } +.codicon-color-mode:before { content: "\eac6" } +.codicon-comment-discussion:before { content: "\eac7" } +.codicon-credit-card:before { content: "\eac9" } +.codicon-dash:before { content: "\eacc" } +.codicon-dashboard:before { content: "\eacd" } +.codicon-database:before { content: "\eace" } +.codicon-debug-continue:before { content: "\eacf" } +.codicon-debug-disconnect:before { content: "\ead0" } +.codicon-debug-pause:before { content: "\ead1" } +.codicon-debug-restart:before { content: "\ead2" } +.codicon-debug-start:before { content: "\ead3" } +.codicon-debug-step-into:before { content: "\ead4" } +.codicon-debug-step-out:before { content: "\ead5" } +.codicon-debug-step-over:before { content: "\ead6" } +.codicon-debug-stop:before { content: "\ead7" } +.codicon-debug:before { content: "\ead8" } +.codicon-device-camera-video:before { content: "\ead9" } +.codicon-device-camera:before { content: "\eada" } +.codicon-device-mobile:before { content: "\eadb" } +.codicon-diff-added:before { content: "\eadc" } +.codicon-diff-ignored:before { content: "\eadd" } +.codicon-diff-modified:before { content: "\eade" } +.codicon-diff-removed:before { content: "\eadf" } +.codicon-diff-renamed:before { content: "\eae0" } +.codicon-diff:before { content: "\eae1" } +.codicon-discard:before { content: "\eae2" } +.codicon-editor-layout:before { content: "\eae3" } +.codicon-empty-window:before { content: "\eae4" } +.codicon-exclude:before { content: "\eae5" } +.codicon-extensions:before { content: "\eae6" } +.codicon-eye-closed:before { content: "\eae7" } +.codicon-file-binary:before { content: "\eae8" } +.codicon-file-code:before { content: "\eae9" } +.codicon-file-media:before { content: "\eaea" } +.codicon-file-pdf:before { content: "\eaeb" } +.codicon-file-submodule:before { content: "\eaec" } +.codicon-file-symlink-directory:before { content: "\eaed" } +.codicon-file-symlink-file:before { content: "\eaee" } +.codicon-file-zip:before { content: "\eaef" } +.codicon-files:before { content: "\eaf0" } +.codicon-filter:before { content: "\eaf1" } +.codicon-flame:before { content: "\eaf2" } +.codicon-fold-down:before { content: "\eaf3" } +.codicon-fold-up:before { content: "\eaf4" } +.codicon-fold:before { content: "\eaf5" } +.codicon-folder-active:before { content: "\eaf6" } +.codicon-folder-opened:before { content: "\eaf7" } +.codicon-gear:before { content: "\eaf8" } +.codicon-gift:before { content: "\eaf9" } +.codicon-gist-secret:before { content: "\eafa" } +.codicon-gist:before { content: "\eafb" } +.codicon-git-commit:before { content: "\eafc" } +.codicon-git-compare:before { content: "\eafd" } +.codicon-compare-changes:before { content: "\eafd" } +.codicon-git-merge:before { content: "\eafe" } +.codicon-github-action:before { content: "\eaff" } +.codicon-github-alt:before { content: "\eb00" } +.codicon-globe:before { content: "\eb01" } +.codicon-grabber:before { content: "\eb02" } +.codicon-graph:before { content: "\eb03" } +.codicon-gripper:before { content: "\eb04" } +.codicon-heart:before { content: "\eb05" } +.codicon-home:before { content: "\eb06" } +.codicon-horizontal-rule:before { content: "\eb07" } +.codicon-hubot:before { content: "\eb08" } +.codicon-inbox:before { content: "\eb09" } +.codicon-issue-closed:before { content: "\eb0a" } +.codicon-issue-reopened:before { content: "\eb0b" } +.codicon-issues:before { content: "\eb0c" } +.codicon-italic:before { content: "\eb0d" } +.codicon-jersey:before { content: "\eb0e" } +.codicon-json:before { content: "\eb0f" } +.codicon-kebab-vertical:before { content: "\eb10" } +.codicon-key:before { content: "\eb11" } +.codicon-law:before { content: "\eb12" } +.codicon-lightbulb-autofix:before { content: "\eb13" } +.codicon-link-external:before { content: "\eb14" } +.codicon-link:before { content: "\eb15" } +.codicon-list-ordered:before { content: "\eb16" } +.codicon-list-unordered:before { content: "\eb17" } +.codicon-live-share:before { content: "\eb18" } +.codicon-loading:before { content: "\eb19" } +.codicon-location:before { content: "\eb1a" } +.codicon-mail-read:before { content: "\eb1b" } +.codicon-mail:before { content: "\eb1c" } +.codicon-markdown:before { content: "\eb1d" } +.codicon-megaphone:before { content: "\eb1e" } +.codicon-mention:before { content: "\eb1f" } +.codicon-milestone:before { content: "\eb20" } +.codicon-mortar-board:before { content: "\eb21" } +.codicon-move:before { content: "\eb22" } +.codicon-multiple-windows:before { content: "\eb23" } +.codicon-mute:before { content: "\eb24" } +.codicon-no-newline:before { content: "\eb25" } +.codicon-note:before { content: "\eb26" } +.codicon-octoface:before { content: "\eb27" } +.codicon-open-preview:before { content: "\eb28" } +.codicon-package:before { content: "\eb29" } +.codicon-paintcan:before { content: "\eb2a" } +.codicon-pin:before { content: "\eb2b" } +.codicon-play:before { content: "\eb2c" } +.codicon-run:before { content: "\eb2c" } +.codicon-plug:before { content: "\eb2d" } +.codicon-preserve-case:before { content: "\eb2e" } +.codicon-preview:before { content: "\eb2f" } +.codicon-project:before { content: "\eb30" } +.codicon-pulse:before { content: "\eb31" } +.codicon-question:before { content: "\eb32" } +.codicon-quote:before { content: "\eb33" } +.codicon-radio-tower:before { content: "\eb34" } +.codicon-reactions:before { content: "\eb35" } +.codicon-references:before { content: "\eb36" } +.codicon-refresh:before { content: "\eb37" } +.codicon-regex:before { content: "\eb38" } +.codicon-remote-explorer:before { content: "\eb39" } +.codicon-remote:before { content: "\eb3a" } +.codicon-remove:before { content: "\eb3b" } +.codicon-replace-all:before { content: "\eb3c" } +.codicon-replace:before { content: "\eb3d" } +.codicon-repo-clone:before { content: "\eb3e" } +.codicon-repo-force-push:before { content: "\eb3f" } +.codicon-repo-pull:before { content: "\eb40" } +.codicon-repo-push:before { content: "\eb41" } +.codicon-report:before { content: "\eb42" } +.codicon-request-changes:before { content: "\eb43" } +.codicon-rocket:before { content: "\eb44" } +.codicon-root-folder-opened:before { content: "\eb45" } +.codicon-root-folder:before { content: "\eb46" } +.codicon-rss:before { content: "\eb47" } +.codicon-ruby:before { content: "\eb48" } +.codicon-save-all:before { content: "\eb49" } +.codicon-save-as:before { content: "\eb4a" } +.codicon-save:before { content: "\eb4b" } +.codicon-screen-full:before { content: "\eb4c" } +.codicon-screen-normal:before { content: "\eb4d" } +.codicon-search-stop:before { content: "\eb4e" } +.codicon-server:before { content: "\eb50" } +.codicon-settings-gear:before { content: "\eb51" } +.codicon-settings:before { content: "\eb52" } +.codicon-shield:before { content: "\eb53" } +.codicon-smiley:before { content: "\eb54" } +.codicon-sort-precedence:before { content: "\eb55" } +.codicon-split-horizontal:before { content: "\eb56" } +.codicon-split-vertical:before { content: "\eb57" } +.codicon-squirrel:before { content: "\eb58" } +.codicon-star-full:before { content: "\eb59" } +.codicon-star-half:before { content: "\eb5a" } +.codicon-symbol-class:before { content: "\eb5b" } +.codicon-symbol-color:before { content: "\eb5c" } +.codicon-symbol-constant:before { content: "\eb5d" } +.codicon-symbol-enum-member:before { content: "\eb5e" } +.codicon-symbol-field:before { content: "\eb5f" } +.codicon-symbol-file:before { content: "\eb60" } +.codicon-symbol-interface:before { content: "\eb61" } +.codicon-symbol-keyword:before { content: "\eb62" } +.codicon-symbol-misc:before { content: "\eb63" } +.codicon-symbol-operator:before { content: "\eb64" } +.codicon-symbol-property:before { content: "\eb65" } +.codicon-wrench:before { content: "\eb65" } +.codicon-wrench-subaction:before { content: "\eb65" } +.codicon-symbol-snippet:before { content: "\eb66" } +.codicon-tasklist:before { content: "\eb67" } +.codicon-telescope:before { content: "\eb68" } +.codicon-text-size:before { content: "\eb69" } +.codicon-three-bars:before { content: "\eb6a" } +.codicon-thumbsdown:before { content: "\eb6b" } +.codicon-thumbsup:before { content: "\eb6c" } +.codicon-tools:before { content: "\eb6d" } +.codicon-triangle-down:before { content: "\eb6e" } +.codicon-triangle-left:before { content: "\eb6f" } +.codicon-triangle-right:before { content: "\eb70" } +.codicon-triangle-up:before { content: "\eb71" } +.codicon-twitter:before { content: "\eb72" } +.codicon-unfold:before { content: "\eb73" } +.codicon-unlock:before { content: "\eb74" } +.codicon-unmute:before { content: "\eb75" } +.codicon-unverified:before { content: "\eb76" } +.codicon-verified:before { content: "\eb77" } +.codicon-versions:before { content: "\eb78" } +.codicon-vm-active:before { content: "\eb79" } +.codicon-vm-outline:before { content: "\eb7a" } +.codicon-vm-running:before { content: "\eb7b" } +.codicon-watch:before { content: "\eb7c" } +.codicon-whitespace:before { content: "\eb7d" } +.codicon-whole-word:before { content: "\eb7e" } +.codicon-window:before { content: "\eb7f" } +.codicon-word-wrap:before { content: "\eb80" } +.codicon-zoom-in:before { content: "\eb81" } +.codicon-zoom-out:before { content: "\eb82" } +.codicon-list-filter:before { content: "\eb83" } +.codicon-list-flat:before { content: "\eb84" } +.codicon-list-selection:before { content: "\eb85" } +.codicon-selection:before { content: "\eb85" } +.codicon-list-tree:before { content: "\eb86" } +.codicon-debug-breakpoint-function-unverified:before { content: "\eb87" } +.codicon-debug-breakpoint-function:before { content: "\eb88" } +.codicon-debug-breakpoint-function-disabled:before { content: "\eb88" } +.codicon-debug-stackframe-active:before { content: "\eb89" } +.codicon-debug-stackframe-dot:before { content: "\eb8a" } +.codicon-debug-stackframe:before { content: "\eb8b" } +.codicon-debug-stackframe-focused:before { content: "\eb8b" } +.codicon-debug-breakpoint-unsupported:before { content: "\eb8c" } +.codicon-symbol-string:before { content: "\eb8d" } +.codicon-debug-reverse-continue:before { content: "\eb8e" } +.codicon-debug-step-back:before { content: "\eb8f" } +.codicon-debug-restart-frame:before { content: "\eb90" } +.codicon-debug-alt:before { content: "\eb91" } +.codicon-call-incoming:before { content: "\eb92" } +.codicon-call-outgoing:before { content: "\eb93" } +.codicon-menu:before { content: "\eb94" } +.codicon-expand-all:before { content: "\eb95" } +.codicon-feedback:before { content: "\eb96" } +.codicon-group-by-ref-type:before { content: "\eb97" } +.codicon-ungroup-by-ref-type:before { content: "\eb98" } +.codicon-account:before { content: "\eb99" } +.codicon-bell-dot:before { content: "\eb9a" } +.codicon-debug-console:before { content: "\eb9b" } +.codicon-library:before { content: "\eb9c" } +.codicon-output:before { content: "\eb9d" } +.codicon-run-all:before { content: "\eb9e" } +.codicon-sync-ignored:before { content: "\eb9f" } +.codicon-pinned:before { content: "\eba0" } +.codicon-github-inverted:before { content: "\eba1" } +.codicon-server-process:before { content: "\eba2" } +.codicon-server-environment:before { content: "\eba3" } +.codicon-pass:before { content: "\eba4" } +.codicon-stop-circle:before { content: "\eba5" } +.codicon-play-circle:before { content: "\eba6" } +.codicon-record:before { content: "\eba7" } +.codicon-debug-alt-small:before { content: "\eba8" } +.codicon-vm-connect:before { content: "\eba9" } +.codicon-cloud:before { content: "\ebaa" } +.codicon-merge:before { content: "\ebab" } +.codicon-export:before { content: "\ebac" } +.codicon-graph-left:before { content: "\ebad" } +.codicon-magnet:before { content: "\ebae" } +.codicon-notebook:before { content: "\ebaf" } +.codicon-redo:before { content: "\ebb0" } +.codicon-check-all:before { content: "\ebb1" } +.codicon-pinned-dirty:before { content: "\ebb2" } +.codicon-pass-filled:before { content: "\ebb3" } +.codicon-circle-large-filled:before { content: "\ebb4" } +.codicon-circle-large-outline:before { content: "\ebb5" } +.codicon-combine:before { content: "\ebb6" } +.codicon-gather:before { content: "\ebb6" } diff --git a/extensions/simple-browser/media/codicon.ttf b/extensions/simple-browser/media/codicon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..39ca0a60807de52b035e1a438f9d4782966cd25b GIT binary patch literal 62792 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 { @@ -86,8 +89,8 @@ export class SimpleBrowserView extends Disposable { const mainJs = this.extensionResourceUrl('media', 'index.js'); const mainCss = this.extensionResourceUrl('media', 'main.css'); - const codiconsUri = this.extensionResourceUrl('node_modules', 'vscode-codicons', 'dist', 'codicon.css'); - const codiconsFontUri = this.extensionResourceUrl('node_modules', 'vscode-codicons', 'dist', 'codicon.ttf'); + const codiconsUri = this.extensionResourceUrl('media', 'codicon.css'); + const codiconsFontUri = this.extensionResourceUrl('media', 'codicon.ttf'); return /* html */ ` diff --git a/extensions/simple-browser/yarn.lock b/extensions/simple-browser/yarn.lock index 1daa22f5798..721ede37a6a 100644 --- a/extensions/simple-browser/yarn.lock +++ b/extensions/simple-browser/yarn.lock @@ -2565,10 +2565,10 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vscode-codicons@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/vscode-codicons/-/vscode-codicons-0.0.12.tgz#94b867156f3e3a6a4cf7661e9bf2bd0060042390" - integrity sha512-CyGFDf3OmQhtBql/BFheUAlvEZ1MKAgvyCrGktGXEsqYvK5m9456kckDTNvnEAGG8gYjE2ds5O1cle82sMgmAg== +vscode-codicons@^0.0.14: + version "0.0.14" + resolved "https://registry.yarnpkg.com/vscode-codicons/-/vscode-codicons-0.0.14.tgz#e0d05418e2e195564ff6f6a2199d70415911c18f" + integrity sha512-6CEH5KT9ct5WMw7n5dlX7rB8ya4CUI2FSq1Wk36XaW+c5RglFtAanUV0T+gvZVVFhl/WxfjTvFHq06Hz9c1SLA== vscode-extension-telemetry@0.1.1: version "0.1.1" From ff03697a1aa7a8c9290280adb425650321f74eea Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Feb 2021 14:54:37 -0800 Subject: [PATCH 32/86] Use node script instead of 'cp' command this should also work on widnows --- extensions/simple-browser/build/copy.js | 14 ++++++++++++++ extensions/simple-browser/package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 extensions/simple-browser/build/copy.js diff --git a/extensions/simple-browser/build/copy.js b/extensions/simple-browser/build/copy.js new file mode 100644 index 00000000000..d48747399a8 --- /dev/null +++ b/extensions/simple-browser/build/copy.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'); + +fs.copyFileSync( + path.join('node_modules', 'vscode-codicons', 'dist', 'codicon.css'), + path.join('media', 'codicon.css')); + +fs.copyFileSync( + path.join('node_modules', 'vscode-codicons', 'dist', 'codicon.ttf'), + path.join('media', 'codicon.ttf')); diff --git a/extensions/simple-browser/package.json b/extensions/simple-browser/package.json index 62f2dc2fc42..d5c6da0a701 100644 --- a/extensions/simple-browser/package.json +++ b/extensions/simple-browser/package.json @@ -58,7 +58,7 @@ "build-preview-production": "webpack --mode production", "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose", - "postinstall": "cp node_modules/vscode-codicons/dist/codicon.css media/ ; cp node_modules/vscode-codicons/dist/codicon.ttf media/" + "postinstall": "node ./build/copy" }, "dependencies": { "vscode-extension-telemetry": "0.1.1", From 64a164c9d5c8381b13cd34b47ef443d212c4f23d Mon Sep 17 00:00:00 2001 From: Miguel Solorio Date: Mon, 8 Feb 2021 16:38:57 -0800 Subject: [PATCH 33/86] Add default color for sash hover border color (refs #114636) --- 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 7bf7747c421..1256437a0d7 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -258,7 +258,7 @@ export const editorInfoBorder = registerColor('editorInfo.border', { dark: null, export const editorHintForeground = registerColor('editorHint.foreground', { dark: Color.fromHex('#eeeeee').transparent(0.7), light: '#6c6c6c', hc: null }, nls.localize('editorHint.foreground', 'Foreground color of hint squigglies in the editor.')); export const editorHintBorder = registerColor('editorHint.border', { dark: null, light: null, hc: Color.fromHex('#eeeeee').transparent(0.8) }, nls.localize('hintBorder', 'Border color of hint boxes in the editor.')); -export const sashHoverBorder = registerColor('sash.hoverBorder', { dark: null, light: null, hc: null }, nls.localize('sashActiveBorder', "Border color of active sashes.")); +export const sashHoverBorder = registerColor('sash.hoverBorder', { dark: focusBorder, light: focusBorder, hc: focusBorder }, nls.localize('sashActiveBorder', "Border color of active sashes.")); /** * Editor background color. From 4623a509954c0fef186c2a1b421e2c4d1c96fc32 Mon Sep 17 00:00:00 2001 From: Jackson Kearl Date: Mon, 8 Feb 2021 17:46:12 -0800 Subject: [PATCH 34/86] Fix #116154 --- test/automation/src/settings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/automation/src/settings.ts b/test/automation/src/settings.ts index 87366ed5e03..914cb8113c2 100644 --- a/test/automation/src/settings.ts +++ b/test/automation/src/settings.ts @@ -19,7 +19,7 @@ export class SettingsEditor { await this.editor.waitForEditorFocus('settings.json', 1); await this.code.dispatchKeybinding('right'); - await this.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value}`); + await this.editor.waitForTypeInEditor('settings.json', `"${setting}": ${value},`); await this.editors.saveOpenedFile(); } From 29844a0baf309a3fb4d07a8a63f1b61c39085622 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 8 Feb 2021 18:21:23 -0800 Subject: [PATCH 35/86] disable smoke tests that time out --- .../src/areas/extensions/extensions.test.ts | 32 ++++++++-------- .../src/areas/languages/languages.test.ts | 38 +++++++++---------- .../src/areas/statusbar/statusbar.test.ts | 10 ++--- .../src/areas/workbench/localization.test.ts | 34 ++++++++--------- 4 files changed, 57 insertions(+), 57 deletions(-) diff --git a/test/smoke/src/areas/extensions/extensions.test.ts b/test/smoke/src/areas/extensions/extensions.test.ts index 72a3460d8fe..fe65087f74c 100644 --- a/test/smoke/src/areas/extensions/extensions.test.ts +++ b/test/smoke/src/areas/extensions/extensions.test.ts @@ -3,31 +3,31 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Application, Quality } from '../../../../automation'; +import { Application } from '../../../../automation'; export function setup() { describe('Extensions', () => { - it(`install and activate vscode-smoketest-check extension`, async function () { - const app = this.app as Application; + // it(`install and activate vscode-smoketest-check extension`, async function () { + // const app = this.app as Application; - if (app.quality === Quality.Dev) { - this.skip(); - return; - } + // if (app.quality === Quality.Dev) { + // this.skip(); + // return; + // } - if (!app.web) { - await app.workbench.settingsEditor.addUserSetting('webview.experimental.useIframes', 'true'); - } + // if (!app.web) { + // await app.workbench.settingsEditor.addUserSetting('webview.experimental.useIframes', 'true'); + // } - await app.workbench.extensions.openExtensionsViewlet(); + // await app.workbench.extensions.openExtensionsViewlet(); - await app.workbench.extensions.installExtension('michelkaporin.vscode-smoketest-check', true); + // await app.workbench.extensions.installExtension('michelkaporin.vscode-smoketest-check', true); - await app.workbench.extensions.waitForExtensionsViewlet(); + // await app.workbench.extensions.waitForExtensionsViewlet(); - await app.workbench.quickaccess.runCommand('Smoke Test Check'); - await app.workbench.statusbar.waitForStatusbarText('smoke test', 'VS Code Smoke Test Check'); - }); + // await app.workbench.quickaccess.runCommand('Smoke Test Check'); + // await app.workbench.statusbar.waitForStatusbarText('smoke test', 'VS Code Smoke Test Check'); + // }); after(async function () { const app = this.app as Application; diff --git a/test/smoke/src/areas/languages/languages.test.ts b/test/smoke/src/areas/languages/languages.test.ts index ef1bf9455cf..8f8e38da297 100644 --- a/test/smoke/src/areas/languages/languages.test.ts +++ b/test/smoke/src/areas/languages/languages.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Application, ProblemSeverity, Problems } from '../../../../automation/out'; +import { Application } from '../../../../automation/out'; export function setup() { describe('Language Features', () => { @@ -15,28 +15,28 @@ export function setup() { await app.workbench.quickinput.waitForQuickInputElements(names => names.length === 2); }); - it('verifies problems view', async function () { - const app = this.app as Application; - await app.workbench.quickaccess.openFile('style.css'); - await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); + // it('verifies problems view', async function () { + // const app = this.app as Application; + // await app.workbench.quickaccess.openFile('style.css'); + // await app.workbench.editor.waitForTypeInEditor('style.css', '.foo{}'); - await app.code.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); + // await app.code.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.WARNING)); - await app.workbench.problems.showProblemsView(); - await app.code.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); - await app.workbench.problems.hideProblemsView(); - }); + // await app.workbench.problems.showProblemsView(); + // await app.code.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.WARNING)); + // await app.workbench.problems.hideProblemsView(); + // }); - it('verifies settings', async function () { - const app = this.app as Application; - await app.workbench.settingsEditor.addUserSetting('css.lint.emptyRules', '"error"'); - await app.workbench.quickaccess.openFile('style.css'); + // it('verifies settings', async function () { + // const app = this.app as Application; + // await app.workbench.settingsEditor.addUserSetting('css.lint.emptyRules', '"error"'); + // await app.workbench.quickaccess.openFile('style.css'); - await app.code.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); + // await app.code.waitForElement(Problems.getSelectorInEditor(ProblemSeverity.ERROR)); - await app.workbench.problems.showProblemsView(); - await app.code.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); - await app.workbench.problems.hideProblemsView(); - }); + // await app.workbench.problems.showProblemsView(); + // await app.code.waitForElement(Problems.getSelectorInProblemsView(ProblemSeverity.ERROR)); + // await app.workbench.problems.hideProblemsView(); + // }); }); } diff --git a/test/smoke/src/areas/statusbar/statusbar.test.ts b/test/smoke/src/areas/statusbar/statusbar.test.ts index 4cbf56526b4..585e6409b5b 100644 --- a/test/smoke/src/areas/statusbar/statusbar.test.ts +++ b/test/smoke/src/areas/statusbar/statusbar.test.ts @@ -53,12 +53,12 @@ export function setup(isWeb) { await app.workbench.quickinput.closeQuickInput(); }); - it(`verifies that 'Problems View' appears when clicking on 'Problems' status element`, async function () { - const app = this.app as Application; + // it(`verifies that 'Problems View' appears when clicking on 'Problems' status element`, async function () { + // const app = this.app as Application; - await app.workbench.statusbar.clickOn(StatusBarElement.PROBLEMS_STATUS); - await app.workbench.problems.waitForProblemsView(); - }); + // 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 Application; diff --git a/test/smoke/src/areas/workbench/localization.test.ts b/test/smoke/src/areas/workbench/localization.test.ts index 1101625ba3e..6f559f45941 100644 --- a/test/smoke/src/areas/workbench/localization.test.ts +++ b/test/smoke/src/areas/workbench/localization.test.ts @@ -20,28 +20,28 @@ export function setup() { await app.restart({ extraArgs: ['--locale=DE'] }); }); - it(`starts with 'DE' locale and verifies title and viewlets text is in German`, async function () { - const app = this.app as Application; + // it(`starts with 'DE' locale and verifies title and viewlets text is in German`, async function () { + // const app = this.app as Application; - if (app.quality === Quality.Dev) { - this.skip(); - return; - } + // if (app.quality === Quality.Dev) { + // this.skip(); + // return; + // } - // await app.workbench.explorer.waitForOpenEditorsViewTitle(title => /geöffnete editoren/i.test(title)); + // // await app.workbench.explorer.waitForOpenEditorsViewTitle(title => /geöffnete editoren/i.test(title)); - await app.workbench.search.openSearchViewlet(); - await app.workbench.search.waitForTitle(title => /suchen/i.test(title)); + // await app.workbench.search.openSearchViewlet(); + // await app.workbench.search.waitForTitle(title => /suchen/i.test(title)); - // await app.workbench.scm.openSCMViewlet(); - // await app.workbench.scm.waitForTitle(title => /quellcodeverwaltung/i.test(title)); + // // await app.workbench.scm.openSCMViewlet(); + // // await app.workbench.scm.waitForTitle(title => /quellcodeverwaltung/i.test(title)); - // See https://github.com/microsoft/vscode/issues/93462 - // await app.workbench.debug.openDebugViewlet(); - // await app.workbench.debug.waitForTitle(title => /starten/i.test(title)); + // // See https://github.com/microsoft/vscode/issues/93462 + // // await app.workbench.debug.openDebugViewlet(); + // // await app.workbench.debug.waitForTitle(title => /starten/i.test(title)); - // await app.workbench.extensions.openExtensionsViewlet(); - // await app.workbench.extensions.waitForTitle(title => /extensions/i.test(title)); - }); + // // await app.workbench.extensions.openExtensionsViewlet(); + // // await app.workbench.extensions.waitForTitle(title => /extensions/i.test(title)); + // }); }); } From 518097377de2ca84d9ba1f01933dee5393e0d76f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Feb 2021 21:00:12 -0800 Subject: [PATCH 36/86] Handle 304s for remote resources Now that we send along etag caching headers, the remote can return 304s. Make sure we forward these --- src/vs/platform/webview/common/resourceLoader.ts | 12 +++++++++--- .../webview/electron-main/webviewProtocolProvider.ts | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/webview/common/resourceLoader.ts b/src/vs/platform/webview/common/resourceLoader.ts index 52577d327e8..06f243e40aa 100644 --- a/src/vs/platform/webview/common/resourceLoader.ts +++ b/src/vs/platform/webview/common/resourceLoader.ts @@ -137,10 +137,16 @@ export async function loadLocalResource( logService.debug(`loadLocalResource - Loaded over http(s). requestUri=${requestUri}, response=${response.res.statusCode}`); - if (response.res.statusCode === 200) { - return new WebviewResourceResponse.StreamSuccess(response.stream, response.res.headers['etag'], mime); + switch (response.res.statusCode) { + case 200: + return new WebviewResourceResponse.StreamSuccess(response.stream, response.res.headers['etag'], mime); + + case 304: // Not modified + return new WebviewResourceResponse.NotModified(mime); + + default: + return WebviewResourceResponse.Failed; } - return WebviewResourceResponse.Failed; } try { diff --git a/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts b/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts index ede8d2ad556..bb0aafe22ee 100644 --- a/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts +++ b/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts @@ -224,7 +224,7 @@ export class WebviewProtocolProvider extends Disposable { }, fileReader, this.requestService, this.logService, CancellationToken.None); switch (result.type) { - case WebviewFileReadResponse.Type.Success: + case WebviewResourceResponse.Type.Success: { const cacheHeaders: Record = result.etag ? { 'ETag': result.etag, From 87a3effc79a191a64854547fb6d05bd57433099f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 Feb 2021 21:31:04 -0800 Subject: [PATCH 37/86] Try to disable caching in the simple browser's iframes --- extensions/simple-browser/media/index.js | 14 ++++++++++++-- extensions/simple-browser/media/index.js.map | 2 +- extensions/simple-browser/preview-src/index.ts | 16 ++++++++++++++-- .../simple-browser/src/simpleBrowserView.ts | 2 +- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/extensions/simple-browser/media/index.js b/extensions/simple-browser/media/index.js index 5a7763a93de..ca44111a2ea 100644 --- a/extensions/simple-browser/media/index.js +++ b/extensions/simple-browser/media/index.js @@ -194,9 +194,19 @@ events_1.onceDocumentLoaded(() => { iframe.src = input.value; }); navigateTo(settings.url); + input.value = settings.url; toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled); - function navigateTo(url) { - iframe.src = url; + function navigateTo(rawUrl) { + try { + const url = new URL(rawUrl); + // Try to bust the cache for the iframe + // There does not appear to be any way to reliably do this except modifying the url + url.searchParams.append('vscodeBrowserReqId', Date.now().toString()); + iframe.src = url.toString(); + } + catch (_a) { + iframe.src = rawUrl; + } } }); function toggleFocusLockIndicatorEnabled(enabled) { diff --git a/extensions/simple-browser/media/index.js.map b/extensions/simple-browser/media/index.js.map index d6128aae7e3..d4e76529981 100644 --- a/extensions/simple-browser/media/index.js.map +++ b/extensions/simple-browser/media/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./preview-src/events.ts","webpack:///./preview-src/index.ts"],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFa;AACb;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACfa;AACb;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D,iBAAiB,mBAAO,CAAC,yCAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./preview-src/index.ts\");\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.onceDocumentLoaded = void 0;\nfunction onceDocumentLoaded(f) {\n if (document.readyState === 'loading' || document.readyState === 'uninitialized') {\n document.addEventListener('DOMContentLoaded', f);\n }\n else {\n f();\n }\n}\nexports.onceDocumentLoaded = onceDocumentLoaded;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"./events\");\nconst vscode = acquireVsCodeApi();\nfunction getSettings() {\n const element = document.getElementById('simple-browser-settings');\n if (element) {\n const data = element.getAttribute('data-settings');\n if (data) {\n return JSON.parse(data);\n }\n }\n throw new Error(`Could not load settings`);\n}\nconst settings = getSettings();\nconst iframe = document.querySelector('iframe');\nconst header = document.querySelector('.header');\nconst input = header.querySelector('.url-input');\nconst forwardButton = header.querySelector('.forward-button');\nconst backButton = header.querySelector('.back-button');\nconst reloadButton = header.querySelector('.reload-button');\nconst openExternalButton = header.querySelector('.open-external-button');\nwindow.addEventListener('message', e => {\n switch (e.data.type) {\n case 'focus':\n {\n iframe.focus();\n break;\n }\n case 'didChangeFocusLockIndicatorEnabled':\n {\n toggleFocusLockIndicatorEnabled(e.data.enabled);\n break;\n }\n }\n});\nevents_1.onceDocumentLoaded(() => {\n setInterval(() => {\n var _a;\n const iframeFocused = ((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === 'IFRAME';\n document.body.classList.toggle('iframe-focused', iframeFocused);\n }, 50);\n iframe.addEventListener('load', () => {\n // Noop\n });\n input.addEventListener('change', e => {\n const url = e.target.value;\n navigateTo(url);\n });\n forwardButton.addEventListener('click', () => {\n history.forward();\n });\n backButton.addEventListener('click', () => {\n history.back();\n });\n openExternalButton.addEventListener('click', () => {\n vscode.postMessage({\n type: 'openExternal',\n url: input.value\n });\n });\n reloadButton.addEventListener('click', () => {\n // This does not seem to trigger what we want\n // history.go(0);\n // This incorrectly adds entries to the history but does reload\n iframe.src = input.value;\n });\n navigateTo(settings.url);\n toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled);\n function navigateTo(url) {\n iframe.src = url;\n }\n});\nfunction toggleFocusLockIndicatorEnabled(enabled) {\n document.body.classList.toggle('enable-focus-lock-indicator', enabled);\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./preview-src/events.ts","webpack:///./preview-src/index.ts"],"names":[],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA,0CAA0C,gCAAgC;QAC1E;QACA;;QAEA;QACA;QACA;QACA,wDAAwD,kBAAkB;QAC1E;QACA,iDAAiD,cAAc;QAC/D;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,yCAAyC,iCAAiC;QAC1E,gHAAgH,mBAAmB,EAAE;QACrI;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;;QAGA;QACA;;;;;;;;;;;;;AClFa;AACb;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACfa;AACb;AACA;AACA;AACA;AACA,8CAA8C,cAAc;AAC5D,iBAAiB,mBAAO,CAAC,yCAAU;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA","file":"index.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./preview-src/index.ts\");\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.onceDocumentLoaded = void 0;\nfunction onceDocumentLoaded(f) {\n if (document.readyState === 'loading' || document.readyState === 'uninitialized') {\n document.addEventListener('DOMContentLoaded', f);\n }\n else {\n f();\n }\n}\nexports.onceDocumentLoaded = onceDocumentLoaded;\n","\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"./events\");\nconst vscode = acquireVsCodeApi();\nfunction getSettings() {\n const element = document.getElementById('simple-browser-settings');\n if (element) {\n const data = element.getAttribute('data-settings');\n if (data) {\n return JSON.parse(data);\n }\n }\n throw new Error(`Could not load settings`);\n}\nconst settings = getSettings();\nconst iframe = document.querySelector('iframe');\nconst header = document.querySelector('.header');\nconst input = header.querySelector('.url-input');\nconst forwardButton = header.querySelector('.forward-button');\nconst backButton = header.querySelector('.back-button');\nconst reloadButton = header.querySelector('.reload-button');\nconst openExternalButton = header.querySelector('.open-external-button');\nwindow.addEventListener('message', e => {\n switch (e.data.type) {\n case 'focus':\n {\n iframe.focus();\n break;\n }\n case 'didChangeFocusLockIndicatorEnabled':\n {\n toggleFocusLockIndicatorEnabled(e.data.enabled);\n break;\n }\n }\n});\nevents_1.onceDocumentLoaded(() => {\n setInterval(() => {\n var _a;\n const iframeFocused = ((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === 'IFRAME';\n document.body.classList.toggle('iframe-focused', iframeFocused);\n }, 50);\n iframe.addEventListener('load', () => {\n // Noop\n });\n input.addEventListener('change', e => {\n const url = e.target.value;\n navigateTo(url);\n });\n forwardButton.addEventListener('click', () => {\n history.forward();\n });\n backButton.addEventListener('click', () => {\n history.back();\n });\n openExternalButton.addEventListener('click', () => {\n vscode.postMessage({\n type: 'openExternal',\n url: input.value\n });\n });\n reloadButton.addEventListener('click', () => {\n // This does not seem to trigger what we want\n // history.go(0);\n // This incorrectly adds entries to the history but does reload\n iframe.src = input.value;\n });\n navigateTo(settings.url);\n input.value = settings.url;\n toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled);\n function navigateTo(rawUrl) {\n try {\n const url = new URL(rawUrl);\n // Try to bust the cache for the iframe\n // There does not appear to be any way to reliably do this except modifying the url\n url.searchParams.append('vscodeBrowserReqId', Date.now().toString());\n iframe.src = url.toString();\n }\n catch (_a) {\n iframe.src = rawUrl;\n }\n }\n});\nfunction toggleFocusLockIndicatorEnabled(enabled) {\n document.body.classList.toggle('enable-focus-lock-indicator', enabled);\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/extensions/simple-browser/preview-src/index.ts b/extensions/simple-browser/preview-src/index.ts index 564224fd3bf..83cb3dedb16 100644 --- a/extensions/simple-browser/preview-src/index.ts +++ b/extensions/simple-browser/preview-src/index.ts @@ -84,10 +84,22 @@ onceDocumentLoaded(() => { }); navigateTo(settings.url); + input.value = settings.url; + toggleFocusLockIndicatorEnabled(settings.focusLockIndicatorEnabled); - function navigateTo(url: string): void { - iframe.src = url; + function navigateTo(rawUrl: string): void { + try { + const url = new URL(rawUrl); + + // Try to bust the cache for the iframe + // There does not appear to be any way to reliably do this except modifying the url + url.searchParams.append('vscodeBrowserReqId', Date.now().toString()); + + iframe.src = url.toString(); + } catch { + iframe.src = rawUrl; + } } }); diff --git a/extensions/simple-browser/src/simpleBrowserView.ts b/extensions/simple-browser/src/simpleBrowserView.ts index 306e56986e4..ef491d60eff 100644 --- a/extensions/simple-browser/src/simpleBrowserView.ts +++ b/extensions/simple-browser/src/simpleBrowserView.ts @@ -129,7 +129,7 @@ export class SimpleBrowserView extends Disposable { class="reload-button icon"> - +