Refresh master with initial release/0.24 snapshot (#332)

* Initial port of release/0.24 source code

* Fix additional headers

* Fix a typo in launch.json
This commit is contained in:
Karl Burtram
2017-12-15 15:38:57 -08:00
committed by GitHub
parent 271b3a0b82
commit 6ad0df0e3e
7118 changed files with 107999 additions and 56466 deletions

View File

@@ -10,10 +10,12 @@ import { Range } from 'vs/editor/common/core/range';
import * as editorCommon from 'vs/editor/common/editorCommon';
import { LineTokens } from 'vs/editor/common/core/lineTokens';
import { PrefixSumComputerWithCache } from 'vs/editor/common/viewModel/prefixSumComputer';
import { ViewLineData, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel';
import { ViewLineData, ICoordinatesConverter, IOverviewRulerDecorations } from 'vs/editor/common/viewModel/viewModel';
import * as viewEvents from 'vs/editor/common/view/viewEvents';
import { WrappingIndent } from 'vs/editor/common/config/editorOptions';
import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations';
import { ModelDecorationOptions, ModelDecorationOverviewRulerOptions } from 'vs/editor/common/model/textModelWithDecorations';
import { ThemeColor, ITheme } from 'vs/platform/theme/common/themeService';
import { Color } from 'vs/base/common/color';
export class OutputPosition {
_outputPositionBrand: void;
@@ -57,6 +59,7 @@ export interface ISplitLine {
getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number;
getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position;
getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number;
}
export interface IViewModelLinesCollection {
@@ -76,12 +79,15 @@ export interface IViewModelLinesCollection {
getViewLineCount(): number;
warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void;
getViewLineIndentGuide(viewLineNumber: number): number;
getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[];
getViewLineContent(viewLineNumber: number): string;
getViewLineMinColumn(viewLineNumber: number): number;
getViewLineMaxColumn(viewLineNumber: number): number;
getViewLineData(viewLineNumber: number): ViewLineData;
getViewLinesData(viewStartLineNumber: number, viewEndLineNumber: number, needed: boolean[]): ViewLineData[];
getAllOverviewRulerDecorations(ownerId: number, filterOutValidation: boolean, theme: ITheme): IOverviewRulerDecorations;
getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[];
}
export class CoordinatesConverter implements ICoordinatesConverter {
@@ -493,11 +499,63 @@ export class SplitLinesCollection implements IViewModelLinesCollection {
this.prefixSumComputer.warmUpCache(viewStartLineNumber - 1, viewEndLineNumber - 1);
}
public getViewLineIndentGuide(viewLineNumber: number): number {
public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] {
this._ensureValidState();
viewLineNumber = this._toValidViewLineNumber(viewLineNumber);
let r = this.prefixSumComputer.getIndexOf(viewLineNumber - 1);
return this.model.getLineIndentGuide(r.index + 1);
viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber);
viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber);
const modelStart = this.convertViewPositionToModelPosition(viewStartLineNumber, this.getViewLineMinColumn(viewStartLineNumber));
const modelEnd = this.convertViewPositionToModelPosition(viewEndLineNumber, this.getViewLineMaxColumn(viewEndLineNumber));
let result: number[] = [];
let resultRepeatCount: number[] = [];
const modelStartLineIndex = modelStart.lineNumber - 1;
const modelEndLineIndex = modelEnd.lineNumber - 1;
let reqStart: Position = null;
for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {
const line = this.lines[modelLineIndex];
if (line.isVisible()) {
let count = 0;
if (modelLineIndex === modelStartLineIndex) {
let viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, modelStart.column);
let viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));
count = viewLineEndIndex - viewLineStartIndex + 1;
} else {
let viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, 1);
let viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));
count = viewLineEndIndex - viewLineStartIndex + 1;
}
resultRepeatCount.push(count);
// merge into previous request
if (reqStart === null) {
reqStart = new Position(modelLineIndex + 1, 0);
}
} else {
// hit invisible line => flush request
if (reqStart !== null) {
result = result.concat(this.model.getLinesIndentGuides(reqStart.lineNumber, modelLineIndex));
reqStart = null;
}
}
}
if (reqStart !== null) {
result = result.concat(this.model.getLinesIndentGuides(reqStart.lineNumber, modelEnd.lineNumber));
reqStart = null;
}
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
let viewIndents = new Array<number>(viewLineCount);
let currIndex = 0;
for (let i = 0, len = result.length; i < len; i++) {
let value = result[i];
let count = Math.min(viewLineCount - currIndex, resultRepeatCount[i]);
for (let j = 0; j < count; j++) {
viewIndents[currIndex++] = value;
}
}
return viewIndents;
}
public getViewLineContent(viewLineNumber: number): string {
@@ -650,6 +708,84 @@ export class SplitLinesCollection implements IViewModelLinesCollection {
// console.log('in -> out ' + inputLineNumber + ',' + inputColumn + ' ===> ' + r.lineNumber + ',' + r);
return r;
}
private _getViewLineNumberForModelPosition(inputLineNumber: number, inputColumn: number): number {
let lineIndex = inputLineNumber - 1;
if (this.lines[lineIndex].isVisible()) {
// this model line is visible
const deltaLineNumber = 1 + (lineIndex === 0 ? 0 : this.prefixSumComputer.getAccumulatedValue(lineIndex - 1));
return this.lines[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, inputColumn);
}
// this model line is not visible
while (lineIndex > 0 && !this.lines[lineIndex].isVisible()) {
lineIndex--;
}
if (lineIndex === 0 && !this.lines[lineIndex].isVisible()) {
// Could not reach a real line
return 1;
}
const deltaLineNumber = 1 + (lineIndex === 0 ? 0 : this.prefixSumComputer.getAccumulatedValue(lineIndex - 1));
return this.lines[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1));
}
public getAllOverviewRulerDecorations(ownerId: number, filterOutValidation: boolean, theme: ITheme): IOverviewRulerDecorations {
const decorations = this.model.getOverviewRulerDecorations(ownerId, filterOutValidation);
const result = new OverviewRulerDecorations();
for (let i = 0, len = decorations.length; i < len; i++) {
const decoration = decorations[i];
const opts = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;
const lane = opts.position;
if (lane === 0) {
continue;
}
const color = resolveColor(opts, theme);
const viewStartLineNumber = this._getViewLineNumberForModelPosition(decoration.range.startLineNumber, decoration.range.startColumn);
const viewEndLineNumber = this._getViewLineNumberForModelPosition(decoration.range.endLineNumber, decoration.range.endColumn);
result.accept(color, viewStartLineNumber, viewEndLineNumber, lane);
}
return result.result;
}
public getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[] {
const modelStart = this.convertViewPositionToModelPosition(range.startLineNumber, range.startColumn);
const modelEnd = this.convertViewPositionToModelPosition(range.endLineNumber, range.endColumn);
if (modelEnd.lineNumber - modelStart.lineNumber <= range.endLineNumber - range.startLineNumber) {
// most likely there are no hidden lines => fast path
return this.model.getDecorationsInRange(new Range(modelStart.lineNumber, modelStart.column, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation);
}
let result: editorCommon.IModelDecoration[] = [];
const modelStartLineIndex = modelStart.lineNumber - 1;
const modelEndLineIndex = modelEnd.lineNumber - 1;
let reqStart: Position = null;
for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {
const line = this.lines[modelLineIndex];
if (line.isVisible()) {
// merge into previous request
if (reqStart === null) {
reqStart = new Position(modelLineIndex + 1, modelLineIndex === modelStartLineIndex ? modelStart.column : 1);
}
} else {
// hit invisible line => flush request
if (reqStart !== null) {
const maxLineColumn = this.model.getLineMaxColumn(modelLineIndex);
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelLineIndex, maxLineColumn), ownerId, filterOutValidation));
reqStart = null;
}
}
}
if (reqStart !== null) {
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation));
reqStart = null;
}
return result;
}
}
class VisibleIdentitySplitLine implements ISplitLine {
@@ -711,6 +847,10 @@ class VisibleIdentitySplitLine implements ISplitLine {
public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position {
return new Position(deltaLineNumber, inputColumn);
}
public getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number {
return deltaLineNumber;
}
}
class InvisibleIdentitySplitLine implements ISplitLine {
@@ -761,6 +901,10 @@ class InvisibleIdentitySplitLine implements ISplitLine {
public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position {
throw new Error('Not supported');
}
public getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number {
throw new Error('Not supported');
}
}
export class SplitLine implements ISplitLine {
@@ -914,6 +1058,14 @@ export class SplitLine implements ISplitLine {
// console.log('in -> out ' + deltaLineNumber + ',' + inputColumn + ' ===> ' + (deltaLineNumber+outputLineIndex) + ',' + outputColumn);
return new Position(deltaLineNumber + outputLineIndex, outputColumn);
}
public getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number {
if (!this._isVisible) {
throw new Error('Not supported');
}
const r = this.positionMapper.getOutputPositionOfInputOffset(inputColumn - 1);
return (deltaLineNumber + r.outputLineIndex);
}
}
function createSplitLine(linePositionMapperFactory: ILineMapperFactory, text: string, tabSize: number, wrappingColumn: number, columnsForFullWidthChar: number, wrappingIndent: WrappingIndent, isVisible: boolean): ISplitLine {
@@ -1050,8 +1202,13 @@ export class IdentityLinesCollection implements IViewModelLinesCollection {
public warmUpLookupCache(viewStartLineNumber: number, viewEndLineNumber: number): void {
}
public getViewLineIndentGuide(viewLineNumber: number): number {
return 0;
public getViewLinesIndentGuides(viewStartLineNumber: number, viewEndLineNumber: number): number[] {
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
let result = new Array<number>(viewLineCount);
for (let i = 0; i < viewLineCount; i++) {
result[i] = 0;
}
return result;
}
public getViewLineContent(viewLineNumber: number): string {
@@ -1093,4 +1250,77 @@ export class IdentityLinesCollection implements IViewModelLinesCollection {
return result;
}
public getAllOverviewRulerDecorations(ownerId: number, filterOutValidation: boolean, theme: ITheme): IOverviewRulerDecorations {
const decorations = this.model.getOverviewRulerDecorations(ownerId, filterOutValidation);
const result = new OverviewRulerDecorations();
for (let i = 0, len = decorations.length; i < len; i++) {
const decoration = decorations[i];
const opts = <ModelDecorationOverviewRulerOptions>decoration.options.overviewRuler;
const lane = opts.position;
if (lane === 0) {
continue;
}
const color = resolveColor(opts, theme);
const viewStartLineNumber = decoration.range.startLineNumber;
const viewEndLineNumber = decoration.range.endLineNumber;
result.accept(color, viewStartLineNumber, viewEndLineNumber, lane);
}
return result.result;
}
public getDecorationsInRange(range: Range, ownerId: number, filterOutValidation: boolean): editorCommon.IModelDecoration[] {
return this.model.getDecorationsInRange(range, ownerId, filterOutValidation);
}
}
class OverviewRulerDecorations {
readonly result: IOverviewRulerDecorations = Object.create(null);
constructor() {
}
public accept(color: string, startLineNumber: number, endLineNumber: number, lane: number): void {
let prev = this.result[color];
if (prev) {
const prevLane = prev[prev.length - 3];
const prevEndLineNumber = prev[prev.length - 1];
if (prevLane === lane && prevEndLineNumber + 1 >= startLineNumber) {
// merge into prev
if (endLineNumber > prevEndLineNumber) {
prev[prev.length - 1] = endLineNumber;
}
return;
}
// push
prev.push(lane, startLineNumber, endLineNumber);
} else {
this.result[color] = [lane, startLineNumber, endLineNumber];
}
}
}
function resolveColor(opts: ModelDecorationOverviewRulerOptions, theme: ITheme): string {
if (!opts._resolvedColor) {
const themeType = theme.type;
const color = (themeType === 'dark' ? opts.darkColor : themeType === 'light' ? opts.color : opts.hcColor);
opts._resolvedColor = resolveRulerColor(color, theme);
}
return opts._resolvedColor;
}
function resolveRulerColor(color: string | ThemeColor, theme: ITheme): string {
if (typeof color === 'string') {
return color;
}
let c = color ? theme.getColor(color.id) : null;
if (!c) {
c = Color.transparent;
}
return c.toString();
}