Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
a32a8024
V
vscode
项目概览
掘金者说
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a32a8024
编写于
6月 27, 2016
作者:
A
Alex Dima
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add getIndentLevel() to TextModel and ModelLine
上级
27d5c0e2
变更
9
显示空白变更内容
内联
并排
Showing
9 changed file
with
184 addition
and
102 deletion
+184
-102
src/vs/editor/common/editorCommon.ts
src/vs/editor/common/editorCommon.ts
+5
-0
src/vs/editor/common/model/editableTextModel.ts
src/vs/editor/common/model/editableTextModel.ts
+9
-7
src/vs/editor/common/model/mirrorModel.ts
src/vs/editor/common/model/mirrorModel.ts
+4
-2
src/vs/editor/common/model/modelLine.ts
src/vs/editor/common/model/modelLine.ts
+81
-14
src/vs/editor/common/model/textModel.ts
src/vs/editor/common/model/textModel.ts
+20
-8
src/vs/editor/contrib/folding/common/indentFoldStrategy.ts
src/vs/editor/contrib/folding/common/indentFoldStrategy.ts
+1
-22
src/vs/editor/contrib/folding/test/indentFold.test.ts
src/vs/editor/contrib/folding/test/indentFold.test.ts
+1
-15
src/vs/editor/test/common/commands/sideEditing.test.ts
src/vs/editor/test/common/commands/sideEditing.test.ts
+4
-2
src/vs/editor/test/common/model/model.line.test.ts
src/vs/editor/test/common/model/model.line.test.ts
+59
-32
未找到文件。
src/vs/editor/common/editorCommon.ts
浏览文件 @
a32a8024
...
...
@@ -1563,6 +1563,11 @@ export interface ITextModel {
*/
getLineContent
(
lineNumber
:
number
):
string
;
/**
* @internal
*/
getIndentLevel
(
lineNumber
:
number
):
number
;
/**
* Get the text for all lines.
*/
...
...
src/vs/editor/common/model/editableTextModel.ts
浏览文件 @
a32a8024
...
...
@@ -425,6 +425,8 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
private
_applyEdits
(
operations
:
IValidatedEditOperation
[]):
void
{
const
tabSize
=
this
.
_options
.
tabSize
;
// Sort operations descending
operations
.
sort
(
EditableTextModel
.
_sortOpsDescending
);
...
...
@@ -461,7 +463,7 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
}
this
.
_invalidateLine
(
currentLineNumber
-
1
);
this
.
_lines
[
currentLineNumber
-
1
].
applyEdits
(
deferredEventsBuilder
.
changedMarkers
,
lineEditsQueue
.
slice
(
currentLineNumberStart
,
i
));
this
.
_lines
[
currentLineNumber
-
1
].
applyEdits
(
deferredEventsBuilder
.
changedMarkers
,
lineEditsQueue
.
slice
(
currentLineNumberStart
,
i
)
,
tabSize
);
if
(
this
.
_lineStarts
)
{
// update prefix sum
this
.
_lineStarts
.
changeValue
(
currentLineNumber
-
1
,
this
.
_lines
[
currentLineNumber
-
1
].
text
.
length
+
this
.
_EOL
.
length
);
...
...
@@ -473,7 +475,7 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
}
this
.
_invalidateLine
(
currentLineNumber
-
1
);
this
.
_lines
[
currentLineNumber
-
1
].
applyEdits
(
deferredEventsBuilder
.
changedMarkers
,
lineEditsQueue
.
slice
(
currentLineNumberStart
,
lineEditsQueue
.
length
));
this
.
_lines
[
currentLineNumber
-
1
].
applyEdits
(
deferredEventsBuilder
.
changedMarkers
,
lineEditsQueue
.
slice
(
currentLineNumberStart
,
lineEditsQueue
.
length
)
,
tabSize
);
if
(
this
.
_lineStarts
)
{
// update prefix sum
this
.
_lineStarts
.
changeValue
(
currentLineNumber
-
1
,
this
.
_lines
[
currentLineNumber
-
1
].
text
.
length
+
this
.
_EOL
.
length
);
...
...
@@ -535,7 +537,7 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
let
spliceStartLineNumber
=
startLineNumber
+
editingLinesCnt
;
let
spliceStartColumn
=
this
.
getLineMaxColumn
(
spliceStartLineNumber
);
let
endLineRemains
=
this
.
_lines
[
endLineNumber
-
1
].
split
(
deferredEventsBuilder
.
changedMarkers
,
endColumn
,
false
);
let
endLineRemains
=
this
.
_lines
[
endLineNumber
-
1
].
split
(
deferredEventsBuilder
.
changedMarkers
,
endColumn
,
false
,
tabSize
);
this
.
_invalidateLine
(
spliceStartLineNumber
-
1
);
let
spliceCnt
=
endLineNumber
-
spliceStartLineNumber
;
...
...
@@ -554,7 +556,7 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
}
// Reconstruct first line
this
.
_lines
[
spliceStartLineNumber
-
1
].
append
(
deferredEventsBuilder
.
changedMarkers
,
endLineRemains
);
this
.
_lines
[
spliceStartLineNumber
-
1
].
append
(
deferredEventsBuilder
.
changedMarkers
,
endLineRemains
,
tabSize
);
if
(
this
.
_lineStarts
)
{
// update prefix sum
this
.
_lineStarts
.
changeValue
(
spliceStartLineNumber
-
1
,
this
.
_lines
[
spliceStartLineNumber
-
1
].
text
.
length
+
this
.
_EOL
.
length
);
...
...
@@ -578,7 +580,7 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
}
// Split last line
let
leftoverLine
=
this
.
_lines
[
spliceLineNumber
-
1
].
split
(
deferredEventsBuilder
.
changedMarkers
,
spliceColumn
,
op
.
forceMoveMarkers
);
let
leftoverLine
=
this
.
_lines
[
spliceLineNumber
-
1
].
split
(
deferredEventsBuilder
.
changedMarkers
,
spliceColumn
,
op
.
forceMoveMarkers
,
tabSize
);
if
(
this
.
_lineStarts
)
{
// update prefix sum
this
.
_lineStarts
.
changeValue
(
spliceLineNumber
-
1
,
this
.
_lines
[
spliceLineNumber
-
1
].
text
.
length
+
this
.
_EOL
.
length
);
...
...
@@ -591,7 +593,7 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
let
newLinesLengths
:
number
[]
=
[];
for
(
let
j
=
editingLinesCnt
+
1
;
j
<=
insertingLinesCnt
;
j
++
)
{
let
newLineNumber
=
startLineNumber
+
j
;
this
.
_lines
.
splice
(
newLineNumber
-
1
,
0
,
new
ModelLine
(
newLineNumber
,
op
.
lines
[
j
]));
this
.
_lines
.
splice
(
newLineNumber
-
1
,
0
,
new
ModelLine
(
newLineNumber
,
op
.
lines
[
j
]
,
tabSize
));
newLinesContent
.
push
(
op
.
lines
[
j
]);
newLinesLengths
.
push
(
op
.
lines
[
j
].
length
+
this
.
_EOL
.
length
);
}
...
...
@@ -602,7 +604,7 @@ export class EditableTextModel extends TextModelWithDecorations implements edito
}
// Last line
this
.
_lines
[
startLineNumber
+
insertingLinesCnt
-
1
].
append
(
deferredEventsBuilder
.
changedMarkers
,
leftoverLine
);
this
.
_lines
[
startLineNumber
+
insertingLinesCnt
-
1
].
append
(
deferredEventsBuilder
.
changedMarkers
,
leftoverLine
,
tabSize
);
if
(
this
.
_lineStarts
)
{
// update prefix sum
this
.
_lineStarts
.
changeValue
(
startLineNumber
+
insertingLinesCnt
-
1
,
this
.
_lines
[
startLineNumber
+
insertingLinesCnt
-
1
].
text
.
length
+
this
.
_EOL
.
length
);
...
...
src/vs/editor/common/model/mirrorModel.ts
浏览文件 @
a32a8024
...
...
@@ -18,6 +18,8 @@ export interface IMirrorModelEvents {
contentChanged
:
editorCommon
.
IModelContentChangedEvent
[];
}
const
NO_TAB_SIZE
=
0
;
export
class
AbstractMirrorModel
extends
TextModelWithTokens
implements
editorCommon
.
IMirrorModel
{
_associatedResource
:
URI
;
...
...
@@ -207,7 +209,7 @@ export class MirrorModel extends AbstractMirrorModel implements editorCommon.IMi
endColumn
:
Number
.
MAX_VALUE
,
text
:
e
.
detail
,
forceMoveMarkers
:
false
}]);
}]
,
NO_TAB_SIZE
);
if
(
this
.
_lineStarts
)
{
// update prefix sum
this
.
_lineStarts
.
changeValue
(
e
.
lineNumber
-
1
,
this
.
_lines
[
e
.
lineNumber
-
1
].
text
.
length
+
this
.
_EOL
.
length
);
...
...
@@ -247,7 +249,7 @@ export class MirrorModel extends AbstractMirrorModel implements editorCommon.IMi
let
newLengths
:
number
[]
=
[];
for
(
lineIndex
=
e
.
fromLineNumber
-
1
,
i
=
0
;
lineIndex
<
e
.
toLineNumber
;
lineIndex
++
,
i
++
)
{
this
.
_lines
.
splice
(
lineIndex
,
0
,
new
ModelLine
(
0
,
splitLines
[
i
]));
this
.
_lines
.
splice
(
lineIndex
,
0
,
new
ModelLine
(
0
,
splitLines
[
i
]
,
NO_TAB_SIZE
));
newLengths
.
push
(
splitLines
[
i
].
length
+
this
.
_EOL
.
length
);
}
if
(
this
.
_lineStarts
)
{
...
...
src/vs/editor/common/model/modelLine.ts
浏览文件 @
a32a8024
...
...
@@ -71,6 +71,35 @@ enum MarkerMoveSemantics {
ForceStay
=
2
}
/**
* Returns:
* - 0 => the line consists of whitespace
* - otherwise => the indent level is returned value - 1
*/
function
computePlusOneIndentLevel
(
line
:
string
,
tabSize
:
number
):
number
{
let
indent
=
0
;
let
i
=
0
;
let
len
=
line
.
length
;
while
(
i
<
len
)
{
let
chCode
=
line
.
charCodeAt
(
i
);
if
(
chCode
===
32
/*space*/
)
{
indent
++
;
}
else
if
(
chCode
===
9
/*\t*/
)
{
indent
=
indent
-
indent
%
tabSize
+
tabSize
;
}
else
{
break
;
}
i
++
;
}
if
(
i
===
len
)
{
return
0
;
// line only consists of whitespace
}
return
indent
+
1
;
}
export
class
ModelLine
{
private
_lineNumber
:
number
;
public
get
lineNumber
():
number
{
return
this
.
_lineNumber
;
}
...
...
@@ -78,19 +107,51 @@ export class ModelLine {
private
_text
:
string
;
public
get
text
():
string
{
return
this
.
_text
;
}
private
_isInvalid
:
boolean
;
public
get
isInvalid
():
boolean
{
return
this
.
_isInvalid
;
}
public
set
isInvalid
(
value
:
boolean
)
{
this
.
_isInvalid
=
value
;
}
/**
* bits 31 - 1 => indentLevel
* bit 0 => isInvalid
*/
private
_metadata
:
number
;
public
get
isInvalid
():
boolean
{
return
(
this
.
_metadata
&
0x00000001
)
?
true
:
false
;
}
public
set
isInvalid
(
value
:
boolean
)
{
this
.
_metadata
=
(
this
.
_metadata
&
0xfffffffe
)
|
(
value
?
1
:
0
);
}
/**
* Returns:
* - -1 => the line consists of whitespace
* - otherwise => the indent level is returned value
*/
public
getIndentLevel
():
number
{
return
((
this
.
_metadata
&
0xfffffffe
)
>>
1
)
-
1
;
}
private
_setPlusOneIndentLevel
(
value
:
number
):
void
{
this
.
_metadata
=
(
this
.
_metadata
&
0x00000001
)
|
((
value
&
0xefffffff
)
<<
1
);
}
public
updateTabSize
(
tabSize
:
number
):
void
{
if
(
tabSize
===
0
)
{
// don't care mark
this
.
_metadata
=
this
.
_metadata
&
0x00000001
;
}
else
{
this
.
_setPlusOneIndentLevel
(
computePlusOneIndentLevel
(
this
.
_text
,
tabSize
));
}
}
private
_state
:
IState
;
private
_modeTransitions
:
ModeTransition
[];
private
_lineTokens
:
LineTokens
;
private
_markers
:
ILineMarker
[];
constructor
(
lineNumber
:
number
,
text
:
string
)
{
constructor
(
lineNumber
:
number
,
text
:
string
,
tabSize
:
number
)
{
this
.
_lineNumber
=
lineNumber
|
0
;
this
.
_
text
=
text
;
this
.
_
isInvalid
=
false
;
this
.
_
metadata
=
0
;
this
.
_
setText
(
text
,
tabSize
)
;
this
.
_state
=
null
;
this
.
_modeTransitions
=
null
;
this
.
_lineTokens
=
null
;
...
...
@@ -207,8 +268,14 @@ export class ModelLine {
};
}
private
_setText
(
text
:
string
):
void
{
private
_setText
(
text
:
string
,
tabSize
:
number
):
void
{
this
.
_text
=
text
;
if
(
tabSize
===
0
)
{
// don't care mark
this
.
_metadata
=
this
.
_metadata
&
0x00000001
;
}
else
{
this
.
_setPlusOneIndentLevel
(
computePlusOneIndentLevel
(
text
,
tabSize
));
}
if
(
this
.
_lineTokens
)
{
let
map
=
this
.
_lineTokens
.
getBinaryEncodedTokensMap
(),
...
...
@@ -342,7 +409,7 @@ export class ModelLine {
};
}
public
applyEdits
(
changedMarkers
:
IChangedMarkers
,
edits
:
ILineEdit
[]):
number
{
public
applyEdits
(
changedMarkers
:
IChangedMarkers
,
edits
:
ILineEdit
[]
,
tabSize
:
number
):
number
{
let
deltaColumn
=
0
;
let
resultText
=
this
.
_text
;
...
...
@@ -393,12 +460,12 @@ export class ModelLine {
markersAdjuster
.
finish
(
deltaColumn
,
resultText
.
length
);
// Save the resulting text
this
.
_setText
(
resultText
);
this
.
_setText
(
resultText
,
tabSize
);
return
deltaColumn
;
}
public
split
(
changedMarkers
:
IChangedMarkers
,
splitColumn
:
number
,
forceMoveMarkers
:
boolean
):
ModelLine
{
public
split
(
changedMarkers
:
IChangedMarkers
,
splitColumn
:
number
,
forceMoveMarkers
:
boolean
,
tabSize
:
number
):
ModelLine
{
// console.log('--> split @ ' + splitColumn + '::: ' + this._printMarkers());
var
myText
=
this
.
_text
.
substring
(
0
,
splitColumn
-
1
);
var
otherText
=
this
.
_text
.
substring
(
splitColumn
-
1
);
...
...
@@ -439,20 +506,20 @@ export class ModelLine {
}
}
this
.
_setText
(
myText
);
this
.
_setText
(
myText
,
tabSize
);
var
otherLine
=
new
ModelLine
(
this
.
_lineNumber
+
1
,
otherText
);
var
otherLine
=
new
ModelLine
(
this
.
_lineNumber
+
1
,
otherText
,
tabSize
);
if
(
otherMarkers
)
{
otherLine
.
addMarkers
(
otherMarkers
);
}
return
otherLine
;
}
public
append
(
changedMarkers
:
IChangedMarkers
,
other
:
ModelLine
):
void
{
public
append
(
changedMarkers
:
IChangedMarkers
,
other
:
ModelLine
,
tabSize
:
number
):
void
{
// console.log('--> append: THIS :: ' + this._printMarkers());
// console.log('--> append: OTHER :: ' + this._printMarkers());
var
thisTextLength
=
this
.
_text
.
length
;
this
.
_setText
(
this
.
_text
+
other
.
_text
);
this
.
_setText
(
this
.
_text
+
other
.
_text
,
tabSize
);
let
otherLineTokens
=
other
.
_lineTokens
;
if
(
otherLineTokens
)
{
...
...
src/vs/editor/common/model/textModel.ts
浏览文件 @
a32a8024
...
...
@@ -93,10 +93,15 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
}
}
if
(
typeof
newOpts
.
tabSize
!==
'
undefined
'
)
{
if
(
this
.
_options
.
tabSize
!==
newOpts
.
tabSize
)
{
let
newTabSize
=
newOpts
.
tabSize
|
0
;
if
(
this
.
_options
.
tabSize
!==
newTabSize
)
{
somethingChanged
=
true
;
changed
.
tabSize
=
true
;
this
.
_options
.
tabSize
=
newOpts
.
tabSize
;
this
.
_options
.
tabSize
=
newTabSize
;
for
(
let
i
=
0
,
len
=
this
.
_lines
.
length
;
i
<
len
;
i
++
)
{
this
.
_lines
[
i
].
updateTabSize
(
newTabSize
);
}
}
}
if
(
typeof
newOpts
.
trimAutoWhitespace
!==
'
undefined
'
)
{
...
...
@@ -461,6 +466,14 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
return
this
.
_lines
[
lineNumber
-
1
].
text
;
}
public
getIndentLevel
(
lineNumber
:
number
):
number
{
if
(
lineNumber
<
1
||
lineNumber
>
this
.
getLineCount
())
{
throw
new
Error
(
'
Illegal value
'
+
lineNumber
+
'
for `lineNumber`
'
);
}
return
this
.
_lines
[
lineNumber
-
1
].
getIndentLevel
();
}
public
getLinesContent
():
string
[]
{
var
r
:
string
[]
=
[];
for
(
var
i
=
0
,
len
=
this
.
_lines
.
length
;
i
<
len
;
i
++
)
{
...
...
@@ -648,13 +661,12 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
}
_constructLines
(
rawText
:
editorCommon
.
IRawText
):
void
{
var
rawLines
=
rawText
.
lines
,
modelLines
:
ModelLine
[]
=
[],
i
:
number
,
len
:
number
;
const
tabSize
=
rawText
.
options
.
tabSize
;
let
rawLines
=
rawText
.
lines
;
let
modelLines
:
ModelLine
[]
=
[];
for
(
i
=
0
,
len
=
rawLines
.
length
;
i
<
len
;
i
++
)
{
modelLines
.
push
(
new
ModelLine
(
i
+
1
,
rawLines
[
i
])
);
for
(
let
i
=
0
,
len
=
rawLines
.
length
;
i
<
len
;
i
++
)
{
modelLines
[
i
]
=
new
ModelLine
(
i
+
1
,
rawLines
[
i
],
tabSize
);
}
this
.
_BOM
=
rawText
.
BOM
;
this
.
_EOL
=
rawText
.
EOL
;
...
...
src/vs/editor/contrib/folding/common/indentFoldStrategy.ts
浏览文件 @
a32a8024
...
...
@@ -16,7 +16,7 @@ export function computeRanges(model: IModel, tabSize: number, minimumRangeSize:
previousRegions
.
push
({
indent
:
-
1
,
line
:
model
.
getLineCount
()
+
1
});
// sentinel, to make sure there's at least one entry
for
(
let
line
=
model
.
getLineCount
();
line
>
0
;
line
--
)
{
let
indent
=
computeIndentLevel
(
model
.
getLineContent
(
line
),
tabSiz
e
);
let
indent
=
model
.
getIndentLevel
(
lin
e
);
if
(
indent
===
-
1
)
{
continue
;
// only whitespace
}
...
...
@@ -46,27 +46,6 @@ export function computeRanges(model: IModel, tabSize: number, minimumRangeSize:
return
result
.
reverse
();
}
export
function
computeIndentLevel
(
line
:
string
,
tabSize
:
number
):
number
{
let
i
=
0
;
let
indent
=
0
;
while
(
i
<
line
.
length
)
{
let
ch
=
line
.
charAt
(
i
);
if
(
ch
===
'
'
)
{
indent
++
;
}
else
if
(
ch
===
'
\t
'
)
{
indent
=
indent
-
indent
%
tabSize
+
tabSize
;
}
else
{
break
;
}
i
++
;
}
if
(
i
===
line
.
length
)
{
return
-
1
;
// line only consists of whitespace
}
return
indent
;
}
/**
* Limits the number of folding ranges by removing ranges with larger indent levels
*/
...
...
src/vs/editor/contrib/folding/test/indentFold.test.ts
浏览文件 @
a32a8024
...
...
@@ -7,7 +7,7 @@
import
*
as
assert
from
'
assert
'
;
import
{
Model
}
from
'
vs/editor/common/model/model
'
;
import
{
IFoldingRange
}
from
'
vs/editor/contrib/folding/common/foldingRange
'
;
import
{
computeRanges
,
limitByIndent
,
computeIndentLevel
}
from
'
vs/editor/contrib/folding/common/indentFoldStrategy
'
;
import
{
computeRanges
,
limitByIndent
}
from
'
vs/editor/contrib/folding/common/indentFoldStrategy
'
;
suite
(
'
Indentation Folding
'
,
()
=>
{
function
assertRanges
(
lines
:
string
[],
tabSize
:
number
,
expected
:
IFoldingRange
[]):
void
{
...
...
@@ -127,18 +127,4 @@ suite('Indentation Folding', () => {
assert
.
deepEqual
(
limitByIndent
(
ranges
,
0
),
[]);
});
test
(
'
Compute indent level
'
,
()
=>
{
assert
.
equal
(
computeIndentLevel
(
'
Hello
'
,
4
),
0
);
assert
.
equal
(
computeIndentLevel
(
'
Hello
'
,
4
),
1
);
assert
.
equal
(
computeIndentLevel
(
'
Hello
'
,
4
),
3
);
assert
.
equal
(
computeIndentLevel
(
'
\t
Hello
'
,
4
),
4
);
assert
.
equal
(
computeIndentLevel
(
'
\t
Hello
'
,
4
),
4
);
assert
.
equal
(
computeIndentLevel
(
'
\t
Hello
'
,
4
),
4
);
assert
.
equal
(
computeIndentLevel
(
'
\t
Hello
'
,
4
),
4
);
assert
.
equal
(
computeIndentLevel
(
'
\t
Hello
'
,
4
),
8
);
assert
.
equal
(
computeIndentLevel
(
'
\t
Hello
'
,
4
),
8
);
assert
.
equal
(
computeIndentLevel
(
'
\t
Hello
'
,
4
),
5
);
assert
.
equal
(
computeIndentLevel
(
'
\t
\t
Hello
'
,
4
),
8
);
});
});
src/vs/editor/test/common/commands/sideEditing.test.ts
浏览文件 @
a32a8024
...
...
@@ -15,6 +15,8 @@ import {Model} from 'vs/editor/common/model/model';
import
{
ILineEdit
,
ModelLine
}
from
'
vs/editor/common/model/modelLine
'
;
import
{
MockConfiguration
}
from
'
vs/editor/test/common/mocks/mockConfiguration
'
;
const
NO_TAB_SIZE
=
0
;
function
testCommand
(
lines
:
string
[],
selection
:
Selection
,
edits
:
IIdentifiedSingleEditOperation
[],
expectedLines
:
string
[],
expectedSelection
:
Selection
):
void
{
let
model
=
Model
.
createFromString
(
lines
.
join
(
'
\n
'
));
let
config
=
new
MockConfiguration
(
null
);
...
...
@@ -36,7 +38,7 @@ function testCommand(lines:string[], selection:Selection, edits:IIdentifiedSingl
}
function
testLineEditMarker
(
text
:
string
,
column
:
number
,
stickToPreviousCharacter
:
boolean
,
edit
:
ILineEdit
,
expectedColumn
:
number
):
void
{
var
line
=
new
ModelLine
(
1
,
text
);
var
line
=
new
ModelLine
(
1
,
text
,
NO_TAB_SIZE
);
line
.
addMarker
({
id
:
'
1
'
,
line
:
null
,
...
...
@@ -46,7 +48,7 @@ function testLineEditMarker(text:string, column:number, stickToPreviousCharacter
oldColumn
:
0
,
});
line
.
applyEdits
({},
[
edit
]);
line
.
applyEdits
({},
[
edit
]
,
NO_TAB_SIZE
);
assert
.
equal
(
line
.
getMarkers
()[
0
].
column
,
expectedColumn
);
}
...
...
src/vs/editor/test/common/model/model.line.test.ts
浏览文件 @
a32a8024
...
...
@@ -6,7 +6,7 @@
import
*
as
assert
from
'
assert
'
;
import
{
ILineTokens
}
from
'
vs/editor/common/editorCommon
'
;
import
*
as
modelLine
from
'
vs/editor/common/model/modelLine
'
;
import
{
ModelLine
,
ILineEdit
,
ILineMarker
}
from
'
vs/editor/common/model/modelLine
'
;
import
{
LineMarker
}
from
'
vs/editor/common/model/textModelWithMarkers
'
;
import
{
TokensInflatorMap
}
from
'
vs/editor/common/model/tokensBinaryEncoding
'
;
import
{
IToken
}
from
'
vs/editor/common/modes
'
;
...
...
@@ -17,15 +17,42 @@ function assertLineTokens(actual:ILineTokens, expected:IToken[]): void {
assert
.
deepEqual
(
inflatedActual
,
expected
,
'
Line tokens are equal
'
);
}
const
NO_TAB_SIZE
=
0
;
suite
(
'
ModelLine - getIndentLevel
'
,
()
=>
{
function
assertIndentLevel
(
text
:
string
,
expected
:
number
,
tabSize
:
number
=
4
):
void
{
let
modelLine
=
new
ModelLine
(
1
,
text
,
tabSize
);
let
actual
=
modelLine
.
getIndentLevel
();
assert
.
equal
(
actual
,
expected
,
text
);
}
test
(
'
getIndentLevel
'
,
()
=>
{
assertIndentLevel
(
''
,
-
1
);
assertIndentLevel
(
'
'
,
-
1
);
assertIndentLevel
(
'
\t
'
,
-
1
);
assertIndentLevel
(
'
Hello
'
,
0
);
assertIndentLevel
(
'
Hello
'
,
1
);
assertIndentLevel
(
'
Hello
'
,
3
);
assertIndentLevel
(
'
\t
Hello
'
,
4
);
assertIndentLevel
(
'
\t
Hello
'
,
4
);
assertIndentLevel
(
'
\t
Hello
'
,
4
);
assertIndentLevel
(
'
\t
Hello
'
,
4
);
assertIndentLevel
(
'
\t
Hello
'
,
8
);
assertIndentLevel
(
'
\t
Hello
'
,
8
);
assertIndentLevel
(
'
\t
Hello
'
,
5
);
assertIndentLevel
(
'
\t
\t
Hello
'
,
8
);
});
});
suite
(
'
Editor Model - modelLine.applyEdits text
'
,
()
=>
{
function
testEdits
(
initial
:
string
,
edits
:
modelLine
.
ILineEdit
[],
expected
:
string
):
void
{
var
line
=
new
modelLine
.
ModelLine
(
1
,
initial
);
line
.
applyEdits
({},
edits
);
function
testEdits
(
initial
:
string
,
edits
:
ILineEdit
[],
expected
:
string
):
void
{
var
line
=
new
ModelLine
(
1
,
initial
,
NO_TAB_SIZE
);
line
.
applyEdits
({},
edits
,
NO_TAB_SIZE
);
assert
.
equal
(
line
.
text
,
expected
);
}
function
editOp
(
startColumn
:
number
,
endColumn
:
number
,
text
:
string
):
modelLine
.
ILineEdit
{
function
editOp
(
startColumn
:
number
,
endColumn
:
number
,
text
:
string
):
ILineEdit
{
return
{
startColumn
:
startColumn
,
endColumn
:
endColumn
,
...
...
@@ -167,8 +194,8 @@ suite('Editor Model - modelLine.applyEdits text', () => {
suite
(
'
Editor Model - modelLine.split text
'
,
()
=>
{
function
testLineSplit
(
initial
:
string
,
splitColumn
:
number
,
expected1
:
string
,
expected2
:
string
):
void
{
var
line
=
new
modelLine
.
ModelLine
(
1
,
initial
);
var
newLine
=
line
.
split
({},
splitColumn
,
false
);
var
line
=
new
ModelLine
(
1
,
initial
,
NO_TAB_SIZE
);
var
newLine
=
line
.
split
({},
splitColumn
,
false
,
NO_TAB_SIZE
);
assert
.
equal
(
line
.
text
,
expected1
);
assert
.
equal
(
newLine
.
text
,
expected2
);
}
...
...
@@ -204,9 +231,9 @@ suite('Editor Model - modelLine.split text', () => {
suite
(
'
Editor Model - modelLine.append text
'
,
()
=>
{
function
testLineAppend
(
a
:
string
,
b
:
string
,
expected
:
string
):
void
{
var
line1
=
new
modelLine
.
ModelLine
(
1
,
a
);
var
line2
=
new
modelLine
.
ModelLine
(
2
,
b
);
line1
.
append
({},
line2
);
var
line1
=
new
ModelLine
(
1
,
a
,
NO_TAB_SIZE
);
var
line2
=
new
ModelLine
(
2
,
b
,
NO_TAB_SIZE
);
line1
.
append
({},
line2
,
NO_TAB_SIZE
);
assert
.
equal
(
line1
.
text
,
expected
);
}
...
...
@@ -236,25 +263,25 @@ suite('Editor Model - modelLine.append text', () => {
});
suite
(
'
Editor Model - modelLine.applyEdits text & tokens
'
,
()
=>
{
function
testLineEditTokens
(
initialText
:
string
,
initialTokens
:
LineToken
[],
edits
:
modelLine
.
ILineEdit
[],
expectedText
:
string
,
expectedTokens
:
LineToken
[]):
void
{
var
line
=
new
modelLine
.
ModelLine
(
1
,
initialText
);
function
testLineEditTokens
(
initialText
:
string
,
initialTokens
:
LineToken
[],
edits
:
ILineEdit
[],
expectedText
:
string
,
expectedTokens
:
LineToken
[]):
void
{
var
line
=
new
ModelLine
(
1
,
initialText
,
NO_TAB_SIZE
);
line
.
setTokens
(
new
TokensInflatorMap
(),
initialTokens
,
null
,
[]);
line
.
applyEdits
({},
edits
);
line
.
applyEdits
({},
edits
,
NO_TAB_SIZE
);
assert
.
equal
(
line
.
text
,
expectedText
);
assertLineTokens
(
line
.
getTokens
(),
expectedTokens
);
}
test
(
'
insertion on empty line
'
,
()
=>
{
var
line
=
new
modelLine
.
ModelLine
(
1
,
'
some text
'
);
var
line
=
new
ModelLine
(
1
,
'
some text
'
,
NO_TAB_SIZE
);
var
map
=
new
TokensInflatorMap
();
line
.
setTokens
(
map
,
[
new
LineToken
(
0
,
'
bar
'
)],
null
,
[]);
line
.
applyEdits
({},
[{
startColumn
:
1
,
endColumn
:
10
,
text
:
''
,
forceMoveMarkers
:
false
}]);
line
.
applyEdits
({},
[{
startColumn
:
1
,
endColumn
:
10
,
text
:
''
,
forceMoveMarkers
:
false
}]
,
NO_TAB_SIZE
);
line
.
setTokens
(
map
,
[],
null
,
[]);
line
.
applyEdits
({},
[{
startColumn
:
1
,
endColumn
:
1
,
text
:
'
a
'
,
forceMoveMarkers
:
false
}]);
line
.
applyEdits
({},
[{
startColumn
:
1
,
endColumn
:
1
,
text
:
'
a
'
,
forceMoveMarkers
:
false
}]
,
NO_TAB_SIZE
);
assertLineTokens
(
line
.
getTokens
(),
[{
startIndex
:
0
,
type
:
''
...
...
@@ -811,10 +838,10 @@ suite('Editor Model - modelLine.applyEdits text & tokens', () => {
suite
(
'
Editor Model - modelLine.split text & tokens
'
,
()
=>
{
function
testLineSplitTokens
(
initialText
:
string
,
initialTokens
:
LineToken
[],
splitColumn
:
number
,
expectedText1
:
string
,
expectedText2
:
string
,
expectedTokens
:
LineToken
[]):
void
{
var
line
=
new
modelLine
.
ModelLine
(
1
,
initialText
);
var
line
=
new
ModelLine
(
1
,
initialText
,
NO_TAB_SIZE
);
line
.
setTokens
(
new
TokensInflatorMap
(),
initialTokens
,
null
,
[]);
var
other
=
line
.
split
({},
splitColumn
,
false
);
var
other
=
line
.
split
({},
splitColumn
,
false
,
NO_TAB_SIZE
);
assert
.
equal
(
line
.
text
,
expectedText1
);
assert
.
equal
(
other
.
text
,
expectedText2
);
...
...
@@ -895,13 +922,13 @@ suite('Editor Model - modelLine.append text & tokens', () => {
function
testLineAppendTokens
(
aText
:
string
,
aTokens
:
LineToken
[],
bText
:
string
,
bTokens
:
LineToken
[],
expectedText
:
string
,
expectedTokens
:
IToken
[]):
void
{
var
inflator
=
new
TokensInflatorMap
();
var
a
=
new
modelLine
.
ModelLine
(
1
,
aText
);
var
a
=
new
ModelLine
(
1
,
aText
,
NO_TAB_SIZE
);
a
.
setTokens
(
inflator
,
aTokens
,
null
,
[]);
var
b
=
new
modelLine
.
ModelLine
(
2
,
bText
);
var
b
=
new
ModelLine
(
2
,
bText
,
NO_TAB_SIZE
);
b
.
setTokens
(
inflator
,
bTokens
,
null
,
[]);
a
.
append
({},
b
);
a
.
append
({},
b
,
NO_TAB_SIZE
);
assert
.
equal
(
a
.
text
,
expectedText
);
assertLineTokens
(
a
.
getTokens
(),
expectedTokens
);
...
...
@@ -1024,7 +1051,7 @@ suite('Editor Model - modelLine.applyEdits text & markers', () => {
return
new
LineMarker
(
String
(
id
),
column
,
stickToPreviousCharacter
);
}
function
toLightWeightMarker
(
marker
:
modelLine
.
ILineMarker
):
ILightWeightMarker
{
function
toLightWeightMarker
(
marker
:
ILineMarker
):
ILightWeightMarker
{
return
{
id
:
marker
.
id
,
column
:
marker
.
column
,
...
...
@@ -1032,12 +1059,12 @@ suite('Editor Model - modelLine.applyEdits text & markers', () => {
};
}
function
testLineEditMarkers
(
initialText
:
string
,
initialMarkers
:
LineMarker
[],
edits
:
modelLine
.
ILineEdit
[],
expectedText
:
string
,
expectedChangedMarkers
:
number
[],
_expectedMarkers
:
LineMarker
[]):
void
{
var
line
=
new
modelLine
.
ModelLine
(
1
,
initialText
);
function
testLineEditMarkers
(
initialText
:
string
,
initialMarkers
:
LineMarker
[],
edits
:
ILineEdit
[],
expectedText
:
string
,
expectedChangedMarkers
:
number
[],
_expectedMarkers
:
LineMarker
[]):
void
{
var
line
=
new
ModelLine
(
1
,
initialText
,
NO_TAB_SIZE
);
line
.
addMarkers
(
initialMarkers
);
var
changedMarkers
=
Object
.
create
(
null
);
line
.
applyEdits
(
changedMarkers
,
edits
);
line
.
applyEdits
(
changedMarkers
,
edits
,
NO_TAB_SIZE
);
assert
.
equal
(
line
.
text
,
expectedText
,
'
text
'
);
...
...
@@ -1840,7 +1867,7 @@ suite('Editor Model - modelLine.split text & markers', () => {
return
new
LineMarker
(
String
(
id
),
column
,
stickToPreviousCharacter
);
}
function
toLightWeightMarker
(
marker
:
modelLine
.
ILineMarker
):
ILightWeightMarker
{
function
toLightWeightMarker
(
marker
:
ILineMarker
):
ILightWeightMarker
{
return
{
id
:
marker
.
id
,
column
:
marker
.
column
,
...
...
@@ -1849,11 +1876,11 @@ suite('Editor Model - modelLine.split text & markers', () => {
}
function
testLineSplitMarkers
(
initialText
:
string
,
initialMarkers
:
LineMarker
[],
splitColumn
:
number
,
forceMoveMarkers
:
boolean
,
expectedText1
:
string
,
expectedText2
:
string
,
expectedChangedMarkers
:
number
[],
_expectedMarkers1
:
LineMarker
[],
_expectedMarkers2
:
LineMarker
[]):
void
{
var
line
=
new
modelLine
.
ModelLine
(
1
,
initialText
);
var
line
=
new
ModelLine
(
1
,
initialText
,
NO_TAB_SIZE
);
line
.
addMarkers
(
initialMarkers
);
var
changedMarkers
=
Object
.
create
(
null
);
var
otherLine
=
line
.
split
(
changedMarkers
,
splitColumn
,
forceMoveMarkers
);
var
otherLine
=
line
.
split
(
changedMarkers
,
splitColumn
,
forceMoveMarkers
,
NO_TAB_SIZE
);
assert
.
equal
(
line
.
text
,
expectedText1
,
'
text
'
);
assert
.
equal
(
otherLine
.
text
,
expectedText2
,
'
text
'
);
...
...
@@ -2108,7 +2135,7 @@ suite('Editor Model - modelLine.append text & markers', () => {
return
new
LineMarker
(
String
(
id
),
column
,
stickToPreviousCharacter
);
}
function
toLightWeightMarker
(
marker
:
modelLine
.
ILineMarker
):
ILightWeightMarker
{
function
toLightWeightMarker
(
marker
:
ILineMarker
):
ILightWeightMarker
{
return
{
id
:
marker
.
id
,
column
:
marker
.
column
,
...
...
@@ -2117,14 +2144,14 @@ suite('Editor Model - modelLine.append text & markers', () => {
}
function
testLinePrependMarkers
(
aText
:
string
,
aMarkers
:
LineMarker
[],
bText
:
string
,
bMarkers
:
LineMarker
[],
expectedText
:
string
,
expectedChangedMarkers
:
number
[],
_expectedMarkers
:
LineMarker
[]):
void
{
var
a
=
new
modelLine
.
ModelLine
(
1
,
aText
);
var
a
=
new
ModelLine
(
1
,
aText
,
NO_TAB_SIZE
);
a
.
addMarkers
(
aMarkers
);
var
b
=
new
modelLine
.
ModelLine
(
1
,
bText
);
var
b
=
new
ModelLine
(
1
,
bText
,
NO_TAB_SIZE
);
b
.
addMarkers
(
bMarkers
);
var
changedMarkers
=
Object
.
create
(
null
);
a
.
append
(
changedMarkers
,
b
);
a
.
append
(
changedMarkers
,
b
,
NO_TAB_SIZE
);
assert
.
equal
(
a
.
text
,
expectedText
,
'
text
'
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录