Vscode merge (#4582)

* Merge from vscode 37cb23d3dd4f9433d56d4ba5ea3203580719a0bd

* fix issues with merges

* bump node version in azpipe

* replace license headers

* remove duplicate launch task

* fix build errors

* fix build errors

* fix tslint issues

* working through package and linux build issues

* more work

* wip

* fix packaged builds

* working through linux build errors

* wip

* wip

* wip

* fix mac and linux file limits

* iterate linux pipeline

* disable editor typing

* revert series to parallel

* remove optimize vscode from linux

* fix linting issues

* revert testing change

* add work round for new node

* readd packaging for extensions

* fix issue with angular not resolving decorator dependencies
This commit is contained in:
Anthony Dresser
2019-03-19 17:44:35 -07:00
committed by GitHub
parent 833d197412
commit 87765e8673
1879 changed files with 54505 additions and 38058 deletions

View File

@@ -22,6 +22,7 @@ import { ILinkComputerTarget, computeLinks } from 'vs/editor/common/modes/linkCo
import { BasicInplaceReplace } from 'vs/editor/common/modes/supports/inplaceReplaceSupport';
import { IDiffComputationResult } from 'vs/editor/common/services/editorWorkerService';
import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase';
import { getAllPropertyNames } from 'vs/base/common/types';
export interface IMirrorModel {
readonly uri: URI;
@@ -322,7 +323,7 @@ declare var require: any;
* @internal
*/
export abstract class BaseEditorSimpleWorker {
private _foreignModuleFactory: IForeignModuleFactory | null;
private readonly _foreignModuleFactory: IForeignModuleFactory | null;
private _foreignModule: any;
constructor(foreignModuleFactory: IForeignModuleFactory | null) {
@@ -490,12 +491,15 @@ export abstract class BaseEditorSimpleWorker {
return Promise.resolve(null);
}
const seen: Record<string, boolean> = Object.create(null);
const suggestions: CompletionItem[] = [];
const wordDefRegExp = new RegExp(wordDef, wordDefFlags);
const currentWord = model.getWordUntilPosition(position, wordDefRegExp);
const wordUntil = model.getWordUntilPosition(position, wordDefRegExp);
const seen: Record<string, boolean> = Object.create(null);
seen[currentWord.word] = true;
const wordAt = model.getWordAtPosition(position, wordDefRegExp);
if (wordAt) {
seen[model.getValueInRange(wordAt)] = true;
}
for (
let iter = model.createWordIterator(wordDefRegExp), e = iter.next();
@@ -515,10 +519,9 @@ export abstract class BaseEditorSimpleWorker {
kind: CompletionItemKind.Text,
label: word,
insertText: word,
range: { startLineNumber: position.lineNumber, startColumn: currentWord.startColumn, endLineNumber: position.lineNumber, endColumn: currentWord.endColumn }
range: { startLineNumber: position.lineNumber, startColumn: wordUntil.startColumn, endLineNumber: position.lineNumber, endColumn: wordUntil.endColumn }
});
}
return Promise.resolve({ suggestions });
}
@@ -599,7 +602,7 @@ export abstract class BaseEditorSimpleWorker {
this._foreignModule = this._foreignModuleFactory(ctx, createData);
// static foreing module
let methods: string[] = [];
for (let prop in this._foreignModule) {
for (const prop of getAllPropertyNames(this._foreignModule)) {
if (typeof this._foreignModule[prop] === 'function') {
methods.push(prop);
}
@@ -612,7 +615,7 @@ export abstract class BaseEditorSimpleWorker {
this._foreignModule = foreignModule.create(ctx, createData);
let methods: string[] = [];
for (let prop in this._foreignModule) {
for (const prop of getAllPropertyNames(this._foreignModule)) {
if (typeof this._foreignModule[prop] === 'function') {
methods.push(prop);
}

View File

@@ -146,7 +146,7 @@ class WordBasedCompletionItemProvider implements modes.CompletionItemProvider {
class WorkerManager extends Disposable {
private _modelService: IModelService;
private readonly _modelService: IModelService;
private _editorWorkerClient: EditorWorkerClient | null;
private _lastWorkerUsedTime: number;
@@ -211,8 +211,8 @@ class WorkerManager extends Disposable {
class EditorModelManager extends Disposable {
private _proxy: EditorSimpleWorkerImpl;
private _modelService: IModelService;
private readonly _proxy: EditorSimpleWorkerImpl;
private readonly _modelService: IModelService;
private _syncedModels: { [modelUrl: string]: IDisposable[]; } = Object.create(null);
private _syncedModelsLastUsedTime: { [modelUrl: string]: number; } = Object.create(null);
@@ -312,8 +312,8 @@ interface IWorkerClient<T> {
}
class SynchronousWorkerClient<T extends IDisposable> implements IWorkerClient<T> {
private _instance: T;
private _proxyObj: Promise<T>;
private readonly _instance: T;
private readonly _proxyObj: Promise<T>;
constructor(instance: T) {
this._instance = instance;
@@ -331,9 +331,9 @@ class SynchronousWorkerClient<T extends IDisposable> implements IWorkerClient<T>
export class EditorWorkerClient extends Disposable {
private _modelService: IModelService;
private readonly _modelService: IModelService;
private _worker: IWorkerClient<EditorSimpleWorkerImpl> | null;
private _workerFactory: DefaultWorkerFactory;
private readonly _workerFactory: DefaultWorkerFactory;
private _modelManager: EditorModelManager | null;
constructor(modelService: IModelService, label: string | undefined) {

View File

@@ -12,9 +12,11 @@ import { IModelService } from 'vs/editor/common/services/modelService';
import { FileKind } from 'vs/platform/files/common/files';
export function getIconClasses(modelService: IModelService, modeService: IModeService, resource: uri | undefined, fileKind?: FileKind): string[] {
// we always set these base classes even if we do not have a path
const classes = fileKind === FileKind.ROOT_FOLDER ? ['rootfolder-icon'] : fileKind === FileKind.FOLDER ? ['folder-icon'] : ['file-icon'];
if (resource) {
// Get the path and name of the resource. For data-URIs, we need to parse specially
let name: string | undefined;
let path: string | undefined;
@@ -22,17 +24,19 @@ export function getIconClasses(modelService: IModelService, modeService: IModeSe
const metadata = DataUri.parseMetaData(resource);
name = metadata.get(DataUri.META_DATA_LABEL);
path = name;
}
else {
} else {
name = cssEscape(basenameOrAuthority(resource).toLowerCase());
path = resource.path.toLowerCase();
}
// Folders
if (fileKind === FileKind.FOLDER) {
classes.push(`${name}-name-folder-icon`);
}
// Files
else {
// Name & Extension(s)
if (name) {
classes.push(`${name}-name-file-icon`);
@@ -42,8 +46,9 @@ export function getIconClasses(modelService: IModelService, modeService: IModeSe
}
classes.push(`ext-file-icon`); // extra segment to increase file-ext score
}
// Configured Language
let configuredLangId: string | null = getConfiguredLangId(modelService, resource);
let configuredLangId: string | null = getConfiguredLangId(modelService, modeService, resource);
configuredLangId = configuredLangId || (path ? modeService.getModeIdByFilepathOrFirstLine(path) : null);
if (configuredLangId) {
classes.push(`${cssEscape(configuredLangId)}-lang-file-icon`);
@@ -53,16 +58,32 @@ export function getIconClasses(modelService: IModelService, modeService: IModeSe
return classes;
}
export function getConfiguredLangId(modelService: IModelService, resource: uri): string | null {
export function getConfiguredLangId(modelService: IModelService, modeService: IModeService, resource: uri): string | null {
let configuredLangId: string | null = null;
if (resource) {
const model = modelService.getModel(resource);
if (model) {
const modeId = model.getLanguageIdentifier().language;
if (modeId && modeId !== PLAINTEXT_MODE_ID) {
configuredLangId = modeId; // only take if the mode is specific (aka no just plain text)
let modeId: string | null = null;
// Data URI: check for encoded metadata
if (resource.scheme === Schemas.data) {
const metadata = DataUri.parseMetaData(resource);
const mime = metadata.get(DataUri.META_DATA_MIME);
if (mime) {
modeId = modeService.getModeId(mime);
}
}
// Any other URI: check for model if existing
else {
const model = modelService.getModel(resource);
if (model) {
modeId = model.getLanguageIdentifier().language;
}
}
if (modeId && modeId !== PLAINTEXT_MODE_ID) {
configuredLangId = modeId; // only take if the mode is specific (aka no just plain text)
}
}
return configuredLangId;

View File

@@ -36,8 +36,8 @@ export class LanguagesRegistry extends Disposable {
private readonly _warnOnOverwrite: boolean;
private _nextLanguageId2: number;
private _languageIdToLanguage: string[];
private _languageToLanguageId: { [id: string]: number; };
private readonly _languageIdToLanguage: string[];
private readonly _languageToLanguageId: { [id: string]: number; };
private _languages: { [id: string]: IResolvedLanguage; };
private _mimeTypesMap: { [mimeType: string]: LanguageIdentifier; };
@@ -273,7 +273,7 @@ export class LanguagesRegistry extends Disposable {
return (language.mimetypes[0] || null);
}
public extractModeIds(commaSeparatedMimetypesOrCommaSeparatedIds: string): string[] {
public extractModeIds(commaSeparatedMimetypesOrCommaSeparatedIds: string | undefined): string[] {
if (!commaSeparatedMimetypesOrCommaSeparatedIds) {
return [];
}

View File

@@ -15,6 +15,7 @@ import { Range } from 'vs/editor/common/core/range';
import { keys } from 'vs/base/common/map';
import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDecorationService';
import { Schemas } from 'vs/base/common/network';
import { Emitter, Event } from 'vs/base/common/event';
function MODEL_ID(resource: URI): string {
return resource.toString();
@@ -44,12 +45,26 @@ class MarkerDecorations extends Disposable {
getMarker(decoration: IModelDecoration): IMarker | undefined {
return this._markersData.get(decoration.id);
}
getMarkers(): [Range, IMarker][] {
const res: [Range, IMarker][] = [];
this._markersData.forEach((marker, id) => {
let range = this.model.getDecorationRange(id);
if (range) {
res.push([range, marker]);
}
});
return res;
}
}
export class MarkerDecorationsService extends Disposable implements IMarkerDecorationsService {
_serviceBrand: any;
private readonly _onDidChangeMarker = new Emitter<ITextModel>();
readonly onDidChangeMarker: Event<ITextModel> = this._onDidChangeMarker.event;
private readonly _markerDecorations: Map<string, MarkerDecorations> = new Map<string, MarkerDecorations>();
constructor(
@@ -68,11 +83,16 @@ export class MarkerDecorationsService extends Disposable implements IMarkerDecor
return markerDecorations ? markerDecorations.getMarker(decoration) || null : null;
}
getLiveMarkers(model: ITextModel): [Range, IMarker][] {
const markerDecorations = this._markerDecorations.get(MODEL_ID(model.uri));
return markerDecorations ? markerDecorations.getMarkers() : [];
}
private _handleMarkerChange(changedResources: URI[]): void {
changedResources.forEach((resource) => {
const markerDecorations = this._markerDecorations.get(MODEL_ID(resource));
if (markerDecorations) {
this.updateDecorations(markerDecorations);
this._updateDecorations(markerDecorations);
}
});
}
@@ -80,7 +100,7 @@ export class MarkerDecorationsService extends Disposable implements IMarkerDecor
private _onModelAdded(model: ITextModel): void {
const markerDecorations = new MarkerDecorations(model);
this._markerDecorations.set(MODEL_ID(model.uri), markerDecorations);
this.updateDecorations(markerDecorations);
this._updateDecorations(markerDecorations);
}
private _onModelRemoved(model: ITextModel): void {
@@ -100,7 +120,7 @@ export class MarkerDecorationsService extends Disposable implements IMarkerDecor
}
}
private updateDecorations(markerDecorations: MarkerDecorations): void {
private _updateDecorations(markerDecorations: MarkerDecorations): void {
// Limit to the first 500 errors/warnings
const markers = this._markerService.read({ resource: markerDecorations.model.uri, take: 500 });
let newModelDecorations: IModelDeltaDecoration[] = markers.map((marker) => {
@@ -110,6 +130,7 @@ export class MarkerDecorationsService extends Disposable implements IMarkerDecor
};
});
markerDecorations.update(markers, newModelDecorations);
this._onDidChangeMarker.fire(markerDecorations.model);
}
private _createDecorationRange(model: ITextModel, rawMarker: IMarker): Range {

View File

@@ -6,11 +6,17 @@
import { ITextModel, IModelDecoration } from 'vs/editor/common/model';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { IMarker } from 'vs/platform/markers/common/markers';
import { Event } from 'vs/base/common/event';
import { Range } from 'vs/editor/common/core/range';
export const IMarkerDecorationsService = createDecorator<IMarkerDecorationsService>('markerDecorationsService');
export interface IMarkerDecorationsService {
_serviceBrand: any;
onDidChangeMarker: Event<ITextModel>;
getMarker(model: ITextModel, decoration: IModelDecoration): IMarker | null;
}
getLiveMarkers(model: ITextModel): [Range, IMarker][];
}

View File

@@ -47,7 +47,7 @@ export interface IModeService {
getConfigurationFiles(modeId: string): URI[];
// --- instantiation
create(commaSeparatedMimetypesOrCommaSeparatedIds: string): ILanguageSelection;
create(commaSeparatedMimetypesOrCommaSeparatedIds: string | undefined): ILanguageSelection;
createByLanguageName(languageName: string): ILanguageSelection;
createByFilepathOrFirstLine(filepath: string | null, firstLine?: string): ILanguageSelection;

View File

@@ -104,7 +104,7 @@ export class ModeServiceImpl implements IModeService {
return null;
}
public getModeId(commaSeparatedMimetypesOrCommaSeparatedIds: string): string | null {
public getModeId(commaSeparatedMimetypesOrCommaSeparatedIds: string | undefined): string | null {
const modeIds = this._registry.extractModeIds(commaSeparatedMimetypesOrCommaSeparatedIds);
if (modeIds.length > 0) {
@@ -124,7 +124,7 @@ export class ModeServiceImpl implements IModeService {
// --- instantiation
public create(commaSeparatedMimetypesOrCommaSeparatedIds: string): ILanguageSelection {
public create(commaSeparatedMimetypesOrCommaSeparatedIds: string | undefined): ILanguageSelection {
return new LanguageSelection(this.onLanguagesMaybeChanged, () => {
const modeId = this.getModeId(commaSeparatedMimetypesOrCommaSeparatedIds);
return this._createModeAndGetLanguageIdentifier(modeId);

View File

@@ -73,6 +73,7 @@ class ModelData implements IDisposable {
interface IRawEditorConfig {
tabSize?: any;
indentSize?: any;
insertSpaces?: any;
detectIndentation?: any;
trimAutoWhitespace?: any;
@@ -90,9 +91,9 @@ const DEFAULT_EOL = (platform.isLinux || platform.isMacintosh) ? DefaultEndOfLin
export class ModelServiceImpl extends Disposable implements IModelService {
public _serviceBrand: any;
private _configurationService: IConfigurationService;
private _configurationServiceSubscription: IDisposable;
private _resourcePropertiesService: ITextResourcePropertiesService;
private readonly _configurationService: IConfigurationService;
private readonly _configurationServiceSubscription: IDisposable;
private readonly _resourcePropertiesService: ITextResourcePropertiesService;
private readonly _onModelAdded: Emitter<ITextModel> = this._register(new Emitter<ITextModel>());
public readonly onModelAdded: Event<ITextModel> = this._onModelAdded.event;
@@ -110,7 +111,7 @@ export class ModelServiceImpl extends Disposable implements IModelService {
/**
* All the models known in the system.
*/
private _models: { [modelId: string]: ModelData; };
private readonly _models: { [modelId: string]: ModelData; };
constructor(
@IConfigurationService configurationService: IConfigurationService,
@@ -138,6 +139,17 @@ export class ModelServiceImpl extends Disposable implements IModelService {
}
}
let indentSize = tabSize;
if (config.editor && typeof config.editor.indentSize !== 'undefined' && config.editor.indentSize !== 'tabSize') {
let parsedIndentSize = parseInt(config.editor.indentSize, 10);
if (!isNaN(parsedIndentSize)) {
indentSize = parsedIndentSize;
}
if (indentSize < 1) {
indentSize = 1;
}
}
let insertSpaces = EDITOR_MODEL_DEFAULTS.insertSpaces;
if (config.editor && typeof config.editor.insertSpaces !== 'undefined') {
insertSpaces = (config.editor.insertSpaces === 'false' ? false : Boolean(config.editor.insertSpaces));
@@ -169,6 +181,7 @@ export class ModelServiceImpl extends Disposable implements IModelService {
return {
isForSimpleWidget: isForSimpleWidget,
tabSize: tabSize,
indentSize: indentSize,
insertSpaces: insertSpaces,
detectIndentation: detectIndentation,
defaultEOL: newDefaultEOL,
@@ -210,6 +223,7 @@ export class ModelServiceImpl extends Disposable implements IModelService {
&& (currentOptions.detectIndentation === newOptions.detectIndentation)
&& (currentOptions.insertSpaces === newOptions.insertSpaces)
&& (currentOptions.tabSize === newOptions.tabSize)
&& (currentOptions.indentSize === newOptions.indentSize)
&& (currentOptions.trimAutoWhitespace === newOptions.trimAutoWhitespace)
) {
// Same indent opts, no need to touch the model
@@ -225,6 +239,7 @@ export class ModelServiceImpl extends Disposable implements IModelService {
model.updateOptions({
insertSpaces: newOptions.insertSpaces,
tabSize: newOptions.tabSize,
indentSize: newOptions.indentSize,
trimAutoWhitespace: newOptions.trimAutoWhitespace
});
}

View File

@@ -18,7 +18,7 @@ export interface ITextModelService {
* Provided a resource URI, it will return a model reference
* which should be disposed once not needed anymore.
*/
createModelReference(resource: URI): Promise<IReference<ITextEditorModel>>;
createModelReference(resource: URI): Promise<IReference<IResolvedTextEditorModel>>;
/**
* Registers a specific `scheme` content provider.
@@ -36,7 +36,7 @@ export interface ITextModelContentProvider {
/**
* Given a resource, return the content of the resource as `ITextModel`.
*/
provideTextContent(resource: URI): Promise<ITextModel> | null;
provideTextContent(resource: URI): Promise<ITextModel | undefined | null> | null | undefined;
}
export interface ITextEditorModel extends IEditorModel {
@@ -44,7 +44,15 @@ export interface ITextEditorModel extends IEditorModel {
/**
* Provides access to the underlying `ITextModel`.
*/
readonly textEditorModel: ITextModel;
readonly textEditorModel: ITextModel | null;
isReadonly(): boolean;
}
export interface IResolvedTextEditorModel extends ITextEditorModel {
/**
* Same as ITextEditorModel#textEditorModel, but never null.
*/
readonly textEditorModel: ITextModel;
}

View File

@@ -24,13 +24,13 @@ export interface ITextResourceConfigurationService {
* Fetches the value of the section for the given resource by applying language overrides.
* Value can be of native type or an object keyed off the section name.
*
* @param resource - Resource for which the configuration has to be fetched. Can be `null` or `undefined`.
* @param postion - Position in the resource for which configuration has to be fetched. Can be `null` or `undefined`.
* @param section - Section of the configuraion. Can be `null` or `undefined`.
* @param resource - Resource for which the configuration has to be fetched.
* @param postion - Position in the resource for which configuration has to be fetched.
* @param section - Section of the configuraion.
*
*/
getValue<T>(resource: URI, section?: string): T;
getValue<T>(resource: URI, position?: IPosition, section?: string): T;
getValue<T>(resource: URI | undefined, section?: string): T;
getValue<T>(resource: URI | undefined, position?: IPosition, section?: string): T;
}

View File

@@ -52,7 +52,7 @@ export interface IWebWorkerOptions {
class MonacoWebWorkerImpl<T> extends EditorWorkerClient implements MonacoWebWorker<T> {
private _foreignModuleId: string;
private readonly _foreignModuleId: string;
private _foreignModuleCreateData: any | null;
private _foreignProxy: Promise<T> | null;