mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-06 17:23:53 -05:00
Merge from vscode a348d103d1256a06a2c9b3f9b406298a9fef6898 (#15681)
* Merge from vscode a348d103d1256a06a2c9b3f9b406298a9fef6898 * Fixes and cleanup * Distro * Fix hygiene yarn * delete no yarn lock changes file * Fix hygiene * Fix layer check * Fix CI * Skip lib checks * Remove tests deleted in vs code * Fix tests * Distro * Fix tests and add removed extension point * Skip failing notebook tests for now * Disable broken tests and cleanup build folder * Update yarn.lock and fix smoke tests * Bump sqlite * fix contributed actions and file spacing * Fix user data path * Update yarn.locks Co-authored-by: ADS Merger <karlb@microsoft.com>
This commit is contained in:
@@ -3,14 +3,15 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { Emitter, PauseableEmitter } from 'vs/base/common/event';
|
||||
import { Emitter, Event, PauseableEmitter } from 'vs/base/common/event';
|
||||
import { Iterable } from 'vs/base/common/iterator';
|
||||
import { IDisposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle';
|
||||
import { TernarySearchTree } from 'vs/base/common/map';
|
||||
import { distinct } from 'vs/base/common/objects';
|
||||
import { localize } from 'vs/nls';
|
||||
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
|
||||
import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IContext, IContextKey, IContextKeyChangeEvent, IContextKeyService, IContextKeyServiceTarget, IReadableSet, SET_CONTEXT_COMMAND_ID, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { IContext, IContextKey, IContextKeyChangeEvent, IContextKeyService, IContextKeyServiceTarget, IReadableSet, SET_CONTEXT_COMMAND_ID, ContextKeyExpression, RawContextKey, ContextKeyInfo } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver';
|
||||
|
||||
const KEYBINDING_CONTEXT_ATTR = 'data-keybinding-context';
|
||||
@@ -74,19 +75,19 @@ class NullContext extends Context {
|
||||
super(-1, null);
|
||||
}
|
||||
|
||||
public setValue(key: string, value: any): boolean {
|
||||
public override setValue(key: string, value: any): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
public removeValue(key: string): boolean {
|
||||
public override removeValue(key: string): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
public getValue<T>(key: string): T | undefined {
|
||||
public override getValue<T>(key: string): T | undefined {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
collectAllValues(): { [key: string]: any; } {
|
||||
override collectAllValues(): { [key: string]: any; } {
|
||||
return Object.create(null);
|
||||
}
|
||||
}
|
||||
@@ -136,7 +137,7 @@ class ConfigAwareContextValuesContainer extends Context {
|
||||
this._listener.dispose();
|
||||
}
|
||||
|
||||
getValue(key: string): any {
|
||||
override getValue(key: string): any {
|
||||
|
||||
if (key.indexOf(ConfigAwareContextValuesContainer._keyPrefix) !== 0) {
|
||||
return super.getValue(key);
|
||||
@@ -167,15 +168,15 @@ class ConfigAwareContextValuesContainer extends Context {
|
||||
return value;
|
||||
}
|
||||
|
||||
setValue(key: string, value: any): boolean {
|
||||
override setValue(key: string, value: any): boolean {
|
||||
return super.setValue(key, value);
|
||||
}
|
||||
|
||||
removeValue(key: string): boolean {
|
||||
override removeValue(key: string): boolean {
|
||||
return super.removeValue(key);
|
||||
}
|
||||
|
||||
collectAllValues(): { [key: string]: any; } {
|
||||
override collectAllValues(): { [key: string]: any; } {
|
||||
const result: { [key: string]: any } = Object.create(null);
|
||||
this._values.forEach((value, index) => result[index] = value);
|
||||
return { ...result, ...super.collectAllValues() };
|
||||
@@ -287,6 +288,13 @@ export abstract class AbstractContextKeyService implements IContextKeyService {
|
||||
return new ScopedContextKeyService(this, domNode);
|
||||
}
|
||||
|
||||
createOverlay(overlay: Iterable<[string, any]> = Iterable.empty()): IContextKeyService {
|
||||
if (this._isDisposed) {
|
||||
throw new Error(`AbstractContextKeyService has been disposed`);
|
||||
}
|
||||
return new OverlayContextKeyService(this, overlay);
|
||||
}
|
||||
|
||||
public contextMatchesRules(rules: ContextKeyExpression | undefined): boolean {
|
||||
if (this._isDisposed) {
|
||||
throw new Error(`AbstractContextKeyService has been disposed`);
|
||||
@@ -405,27 +413,25 @@ export class ContextKeyService extends AbstractContextKeyService implements ICon
|
||||
class ScopedContextKeyService extends AbstractContextKeyService {
|
||||
|
||||
private _parent: AbstractContextKeyService;
|
||||
private _domNode: IContextKeyServiceTarget | undefined;
|
||||
private _domNode: IContextKeyServiceTarget;
|
||||
|
||||
private readonly _parentChangeListener = new MutableDisposable();
|
||||
|
||||
constructor(parent: AbstractContextKeyService, domNode?: IContextKeyServiceTarget) {
|
||||
constructor(parent: AbstractContextKeyService, domNode: IContextKeyServiceTarget) {
|
||||
super(parent.createChildContext());
|
||||
this._parent = parent;
|
||||
this._updateParentChangeListener();
|
||||
|
||||
if (domNode) {
|
||||
this._domNode = domNode;
|
||||
if (this._domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) {
|
||||
let extraInfo = '';
|
||||
if ((this._domNode as HTMLElement).classList) {
|
||||
extraInfo = Array.from((this._domNode as HTMLElement).classList.values()).join(', ');
|
||||
}
|
||||
|
||||
console.error(`Element already has context attribute${extraInfo ? ': ' + extraInfo : ''}`);
|
||||
this._domNode = domNode;
|
||||
if (this._domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) {
|
||||
let extraInfo = '';
|
||||
if ((this._domNode as HTMLElement).classList) {
|
||||
extraInfo = Array.from((this._domNode as HTMLElement).classList.values()).join(', ');
|
||||
}
|
||||
this._domNode.setAttribute(KEYBINDING_CONTEXT_ATTR, String(this._myContextId));
|
||||
|
||||
console.error(`Element already has context attribute${extraInfo ? ': ' + extraInfo : ''}`);
|
||||
}
|
||||
this._domNode.setAttribute(KEYBINDING_CONTEXT_ATTR, String(this._myContextId));
|
||||
}
|
||||
|
||||
private _updateParentChangeListener(): void {
|
||||
@@ -434,14 +440,15 @@ class ScopedContextKeyService extends AbstractContextKeyService {
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
this._onDidChangeContext.dispose();
|
||||
this._isDisposed = true;
|
||||
this._parent.disposeContext(this._myContextId);
|
||||
this._parentChangeListener?.dispose();
|
||||
if (this._domNode) {
|
||||
this._domNode.removeAttribute(KEYBINDING_CONTEXT_ATTR);
|
||||
this._domNode = undefined;
|
||||
if (this._isDisposed) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._onDidChangeContext.dispose();
|
||||
this._parent.disposeContext(this._myContextId);
|
||||
this._parentChangeListener.dispose();
|
||||
this._domNode.removeAttribute(KEYBINDING_CONTEXT_ATTR);
|
||||
this._isDisposed = true;
|
||||
}
|
||||
|
||||
public getContextValuesContainer(contextId: number): Context {
|
||||
@@ -484,6 +491,76 @@ class ScopedContextKeyService extends AbstractContextKeyService {
|
||||
}
|
||||
}
|
||||
|
||||
class OverlayContext implements IContext {
|
||||
|
||||
constructor(private parent: IContext, private overlay: ReadonlyMap<string, any>) { }
|
||||
|
||||
getValue<T>(key: string): T | undefined {
|
||||
return this.overlay.has(key) ? this.overlay.get(key) : this.parent.getValue(key);
|
||||
}
|
||||
}
|
||||
|
||||
class OverlayContextKeyService implements IContextKeyService {
|
||||
|
||||
declare _serviceBrand: undefined;
|
||||
private overlay: Map<string, any>;
|
||||
|
||||
get contextId(): number {
|
||||
return this.parent.contextId;
|
||||
}
|
||||
|
||||
get onDidChangeContext(): Event<IContextKeyChangeEvent> {
|
||||
return this.parent.onDidChangeContext;
|
||||
}
|
||||
|
||||
constructor(private parent: AbstractContextKeyService | OverlayContextKeyService, overlay: Iterable<[string, any]>) {
|
||||
this.overlay = new Map(overlay);
|
||||
}
|
||||
|
||||
bufferChangeEvents(callback: Function): void {
|
||||
this.parent.bufferChangeEvents(callback);
|
||||
}
|
||||
|
||||
createKey<T>(): IContextKey<T> {
|
||||
throw new Error('Not supported.');
|
||||
}
|
||||
|
||||
getContext(target: IContextKeyServiceTarget | null): IContext {
|
||||
return new OverlayContext(this.parent.getContext(target), this.overlay);
|
||||
}
|
||||
|
||||
getContextValuesContainer(contextId: number): IContext {
|
||||
const parentContext = this.parent.getContextValuesContainer(contextId);
|
||||
return new OverlayContext(parentContext, this.overlay);
|
||||
}
|
||||
|
||||
contextMatchesRules(rules: ContextKeyExpression | undefined): boolean {
|
||||
const context = this.getContextValuesContainer(this.contextId);
|
||||
const result = KeybindingResolver.contextMatchesRules(context, rules);
|
||||
return result;
|
||||
}
|
||||
|
||||
getContextKeyValue<T>(key: string): T | undefined {
|
||||
return this.overlay.has(key) ? this.overlay.get(key) : this.parent.getContextKeyValue(key);
|
||||
}
|
||||
|
||||
createScoped(): IContextKeyService {
|
||||
throw new Error('Not supported.');
|
||||
}
|
||||
|
||||
createOverlay(overlay: Iterable<[string, any]> = Iterable.empty()): IContextKeyService {
|
||||
return new OverlayContextKeyService(this, overlay);
|
||||
}
|
||||
|
||||
updateParent(): void {
|
||||
throw new Error('Not supported.');
|
||||
}
|
||||
|
||||
dispose(): void {
|
||||
// noop
|
||||
}
|
||||
}
|
||||
|
||||
function findContextAttr(domNode: IContextKeyServiceTarget | null): number {
|
||||
while (domNode) {
|
||||
if (domNode.hasAttribute(KEYBINDING_CONTEXT_ATTR)) {
|
||||
@@ -501,3 +578,27 @@ function findContextAttr(domNode: IContextKeyServiceTarget | null): number {
|
||||
CommandsRegistry.registerCommand(SET_CONTEXT_COMMAND_ID, function (accessor, contextKey: any, contextValue: any) {
|
||||
accessor.get(IContextKeyService).createKey(String(contextKey), contextValue);
|
||||
});
|
||||
|
||||
CommandsRegistry.registerCommand({
|
||||
id: 'getContextKeyInfo',
|
||||
handler() {
|
||||
return [...RawContextKey.all()].sort((a, b) => a.key.localeCompare(b.key));
|
||||
},
|
||||
description: {
|
||||
description: localize('getContextKeyInfo', "A command that returns information about context keys"),
|
||||
args: []
|
||||
}
|
||||
});
|
||||
|
||||
CommandsRegistry.registerCommand('_generateContextKeyInfo', function () {
|
||||
const result: ContextKeyInfo[] = [];
|
||||
const seen = new Set<string>();
|
||||
for (let info of RawContextKey.all()) {
|
||||
if (!seen.has(info.key)) {
|
||||
seen.add(info.key);
|
||||
result.push(info);
|
||||
}
|
||||
}
|
||||
result.sort((a, b) => a.key.localeCompare(b.key));
|
||||
console.log(JSON.stringify(result, undefined, 2));
|
||||
});
|
||||
|
||||
@@ -339,7 +339,7 @@ export class ContextKeyDefinedExpr implements IContextKeyExpression {
|
||||
|
||||
public readonly type = ContextKeyExprType.Defined;
|
||||
|
||||
protected constructor(protected readonly key: string) {
|
||||
protected constructor(readonly key: string) {
|
||||
}
|
||||
|
||||
public cmp(other: ContextKeyExpression): number {
|
||||
@@ -1257,13 +1257,32 @@ export class ContextKeyOrExpr implements IContextKeyExpression {
|
||||
}
|
||||
}
|
||||
|
||||
export interface ContextKeyInfo {
|
||||
readonly key: string;
|
||||
readonly type?: string;
|
||||
readonly description?: string;
|
||||
}
|
||||
|
||||
export class RawContextKey<T> extends ContextKeyDefinedExpr {
|
||||
|
||||
private static _info: ContextKeyInfo[] = [];
|
||||
|
||||
static all(): IterableIterator<ContextKeyInfo> {
|
||||
return RawContextKey._info.values();
|
||||
}
|
||||
|
||||
private readonly _defaultValue: T | undefined;
|
||||
|
||||
constructor(key: string, defaultValue: T | undefined) {
|
||||
constructor(key: string, defaultValue: T | undefined, metaOrHide?: string | true | { type: string, description: string }) {
|
||||
super(key);
|
||||
this._defaultValue = defaultValue;
|
||||
|
||||
// collect all context keys into a central place
|
||||
if (typeof metaOrHide === 'object') {
|
||||
RawContextKey._info.push({ ...metaOrHide, key });
|
||||
} else if (metaOrHide !== true) {
|
||||
RawContextKey._info.push({ key, description: metaOrHide, type: defaultValue !== null && defaultValue !== undefined ? typeof defaultValue : undefined });
|
||||
}
|
||||
}
|
||||
|
||||
public bindTo(target: IContextKeyService): IContextKey<T> {
|
||||
@@ -1326,7 +1345,8 @@ export interface IContextKeyService {
|
||||
contextMatchesRules(rules: ContextKeyExpression | undefined): boolean;
|
||||
getContextKeyValue<T>(key: string): T | undefined;
|
||||
|
||||
createScoped(target?: IContextKeyServiceTarget): IContextKeyService;
|
||||
createScoped(target: IContextKeyServiceTarget): IContextKeyService;
|
||||
createOverlay(overlay: Iterable<[string, any]>): IContextKeyService;
|
||||
getContext(target: IContextKeyServiceTarget | null): IContext;
|
||||
|
||||
updateParent(parentContextKeyService: IContextKeyService): void;
|
||||
|
||||
@@ -3,17 +3,18 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { localize } from 'vs/nls';
|
||||
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { isMacintosh, isLinux, isWindows, isWeb } from 'vs/base/common/platform';
|
||||
|
||||
export const IsMacContext = new RawContextKey<boolean>('isMac', isMacintosh);
|
||||
export const IsLinuxContext = new RawContextKey<boolean>('isLinux', isLinux);
|
||||
export const IsWindowsContext = new RawContextKey<boolean>('isWindows', isWindows);
|
||||
export const IsMacContext = new RawContextKey<boolean>('isMac', isMacintosh, localize('isMac', "Whether the operating system is macOS"));
|
||||
export const IsLinuxContext = new RawContextKey<boolean>('isLinux', isLinux, localize('isLinux', "Whether the operating system is Linux"));
|
||||
export const IsWindowsContext = new RawContextKey<boolean>('isWindows', isWindows, localize('isWindows', "Whether the operating system is Windows"));
|
||||
|
||||
export const IsWebContext = new RawContextKey<boolean>('isWeb', isWeb);
|
||||
export const IsMacNativeContext = new RawContextKey<boolean>('isMacNative', isMacintosh && !isWeb);
|
||||
export const IsWebContext = new RawContextKey<boolean>('isWeb', isWeb, localize('isWeb', "Whether the platform is a web browser"));
|
||||
export const IsMacNativeContext = new RawContextKey<boolean>('isMacNative', isMacintosh && !isWeb, localize('isMacNative', "Whether the operating system is macOS on a non-browser platform"));
|
||||
|
||||
export const IsDevelopmentContext = new RawContextKey<boolean>('isDevelopment', false);
|
||||
export const IsDevelopmentContext = new RawContextKey<boolean>('isDevelopment', false, true);
|
||||
|
||||
export const InputFocusedContextKey = 'inputFocus';
|
||||
export const InputFocusedContext = new RawContextKey<boolean>(InputFocusedContextKey, false);
|
||||
export const InputFocusedContext = new RawContextKey<boolean>(InputFocusedContextKey, false, localize('inputFocus', "Whether keyboard focus is inside an input box"));
|
||||
|
||||
Reference in New Issue
Block a user