提交 43ab7085 编写于 作者: S Sandeep Somavarapu

#15361 DefaultSettings model include detailed ranges

上级 41a23177
...@@ -31,7 +31,7 @@ configurationRegistry.registerConfiguration({ ...@@ -31,7 +31,7 @@ configurationRegistry.registerConfiguration({
'properties': { 'properties': {
'telemetry.enableCrashReporter': { 'telemetry.enableCrashReporter': {
'type': 'boolean', 'type': 'boolean',
'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\n\t// This option requires restart to take effect."), 'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\nThis option requires restart to take effect."),
'default': true 'default': true
} }
} }
......
...@@ -187,9 +187,8 @@ export class DefaultSettingsContribution extends Disposable implements editorCom ...@@ -187,9 +187,8 @@ export class DefaultSettingsContribution extends Disposable implements editorCom
private renderDecorations(model: editorCommon.IModel) { private renderDecorations(model: editorCommon.IModel) {
this.settingsActions = this.instantiationService.createInstance(SettingsActionsDecorators, this.editor); this.settingsActions = this.instantiationService.createInstance(SettingsActionsDecorators, this.editor);
this.settingsActions.render(this.openSettingsService.defaultSettings.getSettingsGroups()); this.settingsActions.render(this.openSettingsService.defaultSettings.settingsGroups);
} }
} }
export class SettingsActionsDecorators extends Disposable { export class SettingsActionsDecorators extends Disposable {
...@@ -228,11 +227,11 @@ export class SettingsActionsDecorators extends Disposable { ...@@ -228,11 +227,11 @@ export class SettingsActionsDecorators extends Disposable {
private createDecoration(setting: ISetting, model: editorCommon.IModel): editorCommon.IModelDeltaDecoration { private createDecoration(setting: ISetting, model: editorCommon.IModel): editorCommon.IModelDeltaDecoration {
const jsonSchema: IJSONSchema = this.getConfigurationsMap()[setting.key]; const jsonSchema: IJSONSchema = this.getConfigurationsMap()[setting.key];
const maxColumn = model.getLineMaxColumn(setting.range.startLineNumber + 1); const maxColumn = model.getLineMaxColumn(setting.valueRange.startLineNumber);
const range = { const range = {
startLineNumber: setting.range.startLineNumber + 1, startLineNumber: setting.valueRange.startLineNumber,
startColumn: maxColumn, startColumn: maxColumn,
endLineNumber: setting.range.startLineNumber + 1, endLineNumber: setting.valueRange.startLineNumber,
endColumn: maxColumn endColumn: maxColumn
}; };
return { return {
......
...@@ -9,24 +9,21 @@ import * as strings from 'vs/base/common/strings'; ...@@ -9,24 +9,21 @@ import * as strings from 'vs/base/common/strings';
import URI from 'vs/base/common/uri'; import URI from 'vs/base/common/uri';
import { Registry } from 'vs/platform/platform'; import { Registry } from 'vs/platform/platform';
import { IConfigurationNode, IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; import { IConfigurationNode, IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
import { IDefaultSettings, IDefaultKeybindings, ISettingsGroup } from 'vs/workbench/parts/settings/common/openSettings'; import { IDefaultSettings, IDefaultKeybindings, ISettingsGroup, ISetting } from 'vs/workbench/parts/settings/common/openSettings';
import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
export class DefaultSettings implements IDefaultSettings { export class DefaultSettings implements IDefaultSettings {
private _uri: URI = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/settings.json' }); private _uri: URI = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/settings.json' });
private _content: string;
private _settingsGroups: ISettingsGroup[];
private indent: string; private indent: string;
private _settingsGroups: ISettingsGroup[];
private _content: string;
constructor( @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService) { constructor( @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService) {
const editorConfig = this.configurationService.getConfiguration<any>(); const editorConfig = this.configurationService.getConfiguration<any>();
this.indent = editorConfig.editor.insertSpaces ? strings.repeat(' ', editorConfig.editor.tabSize) : '\t'; this.indent = editorConfig.editor.insertSpaces ? strings.repeat(' ', editorConfig.editor.tabSize) : '\t';
const configurations = Registry.as<IConfigurationRegistry>(Extensions.Configuration).getConfigurations();
this._settingsGroups = configurations.sort(this.compareConfigurationNodes).reduce((result, config) => this.parseConfig(config, result), []);
this._content = this.toContent();
} }
public get uri(): URI { public get uri(): URI {
...@@ -34,10 +31,17 @@ export class DefaultSettings implements IDefaultSettings { ...@@ -34,10 +31,17 @@ export class DefaultSettings implements IDefaultSettings {
} }
public get content(): string { public get content(): string {
if (!this._content) {
this._content = this.toContent(this.settingsGroups);
}
return this._content; return this._content;
} }
public getSettingsGroups(): ISettingsGroup[] { public get settingsGroups(): ISettingsGroup[] {
if (!this._settingsGroups) {
const configurations = Registry.as<IConfigurationRegistry>(Extensions.Configuration).getConfigurations();
this._settingsGroups = configurations.sort(this.compareConfigurationNodes).reduce((result, config) => this.parseConfig(config, result), []);
}
return this._settingsGroups; return this._settingsGroups;
} }
...@@ -46,23 +50,23 @@ export class DefaultSettings implements IDefaultSettings { ...@@ -46,23 +50,23 @@ export class DefaultSettings implements IDefaultSettings {
if (!settingsGroup) { if (!settingsGroup) {
settingsGroup = result.filter(g => g.title === config.title)[0]; settingsGroup = result.filter(g => g.title === config.title)[0];
if (!settingsGroup) { if (!settingsGroup) {
settingsGroup = { sections: [{ settings: [] }], title: config.title }; settingsGroup = { sections: [{ settings: [] }], title: config.title, titleRange: null };
result.push(settingsGroup); result.push(settingsGroup);
} }
} else { } else {
settingsGroup.sections[settingsGroup.sections.length - 1].description = config.title; settingsGroup.sections[settingsGroup.sections.length - 1].title = config.title;
} }
} }
if (config.properties) { if (config.properties) {
if (!settingsGroup) { if (!settingsGroup) {
settingsGroup = { sections: [{ settings: [] }], title: config.id }; settingsGroup = { sections: [{ settings: [] }], title: config.id, titleRange: null };
result.push(settingsGroup); result.push(settingsGroup);
} }
const configurationSettings = Object.keys(config.properties).map((key) => { const configurationSettings: ISetting[] = Object.keys(config.properties).map((key) => {
const prop = config.properties[key]; const prop = config.properties[key];
const value = prop.default; const value = prop.default;
const description = prop.description || ''; const description = prop.description || '';
return { key, value, description }; return { key, value, description, range: null, valueRange: null };
}); });
settingsGroup.sections[settingsGroup.sections.length - 1].settings.push(...configurationSettings); settingsGroup.sections[settingsGroup.sections.length - 1].settings.push(...configurationSettings);
} }
...@@ -87,63 +91,69 @@ export class DefaultSettings implements IDefaultSettings { ...@@ -87,63 +91,69 @@ export class DefaultSettings implements IDefaultSettings {
return c1.order - c2.order; return c1.order - c2.order;
} }
private toContent(): string { private toContent(settingsGroups: ISettingsGroup[]): string {
let defaultsHeader = '// ' + nls.localize('defaultSettingsHeader', "Overwrite settings by placing them into your settings file.\n"); let lastSetting: ISetting = null;
defaultsHeader += '// ' + nls.localize('defaultSettingsHeader2', "See http://go.microsoft.com/fwlink/?LinkId=808995 for the most commonly used settings.\n\n");
let lastEntry = -1;
const result: string[] = []; const result: string[] = [];
result.push('// ' + nls.localize('defaultSettingsHeader', "Overwrite settings by placing them into your settings file."));
result.push('// ' + nls.localize('defaultSettingsHeader2', "See http://go.microsoft.com/fwlink/?LinkId=808995 for the most commonly used settings."));
result.push('{'); result.push('{');
let lineNumber = 4; // Beginning of settings
for (const group of this._settingsGroups) { for (const group of settingsGroups) {
result.push('// ' + group.title); this.addTitleOrDescription(group.title, '', result);
lineNumber++; let groupTitleStart = result.length + 1;
group.range = { startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: 1 }; group.titleRange = { startLineNumber: groupTitleStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length };
for (const section of group.sections) { for (const section of group.sections) {
if (section.description) { if (section.title) {
result.push(this.indent + '// ' + section.description); let sectionTitleStart = result.length + 1;
lineNumber++; this.addTitleOrDescription(section.title, this.indent, result);
section.range = { startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: 1 }; section.titleRange = { startLineNumber: sectionTitleStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length };
} }
for (const setting of section.settings) { for (const setting of section.settings) {
result.push(this.indent + '// ' + setting.description); const settingStart = result.length + 1;
lineNumber++; this.addTitleOrDescription(setting.description, this.indent, result);
const settingStart = lineNumber; const valueStart = result.length + 1;
let valueString = JSON.stringify(setting.value, null, this.indent); let valueString = JSON.stringify(setting.value, null, this.indent);
let valueLines = 1;
if (valueString && (typeof setting.value === 'object')) { if (valueString && (typeof setting.value === 'object')) {
const mulitLineValue = valueString.split('\n'); const mulitLineValue = valueString.split('\n');
valueString = mulitLineValue.join('\n' + this.indent); result.push(this.indent + JSON.stringify(setting.key) + ': ' + mulitLineValue[0]);
valueLines = mulitLineValue.length; for (let i = 1; i < mulitLineValue.length; i++) {
} result.push(this.indent + mulitLineValue[i]);
if (lastEntry !== -1) { }
result[lastEntry] += ','; } else {
result.push(this.indent + JSON.stringify(setting.key) + ': ' + valueString);
} }
lastEntry = result.length; result[result.length - 1] += ',';
result.push(this.indent + JSON.stringify(setting.key) + ': ' + valueString); lastSetting = setting;
lineNumber += valueLines;
setting.range = { startLineNumber: settingStart, startColumn: 1, endLineNumber: lineNumber, endColumn: 1 };
result.push(''); result.push('');
lineNumber++; setting.valueRange = { startLineNumber: valueStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length };
setting.range = { startLineNumber: settingStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length };
} }
} }
} }
if (lastSetting) {
const content = result[lastSetting.range.endLineNumber - 2];
result[lastSetting.range.endLineNumber - 2] = content.substring(0, content.length - 1);
}
result.push('}'); result.push('}');
return result.join('\n');
}
return defaultsHeader + result.join('\n'); private addTitleOrDescription(description: string, indent: string, result: string[]) {
const multiLines = description.split('\n');
for (const line of multiLines) {
result.push(indent + '//' + line);
}
} }
} }
export class DefaultKeybindings implements IDefaultKeybindings { export class DefaultKeybindings implements IDefaultKeybindings {
private _uri: URI; private _uri: URI = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/keybindings.json' });
private _content: string; private _content: string;
constructor( @IKeybindingService keybindingService: IKeybindingService) { constructor( @IKeybindingService private keybindingService: IKeybindingService) {
this._uri = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/keybindings.json' });
const defaultsHeader = '// ' + nls.localize('defaultKeybindingsHeader', "Overwrite key bindings by placing them into your key bindings file.");
this._content = defaultsHeader + '\n' + keybindingService.getDefaultKeybindings();
} }
public get uri(): URI { public get uri(): URI {
...@@ -151,6 +161,10 @@ export class DefaultKeybindings implements IDefaultKeybindings { ...@@ -151,6 +161,10 @@ export class DefaultKeybindings implements IDefaultKeybindings {
} }
public get content(): string { public get content(): string {
if (!this._content) {
const defaultsHeader = '// ' + nls.localize('defaultKeybindingsHeader', "Overwrite key bindings by placing them into your key bindings file.");
this._content = defaultsHeader + '\n' + this.keybindingService.getDefaultKeybindings();
}
return this._content; return this._content;
} }
} }
\ No newline at end of file
...@@ -10,29 +10,31 @@ import URI from 'vs/base/common/uri'; ...@@ -10,29 +10,31 @@ import URI from 'vs/base/common/uri';
import { IConfigurationValue } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IConfigurationValue } from 'vs/workbench/services/configuration/common/configurationEditing';
export interface ISettingsGroup { export interface ISettingsGroup {
range?: IRange; titleRange: IRange;
title: string; title: string;
sections: ISettingsSection[]; sections: ISettingsSection[];
} }
export interface ISettingsSection { export interface ISettingsSection {
range?: IRange; titleRange?: IRange;
description?: string; title?: string;
settings: ISetting[]; settings: ISetting[];
} }
export interface ISetting { export interface ISetting {
range?: IRange; range: IRange;
key: string; key: string;
value: any; value: any;
description?: string; valueRange: IRange;
description: string;
} }
export interface IDefaultSettings { export interface IDefaultSettings {
uri: URI; uri: URI;
content: string; content: string;
settingsGroups: ISettingsGroup[];
getSettingsGroups(): ISettingsGroup[]; // filterSettings(filter: string): ISettingsGroup[];
} }
export interface IDefaultKeybindings { export interface IDefaultKeybindings {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册