Merge branch 'master' into joh/ftp

This commit is contained in:
Johannes Rieken 2017-09-13 12:23:12 +02:00
commit 90de7db5a1
92 changed files with 949 additions and 875 deletions

View file

@ -43,7 +43,7 @@ const nodeModules = ['electron', 'original-fs']
// Build
const builtInExtensions = [
{ name: 'ms-vscode.node-debug', version: '1.17.2' },
{ name: 'ms-vscode.node-debug', version: '1.17.3' },
{ name: 'ms-vscode.node-debug2', version: '1.17.1' }
];

View file

@ -1,59 +0,0 @@
"use strict";
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var ts = require("typescript");
var Lint = require("tslint");
var Rule = /** @class */ (function (_super) {
__extends(Rule, _super);
function Rule() {
return _super !== null && _super.apply(this, arguments) || this;
}
Rule.prototype.apply = function (sourceFile) {
var allowed = this.getOptions().ruleArguments[0];
return this.applyWithWalker(new AsyncRuleWalker(sourceFile, this.getOptions(), allowed));
};
return Rule;
}(Lint.Rules.AbstractRule));
exports.Rule = Rule;
var AsyncRuleWalker = /** @class */ (function (_super) {
__extends(AsyncRuleWalker, _super);
function AsyncRuleWalker(file, opts, allowed) {
var _this = _super.call(this, file, opts) || this;
_this.allowed = allowed;
return _this;
}
AsyncRuleWalker.prototype.visitMethodDeclaration = function (node) {
this.visitFunctionLikeDeclaration(node);
};
AsyncRuleWalker.prototype.visitFunctionDeclaration = function (node) {
this.visitFunctionLikeDeclaration(node);
};
AsyncRuleWalker.prototype.visitFunctionLikeDeclaration = function (node) {
var _this = this;
var flags = ts.getCombinedModifierFlags(node);
if (!(flags & ts.ModifierFlags.Async)) {
return;
}
var path = node.getSourceFile().path;
var pathParts = path.split(/\\|\//);
if (pathParts.some(function (part) { return _this.allowed.some(function (allowed) { return part === allowed; }); })) {
return;
}
var message = "You are not allowed to use async function in this layer. Allowed layers are: [" + this.allowed + "]";
this.addFailureAtNode(node, message);
};
return AsyncRuleWalker;
}(Lint.RuleWalker));

View file

@ -1,47 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as ts from 'typescript';
import * as Lint from 'tslint';
export class Rule extends Lint.Rules.AbstractRule {
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
const allowed = this.getOptions().ruleArguments[0] as string[];
return this.applyWithWalker(new AsyncRuleWalker(sourceFile, this.getOptions(), allowed));
}
}
class AsyncRuleWalker extends Lint.RuleWalker {
constructor(file: ts.SourceFile, opts: Lint.IOptions, private allowed: string[]) {
super(file, opts);
}
protected visitMethodDeclaration(node: ts.MethodDeclaration): void {
this.visitFunctionLikeDeclaration(node);
}
protected visitFunctionDeclaration(node: ts.FunctionDeclaration): void {
this.visitFunctionLikeDeclaration(node);
}
private visitFunctionLikeDeclaration(node: ts.FunctionLikeDeclaration) {
const flags = ts.getCombinedModifierFlags(node);
if (!(flags & ts.ModifierFlags.Async)) {
return;
}
const path = (node.getSourceFile() as any).path;
const pathParts = path.split(/\\|\//);
if (pathParts.some(part => this.allowed.some(allowed => part === allowed))) {
return;
}
const message = `You are not allowed to use async function in this layer. Allowed layers are: [${this.allowed}]`;
this.addFailureAtNode(node, message);
}
}

View file

@ -69,8 +69,8 @@
"c": "(",
"t": "source.coffee string.regexp.coffee meta.group.regexp punctuation.definition.group.regexp",
"r": {
"dark_plus": "string.regexp: #D16969",
"light_plus": "string.regexp: #811F3F",
"dark_plus": "punctuation.definition.group.regexp: #D7BA7D",
"light_plus": "punctuation.definition.group.regexp: #FF0000",
"dark_vs": "string.regexp: #D16969",
"light_vs": "string.regexp: #811F3F",
"hc_black": "string.regexp: #D16969"
@ -91,8 +91,8 @@
"c": "+",
"t": "source.coffee string.regexp.coffee meta.group.regexp keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"
@ -102,8 +102,8 @@
"c": ")",
"t": "source.coffee string.regexp.coffee meta.group.regexp punctuation.definition.group.regexp",
"r": {
"dark_plus": "string.regexp: #D16969",
"light_plus": "string.regexp: #811F3F",
"dark_plus": "punctuation.definition.group.regexp: #D7BA7D",
"light_plus": "punctuation.definition.group.regexp: #FF0000",
"dark_vs": "string.regexp: #D16969",
"light_vs": "string.regexp: #811F3F",
"hc_black": "string.regexp: #D16969"
@ -454,11 +454,11 @@
"c": "#{",
"t": "source.coffee string.regexp.coffee source.coffee.embedded.source punctuation.section.embedded.coffee",
"r": {
"dark_plus": "punctuation.section.embedded.coffee: #569CD6",
"light_plus": "punctuation.section.embedded.coffee: #0000FF",
"dark_vs": "punctuation.section.embedded.coffee: #569CD6",
"light_vs": "punctuation.section.embedded.coffee: #0000FF",
"hc_black": "punctuation.section.embedded.coffee: #569CD6"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -476,11 +476,11 @@
"c": "}",
"t": "source.coffee string.regexp.coffee source.coffee.embedded.source punctuation.section.embedded.coffee",
"r": {
"dark_plus": "punctuation.section.embedded.coffee: #569CD6",
"light_plus": "punctuation.section.embedded.coffee: #0000FF",
"dark_vs": "punctuation.section.embedded.coffee: #569CD6",
"light_vs": "punctuation.section.embedded.coffee: #0000FF",
"hc_black": "punctuation.section.embedded.coffee: #569CD6"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{

View file

@ -311,11 +311,11 @@
"c": "#{",
"t": "source.coffee meta.function-call.coffee meta.arguments.coffee string.quoted.double.coffee source.coffee.embedded.source punctuation.section.embedded.coffee",
"r": {
"dark_plus": "punctuation.section.embedded.coffee: #569CD6",
"light_plus": "punctuation.section.embedded.coffee: #0000FF",
"dark_vs": "punctuation.section.embedded.coffee: #569CD6",
"light_vs": "punctuation.section.embedded.coffee: #0000FF",
"hc_black": "punctuation.section.embedded.coffee: #569CD6"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -333,11 +333,11 @@
"c": "}",
"t": "source.coffee meta.function-call.coffee meta.arguments.coffee string.quoted.double.coffee source.coffee.embedded.source punctuation.section.embedded.coffee",
"r": {
"dark_plus": "punctuation.section.embedded.coffee: #569CD6",
"light_plus": "punctuation.section.embedded.coffee: #0000FF",
"dark_vs": "punctuation.section.embedded.coffee: #569CD6",
"light_vs": "punctuation.section.embedded.coffee: #0000FF",
"hc_black": "punctuation.section.embedded.coffee: #569CD6"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -575,11 +575,11 @@
"c": "#{",
"t": "source.coffee meta.function-call.coffee meta.arguments.coffee string.quoted.double.coffee source.coffee.embedded.source punctuation.section.embedded.coffee",
"r": {
"dark_plus": "punctuation.section.embedded.coffee: #569CD6",
"light_plus": "punctuation.section.embedded.coffee: #0000FF",
"dark_vs": "punctuation.section.embedded.coffee: #569CD6",
"light_vs": "punctuation.section.embedded.coffee: #0000FF",
"hc_black": "punctuation.section.embedded.coffee: #569CD6"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -597,11 +597,11 @@
"c": "}",
"t": "source.coffee meta.function-call.coffee meta.arguments.coffee string.quoted.double.coffee source.coffee.embedded.source punctuation.section.embedded.coffee",
"r": {
"dark_plus": "punctuation.section.embedded.coffee: #569CD6",
"light_plus": "punctuation.section.embedded.coffee: #0000FF",
"dark_vs": "punctuation.section.embedded.coffee: #569CD6",
"light_vs": "punctuation.section.embedded.coffee: #0000FF",
"hc_black": "punctuation.section.embedded.coffee: #569CD6"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -1378,8 +1378,8 @@
"c": "(",
"t": "source.coffee string.regexp.coffee meta.group.regexp punctuation.definition.group.regexp",
"r": {
"dark_plus": "string.regexp: #D16969",
"light_plus": "string.regexp: #811F3F",
"dark_plus": "punctuation.definition.group.regexp: #D7BA7D",
"light_plus": "punctuation.definition.group.regexp: #FF0000",
"dark_vs": "string.regexp: #D16969",
"light_vs": "string.regexp: #811F3F",
"hc_black": "string.regexp: #D16969"
@ -1400,8 +1400,8 @@
"c": "+",
"t": "source.coffee string.regexp.coffee meta.group.regexp keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"
@ -1411,8 +1411,8 @@
"c": ")",
"t": "source.coffee string.regexp.coffee meta.group.regexp punctuation.definition.group.regexp",
"r": {
"dark_plus": "string.regexp: #D16969",
"light_plus": "string.regexp: #811F3F",
"dark_plus": "punctuation.definition.group.regexp: #D7BA7D",
"light_plus": "punctuation.definition.group.regexp: #FF0000",
"dark_vs": "string.regexp: #D16969",
"light_vs": "string.regexp: #811F3F",
"hc_black": "string.regexp: #D16969"
@ -1466,8 +1466,8 @@
"c": "(",
"t": "source.coffee string.regexp.coffee meta.group.regexp punctuation.definition.group.regexp",
"r": {
"dark_plus": "string.regexp: #D16969",
"light_plus": "string.regexp: #811F3F",
"dark_plus": "punctuation.definition.group.regexp: #D7BA7D",
"light_plus": "punctuation.definition.group.regexp: #FF0000",
"dark_vs": "string.regexp: #D16969",
"light_vs": "string.regexp: #811F3F",
"hc_black": "string.regexp: #D16969"
@ -1488,8 +1488,8 @@
"c": "*",
"t": "source.coffee string.regexp.coffee meta.group.regexp keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"
@ -1499,8 +1499,8 @@
"c": ")",
"t": "source.coffee string.regexp.coffee meta.group.regexp punctuation.definition.group.regexp",
"r": {
"dark_plus": "string.regexp: #D16969",
"light_plus": "string.regexp: #811F3F",
"dark_plus": "punctuation.definition.group.regexp: #D7BA7D",
"light_plus": "punctuation.definition.group.regexp: #FF0000",
"dark_vs": "string.regexp: #D16969",
"light_vs": "string.regexp: #811F3F",
"hc_black": "string.regexp: #D16969"
@ -1554,8 +1554,8 @@
"c": "$",
"t": "source.coffee string.regexp.coffee keyword.control.anchor.regexp",
"r": {
"dark_plus": "keyword.control: #C586C0",
"light_plus": "keyword.control: #AF00DB",
"dark_plus": "keyword.control.anchor.regexp: #C586C0",
"light_plus": "keyword.control.anchor.regexp: #09885A",
"dark_vs": "keyword.control: #569CD6",
"light_vs": "keyword.control: #0000FF",
"hc_black": "keyword.control: #C586C0"

View file

@ -3,9 +3,9 @@
"version": "1.0.0",
"dependencies": {
"vscode-css-languageservice": {
"version": "2.1.4",
"version": "2.1.6",
"from": "vscode-css-languageservice@next",
"resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.1.4.tgz"
"resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.1.6.tgz"
},
"vscode-jsonrpc": {
"version": "3.3.1",

View file

@ -8,7 +8,7 @@
"node": "*"
},
"dependencies": {
"vscode-css-languageservice": "^2.1.4",
"vscode-css-languageservice": "^2.1.6",
"vscode-languageserver": "3.4.0-next.6",
"vscode-languageserver-protocol": "^3.1.1"
},

View file

@ -529,6 +529,11 @@
"group": "3_commit",
"when": "config.git.enabled && scmProvider == git"
},
{
"command": "git.stageAll",
"group": "4_stage",
"when": "config.git.enabled && scmProvider == git"
},
{
"command": "git.unstageAll",
"group": "4_stage",

View file

@ -345,9 +345,9 @@ export class Git {
return folderPath;
}
async getRepositoryRoot(path: string): Promise<string> {
const result = await this.exec(path, ['rev-parse', '--show-toplevel']);
return result.stdout.trim();
async getRepositoryRoot(repositoryPath: string): Promise<string> {
const result = await this.exec(repositoryPath, ['rev-parse', '--show-toplevel']);
return path.normalize(result.stdout.trim());
}
async exec(cwd: string, args: string[], options: any = {}): Promise<IExecutionResult> {

View file

@ -9232,33 +9232,33 @@
"c": "${",
"t": "source.groovy meta.definition.method.groovy meta.method.body.java string.quoted.double.groovy source.groovy.embedded.source punctuation.section.embedded.groovy",
"r": {
"dark_plus": "string: #CE9178",
"light_plus": "string: #A31515",
"dark_vs": "string: #CE9178",
"light_vs": "string: #A31515",
"hc_black": "string: #CE9178"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
"c": "System.currentTimeMillis() - start",
"t": "source.groovy meta.definition.method.groovy meta.method.body.java string.quoted.double.groovy source.groovy.embedded.source",
"r": {
"dark_plus": "string: #CE9178",
"light_plus": "string: #A31515",
"dark_vs": "string: #CE9178",
"light_vs": "string: #A31515",
"hc_black": "string: #CE9178"
"dark_plus": "source.groovy.embedded: #D4D4D4",
"light_plus": "source.groovy.embedded: #000000",
"dark_vs": "source.groovy.embedded: #D4D4D4",
"light_vs": "source.groovy.embedded: #000000",
"hc_black": "source.groovy.embedded: #FFFFFF"
}
},
{
"c": "}",
"t": "source.groovy meta.definition.method.groovy meta.method.body.java string.quoted.double.groovy source.groovy.embedded.source punctuation.section.embedded.groovy",
"r": {
"dark_plus": "string: #CE9178",
"light_plus": "string: #A31515",
"dark_vs": "string: #CE9178",
"light_vs": "string: #A31515",
"hc_black": "string: #CE9178"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{

View file

@ -3,14 +3,14 @@
"version": "1.0.0",
"dependencies": {
"vscode-css-languageservice": {
"version": "2.1.4",
"version": "2.1.6",
"from": "vscode-css-languageservice@next",
"resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.1.4.tgz"
"resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.1.6.tgz"
},
"vscode-html-languageservice": {
"version": "2.0.7",
"version": "2.0.8",
"from": "vscode-html-languageservice@next",
"resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-2.0.7.tgz"
"resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-2.0.8.tgz"
},
"vscode-jsonrpc": {
"version": "3.3.1",

View file

@ -8,8 +8,8 @@
"node": "*"
},
"dependencies": {
"vscode-css-languageservice": "^2.1.4",
"vscode-html-languageservice": "^2.0.7",
"vscode-css-languageservice": "^2.1.6",
"vscode-html-languageservice": "^2.0.8",
"vscode-languageserver": "3.4.0-next.6",
"vscode-languageserver-protocol": "^3.1.1",
"vscode-languageserver-types": "^3.3.0",

View file

@ -29,7 +29,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -51,7 +51,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -106,7 +106,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -128,7 +128,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -150,7 +150,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -194,7 +194,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -205,7 +205,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -293,7 +293,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -315,7 +315,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -337,7 +337,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -381,7 +381,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -392,7 +392,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{

View file

@ -62,7 +62,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -84,7 +84,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -139,7 +139,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -172,7 +172,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -194,7 +194,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -359,7 +359,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -381,7 +381,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -436,7 +436,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -458,7 +458,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -480,7 +480,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -502,7 +502,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -524,7 +524,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -601,7 +601,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -623,7 +623,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -678,7 +678,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -711,7 +711,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -733,7 +733,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{

View file

@ -480,7 +480,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -502,7 +502,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -557,7 +557,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -579,7 +579,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -590,7 +590,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -601,7 +601,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -623,7 +623,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -634,7 +634,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -656,7 +656,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -667,7 +667,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -689,7 +689,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -700,7 +700,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -733,7 +733,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -744,7 +744,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -755,7 +755,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -766,7 +766,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1129,7 +1129,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1151,7 +1151,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1283,7 +1283,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1305,7 +1305,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1448,7 +1448,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1470,7 +1470,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1492,7 +1492,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1536,7 +1536,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1547,7 +1547,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1558,7 +1558,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1580,7 +1580,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1602,7 +1602,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1613,7 +1613,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1624,7 +1624,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1657,7 +1657,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1701,7 +1701,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1712,7 +1712,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1745,7 +1745,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1756,7 +1756,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1767,7 +1767,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1800,7 +1800,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1844,7 +1844,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1855,7 +1855,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1866,7 +1866,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1877,7 +1877,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1888,7 +1888,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1899,7 +1899,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1910,7 +1910,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1932,7 +1932,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1943,7 +1943,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1954,7 +1954,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1976,7 +1976,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1987,7 +1987,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1998,7 +1998,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2009,7 +2009,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2020,7 +2020,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2042,7 +2042,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2053,7 +2053,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2064,7 +2064,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2075,7 +2075,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2086,7 +2086,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2097,7 +2097,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2119,7 +2119,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2141,7 +2141,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2152,7 +2152,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2163,7 +2163,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2174,7 +2174,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2185,7 +2185,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2196,7 +2196,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -2207,7 +2207,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{

View file

@ -1664,11 +1664,11 @@
"c": "{",
"t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js meta.jsx.children.tsx meta.embedded.expression.js punctuation.section.embedded.begin.js",
"r": {
"dark_plus": "meta.embedded: #D4D4D4",
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -1686,11 +1686,11 @@
"c": "}",
"t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js meta.jsx.children.tsx meta.embedded.expression.js punctuation.section.embedded.end.js",
"r": {
"dark_plus": "meta.embedded: #D4D4D4",
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -1862,11 +1862,11 @@
"c": "{",
"t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js",
"r": {
"dark_plus": "meta.embedded: #D4D4D4",
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -1888,7 +1888,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1906,11 +1906,11 @@
"c": "}",
"t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js",
"r": {
"dark_plus": "meta.embedded: #D4D4D4",
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{

View file

@ -656,7 +656,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -678,7 +678,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -733,7 +733,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -744,7 +744,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1030,7 +1030,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1052,7 +1052,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1063,7 +1063,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1074,7 +1074,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1096,7 +1096,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1107,7 +1107,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1151,7 +1151,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1162,7 +1162,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -1173,7 +1173,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{

View file

@ -40,7 +40,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -62,7 +62,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -73,7 +73,7 @@
"light_plus": "punctuation.section.embedded.begin.php: #800000",
"dark_vs": "punctuation.section.embedded.begin.php: #569CD6",
"light_vs": "punctuation.section.embedded.begin.php: #800000",
"hc_black": "default: #FFFFFF"
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -84,7 +84,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -106,7 +106,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -139,7 +139,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -161,7 +161,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -194,7 +194,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -205,7 +205,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -216,7 +216,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -227,7 +227,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -249,7 +249,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -414,7 +414,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -425,7 +425,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -436,7 +436,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -447,7 +447,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{
@ -458,7 +458,7 @@
"light_plus": "punctuation.section.embedded.end.php: #800000",
"dark_vs": "punctuation.section.embedded.end.php: #569CD6",
"light_vs": "punctuation.section.embedded.end.php: #800000",
"hc_black": "default: #FFFFFF"
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -469,7 +469,7 @@
"light_plus": "punctuation.section.embedded.end.php: #800000",
"dark_vs": "punctuation.section.embedded.end.php: #569CD6",
"light_vs": "punctuation.section.embedded.end.php: #800000",
"hc_black": "default: #FFFFFF"
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -480,7 +480,7 @@
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "default: #FFFFFF"
"hc_black": "meta.embedded: #FFFFFF"
}
},
{

File diff suppressed because it is too large Load diff

View file

@ -5338,8 +5338,8 @@
"c": "*",
"t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"
@ -5371,8 +5371,8 @@
"c": "*",
"t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"
@ -5426,8 +5426,8 @@
"c": "+",
"t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"
@ -5470,8 +5470,8 @@
"c": "+",
"t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"
@ -5503,8 +5503,8 @@
"c": "*",
"t": "source.python meta.function-call.python meta.function-call.arguments.python string.regexp.quoted.single.python keyword.operator.quantifier.regexp",
"r": {
"dark_plus": "keyword.operator: #D4D4D4",
"light_plus": "keyword.operator: #000000",
"dark_plus": "keyword.operator.quantifier.regexp: #D4D4D4",
"light_plus": "keyword.operator.quantifier.regexp: #0000FF",
"dark_vs": "keyword.operator: #D4D4D4",
"light_vs": "keyword.operator: #000000",
"hc_black": "keyword.operator: #D4D4D4"

View file

@ -14,11 +14,11 @@
"c": "{",
"t": "text.html.cshtml section.embedded.source.cshtml punctuation.section.embedded.begin.cshtml",
"r": {
"dark_plus": "default: #D4D4D4",
"light_plus": "default: #000000",
"dark_vs": "default: #D4D4D4",
"light_vs": "default: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -333,11 +333,11 @@
"c": "{",
"t": "text.html.cshtml section.embedded.source.cshtml section.embedded.source.cshtml punctuation.section.embedded.begin.cshtml",
"r": {
"dark_plus": "default: #D4D4D4",
"light_plus": "default: #000000",
"dark_vs": "default: #D4D4D4",
"light_vs": "default: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -1125,22 +1125,22 @@
"c": "}",
"t": "text.html.cshtml section.embedded.source.cshtml section.embedded.source.cshtml punctuation.section.embedded.begin.cshtml",
"r": {
"dark_plus": "default: #D4D4D4",
"light_plus": "default: #000000",
"dark_vs": "default: #D4D4D4",
"light_vs": "default: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
"c": "}",
"t": "text.html.cshtml section.embedded.source.cshtml punctuation.section.embedded.begin.cshtml",
"r": {
"dark_plus": "default: #D4D4D4",
"light_plus": "default: #000000",
"dark_vs": "default: #D4D4D4",
"light_vs": "default: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -3226,11 +3226,11 @@
"c": "@(",
"t": "text.html.cshtml punctuation.section.embedded.begin.cshtml",
"r": {
"dark_plus": "default: #D4D4D4",
"light_plus": "default: #000000",
"dark_vs": "default: #D4D4D4",
"light_vs": "default: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -3270,11 +3270,11 @@
"c": ")",
"t": "text.html.cshtml punctuation.section.embedded.begin.cshtml",
"r": {
"dark_plus": "default: #D4D4D4",
"light_plus": "default: #000000",
"dark_vs": "default: #D4D4D4",
"light_vs": "default: #000000",
"hc_black": "default: #FFFFFF"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{

View file

@ -2258,11 +2258,11 @@
"c": "#{",
"t": "source.ruby string.interpolated.ruby meta.embedded.line.ruby punctuation.section.embedded.begin.ruby",
"r": {
"dark_plus": "meta.embedded: #D4D4D4",
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "string: #CE9178"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{
@ -2280,11 +2280,11 @@
"c": "}",
"t": "source.ruby string.interpolated.ruby meta.embedded.line.ruby punctuation.section.embedded.end.ruby source.ruby",
"r": {
"dark_plus": "meta.embedded: #D4D4D4",
"light_plus": "meta.embedded: #000000",
"dark_vs": "meta.embedded: #D4D4D4",
"light_vs": "meta.embedded: #000000",
"hc_black": "string: #CE9178"
"dark_plus": "punctuation.section.embedded: #569CD6",
"light_plus": "punctuation.section.embedded: #0000FF",
"dark_vs": "punctuation.section.embedded: #569CD6",
"light_vs": "punctuation.section.embedded: #0000FF",
"hc_black": "punctuation.section.embedded: #569CD6"
}
},
{

View file

@ -8,7 +8,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#000c18",
"foreground": "#6688cc"

View file

@ -101,6 +101,29 @@
"settings": {
"foreground": "#CE9178"
}
},
{
"scope": [
"punctuation.definition.group.regexp",
"punctuation.definition.group.assertion.regexp",
"punctuation.definition.character-class.regexp",
"keyword.operator.negation.regexp"
],
"settings": {
"foreground": "#d7ba7d"
}
},
{
"scope": "keyword.operator.quantifier.regexp",
"settings": {
"foreground": "#d4d4d4"
}
},
{
"scope": "keyword.control.anchor.regexp",
"settings": {
"foreground": "#C586C0"
}
}
]
}

View file

@ -10,7 +10,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"foreground": "#D4D4D4",
"background": "#1E1E1E"
@ -248,11 +248,12 @@
}
},
{
"name": "JavaScript string interpolation ${}",
"name": "String interpolation",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded.coffee"
"punctuation.section.embedded",
"constant.character.format.placeholder"
],
"settings": {
"foreground": "#569cd6"

View file

@ -14,6 +14,16 @@
"background": "#000000"
}
},
{
"scope": [
"meta.embedded",
"source.groovy.embedded"
],
"settings": {
"foreground": "#FFFFFF",
"background": "#000000"
}
},
{
"scope": "emphasis",
"settings": {
@ -227,11 +237,12 @@
}
},
{
"name": "JavaScript string interpolation ${}",
"name": "String interpolation",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded.coffee"
"punctuation.section.embedded",
"constant.character.format.placeholder"
],
"settings": {
"foreground": "#569cd6"

View file

@ -101,6 +101,29 @@
"settings": {
"foreground": "#0451a5"
}
},
{
"scope": [
"punctuation.definition.group.regexp",
"punctuation.definition.group.assertion.regexp",
"punctuation.definition.character-class.regexp",
"keyword.operator.negation.regexp"
],
"settings": {
"foreground": "#ff0000"
}
},
{
"scope": "keyword.operator.quantifier.regexp",
"settings": {
"foreground": "#0000ff"
}
},
{
"scope": "keyword.control.anchor.regexp",
"settings": {
"foreground": "#09885a"
}
}
]
}

View file

@ -4,7 +4,7 @@
"include": "./light_defaults.json",
"tokenColors": [
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"foreground": "#000000ff",
"background":"#ffffffff"
@ -244,11 +244,12 @@
}
},
{
"name": "JavaScript string interpolation ${}",
"name": "String interpolation",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded.coffee"
"punctuation.section.embedded",
"constant.character.format.placeholder"
],
"settings": {
"foreground": "#0000ff"

View file

@ -55,7 +55,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#221a0f",
"foreground": "#d3af86"

View file

@ -52,7 +52,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#1e1e1e",
"foreground": "#C5C8C6"
@ -453,7 +453,9 @@
},
{
"name": "Ruby Embedded Source",
"scope": "source.ruby.embedded.source",
"scope": [
"punctuation.section.embedded.begin.ruby",
"punctuation.section.embedded.end.ruby"],
"settings": {
"foreground": "#D08442"
}

View file

@ -97,7 +97,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#272822",
"foreground": "#F8F8F2"
@ -121,7 +121,7 @@
"name": "Template Definition",
"scope": [
"punctuation.definition.template-expression",
"punctuation.section.embedded.coffee"
"punctuation.section.embedded"
],
"settings": {
"foreground": "#F92672"

View file

@ -8,7 +8,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#F5F5F5",
"foreground": "#333333"

View file

@ -69,7 +69,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#390000",
"foreground": "#F8F8F8"
@ -169,14 +169,6 @@
"foreground": "#aa5507ff"
}
},
{
"name": "String embedded-source",
"scope": "string.quoted source",
"settings": {
"fontStyle": "",
"foreground": "#9df39fff"
}
},
{
"name": "String constant",
"scope": "string constant",
@ -393,6 +385,18 @@
"fontStyle": "",
"foreground": "#fec758ff"
}
},
{
"name": "String interpolation",
"scope": [
"punctuation.definition.template-expression.begin",
"punctuation.definition.template-expression.end",
"punctuation.section.embedded",
"constant.character.format.placeholder"
],
"settings": {
"foreground": "#ec0d1e"
}
}
]
}

View file

@ -8,7 +8,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#002B36",
"foreground": "#93A1A1"

View file

@ -8,7 +8,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#FDF6E3",
"foreground": "#657B83"

View file

@ -61,7 +61,7 @@
}
},
{
"scope": "meta.embedded",
"scope": ["meta.embedded", "source.groovy.embedded"],
"settings": {
"background": "#002451",
"foreground": "#FFFFFF"

8
npm-shrinkwrap.json generated
View file

@ -552,9 +552,9 @@
"resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.23.0.tgz"
},
"vscode-ripgrep": {
"version": "0.0.25",
"from": "vscode-ripgrep@0.0.25",
"resolved": "https://registry.npmjs.org/vscode-ripgrep/-/vscode-ripgrep-0.0.25.tgz"
"version": "0.0.26",
"from": "vscode-ripgrep@0.0.26",
"resolved": "https://registry.npmjs.org/vscode-ripgrep/-/vscode-ripgrep-0.0.26.tgz"
},
"vscode-textmate": {
"version": "3.1.5",
@ -574,7 +574,7 @@
"xterm": {
"version": "3.0.0",
"from": "Tyriar/xterm.js#vscode-release/1.17",
"resolved": "git+https://github.com/Tyriar/xterm.js.git#c3039b4d63b5c0e4a0c993e04714ad62fd056185"
"resolved": "git+https://github.com/Tyriar/xterm.js.git#4483a2faf442101b507d033e4d25d134dddbe2ff"
},
"yauzl": {
"version": "2.8.0",

View file

@ -43,7 +43,7 @@
"semver": "4.3.6",
"v8-profiler": "jrieken/v8-profiler#vscode",
"vscode-debugprotocol": "1.23.0",
"vscode-ripgrep": "0.0.25",
"vscode-ripgrep": "0.0.26",
"vscode-textmate": "^3.1.5",
"winreg": "1.2.0",
"xterm": "Tyriar/xterm.js#vscode-release/1.17",

View file

@ -28,6 +28,7 @@ test -d node_modules || ./scripts/npm.sh install
(test -f "$CODE" && [ $INTENDED_VERSION == $INSTALLED_VERSION ]) || ./node_modules/.bin/gulp electron
# Unit Tests
export ELECTRON_ENABLE_LOGGING=1
if [[ "$OSTYPE" == "darwin"* ]]; then
cd $ROOT ; ulimit -n 4096 ; \
"$CODE" \

View file

@ -348,8 +348,6 @@ class MouseController<T> implements IDisposable {
}
private onMouseDown(e: IListMouseEvent<T>): void {
e.preventDefault();
e.stopPropagation();
this.view.domNode.focus();
let reference = this.list.getFocus()[0];
@ -373,9 +371,6 @@ class MouseController<T> implements IDisposable {
}
private onPointer(e: IListMouseEvent<T>): void {
e.preventDefault();
e.stopPropagation();
if (isSelectionChangeEvent(e)) {
return;
}
@ -388,9 +383,6 @@ class MouseController<T> implements IDisposable {
}
private onDoubleClick(e: IListMouseEvent<T>): void {
e.preventDefault();
e.stopPropagation();
if (isSelectionChangeEvent(e)) {
return;
}

View file

@ -244,9 +244,9 @@ export abstract class HeaderView extends View {
protected abstract layoutBody(size: number): void;
}
export interface ICollapsibleViewOptions {
export interface IAbstractCollapsibleViewOptions {
sizing: ViewSizing;
ariaHeaderLabel: string;
ariaHeaderLabel?: string;
bodySize?: number;
initialState?: CollapsibleState;
}
@ -268,7 +268,7 @@ export abstract class AbstractCollapsibleView extends HeaderView {
private _previousSize: number = null;
private readonly viewSizing: ViewSizing;
constructor(initialSize: number | undefined, opts: ICollapsibleViewOptions) {
constructor(initialSize: number | undefined, opts: IAbstractCollapsibleViewOptions) {
super(initialSize, opts);
this.viewSizing = opts.sizing;
this.ariaHeaderLabel = opts.ariaHeaderLabel;
@ -493,6 +493,7 @@ export interface SplitViewStyles {
export class SplitView extends lifecycle.Disposable implements
sash.IHorizontalSashLayoutProvider,
sash.IVerticalSashLayoutProvider {
private orientation: Orientation;
private canDragAndDrop: boolean;
private el: HTMLElement;
@ -521,6 +522,10 @@ export class SplitView extends lifecycle.Disposable implements
private _onDidOrderChange: Emitter<void> = this._register(new Emitter<void>());
readonly onDidOrderChange: Event<void> = this._onDidOrderChange.event;
get length(): number {
return this.views.length;
}
constructor(container: HTMLElement, options?: IOptions) {
super();
options = options || {};
@ -560,18 +565,18 @@ export class SplitView extends lifecycle.Disposable implements
}
// The void space exists to handle the case where all other views are fixed size
this.addView(new VoidView(), 1, 0);
this.addView(new VoidView(), 0);
}
getView(index: number): IView | undefined {
return this.views[index];
}
getViews<T extends IView>(): T[] {
return <T[]>this.views.slice(0, this.views.length - 1);
}
addView(view: IView, initialWeight: number = 1, index = this.views.length - 1): void {
if (initialWeight <= 0) {
throw new Error('Initial weight must be a positive number.');
}
addView(view: IView, index = this.views.length - 1): void {
/**
* Reset size to null. This will layout newly added views to initial weights.
*/

View file

@ -23,6 +23,7 @@ export interface IToolBarOptions {
actionItemProvider?: IActionItemProvider;
ariaLabel?: string;
getKeyBinding?: (action: IAction) => ResolvedKeybinding;
actionRunner?: IActionRunner;
}
/**
@ -49,6 +50,7 @@ export class ToolBar {
this.actionBar = new ActionBar($(element), {
orientation: options.orientation,
ariaLabel: options.ariaLabel,
actionRunner: options.actionRunner,
actionItemProvider: (action: Action) => {
// Return special action item for the toggle menu action

View file

@ -58,8 +58,8 @@ export function getPathLabel(resource: URI | string, rootProvider?: IRootProvide
}
// convert c:\something => C:\something
if (platform.isWindows && resource.fsPath && resource.fsPath[1] === ':') {
return normalize(resource.fsPath.charAt(0).toUpperCase() + resource.fsPath.slice(1), true);
if (hasDriveLetter(resource.fsPath)) {
return normalize(normalizeDriveLetter(resource.fsPath), true);
}
// normalize and tildify (macOS, Linux only)
@ -71,6 +71,18 @@ export function getPathLabel(resource: URI | string, rootProvider?: IRootProvide
return res;
}
function hasDriveLetter(path: string): boolean {
return platform.isWindows && path && path[1] === ':';
}
export function normalizeDriveLetter(path: string): string {
if (hasDriveLetter(path)) {
return path.charAt(0).toUpperCase() + path.slice(1);
}
return path;
}
export function tildify(path: string, userHome: string): string {
if (path && (platform.isMacintosh || platform.isLinux) && isEqualOrParent(path, userHome, !platform.isLinux /* ignorecase */)) {
path = `~${path.substr(userHome.length)}`;

View file

@ -238,9 +238,19 @@ export function regExpLeadsToEndlessLoop(regexp: RegExp): boolean {
* @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize}
*/
export const canNormalize = typeof ((<any>'').normalize) === 'function';
const nonAsciiCharactersPattern = /[^\u0000-\u0080]/;
const normalizedCache = new BoundedMap<string>(10000); // bounded to 10000 elements
const nfcCache = new BoundedMap<string>(10000); // bounded to 10000 elements
export function normalizeNFC(str: string): string {
return normalize(str, 'NFC', nfcCache);
}
const nfdCache = new BoundedMap<string>(10000); // bounded to 10000 elements
export function normalizeNFD(str: string): string {
return normalize(str, 'NFD', nfdCache);
}
const nonAsciiCharactersPattern = /[^\u0000-\u0080]/;
function normalize(str: string, form: string, normalizedCache: BoundedMap<string>): string {
if (!canNormalize || !str) {
return str;
}
@ -252,7 +262,7 @@ export function normalizeNFC(str: string): string {
let res: string;
if (nonAsciiCharactersPattern.test(str)) {
res = (<any>str).normalize('NFC');
res = (<any>str).normalize(form);
} else {
res = str;
}

View file

@ -6,7 +6,7 @@
'use strict';
import * as fs from 'fs';
import * as path from 'path';
import { dirname, basename } from 'path';
import * as objects from 'vs/base/common/objects';
import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle';
import Event, { Emitter } from 'vs/base/common/event';
@ -49,9 +49,11 @@ export class ConfigWatcher<T> implements IConfigWatcher<T>, IDisposable {
private timeoutHandle: NodeJS.Timer;
private disposables: IDisposable[];
private _onDidUpdateConfiguration: Emitter<IConfigurationChangeEvent<T>>;
private configName: string;
constructor(private _path: string, private options: IConfigOptions<T> = { changeBufferDelay: 0, defaultConfig: Object.create(null), onError: error => console.error(error) }) {
this.disposables = [];
this.configName = basename(this._path);
this._onDidUpdateConfiguration = new Emitter<IConfigurationChangeEvent<T>>();
this.disposables.push(this._onDidUpdateConfiguration);
@ -121,8 +123,8 @@ export class ConfigWatcher<T> implements IConfigWatcher<T>, IDisposable {
private registerWatcher(): void {
// Watch the parent of the path so that we detect ADD and DELETES
const parentFolder = path.dirname(this._path);
this.watch(parentFolder);
const parentFolder = dirname(this._path);
this.watch(parentFolder, true);
// Check if the path is a symlink and watch its target if so
fs.lstat(this._path, (err, stat) => {
@ -137,20 +139,20 @@ export class ConfigWatcher<T> implements IConfigWatcher<T>, IDisposable {
return; // path is not a valid symlink
}
this.watch(realPath);
this.watch(realPath, false);
});
}
});
}
private watch(path: string): void {
private watch(path: string, isParentFolder: boolean): void {
if (this.disposed) {
return; // avoid watchers that will never get disposed by checking for being disposed
}
try {
const watcher = fs.watch(path);
watcher.on('change', () => this.onConfigFileChange());
watcher.on('change', (type, file) => this.onConfigFileChange(type, file.toString(), isParentFolder));
watcher.on('error', (code, signal) => this.options.onError(`Error watching ${path} for configuration changes (${code}, ${signal})`));
this.disposables.push(toDisposable(() => {
@ -166,7 +168,11 @@ export class ConfigWatcher<T> implements IConfigWatcher<T>, IDisposable {
}
}
private onConfigFileChange(): void {
private onConfigFileChange(eventType: string, filename: string, isParentFolder: boolean): void {
if (isParentFolder && filename !== this.configName) {
return; // a change to a sibling file that is not our config file
}
if (this.timeoutHandle) {
global.clearTimeout(this.timeoutHandle);
this.timeoutHandle = null;

View file

@ -174,4 +174,9 @@ export class KeybindingsResolver {
return this.keybindings[commandId];
}
public dispose(): void {
this._onKeybindingsChanged.dispose();
this.keybindingsWatcher.dispose();
}
}

View file

@ -174,7 +174,6 @@ export abstract class PeekViewWidget extends ZoneWidget {
if (!this._isShowing && heightInPixel < 0) {
// Looks like the view zone got folded away!
this.dispose();
this._onDidClose.fire(this);
return;
}

View file

@ -8,7 +8,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { ConfigWatcher } from 'vs/base/node/config';
import { Registry } from 'vs/platform/registry/common/platform';
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
import { IDisposable, toDisposable, Disposable } from 'vs/base/common/lifecycle';
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
import { ConfigurationSource, IConfigurationService, IConfigurationServiceEvent, IConfigurationValue, IConfigurationKeys, ConfigurationModel, IConfigurationOverrides, Configuration, IConfigurationValues, IConfigurationData } from 'vs/platform/configuration/common/configuration';
import { CustomConfigurationModel, DefaultConfigurationModel } from 'vs/platform/configuration/common/model';
import Event, { Emitter } from 'vs/base/common/event';
@ -37,7 +37,7 @@ export class ConfigurationService<T> extends Disposable implements IConfiguratio
return userConfigModel;
}
});
this._register(toDisposable(() => this.userConfigModelWatcher.dispose()));
this._register(this.userConfigModelWatcher);
// Listeners
this._register(this.userConfigModelWatcher.onDidUpdateConfiguration(() => this.onConfigurationChange(ConfigurationSource.User)));

View file

@ -10,7 +10,7 @@ import * as os from 'os';
import * as path from 'path';
import * as fs from 'fs';
import URI from 'vs/base/common/uri';
import { generateUuid } from 'vs/base/common/uuid';
import { generateUuid, isUUID } from 'vs/base/common/uuid';
import { memoize } from 'vs/base/common/decorators';
import pkg from 'vs/platform/node/package';
import product from 'vs/platform/node/product';
@ -31,9 +31,13 @@ function getUniqueUserId(): string {
return crypto.createHash('sha256').update(username).digest('hex').substr(0, 6);
}
// Read this before there's any chance it is overwritten
// Related to https://github.com/Microsoft/vscode/issues/30624
const xdgRuntimeDir = process.env['XDG_RUNTIME_DIR'];
function getNixIPCHandle(userDataPath: string, type: string): string {
if (process.env['XDG_RUNTIME_DIR']) {
return path.join(process.env['XDG_RUNTIME_DIR'], `${pkg.name}-${pkg.version}-${type}.sock`);
if (xdgRuntimeDir) {
return path.join(xdgRuntimeDir, `${pkg.name}-${pkg.version}-${type}.sock`);
}
return path.join(userDataPath, `${pkg.version}-${type}.sock`);
}
@ -151,11 +155,15 @@ export class EnvironmentService implements IEnvironmentService {
try {
this.machineUUID = fs.readFileSync(machineIdPath, 'utf8');
if (!isUUID(this.machineUUID)) {
throw new Error('Not a UUID');
}
} catch (err) {
this.machineUUID = generateUuid();
try {
fs.writeFileSync(machineIdPath, this.machineUUID);
fs.writeFileSync(machineIdPath, this.machineUUID, 'utf8');
} catch (err) {
console.warn('Could not store machine ID');
}

View file

@ -4,7 +4,6 @@
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as platform from 'vs/base/common/platform';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
@ -44,10 +43,7 @@ export class ExperimentService implements IExperimentService {
function loadExperiments(storageService: IStorageService, configurationService: IConfigurationService): IExperiments {
const experiments = splitExperimentsRandomness(storageService);
if (platform.isWindows) {
// Ripgrep triggers MsMpEng.exe (https://github.com/BurntSushi/ripgrep/issues/600)
experiments.ripgrepQuickSearch = false;
}
experiments.ripgrepQuickSearch = true;
return applyOverrides(experiments, configurationService);
}

View file

@ -93,7 +93,7 @@ export class ColorExtensionPoint {
extensionValue.forEach(extension => {
if (typeof extension.id !== 'string' || extension.id.length === 0) {
collector.error(nls.localize('invalid.id', "'configuration.colors.id' must be defined an can not be empty"));
collector.error(nls.localize('invalid.id', "'configuration.colors.id' must be defined and can not be empty"));
return;
}
if (!extension.id.match(colorIdPattern)) {
@ -101,7 +101,7 @@ export class ColorExtensionPoint {
return;
}
if (typeof extension.description !== 'string' || extension.id.length === 0) {
collector.error(nls.localize('invalid.description', "'configuration.colors.description' must be defined an can not be empty"));
collector.error(nls.localize('invalid.description', "'configuration.colors.description' must be defined and can not be empty"));
return;
}
let defaults = extension.defaults;

View file

@ -12,14 +12,19 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment'
import { extname, join, dirname, isAbsolute, resolve, relative } from 'path';
import { mkdirp, writeFile, readFile } from 'vs/base/node/pfs';
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
import { isLinux } from 'vs/base/common/platform';
import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform';
import { delSync, readdirSync } from 'vs/base/node/extfs';
import Event, { Emitter } from 'vs/base/common/event';
import { ILogService } from 'vs/platform/log/common/log';
import { isEqual, isEqualOrParent } from 'vs/base/common/paths';
import { isEqual, isEqualOrParent, normalize } from 'vs/base/common/paths';
import { coalesce } from 'vs/base/common/arrays';
import { createHash } from 'crypto';
import * as json from 'vs/base/common/json';
import * as jsonEdit from 'vs/base/common/jsonEdit';
import { applyEdit } from 'vs/base/common/jsonFormatter';
import { normalizeDriveLetter } from 'vs/base/common/labels';
const SLASH = '/';
export class WorkspacesMainService implements IWorkspacesMainService {
@ -181,10 +186,11 @@ export class WorkspacesMainService implements IWorkspacesMainService {
}
// Read the contents of the workspace file and resolve it
return readFile(workspace.configPath).then(rawWorkspaceContents => {
return readFile(workspace.configPath).then(raw => {
const rawWorkspaceContents = raw.toString();
let storedWorkspace: IStoredWorkspace;
try {
storedWorkspace = this.doParseStoredWorkspace(workspace.configPath, rawWorkspaceContents.toString());
storedWorkspace = this.doParseStoredWorkspace(workspace.configPath, rawWorkspaceContents);
} catch (error) {
return TPromise.wrapError(error);
}
@ -192,6 +198,18 @@ export class WorkspacesMainService implements IWorkspacesMainService {
const sourceConfigFolder = dirname(workspace.configPath);
const targetConfigFolder = dirname(targetConfigPath);
// Determine which path separator to use:
// - macOS/Linux: slash
// - Windows: use slash if already used in that file
let useSlashesForPath = !isWindows;
if (isWindows) {
storedWorkspace.folders.forEach(folder => {
if (folder.path.indexOf(SLASH) >= 0) {
useSlashesForPath = true;
}
});
}
// Rewrite absolute paths to relative paths if the target workspace folder
// is a parent of the location of the workspace file itself. Otherwise keep
// using absolute paths.
@ -203,9 +221,32 @@ export class WorkspacesMainService implements IWorkspacesMainService {
if (isEqualOrParent(folder.path, targetConfigFolder, !isLinux)) {
folder.path = relative(targetConfigFolder, folder.path) || '.'; // absolute paths get converted to relative ones to workspace location if possible
}
// Windows gets special treatment:
// - normalize all paths to get nice casing of drive letters
// - convert to slashes if we want to use slashes for paths
if (isWindows) {
if (isAbsolute(folder.path)) {
if (useSlashesForPath) {
folder.path = normalize(folder.path, false /* do not use OS path separator */);
}
folder.path = normalizeDriveLetter(folder.path);
} else if (useSlashesForPath) {
folder.path = folder.path.replace(/[\\]/g, SLASH);
}
}
});
return writeFile(targetConfigPath, JSON.stringify(storedWorkspace, null, '\t')).then(() => {
// Preserve as much of the existing workspace as possible by using jsonEdit
// and only changing the folders portion.
let newRawWorkspaceContents = rawWorkspaceContents;
const edits = jsonEdit.setProperty(rawWorkspaceContents, ['folders'], storedWorkspace.folders, { insertSpaces: false, tabSize: 4, eol: (isLinux || isMacintosh) ? '\n' : '\r\n' });
edits.forEach(edit => {
newRawWorkspaceContents = applyEdit(rawWorkspaceContents, edit);
});
return writeFile(targetConfigPath, newRawWorkspaceContents).then(() => {
const savedWorkspaceIdentifier = { id: this.getWorkspaceId(targetConfigPath), configPath: targetConfigPath };
// Event

View file

@ -245,6 +245,32 @@ suite('WorkspacesMainService', () => {
});
});
test('saveWorkspace (saved workspace, preserves comments)', done => {
return service.createWorkspace([process.cwd(), os.tmpdir(), path.join(os.tmpdir(), 'somefolder')]).then(workspace => {
const workspaceConfigPath = path.join(os.tmpdir(), `myworkspace.${Date.now()}.${WORKSPACE_EXTENSION}`);
const newWorkspaceConfigPath = path.join(os.tmpdir(), `mySavedWorkspace.${Date.now()}.${WORKSPACE_EXTENSION}`);
return service.saveWorkspace(workspace, workspaceConfigPath).then(savedWorkspace => {
const contents = fs.readFileSync(savedWorkspace.configPath).toString();
fs.writeFileSync(savedWorkspace.configPath, `// this is a comment\n${contents}`);
return service.saveWorkspace(savedWorkspace, newWorkspaceConfigPath).then(newSavedWorkspace => {
assert.ok(newSavedWorkspace.id);
assert.notEqual(newSavedWorkspace.id, workspace.id);
assert.equal(newSavedWorkspace.configPath, newWorkspaceConfigPath);
const savedContents = fs.readFileSync(newSavedWorkspace.configPath).toString();
assert.equal(0, savedContents.indexOf('// this is a comment'));
extfs.delSync(workspaceConfigPath);
extfs.delSync(newWorkspaceConfigPath);
done();
});
});
});
});
test('deleteUntitledWorkspaceSync (untitled)', done => {
return service.createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => {
assert.ok(fs.existsSync(workspace.configPath));

2
src/vs/vscode.d.ts vendored
View file

@ -773,7 +773,7 @@ declare module 'vscode' {
export interface ThemableDecorationRenderOptions {
/**
* Background color of the decoration. Use rgba() and define transparent background colors to play well with other decorations.
* Alternativly a color from the color registry an be [referenced](#ColorIdentifier).
* Alternatively a color from the color registry can be [referenced](#ThemeColor).
*/
backgroundColor?: string | ThemeColor;

View file

@ -20,6 +20,7 @@ import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecyc
import { RemoteFileService } from 'vs/workbench/services/files/electron-browser/remoteFileService';
import { Emitter } from 'vs/base/common/event';
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
import { IExperimentService } from 'vs/platform/telemetry/common/experiments';
@extHostNamedCustomer(MainContext.MainThreadWorkspace)
export class MainThreadWorkspace implements MainThreadWorkspaceShape {
@ -35,6 +36,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
@ITextFileService private readonly _textFileService: ITextFileService,
@IWorkbenchEditorService private readonly _editorService: IWorkbenchEditorService,
@ITextModelService private readonly _textModelResolverService: ITextModelService,
@IExperimentService private experimentService: IExperimentService,
@IFileService private readonly _fileService: IFileService
) {
this._proxy = extHostContext.get(ExtHostContext.ExtHostWorkspace);
@ -70,6 +72,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
maxResults,
includePattern: { [include]: true },
excludePattern: { [exclude]: true },
useRipgrep: this.experimentService.getExperiments().ripgrepQuickSearch
};
this._searchService.extendQuery(query);

View file

@ -35,86 +35,54 @@ import { SIDE_BAR_DRAG_AND_DROP_BACKGROUND, SIDE_BAR_SECTION_HEADER_FOREGROUND,
import { contrastBorder } from 'vs/platform/theme/common/colorRegistry';
export interface IViewOptions {
id: string;
name: string;
actionRunner: IActionRunner;
collapsed: boolean;
}
export interface IViewConstructorSignature {
new(initialSize: number, options: IViewOptions, ...services: { _serviceBrand: any; }[]): IView;
new(initialSize: number, options: IViewOptions, ...services: { _serviceBrand: any; }[]): IViewletView;
}
export interface IView extends IBaseView, IThemable {
export interface IViewletView extends IBaseView, IThemable {
id: string;
name: string;
getHeaderElement(): HTMLElement;
create(): TPromise<void>;
setVisible(visible: boolean): TPromise<void>;
isVisible(): boolean;
getActions(): IAction[];
getSecondaryActions(): IAction[];
getActionItem(action: IAction): IActionItem;
getActionsContext(): any;
showHeader(): boolean;
hideHeader(): boolean;
focusBody(): void;
isExpanded(): boolean;
expand(): void;
collapse(): void;
getOptimalWidth(): number;
shutdown(): void;
}
export interface ICollapsibleViewOptions extends IViewOptions {
ariaHeaderLabel?: string;
sizing: ViewSizing;
initialBodySize?: number;
}
export abstract class CollapsibleView extends AbstractCollapsibleView implements IView {
export abstract class CollapsibleView extends AbstractCollapsibleView implements IViewletView {
readonly id: string;
readonly name: string;
protected treeContainer: HTMLElement;
protected tree: ITree;
protected toDispose: IDisposable[];
protected toolBar: ToolBar;
protected actionRunner: IActionRunner;
protected isDisposed: boolean;
private _isVisible: boolean;
private dragHandler: DelayedDragHandler;
constructor(
@ -144,7 +112,7 @@ export abstract class CollapsibleView extends AbstractCollapsibleView implements
get draggableLabel(): string { return this.name; }
public create(): TPromise<void> {
create(): TPromise<void> {
return TPromise.as(null);
}
@ -152,7 +120,7 @@ export abstract class CollapsibleView extends AbstractCollapsibleView implements
return this.header;
}
public renderHeader(container: HTMLElement): void {
renderHeader(container: HTMLElement): void {
// Tool bar
this.toolBar = new ToolBar($('div.actions').appendTo(container).getHTMLElement(), this.contextMenuService, {
@ -184,15 +152,15 @@ export abstract class CollapsibleView extends AbstractCollapsibleView implements
return treeContainer;
}
public getViewer(): ITree {
getViewer(): ITree {
return this.tree;
}
public isVisible(): boolean {
isVisible(): boolean {
return this._isVisible;
}
public setVisible(visible: boolean): TPromise<void> {
setVisible(visible: boolean): TPromise<void> {
if (this._isVisible !== visible) {
this._isVisible = visible;
this.updateTreeVisibility(this.tree, visible && this.state === CollapsibleState.EXPANDED);
@ -201,7 +169,7 @@ export abstract class CollapsibleView extends AbstractCollapsibleView implements
return TPromise.as(null);
}
public focusBody(): void {
focusBody(): void {
this.focusTree();
}
@ -213,38 +181,38 @@ export abstract class CollapsibleView extends AbstractCollapsibleView implements
return this.tree.reveal(element, relativeTop);
}
public layoutBody(size: number): void {
layoutBody(size: number): void {
if (this.tree) {
this.treeContainer.style.height = size + 'px';
this.tree.layout(size);
}
}
public getActions(): IAction[] {
getActions(): IAction[] {
return [];
}
public getSecondaryActions(): IAction[] {
getSecondaryActions(): IAction[] {
return [];
}
public getActionItem(action: IAction): IActionItem {
getActionItem(action: IAction): IActionItem {
return null;
}
public getActionsContext(): any {
getActionsContext(): any {
return undefined;
}
public shutdown(): void {
shutdown(): void {
// Subclass to implement
}
public getOptimalWidth(): number {
getOptimalWidth(): number {
return 0;
}
public dispose(): void {
dispose(): void {
this.isDisposed = true;
this.treeContainer = null;
@ -300,33 +268,24 @@ export abstract class CollapsibleView extends AbstractCollapsibleView implements
}
export interface IViewletViewOptions extends IViewOptions {
viewletSettings: object;
}
export interface IViewState {
collapsed: boolean;
size: number | undefined;
isHidden: boolean;
order: number;
}
export class ViewsViewlet extends Viewlet {
protected viewletContainer: HTMLElement;
protected lastFocusedView: IView;
protected lastFocusedView: IViewletView;
private splitView: SplitView;
private viewHeaderContextMenuListeners: IDisposable[] = [];
protected dimension: Dimension;
private viewletSettings: object;
private readonly viewsContextKeys: Set<string> = new Set<string>();
protected viewsStates: Map<string, IViewState> = new Map<string, IViewState>();
private areExtensionsReady: boolean = false;
@ -339,7 +298,6 @@ export class ViewsViewlet extends Viewlet {
@IStorageService protected storageService: IStorageService,
@IInstantiationService protected instantiationService: IInstantiationService,
@IThemeService themeService: IThemeService,
@IWorkspaceContextService protected contextService: IWorkspaceContextService,
@IContextKeyService protected contextKeyService: IContextKeyService,
@IContextMenuService protected contextMenuService: IContextMenuService,
@IExtensionService extensionService: IExtensionService
@ -358,15 +316,15 @@ export class ViewsViewlet extends Viewlet {
});
}
public create(parent: Builder): TPromise<void> {
create(parent: Builder): TPromise<void> {
super.create(parent);
this.viewletContainer = DOM.append(parent.getHTMLElement(), DOM.$(''));
this.splitView = this._register(new SplitView(this.viewletContainer, { canChangeOrderByDragAndDrop: true }));
this.attachSplitViewStyler(this.splitView);
this._register(this.splitView.onFocus((view: IView) => this.lastFocusedView = view));
this._register(this.splitView.onFocus((view: IViewletView) => this.lastFocusedView = view));
this._register(this.splitView.onDidOrderChange(() => {
const views = this.splitView.getViews<IView>();
const views = this.splitView.getViews<IViewletView>();
for (let order = 0; order < views.length; order++) {
this.viewsStates.get(views[order].id).order = order;
}
@ -374,34 +332,34 @@ export class ViewsViewlet extends Viewlet {
return this.onViewsRegistered(ViewsRegistry.getViews(this.location))
.then(() => {
this.lastFocusedView = this.splitView.getViews<IView>()[0];
this.lastFocusedView = this.splitView.getViews<IViewletView>()[0];
this.focus();
});
}
public getTitle(): string {
getTitle(): string {
let title = Registry.as<ViewletRegistry>(Extensions.Viewlets).getViewlet(this.getId()).name;
if (this.showHeaderInTitleArea() && this.splitView.getViews<IView>()[0]) {
title += ': ' + this.splitView.getViews<IView>()[0].name;
if (this.showHeaderInTitleArea() && this.splitView.getViews<IViewletView>()[0]) {
title += ': ' + this.splitView.getViews<IViewletView>()[0].name;
}
return title;
}
public getActions(): IAction[] {
if (this.showHeaderInTitleArea() && this.splitView.getViews<IView>()[0]) {
return this.splitView.getViews<IView>()[0].getActions();
getActions(): IAction[] {
if (this.showHeaderInTitleArea() && this.splitView.getViews<IViewletView>()[0]) {
return this.splitView.getViews<IViewletView>()[0].getActions();
}
return [];
}
public getSecondaryActions(): IAction[] {
if (this.showHeaderInTitleArea() && this.splitView.getViews<IView>()[0]) {
return this.splitView.getViews<IView>()[0].getSecondaryActions();
getSecondaryActions(): IAction[] {
if (this.showHeaderInTitleArea() && this.splitView.getViews<IViewletView>()[0]) {
return this.splitView.getViews<IViewletView>()[0].getSecondaryActions();
}
return [];
}
public getContextMenuActions(): IAction[] {
getContextMenuActions(): IAction[] {
return this.getViewDescriptorsFromRegistry(true)
.filter(viewDescriptor => viewDescriptor.canToggleVisibility && this.contextKeyService.contextMatchesRules(viewDescriptor.when))
.map(viewDescriptor => (<IAction>{
@ -413,14 +371,14 @@ export class ViewsViewlet extends Viewlet {
}));
}
public setVisible(visible: boolean): TPromise<void> {
setVisible(visible: boolean): TPromise<void> {
return super.setVisible(visible)
.then(() => TPromise.join(this.splitView.getViews<IView>().filter(view => view.isVisible() !== visible)
.then(() => TPromise.join(this.splitView.getViews<IViewletView>().filter(view => view.isVisible() !== visible)
.map((view) => view.setVisible(visible))))
.then(() => void 0);
}
public focus(): void {
focus(): void {
super.focus();
if (this.lastFocusedView) {
@ -430,26 +388,26 @@ export class ViewsViewlet extends Viewlet {
}
}
public layout(dimension: Dimension): void {
layout(dimension: Dimension): void {
this.dimension = dimension;
this.layoutViews();
}
public getOptimalWidth(): number {
getOptimalWidth(): number {
const additionalMargin = 16;
const optimalWidth = Math.max(...this.splitView.getViews<IView>().map(view => view.getOptimalWidth() || 0));
const optimalWidth = Math.max(...this.splitView.getViews<IViewletView>().map(view => view.getOptimalWidth() || 0));
return optimalWidth + additionalMargin;
}
public shutdown(): void {
this.splitView.getViews<IView>().forEach((view) => view.shutdown());
shutdown(): void {
this.splitView.getViews<IViewletView>().forEach((view) => view.shutdown());
super.shutdown();
}
private layoutViews(): void {
if (this.splitView) {
this.splitView.layout(this.dimension.height);
for (const view of this.splitView.getViews<IView>()) {
for (const view of this.splitView.getViews<IViewletView>()) {
let viewState = this.updateViewStateSize(view);
this.viewsStates.set(view.id, viewState);
}
@ -470,7 +428,7 @@ export class ViewsViewlet extends Viewlet {
this.updateViews();
}
private onViewsRegistered(views: IViewDescriptor[]): TPromise<IView[]> {
private onViewsRegistered(views: IViewDescriptor[]): TPromise<IViewletView[]> {
this.viewsContextKeys.clear();
for (const viewDescriptor of this.getViewDescriptorsFromRegistry()) {
if (viewDescriptor.when) {
@ -483,7 +441,7 @@ export class ViewsViewlet extends Viewlet {
return this.updateViews();
}
private onViewsDeregistered(views: IViewDescriptor[]): TPromise<IView[]> {
private onViewsDeregistered(views: IViewDescriptor[]): TPromise<IViewletView[]> {
return this.updateViews(views);
}
@ -505,7 +463,7 @@ export class ViewsViewlet extends Viewlet {
}
}
protected updateViews(unregisteredViews: IViewDescriptor[] = []): TPromise<IView[]> {
protected updateViews(unregisteredViews: IViewDescriptor[] = []): TPromise<IViewletView[]> {
if (this.splitView) {
const registeredViews = this.getViewDescriptorsFromRegistry();
@ -529,10 +487,10 @@ export class ViewsViewlet extends Viewlet {
}, [[], [], unregisteredViews]);
const toCreate: IView[] = [];
const toCreate: IViewletView[] = [];
if (toAdd.length || toRemove.length) {
for (const view of this.splitView.getViews<IView>()) {
for (const view of this.splitView.getViews<IViewletView>()) {
let viewState = this.viewsStates.get(view.id);
if (!viewState || typeof viewState.size === 'undefined' || view.size !== viewState.size || !view.isExpanded() !== viewState.collapsed) {
viewState = this.updateViewStateSize(view);
@ -564,7 +522,7 @@ export class ViewsViewlet extends Viewlet {
toCreate.push(view);
this.attachViewStyler(view);
this.splitView.addView(view, viewState && viewState.size ? Math.max(viewState.size, 1) : viewDescriptor.size, index);
this.splitView.addView(view, index);
}
return TPromise.join(toCreate.map(view => view.create()))
@ -611,14 +569,14 @@ export class ViewsViewlet extends Viewlet {
}
if (this.showHeaderInTitleArea()) {
if (this.splitView.getViews<IView>()[0]) {
this.splitView.getViews<IView>()[0].hideHeader();
if (!this.splitView.getViews<IView>()[0].isExpanded()) {
this.splitView.getViews<IView>()[0].expand();
if (this.splitView.getViews<IViewletView>()[0]) {
this.splitView.getViews<IViewletView>()[0].hideHeader();
if (!this.splitView.getViews<IViewletView>()[0].isExpanded()) {
this.splitView.getViews<IViewletView>()[0].expand();
}
}
} else {
for (const view of this.splitView.getViews<IView>()) {
for (const view of this.splitView.getViews<IViewletView>()) {
view.showHeader();
}
}
@ -647,7 +605,7 @@ export class ViewsViewlet extends Viewlet {
return this.setVisible(this.isVisible());
}
private onContextMenu(event: StandardMouseEvent, view: IView): void {
private onContextMenu(event: StandardMouseEvent, view: IViewletView): void {
event.stopPropagation();
event.preventDefault();
@ -667,7 +625,7 @@ export class ViewsViewlet extends Viewlet {
if (!this.showHeaderInTitleWhenSingleView) {
return false;
}
if (this.splitView.getViews<IView>().length > 1) {
if (this.splitView.getViews<IViewletView>().length > 1) {
return false;
}
if (ViewLocation.getContributedViewLocation(this.location.id) && !this.areExtensionsReady) {
@ -705,32 +663,32 @@ export class ViewsViewlet extends Viewlet {
});
}
protected createView(viewDescriptor: IViewDescriptor, initialSize: number, options: IViewletViewOptions): IView {
protected createView(viewDescriptor: IViewDescriptor, initialSize: number, options: IViewletViewOptions): IViewletView {
return this.instantiationService.createInstance(viewDescriptor.ctor, initialSize, options);
}
protected get views(): IView[] {
return this.splitView ? this.splitView.getViews<IView>() : [];
protected get views(): IViewletView[] {
return this.splitView ? this.splitView.getViews<IViewletView>() : [];
}
protected getView(id: string): IView {
return this.splitView.getViews<IView>().filter(view => view.id === id)[0];
protected getView(id: string): IViewletView {
return this.splitView.getViews<IViewletView>().filter(view => view.id === id)[0];
}
private updateViewStateSize(view: IView): IViewState {
private updateViewStateSize(view: IViewletView): IViewState {
const currentState = this.viewsStates.get(view.id);
const newViewState = this.createViewState(view);
return currentState ? { ...currentState, collapsed: newViewState.collapsed, size: newViewState.size } : newViewState;
}
protected createViewState(view: IView): IViewState {
protected createViewState(view: IViewletView): IViewState {
const collapsed = !view.isExpanded();
const size = collapsed && view instanceof CollapsibleView ? view.previousSize : view.size;
return {
collapsed,
size: size && size > 0 ? size : void 0,
isHidden: false,
order: this.splitView.getViews<IView>().indexOf(view)
order: this.splitView.getViews<IViewletView>().indexOf(view)
};
}
}
@ -746,12 +704,12 @@ export class PersistentViewsViewlet extends ViewsViewlet {
@IStorageService storageService: IStorageService,
@IInstantiationService instantiationService: IInstantiationService,
@IThemeService themeService: IThemeService,
@IWorkspaceContextService contextService: IWorkspaceContextService,
@IWorkspaceContextService protected contextService: IWorkspaceContextService,
@IContextKeyService contextKeyService: IContextKeyService,
@IContextMenuService contextMenuService: IContextMenuService,
@IExtensionService extensionService: IExtensionService
) {
super(id, location, showHeaderInTitleWhenSingleView, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService);
super(id, location, showHeaderInTitleWhenSingleView, telemetryService, storageService, instantiationService, themeService, contextKeyService, contextMenuService, extensionService);
this.loadViewsStates();
}

View file

@ -613,7 +613,7 @@ export class Process implements IProcess {
}
public clearThreads(removeThreads: boolean, reference: number = undefined): void {
if (reference) {
if (reference !== undefined && reference !== null) {
if (this.threads.has(reference)) {
const thread = this.threads.get(reference);
thread.clearCallStack();

View file

@ -365,7 +365,7 @@ export class DebugEditorContribution implements IDebugEditorContribution {
// First call stack frame that is available is the frame where exception has been thrown
const exceptionSf = first(callStack, sf => sf.source && sf.source.available, undefined);
if (!exceptionSf) {
if (!exceptionSf || exceptionSf !== focusedSf) {
this.closeExceptionWidget();
return;
}

View file

@ -254,7 +254,8 @@ export class DebugHoverWidget implements IContentWidget {
this.valueContainer.hidden = false;
renderExpressionValue(expression, this.valueContainer, {
showChanged: false,
preserveWhitespace: true
preserveWhitespace: true,
colorize: true
});
this.valueContainer.title = '';
this.editor.layoutContentWidget(this);

View file

@ -48,6 +48,7 @@ export interface IRenderValueOptions {
showChanged?: boolean;
maxValueLength?: number;
showHover?: boolean;
colorize?: boolean;
}
function replaceWhitespace(value: string): string {
@ -66,12 +67,16 @@ export function renderExpressionValue(expressionOrValue: debug.IExpression | str
if (value !== Expression.DEFAULT_VALUE) {
dom.addClass(container, 'error');
}
} else if (!isNaN(+value)) {
dom.addClass(container, 'number');
} else if (booleanRegex.test(value)) {
dom.addClass(container, 'boolean');
} else if (stringRegex.test(value)) {
dom.addClass(container, 'string');
}
if (options.colorize) {
if (!isNaN(+value)) {
dom.addClass(container, 'number');
} else if (booleanRegex.test(value)) {
dom.addClass(container, 'boolean');
} else if (stringRegex.test(value)) {
dom.addClass(container, 'string');
}
}
if (options.showChanged && (<any>expressionOrValue).valueChanged && value !== Expression.DEFAULT_VALUE) {
@ -104,7 +109,8 @@ export function renderVariable(tree: ITree, variable: Variable, data: IVariableT
showChanged,
maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET,
preserveWhitespace: false,
showHover: true
showHover: true,
colorize: true
});
} else {
data.value.textContent = '';
@ -209,7 +215,7 @@ export class BaseDebugController extends DefaultController {
this.contributedContextMenu = menuService.createMenu(menuId, contextKeyService);
}
public onContextMenu(tree: ITree, element: debug.IEnablement, event: ContextMenuEvent): boolean {
public onContextMenu(tree: ITree, element: debug.IEnablement, event: ContextMenuEvent, focusElement = true): boolean {
if (event.target && event.target.tagName && event.target.tagName.toLowerCase() === 'input') {
return false;
}
@ -217,7 +223,9 @@ export class BaseDebugController extends DefaultController {
event.preventDefault();
event.stopPropagation();
tree.setFocus(element);
if (focusElement) {
tree.setFocus(element);
}
if (this.actionProvider.hasSecondaryActions(tree, element)) {
const anchor = { x: event.posx, y: event.posy };
@ -942,7 +950,8 @@ export class WatchExpressionsRenderer implements IRenderer {
showChanged: true,
maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET,
preserveWhitespace: false,
showHover: true
showHover: true,
colorize: true
});
data.name.title = watchExpression.type ? watchExpression.type : watchExpression.value;
}

View file

@ -11,7 +11,7 @@ import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar';
import * as dom from 'vs/base/browser/dom';
import severity from 'vs/base/common/severity';
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
import { ITree, IAccessibilityProvider, IDataSource, IRenderer, IActionProvider } from 'vs/base/parts/tree/browser/tree';
import { ITree, IAccessibilityProvider, ContextMenuEvent, IDataSource, IRenderer, IActionProvider } from 'vs/base/parts/tree/browser/tree';
import { ICancelableEvent } from 'vs/base/parts/tree/browser/treeDefaults';
import { IExpressionContainer, IExpression } from 'vs/workbench/parts/debug/common/debug';
import { Model, OutputNameValueElement, Expression, OutputElement, Variable } from 'vs/workbench/parts/debug/common/debugModel';
@ -431,4 +431,8 @@ export class ReplExpressionsController extends BaseDebugController {
return true;
}
public onContextMenu(tree: ITree, element: any, event: ContextMenuEvent): boolean {
return super.onContextMenu(tree, element, event, false);
}
}

View file

@ -46,7 +46,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService';
import { inputForeground, inputBackground, inputBorder } from 'vs/platform/theme/common/colorRegistry';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { ViewsRegistry, ViewLocation, IViewDescriptor } from 'vs/workbench/browser/parts/views/viewsRegistry';
import { PersistentViewsViewlet, IView } from 'vs/workbench/browser/parts/views/views';
import { PersistentViewsViewlet, IViewletView } from 'vs/workbench/browser/parts/views/views';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { IContextKeyService, ContextKeyExpr, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey';
@ -310,7 +310,7 @@ export class ExtensionsViewlet extends PersistentViewsViewlet implements IExtens
await this.updateViews([], !!value);
}
protected async updateViews(unregisteredViews: IViewDescriptor[] = [], showAll = false): TPromise<IView[]> {
protected async updateViews(unregisteredViews: IViewDescriptor[] = [], showAll = false): TPromise<IViewletView[]> {
const created = await super.updateViews();
const toShow = showAll ? this.views : created;
if (toShow.length) {

View file

@ -12,7 +12,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
import * as DOM from 'vs/base/browser/dom';
import { Builder } from 'vs/base/browser/builder';
import { VIEWLET_ID, ExplorerViewletVisibleContext, IFilesConfiguration, OpenEditorsVisibleContext, OpenEditorsVisibleCondition } from 'vs/workbench/parts/files/common/files';
import { PersistentViewsViewlet, IView, IViewletViewOptions } from 'vs/workbench/browser/parts/views/views';
import { PersistentViewsViewlet, IViewletView, IViewletViewOptions } from 'vs/workbench/browser/parts/views/views';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IConfigurationEditingService } from 'vs/workbench/services/configuration/common/configurationEditing';
import { ActionRunner, FileViewletState } from 'vs/workbench/parts/files/browser/views/explorerViewer';
@ -125,7 +125,7 @@ export class ExplorerViewlet extends PersistentViewsViewlet {
this.openEditorsVisibleContextKey.set(!this.contextService.hasWorkspace() || (<IFilesConfiguration>this.configurationService.getConfiguration()).explorer.openEditors.visible !== 0);
}
protected createView(viewDescriptor: IViewDescriptor, initialSize: number, options: IViewletViewOptions): IView {
protected createView(viewDescriptor: IViewDescriptor, initialSize: number, options: IViewletViewOptions): IViewletView {
if (viewDescriptor.id === ExplorerView.ID) {
// Create a delegating editor service for the explorer to be able to delay the refresh in the opened
// editors view above. This is a workaround for being able to double click on a file to make it pinned
@ -223,7 +223,7 @@ export class ExplorerViewlet extends PersistentViewsViewlet {
super.focus();
}
private hasSelectionOrFocus(view: IView): boolean {
private hasSelectionOrFocus(view: IViewletView): boolean {
if (!view) {
return false;
}

View file

@ -549,7 +549,8 @@ export class FileSorter implements ISorter {
private sortOrder: SortOrder;
constructor(
@IConfigurationService private configurationService: IConfigurationService
@IConfigurationService private configurationService: IConfigurationService,
@IWorkspaceContextService private contextService: IWorkspaceContextService
) {
this.toDispose = [];
@ -570,6 +571,10 @@ export class FileSorter implements ISorter {
// Do not sort roots
if (statA.isRoot) {
if (statB.isRoot) {
const ws = this.contextService.getWorkspace();
return ws.roots.indexOf(statA.resource) - ws.roots.indexOf(statB.resource);
}
return -1;
}
if (statB.isRoot) {

View file

@ -12,7 +12,7 @@ import { chain } from 'vs/base/common/event';
import { onUnexpectedError } from 'vs/base/common/errors';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Builder } from 'vs/base/browser/builder';
import { PersistentViewsViewlet, CollapsibleView, IViewletViewOptions, IView, IViewOptions } from 'vs/workbench/browser/parts/views/views';
import { PersistentViewsViewlet, CollapsibleView, IViewletViewOptions, IViewletView, IViewOptions } from 'vs/workbench/browser/parts/views/views';
import { append, $, toggleClass, trackFocus } from 'vs/base/browser/dom';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { List } from 'vs/base/browser/ui/list/listWidget';
@ -545,14 +545,14 @@ export class SCMViewlet extends PersistentViewsViewlet {
await super.create(parent);
parent.addClass('scm-viewlet', 'empty');
append(parent.getHTMLElement(), $('div.empty-message', null, localize('no open repo', "There are no source controls active.")));
append(parent.getHTMLElement(), $('div.empty-message', null, localize('no open repo', "There are no source control providers active.")));
this.scmService.onDidAddRepository(this.onDidAddRepository, this, this.disposables);
this.scmService.onDidRemoveRepository(this.onDidRemoveRepository, this, this.disposables);
this.scmService.repositories.forEach(p => this.onDidAddRepository(p));
}
protected createView(viewDescriptor: IViewDescriptor, initialSize: number, options: IViewletViewOptions): IView {
protected createView(viewDescriptor: IViewDescriptor, initialSize: number, options: IViewletViewOptions): IViewletView {
if (viewDescriptor instanceof SourceControlViewDescriptor) {
return this.instantiationService.createInstance(SourceControlView, initialSize, viewDescriptor.repository, options);
}

View file

@ -36,11 +36,19 @@ namespace schema {
export function isValidSnippet(extension: IExtensionPointUser<ISnippetsExtensionPoint[]>, snippet: ISnippetsExtensionPoint, modeService: IModeService): boolean {
if (!snippet.language || (typeof snippet.language !== 'string') || !modeService.isRegisteredMode(snippet.language)) {
extension.collector.error(localize('invalid.language', "Unknown language in `contributes.{0}.language`. Provided value: {0}", String(snippet.language)));
extension.collector.error(localize(
'invalid.language',
"Unknown language in `contributes.{0}.language`. Provided value: {1}",
extension.description.name, String(snippet.language)
));
return false;
} else if (!snippet.path || (typeof snippet.path !== 'string')) {
extension.collector.error(localize('invalid.path.0', "Expected string in `contributes.{0}.path`. Provided value: {0}", String(snippet.path)));
extension.collector.error(localize(
'invalid.path.0',
"Expected string in `contributes.{0}.path`. Provided value: {1}",
extension.description.name, String(snippet.path)
));
return false;
} else {

View file

@ -206,7 +206,16 @@ export class TerminalInstance implements ITerminalInstance {
}
const font = this._configHelper.getFont();
this._cols = Math.max(Math.floor(dimension.width / font.charWidth), 1);
this._rows = Math.max(Math.floor(dimension.height / Math.floor(font.charHeight * font.lineHeight)), 1);
// xterm.js does the horizontal space calculation using values scaled
// with window.devicePixelRatio. In these calculations, ceil and floor
// are used which require us to check it on this side as well or we
// would lose that precision.
const scaledSpaceAvailable = dimension.height * window.devicePixelRatio;
const scaledCharHeight = Math.ceil(font.charHeight * window.devicePixelRatio);
const scaledLineHeight = Math.floor(scaledCharHeight * font.lineHeight);
this._rows = Math.floor(scaledSpaceAvailable / scaledLineHeight);
return dimension.width;
}

View file

@ -41,7 +41,7 @@ const lineAndColumnClause = [
// Changing any regex may effect this value, hence changes this as well if required.
const winLineAndColumnMatchIndex = 12;
const unixLineAndColumnMatchIndex = 15;
const unixLineAndColumnMatchIndex = 23;
// Each line and column clause have 6 groups (ie no. of expressions in round brackets)
const lineAndColumnClauseGroupCount = 6;

View file

@ -138,16 +138,16 @@ suite('Workbench - TerminalLinkHandler', () => {
// { urlFormat: '{0} on line {1}, column {2}', line: '5', column: '3' },
// { urlFormat: '{0}:line {1}', line: '5' },
// { urlFormat: '{0}:line {1}, column {2}', line: '5', column: '3' },
// { urlFormat: '{0}({1})', line: '5' },
// { urlFormat: '{0} ({1})', line: '5' },
// { urlFormat: '{0}({1},{2})', line: '5', column: '3' },
// { urlFormat: '{0} ({1},{2})', line: '5', column: '3' },
// { urlFormat: '{0}:{1}', line: '5' },
// { urlFormat: '{0}:{1}:{2}', line: '5', column: '3' },
// { urlFormat: '{0}[{1}]', line: '5' },
// { urlFormat: '{0} [{1}]', line: '5' },
// { urlFormat: '{0}[{1},{2}]', line: '5', column: '3' },
// { urlFormat: '{0} [{1},{2}]', line: '5', column: '3' }
{ urlFormat: '{0}({1})', line: '5' },
{ urlFormat: '{0} ({1})', line: '5' },
{ urlFormat: '{0}({1},{2})', line: '5', column: '3' },
{ urlFormat: '{0} ({1},{2})', line: '5', column: '3' },
{ urlFormat: '{0}:{1}', line: '5' },
{ urlFormat: '{0}:{1}:{2}', line: '5', column: '3' },
{ urlFormat: '{0}[{1}]', line: '5' },
{ urlFormat: '{0} [{1}]', line: '5' },
{ urlFormat: '{0}[{1},{2}]', line: '5', column: '3' },
{ urlFormat: '{0} [{1},{2}]', line: '5', column: '3' }
];
linkUrls.forEach(linkUrl => {

View file

@ -13,7 +13,7 @@ import { equals, coalesce } from 'vs/base/common/arrays';
import * as objects from 'vs/base/common/objects';
import * as errors from 'vs/base/common/errors';
import * as collections from 'vs/base/common/collections';
import { Disposable, toDisposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle';
import { RunOnceScheduler } from 'vs/base/common/async';
import { readFile, stat } from 'vs/base/node/pfs';
import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry';
@ -631,7 +631,7 @@ class WorkspaceConfiguration extends Disposable {
return workspaceConfigurationModel;
}, initCallback: () => c(null)
});
this._workspaceConfigurationWatcherDisposables.push(toDisposable(() => this._workspaceConfigurationWatcher.dispose()));
this._workspaceConfigurationWatcherDisposables.push(this._workspaceConfigurationWatcher);
this._workspaceConfigurationWatcher.onDidUpdateConfiguration(() => this._onDidUpdateConfiguration.fire(), this, this._workspaceConfigurationWatcherDisposables);
});
}

View file

@ -8,7 +8,6 @@ import * as nls from 'vs/nls';
import { IJSONSchema } from 'vs/base/common/jsonSchema';
import { ResolvedKeybinding, Keybinding } from 'vs/base/common/keyCodes';
import { OS, OperatingSystem } from 'vs/base/common/platform';
import { toDisposable } from 'vs/base/common/lifecycle';
import { ExtensionMessageCollector, ExtensionsRegistry } from 'vs/platform/extensions/common/extensionsRegistry';
import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry';
import { AbstractKeybindingService } from 'vs/platform/keybinding/common/abstractKeybindingService';
@ -296,7 +295,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService {
this._firstTimeComputingResolver = true;
this.userKeybindings = new ConfigWatcher(environmentService.appKeybindingsPath, { defaultConfig: [], onError: error => onUnexpectedError(error) });
this.toDispose.push(toDisposable(() => this.userKeybindings.dispose()));
this.toDispose.push(this.userKeybindings);
keybindingsExtPoint.setHandler((extensions) => {
let commandAdded = false;

View file

@ -49,6 +49,7 @@ interface IDirectoryTree {
export class FileWalker {
private config: IRawSearch;
private useRipgrep: boolean;
private filePattern: string;
private normalizedFilePatternLowercase: string;
private includePattern: glob.ParsedExpression;
@ -73,6 +74,7 @@ export class FileWalker {
constructor(config: IRawSearch) {
this.config = config;
this.useRipgrep = config.useRipgrep !== false;
this.filePattern = config.filePattern;
this.includePattern = config.includePattern && glob.parse(config.includePattern);
this.maxResults = config.maxResults || null;
@ -153,7 +155,7 @@ export class FileWalker {
let traverse = this.nodeJSTraversal;
if (!this.maxFilesize) {
if (this.config.useRipgrep) {
if (this.useRipgrep) {
this.traversal = Traversal.Ripgrep;
traverse = this.cmdTraversal;
} else if (platform.isMacintosh) {
@ -216,11 +218,12 @@ export class FileWalker {
let first = true;
const tree = this.initDirectoryTree();
const useRipgrep = this.config.useRipgrep;
const useRipgrep = this.useRipgrep;
let cmd: childProcess.ChildProcess;
let noSiblingsClauses: boolean;
let filePatternSeen = false;
if (useRipgrep) {
const ripgrep = spawnRipgrepCmd(folderQuery, this.config.includePattern, this.folderExcludePatterns.get(folderQuery.folder));
const ripgrep = spawnRipgrepCmd(folderQuery, this.config.includePattern, this.folderExcludePatterns.get(folderQuery.folder).expression);
cmd = ripgrep.cmd;
noSiblingsClauses = !Object.keys(ripgrep.siblingClauses).length;
} else {
@ -236,7 +239,7 @@ export class FileWalker {
// Mac: uses NFD unicode form on disk, but we want NFC
const normalized = leftover + (isMac ? strings.normalizeNFC(stdout) : stdout);
const relativeFiles = normalized.split(useRipgrep ? '\n' : '\n./');
if (first && normalized.length >= 2) {
if (!useRipgrep && first && normalized.length >= 2) {
first = false;
relativeFiles[0] = relativeFiles[0].trim().substr(2);
}
@ -260,11 +263,28 @@ export class FileWalker {
if (useRipgrep && noSiblingsClauses) {
for (const relativePath of relativeFiles) {
if (relativePath === this.filePattern) {
filePatternSeen = true;
}
const basename = path.basename(relativePath);
this.matchFile(onResult, { base: rootFolder, relativePath, basename });
}
if (last) {
done();
if (!filePatternSeen) {
this.checkFilePatternRelativeMatch(folderQuery.folder, (match, size) => {
if (match) {
this.resultCount++;
onResult({
base: folderQuery.folder,
relativePath: this.filePattern,
basename: path.basename(this.filePattern),
});
}
done();
});
} else {
done();
}
}
return;
}
@ -367,7 +387,7 @@ export class FileWalker {
cmd.on('close', (code: number) => {
if (code !== 0) {
done(new Error(`find failed with error code ${code}: ${this.decodeData(stderr, encoding)}`));
done(new Error(`command failed with error code ${code}: ${this.decodeData(stderr, encoding)}`));
} else {
done(null, '', true);
}
@ -710,8 +730,8 @@ class AbsoluteAndRelativeParsedExpression {
private absoluteParsedExpr: glob.ParsedExpression;
private relativeParsedExpr: glob.ParsedExpression;
constructor(expr: glob.IExpression, private root: string) {
this.init(expr);
constructor(public expression: glob.IExpression, private root: string) {
this.init(expression);
}
/**

View file

@ -83,6 +83,7 @@ export class SearchService implements IRawSearchService {
includePattern: config.includePattern,
excludePattern: config.excludePattern,
filePattern: config.filePattern,
useRipgrep: false,
maxFilesize: MAX_FILE_SIZE
}),
this.textSearchWorkerProvider);

View file

@ -6,7 +6,9 @@
import * as cp from 'child_process';
import { rgPath } from 'vscode-ripgrep';
import { isMacintosh as isMac } from 'vs/base/common/platform';
import * as glob from 'vs/base/common/glob';
import { normalizeNFD } from 'vs/base/common/strings';
import { IFolderSearch } from './search';
import { foldersToIncludeGlobs, foldersToRgExcludeGlobs } from './ripgrepTextSearch';
@ -24,14 +26,14 @@ function getRgArgs(folderQuery: IFolderSearch, includePattern: glob.IExpression,
// includePattern can't have siblingClauses
foldersToIncludeGlobs([folderQuery], includePattern, false).forEach(globArg => {
args.push('-g', globArg);
args.push('-g', isMac ? normalizeNFD(globArg) : globArg);
});
let siblingClauses: glob.IExpression;
const rgGlobs = foldersToRgExcludeGlobs([folderQuery], excludePattern, undefined, false);
rgGlobs.globArgs
.forEach(rgGlob => args.push('-g', `!${rgGlob}`));
.forEach(rgGlob => args.push('-g', `!${isMac ? normalizeNFD(rgGlob) : rgGlob}`));
siblingClauses = rgGlobs.siblingClauses;
// Don't use .gitignore or .ignore

View file

@ -37,7 +37,7 @@ const textSearchWorkerProvider = new TextSearchWorkerProvider();
function doLegacySearchTest(config: IRawSearch, expectedResultCount: number | Function): TPromise<void> {
return new TPromise<void>((resolve, reject) => {
let engine = new TextSearchEngine(config, new FileWalker(config), textSearchWorkerProvider);
let engine = new TextSearchEngine(config, new FileWalker({ ...config, useRipgrep: false }), textSearchWorkerProvider);
let c = 0;
engine.search((result) => {

View file

@ -15,10 +15,10 @@ describe('CSS', () => {
it('verifies quick outline', async () => {
await app.workbench.quickopen.openFile('style.css');
const outline = await app.workbench.editor.openOutline();
const elements = await outline.getQuickOpenElements();
await app.screenCapturer.capture('CSS Outline result');
assert.equal(elements.length, 2, `Did not find two outline elements`);
await outline.waitForQuickOpenElements(2);
});
it('verifies warnings for the empty rule', async () => {

View file

@ -115,7 +115,7 @@ describe('Debug', () => {
});
it('debug console', async function () {
const result = await app.workbench.debug.console('2 + 2 \n', 'number');
const result = await app.workbench.debug.console('2 + 2 \n');
assert.equal(result, '4');
});

View file

@ -24,7 +24,7 @@ const TOOLBAR_HIDDEN = `.debug-actions-widget.builder-hidden`;
const STACK_FRAME = `${VIEWLET} .monaco-tree-row .stack-frame`;
const VARIABLE = `${VIEWLET} .debug-variables .monaco-tree-row .expression`;
const CONSOLE_OUTPUT = `.repl .output.expression`;
const CONSOLE_INPUT_OUTPUT = `.repl .input-output-pair .output.expression`;
const CONSOLE_INPUT_OUTPUT = `.repl .input-output-pair .output.expression .value`;
const SCOPE = `${VIEWLET} .debug-variables .scope`;
const REPL_FOCUSED = '.repl-input-wrapper .monaco-editor.focused';
@ -103,11 +103,11 @@ export class Debug extends Viewlet {
await this.spectron.workbench.waitForOpen(name);
}
async console(text: string, type: string): Promise<string> {
await this.spectron.workbench.commandPallette.runCommand('Debug: Focus Debug Console');
async console(text: string): Promise<string> {
await this.spectron.workbench.quickopen.runCommand('Debug: Focus Debug Console');
await this.spectron.client.waitForElement(REPL_FOCUSED);
await this.spectron.client.type(text);
await this.spectron.client.waitForElement(CONSOLE_INPUT_OUTPUT + ` .${type}`);
await this.spectron.client.waitForElement(CONSOLE_INPUT_OUTPUT);
const result = await this.getConsoleOutput();
return result[result.length - 1] || '';

View file

@ -18,9 +18,7 @@ describe('Editor', () => {
const outline = await app.workbench.editor.openOutline();
const symbols = await outline.getQuickOpenElements();
await app.screenCapturer.capture('Javascript Outline result');
assert.equal(symbols.length, 12, 'Quick outline elements count does not match to expected.');
await outline.waitForQuickOpenElements(12);
});
it(`finds 'All References' to 'app'`, async function () {

View file

@ -35,7 +35,7 @@ export class Editor {
public async findReferences(term: string, line: number): Promise<References> {
await this.clickOnTerm(term, line);
await this.spectron.workbench.commandPallette.runCommand('Find All References');
await this.spectron.workbench.quickopen.runCommand('Find All References');
const references = new References(this.spectron);
await references.waitUntilOpen();
return references;
@ -43,7 +43,7 @@ export class Editor {
public async rename(term: string, line: number): Promise<Rename> {
await this.clickOnTerm(term, line);
await this.spectron.workbench.commandPallette.runCommand('Rename Symbol');
await this.spectron.workbench.quickopen.runCommand('Rename Symbol');
const rename = new Rename(term, this.spectron);
await rename.waitUntilOpen();
return rename;
@ -51,12 +51,12 @@ export class Editor {
public async gotoDefinition(term: string, line: number): Promise<void> {
await this.clickOnTerm(term, line);
await this.spectron.workbench.commandPallette.runCommand('Go to Definition');
await this.spectron.workbench.quickopen.runCommand('Go to Definition');
}
public async peekDefinition(term: string, line: number): Promise<References> {
await this.clickOnTerm(term, line);
await this.spectron.workbench.commandPallette.runCommand('Peek Definition');
await this.spectron.workbench.quickopen.runCommand('Peek Definition');
const peek = new References(this.spectron);
await peek.waitUntilOpen();
return peek;

View file

@ -3,7 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { SpectronApplication } from '../../spectron/application';
describe('Explorer', () => {
@ -14,22 +13,19 @@ describe('Explorer', () => {
it('quick open search produces correct result', async function () {
await app.workbench.quickopen.openQuickOpen();
await app.client.type('.js');
const elements = await app.workbench.quickopen.getQuickOpenElements();
await app.client.keys(['Escape', 'NULL']);
await app.screenCapturer.capture('Quick open result');
assert.equal(elements.length, 7, 'There are 7 elements in quick open');
await app.client.type('.js');
await app.workbench.quickopen.waitForQuickOpenElements(7);
await app.client.keys(['Escape', 'NULL']);
});
it('quick open respects fuzzy matching', async function () {
await app.workbench.quickopen.openQuickOpen();
await app.client.type('a.s');
const elements = await app.workbench.quickopen.getQuickOpenElements();
await app.workbench.quickopen.waitForQuickOpenElements(3);
await app.client.keys(['Escape', 'NULL']);
await app.screenCapturer.capture('fuzzy match result');
assert.equal(elements.length, 3, 'There are 3 elements in quick open');
});
});

View file

@ -22,7 +22,7 @@ describe('Extensions', () => {
await app.reload();
await app.workbench.extensions.waitForExtensionsViewlet();
await app.workbench.commandPallette.runCommand('Smoke Test Check');
await app.workbench.quickopen.runCommand('Smoke Test Check');
const statusbarText = await app.workbench.statusbar.getStatusbarTextByTitle('smoke test');
await app.screenCapturer.capture('Statusbar');

View file

@ -68,7 +68,7 @@ describe('Git', () => {
await app.workbench.scm.commit('first commit');
await app.client.waitForText(SYNC_STATUSBAR, ' 0↓ 1↑');
await app.workbench.commandPallette.runCommand('Git: Stage All Changes');
await app.workbench.quickopen.runCommand('Git: Stage All Changes');
await app.workbench.scm.waitForChange(c => c.name === 'index.jade' && c.type === 'Index Modified');
await app.workbench.scm.commit('second commit');

View file

@ -5,7 +5,6 @@
import * as assert from 'assert';
import { SpectronApplication, CODE_WORKSPACE_PATH, VSCODE_BUILD } from '../../spectron/application';
import { QuickOpen } from '../quickopen/quickopen';
import { Window } from '../window';
describe('Multi Root', () => {
@ -19,12 +18,11 @@ describe('Multi Root', () => {
beforeEach(function () { app.screenCapturer.testName = this.currentTest.title; });
it('shows results from all folders', async function () {
let quickOpen = new QuickOpen(app);
await quickOpen.openQuickOpen();
await app.client.type('*.*');
const elements = await quickOpen.getQuickOpenElements();
await app.screenCapturer.capture('quick open result');
assert.equal(elements.length, 6);
await app.workbench.quickopen.openQuickOpen();
await app.workbench.quickopen.type('*.*');
await app.workbench.quickopen.waitForQuickOpenElements(6);
});
it('shows workspace name in title', async function () {

View file

@ -8,6 +8,10 @@ import { Element } from 'webdriverio';
export class QuickOpen {
static QUICK_OPEN_HIDDEN = 'div.quick-open-widget[aria-hidden="true"]';
static QUICK_OPEN = 'div.quick-open-widget[aria-hidden="false"]';
static QUICK_OPEN_FOCUSSED_INPUT = `${QuickOpen.QUICK_OPEN} .quick-open-input input:focus`;
static QUICK_OPEN_FOCUSED_ELEMENT = `${QuickOpen.QUICK_OPEN} .quick-open-tree .monaco-tree-row.focused .monaco-highlighted-label`;
static QUICK_OPEN_ENTRY_SELECTOR = 'div[aria-label="Quick Picker"] .monaco-tree-rows.show-twisties .monaco-tree-row .quick-open-entry';
constructor(readonly spectron: SpectronApplication) {
@ -18,18 +22,34 @@ export class QuickOpen {
await this.waitForQuickOpenOpened();
}
public async openCommandPallette(): Promise<void> {
await this.spectron.command('workbench.action.showCommands');
await this.waitForQuickOpenOpened();
}
public async closeQuickOpen(): Promise<void> {
await this.spectron.command('workbench.action.closeQuickOpen');
await this.waitForQuickOpenClosed();
}
public async type(text: string): Promise<void> {
let prefix = await this.spectron.client.getValue(QuickOpen.QUICK_OPEN_FOCUSSED_INPUT);
await this.spectron.client.type(text);
await this.spectron.client.waitForValue(QuickOpen.QUICK_OPEN_FOCUSSED_INPUT, prefix + text);
}
public async getQuickOpenElements(): Promise<Element[]> {
return this.spectron.client.waitForElements(QuickOpen.QUICK_OPEN_ENTRY_SELECTOR);
}
public async waitForQuickOpenElements(count: number): Promise<Element[]> {
return this.spectron.client.waitForElements(QuickOpen.QUICK_OPEN_ENTRY_SELECTOR, elements => elements && elements.length === count);
}
public async openFile(fileName: string): Promise<void> {
await this.openQuickOpen();
await this.spectron.client.type(fileName);
await this.type(fileName);
await this.getQuickOpenElements();
await this.spectron.client.keys(['Enter', 'NULL']);
await this.spectron.client.waitForElement(`.tabs-container div[aria-selected="true"][aria-label="${fileName}, tab"]`);
@ -37,12 +57,25 @@ export class QuickOpen {
await this.spectron.workbench.waitForEditorFocus(fileName);
}
public async runCommand(commandText: string): Promise<void> {
await this.openCommandPallette();
// type the text
await this.type(commandText);
// wait for best choice to be focused
await this.spectron.client.waitForTextContent(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT, commandText);
// wait and click on best choice
await this.spectron.client.waitAndClick(QuickOpen.QUICK_OPEN_FOCUSED_ELEMENT);
}
protected waitForQuickOpenOpened(): Promise<Element> {
return this.spectron.client.waitForElement('.quick-open-widget .quick-open-input input:focus');
return this.spectron.client.waitForElement(QuickOpen.QUICK_OPEN_FOCUSSED_INPUT);
}
protected waitForQuickOpenClosed(): Promise<Element> {
return this.spectron.client.waitForElement('div.quick-open-widget[aria-hidden="true"]');
return this.spectron.client.waitForElement(QuickOpen.QUICK_OPEN_HIDDEN);
}
public async isQuickOpenVisible(): Promise<boolean> {

View file

@ -16,7 +16,7 @@ export class Terminal {
public async showTerminal(): Promise<void> {
if (!await this.isVisible()) {
await this.spectron.workbench.commandPallette.runCommand('View: Toggle Integrated Terminal');
await this.spectron.workbench.quickopen.runCommand('View: Toggle Integrated Terminal');
await this.spectron.client.waitForElement(Terminal.TERMINAL_CURSOR);
await this.waitForTerminalText(text => text.length > 0, 'Waiting for Terminal to be ready');
}

View file

@ -1,32 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { QuickOpen } from '../quickopen/quickopen';
const QUICK_OPEN_INPUT = '.quick-open-widget .quick-open-input input';
const QUICK_OPEN_FOCUSED_ELEMENT = '.quick-open-widget .quick-open-tree .monaco-tree-row.focused .monaco-highlighted-label';
export class CommandPallette extends QuickOpen {
public async runCommand(commandText: string): Promise<void> {
// run command
await this.spectron.command('workbench.action.showCommands');
// wait for quick open
await this.waitForQuickOpenOpened();
// type the text
await this.spectron.client.keys([commandText, 'NULL']);
// wait for text to be in input box
await this.spectron.client.waitForValue(QUICK_OPEN_INPUT, `>${commandText}`);
// wait for best choice to be focused
await this.spectron.client.waitForTextContent(QUICK_OPEN_FOCUSED_ELEMENT, commandText);
// wait and click on best choice
await this.spectron.client.waitAndClick(QUICK_OPEN_FOCUSED_ELEMENT);
}
}

View file

@ -16,21 +16,24 @@ describe('Dataloss', () => {
const textToType = 'Hello, Code', textToTypeInUntitled = 'Hello, Unitled Code', fileName = 'readme.md', untitled = 'Untitled-1';
await app.workbench.newUntitledFile();
await app.client.type(textToTypeInUntitled);
await app.screenCapturer.capture('Untitled file before reload');
await app.workbench.explorer.openFile(fileName);
await app.client.type(textToType);
await app.screenCapturer.capture(`${fileName} before reload`);
await app.screenCapturer.capture('Before reload');
await app.reload();
await app.screenCapturer.capture('After reload');
await app.workbench.waitForActiveOpen(fileName, true);
await app.screenCapturer.capture(`${fileName} after reload`);
let actual = await app.workbench.editor.getEditorFirstLineText();
await app.screenCapturer.capture(fileName + ' text');
assert.ok(actual.startsWith(textToType), `${actual} did not start with ${textToType}`);
await app.workbench.waitForOpen(untitled, true);
await app.workbench.selectTab('Untitled-1', true);
await app.screenCapturer.capture('Untitled file after reload');
actual = await app.workbench.editor.getEditorFirstLineText();
await app.screenCapturer.capture('Untitled file text');
assert.ok(actual.startsWith(textToTypeInUntitled), `${actual} did not start with ${textToTypeInUntitled}`);
});
});

View file

@ -8,7 +8,6 @@ import { Explorer } from '../explorer/explorer';
import { ActivityBar } from '../activitybar/activityBar';
import { QuickOpen } from '../quickopen/quickopen';
import { Extensions } from '../extensions/extensions';
import { CommandPallette } from './commandPallette';
import { Search } from '../search/search';
import { Editor } from '../editor/editor';
import { SCM } from '../git/scm';
@ -23,7 +22,6 @@ export class Workbench {
readonly explorer: Explorer;
readonly activitybar: ActivityBar;
readonly commandPallette: CommandPallette;
readonly quickopen: QuickOpen;
readonly search: Search;
readonly extensions: Extensions;
@ -40,7 +38,6 @@ export class Workbench {
this.explorer = new Explorer(spectron);
this.activitybar = new ActivityBar(spectron);
this.quickopen = new QuickOpen(spectron);
this.commandPallette = new CommandPallette(spectron);
this.search = new Search(spectron);
this.extensions = new Extensions(spectron);
this.editor = new Editor(spectron);

View file

@ -101,10 +101,10 @@ function getKeybindingPlatform(): string {
function toUri(path: string): string {
if (process.platform === 'win32') {
return `file:///${path.replace(/\\/g, '/')}`;
return `${path.replace(/\\/g, '/')}`;
}
return `file://${path}`;
return `${path}`;
}
async function setup(): Promise<void> {
@ -127,11 +127,16 @@ async function setup(): Promise<void> {
if (!fs.existsSync(workspacePath)) {
console.log('*** Creating workspace file...');
const workspace = {
id: (Date.now() + Math.round(Math.random() * 1000)).toString(),
folders: [
toUri(path.join(testRepoLocalDir, 'public')),
toUri(path.join(testRepoLocalDir, 'routes')),
toUri(path.join(testRepoLocalDir, 'views'))
{
path: toUri(path.join(testRepoLocalDir, 'public'))
},
{
path: toUri(path.join(testRepoLocalDir, 'routes'))
},
{
path: toUri(path.join(testRepoLocalDir, 'views'))
}
]
};
@ -190,7 +195,7 @@ import './areas/css/css.test';
import './areas/editor/editor.test';
import './areas/debug/debug.test';
import './areas/git/git.test';
import './areas/terminal/terminal.test';
// import './areas/terminal/terminal.test';
import './areas/statusbar/statusbar.test';
import './areas/extensions/extensions.test';
import './areas/workbench/localization.test';

View file

@ -79,7 +79,7 @@ export class SpectronApplication {
}
public async reload(): Promise<any> {
await this.workbench.commandPallette.runCommand('Reload Window');
await this.workbench.quickopen.runCommand('Reload Window');
// TODO @sandy: Find a proper condition to wait for reload
await this.wait(.5);
await this.checkWindowReady();
@ -165,7 +165,7 @@ export class SpectronApplication {
public command(command: string, capture?: boolean): Promise<any> {
const binding = this.keybindings.find(x => x['command'] === command);
if (!binding) {
return this.workbench.commandPallette.runCommand(command);
return this.workbench.quickopen.runCommand(command);
}
const keys: string = binding.key;

View file

@ -391,16 +391,6 @@
}
],
"duplicate-imports": true,
"allow-async": [
true,
[
"node",
"electron-main",
"electron-browser",
"extensions",
"smoke"
]
],
"translation-remind": true
}
}