提交 f79c3e1f 编写于 作者: S Sandeep Somavarapu

Fix #33535

上级 465d91db
...@@ -17,7 +17,7 @@ import { Range, IRange } from 'vs/editor/common/core/range'; ...@@ -17,7 +17,7 @@ import { Range, IRange } from 'vs/editor/common/core/range';
import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IPreferencesService, ISettingsGroup, ISetting, IPreferencesEditorModel, IFilterResult, ISettingsEditorModel } from 'vs/workbench/parts/preferences/common/preferences'; import { IPreferencesService, ISettingsGroup, ISetting, IPreferencesEditorModel, IFilterResult, ISettingsEditorModel } from 'vs/workbench/parts/preferences/common/preferences';
import { SettingsEditorModel, DefaultSettingsEditorModel } from 'vs/workbench/parts/preferences/common/preferencesModels'; import { SettingsEditorModel, DefaultSettingsEditorModel, WorkspaceConfigurationEditorModel } from 'vs/workbench/parts/preferences/common/preferencesModels';
import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser';
import { IContextMenuService, ContextSubMenu } from 'vs/platform/contextview/browser/contextView'; import { IContextMenuService, ContextSubMenu } from 'vs/platform/contextview/browser/contextView';
import { SettingsGroupTitleWidget, EditPreferenceWidget, SettingsHeaderWidget, DefaultSettingsHeaderWidget, FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; import { SettingsGroupTitleWidget, EditPreferenceWidget, SettingsHeaderWidget, DefaultSettingsHeaderWidget, FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets';
...@@ -1221,11 +1221,11 @@ class WorkspaceConfigurationRenderer extends Disposable { ...@@ -1221,11 +1221,11 @@ class WorkspaceConfigurationRenderer extends Disposable {
} }
public render(): void { public render(): void {
if (this.workspaceContextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { if (this.workspaceContextService.getWorkbenchState() === WorkbenchState.WORKSPACE && this.workspaceSettingsEditorModel instanceof WorkspaceConfigurationEditorModel) {
this.editor.changeDecorations(changeAccessor => this.decorationIds = changeAccessor.deltaDecorations(this.decorationIds, [])); this.editor.changeDecorations(changeAccessor => this.decorationIds = changeAccessor.deltaDecorations(this.decorationIds, []));
const ranges: IRange[] = []; const ranges: IRange[] = [];
for (const settingsGroup of this.workspaceSettingsEditorModel.settingsGroups) { for (const settingsGroup of this.workspaceSettingsEditorModel.configurationGroups) {
for (const section of settingsGroup.sections) { for (const section of settingsGroup.sections) {
for (const setting of section.settings) { for (const setting of section.settings) {
if (setting.key !== 'settings') { if (setting.key !== 'settings') {
......
...@@ -26,7 +26,7 @@ import { IExtensionService } from 'vs/platform/extensions/common/extensions'; ...@@ -26,7 +26,7 @@ import { IExtensionService } from 'vs/platform/extensions/common/extensions';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { IPreferencesService, IPreferencesEditorModel, ISetting, getSettingsTargetName, FOLDER_SETTINGS_PATH, DEFAULT_SETTINGS_EDITOR_SETTING } from 'vs/workbench/parts/preferences/common/preferences'; import { IPreferencesService, IPreferencesEditorModel, ISetting, getSettingsTargetName, FOLDER_SETTINGS_PATH, DEFAULT_SETTINGS_EDITOR_SETTING } from 'vs/workbench/parts/preferences/common/preferences';
import { SettingsEditorModel, DefaultSettingsEditorModel, DefaultKeybindingsEditorModel, defaultKeybindingsContents, WorkspaceConfigModel, DefaultSettingsModel } from 'vs/workbench/parts/preferences/common/preferencesModels'; import { SettingsEditorModel, DefaultSettingsEditorModel, DefaultKeybindingsEditorModel, defaultKeybindingsContents, DefaultSettingsModel, WorkspaceConfigurationEditorModel } from 'vs/workbench/parts/preferences/common/preferencesModels';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { DefaultPreferencesEditorInput, PreferencesEditorInput } from 'vs/workbench/parts/preferences/browser/preferencesEditor'; import { DefaultPreferencesEditorInput, PreferencesEditorInput } from 'vs/workbench/parts/preferences/browser/preferencesEditor';
import { KeybindingsEditorInput } from 'vs/workbench/parts/preferences/browser/keybindingsEditor'; import { KeybindingsEditorInput } from 'vs/workbench/parts/preferences/browser/keybindingsEditor';
...@@ -96,7 +96,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic ...@@ -96,7 +96,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic
} }
readonly defaultKeybindingsResource = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/keybindings.json' }); readonly defaultKeybindingsResource = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/keybindings.json' });
private readonly workspaceConfigSettingsResource = URI.from({ scheme: network.Schemas.vscode, authority: 'settings', path: '/workspaceSettings.json' });
get userSettingsResource(): URI { get userSettingsResource(): URI {
return this.getEditableSettingsURI(ConfigurationTarget.USER); return this.getEditableSettingsURI(ConfigurationTarget.USER);
...@@ -137,10 +136,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic ...@@ -137,10 +136,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic
return this.createDefaultSettingsEditorModel(uri); return this.createDefaultSettingsEditorModel(uri);
} }
if (this.workspaceConfigSettingsResource.toString() === uri.toString()) {
return this.createEditableSettingsEditorModel(ConfigurationTarget.WORKSPACE, uri);
}
if (this.getEditableSettingsURI(ConfigurationTarget.USER).toString() === uri.toString()) { if (this.getEditableSettingsURI(ConfigurationTarget.USER).toString() === uri.toString()) {
return this.createEditableSettingsEditorModel(ConfigurationTarget.USER, uri); return this.createEditableSettingsEditorModel(ConfigurationTarget.USER, uri);
} }
...@@ -279,9 +274,10 @@ export class PreferencesService extends Disposable implements IPreferencesServic ...@@ -279,9 +274,10 @@ export class PreferencesService extends Disposable implements IPreferencesServic
private createEditableSettingsEditorModel(configurationTarget: ConfigurationTarget, resource: URI): TPromise<SettingsEditorModel> { private createEditableSettingsEditorModel(configurationTarget: ConfigurationTarget, resource: URI): TPromise<SettingsEditorModel> {
const settingsUri = this.getEditableSettingsURI(configurationTarget, resource); const settingsUri = this.getEditableSettingsURI(configurationTarget, resource);
if (settingsUri) { if (settingsUri) {
if (settingsUri.toString() === this.workspaceConfigSettingsResource.toString()) { const workspace = this.contextService.getWorkspace();
return TPromise.join([this.textModelResolverService.createModelReference(settingsUri), this.textModelResolverService.createModelReference(this.contextService.getWorkspace().configuration)]) if (workspace.configuration && workspace.configuration.toString() === settingsUri.toString()) {
.then(([reference, workspaceConfigReference]) => this.instantiationService.createInstance(WorkspaceConfigModel, reference, workspaceConfigReference, configurationTarget, this._onDispose.event)); return this.textModelResolverService.createModelReference(settingsUri)
.then(reference => this.instantiationService.createInstance(WorkspaceConfigurationEditorModel, reference, configurationTarget));
} }
return this.textModelResolverService.createModelReference(settingsUri) return this.textModelResolverService.createModelReference(settingsUri)
.then(reference => this.instantiationService.createInstance(SettingsEditorModel, reference, configurationTarget)); .then(reference => this.instantiationService.createInstance(SettingsEditorModel, reference, configurationTarget));
......
...@@ -126,9 +126,7 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti ...@@ -126,9 +126,7 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti
super(); super();
this.settingsModel = reference.object.textEditorModel; this.settingsModel = reference.object.textEditorModel;
this._register(this.onDispose(() => reference.dispose())); this._register(this.onDispose(() => reference.dispose()));
this._register(this.settingsModel.onDidChangeContent(() => { this._register(this.settingsModel.onDidChangeContent(() => this._settingsGroups = null));
this._settingsGroups = null;
}));
this.queue = new Queue<void>(); this.queue = new Queue<void>();
} }
...@@ -163,176 +161,204 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti ...@@ -163,176 +161,204 @@ export class SettingsEditorModel extends AbstractSettingsModel implements ISetti
return this.queue.queue(() => this.doSave()); return this.queue.queue(() => this.doSave());
} }
protected isSettingsProperty(property: string, previousParents: string[]): boolean {
return previousParents.length === 0; // Settings is root
}
protected doSave(): TPromise<any> { protected doSave(): TPromise<any> {
return this.textFileService.save(this.uri); return this.textFileService.save(this.uri);
} }
private parse() { protected parse(): void {
const model = this.settingsModel; this._settingsGroups = parse(this.settingsModel, (property: string, previousParents: string[]): boolean => this.isSettingsProperty(property, previousParents));
const settings: ISetting[] = []; }
let overrideSetting: ISetting = null; }
let currentProperty: string = null;
let currentParent: any = [];
let previousParents: any[] = [];
let range = {
startLineNumber: 0,
startColumn: 0,
endLineNumber: 0,
endColumn: 0
};
function onValue(value: any, offset: number, length: number) { function parse(model: IModel, isSettingsProperty: (currentProperty: string, previousParents: string[]) => boolean): ISettingsGroup[] {
if (Array.isArray(currentParent)) { const settings: ISetting[] = [];
(<any[]>currentParent).push(value); let overrideSetting: ISetting = null;
} else if (currentProperty) {
currentParent[currentProperty] = value; let currentProperty: string = null;
let currentParent: any = [];
let previousParents: any[] = [];
let settingsPropertyIndex: number = -1;
let range = {
startLineNumber: 0,
startColumn: 0,
endLineNumber: 0,
endColumn: 0
};
function onValue(value: any, offset: number, length: number) {
if (Array.isArray(currentParent)) {
(<any[]>currentParent).push(value);
} else if (currentProperty) {
currentParent[currentProperty] = value;
}
if (previousParents.length === settingsPropertyIndex + 1 || (previousParents.length === settingsPropertyIndex + 2 && overrideSetting !== null)) {
// settings value started
const setting = previousParents.length === settingsPropertyIndex + 1 ? settings[settings.length - 1] : overrideSetting.overrides[overrideSetting.overrides.length - 1];
if (setting) {
let valueStartPosition = model.getPositionAt(offset);
let valueEndPosition = model.getPositionAt(offset + length);
setting.value = value;
setting.valueRange = {
startLineNumber: valueStartPosition.lineNumber,
startColumn: valueStartPosition.column,
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
};
setting.range = assign(setting.range, {
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
});
}
}
}
let visitor: JSONVisitor = {
onObjectBegin: (offset: number, length: number) => {
if (isSettingsProperty(currentProperty, previousParents)) {
// Settings started
settingsPropertyIndex = previousParents.length;
let position = model.getPositionAt(offset);
range.startLineNumber = position.lineNumber;
range.startColumn = position.column;
}
let object = {};
onValue(object, offset, length);
currentParent = object;
currentProperty = null;
previousParents.push(currentParent);
},
onObjectProperty: (name: string, offset: number, length: number) => {
currentProperty = name;
if (previousParents.length === settingsPropertyIndex + 1 || (previousParents.length === settingsPropertyIndex + 2 && overrideSetting !== null)) {
// setting started
let settingStartPosition = model.getPositionAt(offset);
const setting: ISetting = {
description: [],
key: name,
keyRange: {
startLineNumber: settingStartPosition.lineNumber,
startColumn: settingStartPosition.column + 1,
endLineNumber: settingStartPosition.lineNumber,
endColumn: settingStartPosition.column + length
},
range: {
startLineNumber: settingStartPosition.lineNumber,
startColumn: settingStartPosition.column,
endLineNumber: 0,
endColumn: 0
},
value: null,
valueRange: null,
descriptionRanges: null,
overrides: [],
overrideOf: overrideSetting
};
if (previousParents.length === settingsPropertyIndex + 1) {
settings.push(setting);
if (OVERRIDE_PROPERTY_PATTERN.test(name)) {
overrideSetting = setting;
}
} else {
overrideSetting.overrides.push(setting);
}
} }
if (previousParents.length === 1 || (previousParents.length === 2 && overrideSetting !== null)) { },
// settings value started onObjectEnd: (offset: number, length: number) => {
const setting = previousParents.length === 1 ? settings[settings.length - 1] : overrideSetting.overrides[overrideSetting.overrides.length - 1]; currentParent = previousParents.pop();
if (previousParents.length === settingsPropertyIndex + 1 || (previousParents.length === settingsPropertyIndex + 2 && overrideSetting !== null)) {
// setting ended
const setting = previousParents.length === settingsPropertyIndex + 1 ? settings[settings.length - 1] : overrideSetting.overrides[overrideSetting.overrides.length - 1];
if (setting) { if (setting) {
let valueStartPosition = model.getPositionAt(offset);
let valueEndPosition = model.getPositionAt(offset + length); let valueEndPosition = model.getPositionAt(offset + length);
setting.value = value; setting.valueRange = assign(setting.valueRange, {
setting.valueRange = {
startLineNumber: valueStartPosition.lineNumber,
startColumn: valueStartPosition.column,
endLineNumber: valueEndPosition.lineNumber, endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column endColumn: valueEndPosition.column
}; });
setting.range = assign(setting.range, { setting.range = assign(setting.range, {
endLineNumber: valueEndPosition.lineNumber, endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column endColumn: valueEndPosition.column
}); });
} }
}
}
let visitor: JSONVisitor = {
onObjectBegin: (offset: number, length: number) => {
if (previousParents.length === 0) {
// Settings started
let position = model.getPositionAt(offset);
range.startLineNumber = position.lineNumber;
range.startColumn = position.column;
}
let object = {};
onValue(object, offset, length);
currentParent = object;
currentProperty = null;
previousParents.push(currentParent);
},
onObjectProperty: (name: string, offset: number, length: number) => {
currentProperty = name;
if (previousParents.length === 1 || (previousParents.length === 2 && overrideSetting !== null)) {
// setting started
let settingStartPosition = model.getPositionAt(offset);
const setting: ISetting = {
description: [],
key: name,
keyRange: {
startLineNumber: settingStartPosition.lineNumber,
startColumn: settingStartPosition.column + 1,
endLineNumber: settingStartPosition.lineNumber,
endColumn: settingStartPosition.column + length
},
range: {
startLineNumber: settingStartPosition.lineNumber,
startColumn: settingStartPosition.column,
endLineNumber: 0,
endColumn: 0
},
value: null,
valueRange: null,
descriptionRanges: null,
overrides: [],
overrideOf: overrideSetting
};
if (previousParents.length === 1) {
settings.push(setting);
if (OVERRIDE_PROPERTY_PATTERN.test(name)) {
overrideSetting = setting;
}
} else {
overrideSetting.overrides.push(setting);
}
}
},
onObjectEnd: (offset: number, length: number) => {
currentParent = previousParents.pop();
if (previousParents.length === 1 || (previousParents.length === 2 && overrideSetting !== null)) {
// setting ended
const setting = previousParents.length === 1 ? settings[settings.length - 1] : overrideSetting.overrides[overrideSetting.overrides.length - 1];
if (setting) {
let valueEndPosition = model.getPositionAt(offset + length);
setting.valueRange = assign(setting.valueRange, {
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
});
setting.range = assign(setting.range, {
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
});
}
if (previousParents.length === 1) { if (previousParents.length === settingsPropertyIndex + 1) {
overrideSetting = null; overrideSetting = null;
}
}
if (previousParents.length === 0) {
// settings ended
let position = model.getPositionAt(offset);
range.endLineNumber = position.lineNumber;
range.endColumn = position.column;
}
},
onArrayBegin: (offset: number, length: number) => {
let array: any[] = [];
onValue(array, offset, length);
previousParents.push(currentParent);
currentParent = array;
currentProperty = null;
},
onArrayEnd: (offset: number, length: number) => {
currentParent = previousParents.pop();
if (previousParents.length === 1 || (previousParents.length === 2 && overrideSetting !== null)) {
// setting value ended
const setting = previousParents.length === 1 ? settings[settings.length - 1] : overrideSetting.overrides[overrideSetting.overrides.length - 1];
if (setting) {
let valueEndPosition = model.getPositionAt(offset + length);
setting.valueRange = assign(setting.valueRange, {
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
});
setting.range = assign(setting.range, {
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
});
}
} }
}, }
onLiteralValue: onValue, if (previousParents.length === settingsPropertyIndex) {
onError: (error) => { // settings ended
const setting = settings[settings.length - 1]; let position = model.getPositionAt(offset);
if (setting && (!setting.range || !setting.keyRange || !setting.valueRange)) { range.endLineNumber = position.lineNumber;
settings.pop(); range.endColumn = position.column;
}
},
onArrayBegin: (offset: number, length: number) => {
let array: any[] = [];
onValue(array, offset, length);
previousParents.push(currentParent);
currentParent = array;
currentProperty = null;
},
onArrayEnd: (offset: number, length: number) => {
currentParent = previousParents.pop();
if (previousParents.length === settingsPropertyIndex + 1 || (previousParents.length === settingsPropertyIndex + 2 && overrideSetting !== null)) {
// setting value ended
const setting = previousParents.length === settingsPropertyIndex + 1 ? settings[settings.length - 1] : overrideSetting.overrides[overrideSetting.overrides.length - 1];
if (setting) {
let valueEndPosition = model.getPositionAt(offset + length);
setting.valueRange = assign(setting.valueRange, {
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
});
setting.range = assign(setting.range, {
endLineNumber: valueEndPosition.lineNumber,
endColumn: valueEndPosition.column
});
} }
} }
}; },
if (!model.isDisposed()) { onLiteralValue: onValue,
visit(model.getValue(), visitor); onError: (error) => {
const setting = settings[settings.length - 1];
if (setting && (!setting.range || !setting.keyRange || !setting.valueRange)) {
settings.pop();
}
} }
this._settingsGroups = settings.length > 0 ? [<ISettingsGroup>{ };
sections: [ if (!model.isDisposed()) {
{ visit(model.getValue(), visitor);
settings
}
],
title: null,
titleRange: null,
range
}] : [];
} }
return settings.length > 0 ? [<ISettingsGroup>{
sections: [
{
settings
}
],
title: null,
titleRange: null,
range
}] : [];
}
export class WorkspaceConfigurationEditorModel extends SettingsEditorModel {
private _configurationGroups: ISettingsGroup[];
get configurationGroups(): ISettingsGroup[] {
return this._configurationGroups;
}
protected parse(): void {
super.parse();
this._configurationGroups = parse(this.settingsModel, (property: string, previousParents: string[]): boolean => previousParents.length === 0);
}
protected isSettingsProperty(property: string, previousParents: string[]): boolean {
return property === 'settings' && previousParents.length === 1;
}
} }
export class WorkspaceConfigModel extends SettingsEditorModel implements ISettingsEditorModel { export class WorkspaceConfigModel extends SettingsEditorModel implements ISettingsEditorModel {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册