Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
d8904bc1
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,发现更多精彩内容 >>
提交
d8904bc1
编写于
3月 22, 2017
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
allow extensions to work with closed documents, #15723
上级
3755bb87
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
81 addition
and
42 deletion
+81
-42
src/vs/workbench/api/node/extHostDocumentData.ts
src/vs/workbench/api/node/extHostDocumentData.ts
+39
-25
src/vs/workbench/test/node/api/extHostDocumentData.test.ts
src/vs/workbench/test/node/api/extHostDocumentData.test.ts
+41
-16
src/vs/workbench/test/node/api/mainThreadDocuments.test.ts
src/vs/workbench/test/node/api/mainThreadDocuments.test.ts
+1
-1
未找到文件。
src/vs/workbench/api/node/extHostDocumentData.ts
浏览文件 @
d8904bc1
...
...
@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
{
ok
}
from
'
vs/base/common/assert
'
;
import
{
regExpLeadsToEndlessLoop
}
from
'
vs/base/common/strings
'
;
import
{
MirrorModel2
}
from
'
vs/editor/common/model/mirrorModel2
'
;
import
URI
from
'
vs/base/common/uri
'
;
...
...
@@ -12,6 +13,7 @@ import * as vscode from 'vscode';
import
{
getWordAtText
,
ensureValidWordDefinition
}
from
'
vs/editor/common/model/wordHelper
'
;
import
{
MainThreadDocumentsShape
}
from
'
./extHost.protocol
'
;
import
{
ITextSource
}
from
'
vs/editor/common/model/textSource
'
;
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
const
_modeId2WordDefinition
=
new
Map
<
string
,
RegExp
>
();
export
function
setWordDefinitionFor
(
modeId
:
string
,
wordDefinition
:
RegExp
):
void
{
...
...
@@ -26,23 +28,26 @@ export class ExtHostDocumentData extends MirrorModel2 {
private
_proxy
:
MainThreadDocumentsShape
;
private
_languageId
:
string
;
private
_isDirty
:
boolean
;
private
_textLines
:
vscode
.
TextLine
[];
private
_document
:
vscode
.
TextDocument
;
private
_textLines
:
vscode
.
TextLine
[]
=
[];
private
_isDisposed
:
boolean
=
false
;
constructor
(
proxy
:
MainThreadDocumentsShape
,
uri
:
URI
,
lines
:
string
[],
eol
:
string
,
languageId
:
string
,
versionId
:
number
,
isDirty
:
boolean
)
{
languageId
:
string
,
versionId
:
number
,
isDirty
:
boolean
)
{
super
(
uri
,
lines
,
eol
,
versionId
);
this
.
_proxy
=
proxy
;
this
.
_languageId
=
languageId
;
this
.
_isDirty
=
isDirty
;
this
.
_textLines
=
[];
}
dispose
():
void
{
this
.
_textLines
.
length
=
0
;
// we don't really dispose documents but let
// extensions still read from them. some
// operations, live saving, will now error tho
ok
(
!
this
.
_isDisposed
);
this
.
_isDisposed
=
true
;
this
.
_isDirty
=
false
;
super
.
dispose
();
}
equalLines
({
lines
}:
ITextSource
):
boolean
{
...
...
@@ -68,30 +73,39 @@ export class ExtHostDocumentData extends MirrorModel2 {
get
languageId
()
{
return
data
.
_languageId
;
},
get
version
()
{
return
data
.
_versionId
;
},
get
isDirty
()
{
return
data
.
_isDirty
;
},
save
()
{
return
data
.
_
proxy
.
$trySaveDocument
(
data
.
_uri
);
},
save
()
{
return
data
.
_
save
(
);
},
getText
(
range
?)
{
return
range
?
data
.
_getTextInRange
(
range
)
:
data
.
getText
();
},
get
lineCount
()
{
return
data
.
_lines
.
length
;
},
lineAt
(
lineOrPos
)
{
return
data
.
lineAt
(
lineOrPos
);
},
offsetAt
(
pos
)
{
return
data
.
offsetAt
(
pos
);
},
positionAt
(
offset
)
{
return
data
.
positionAt
(
offset
);
},
validateRange
(
ran
)
{
return
data
.
validateRange
(
ran
);
},
validatePosition
(
pos
)
{
return
data
.
validatePosition
(
pos
);
},
getWordRangeAtPosition
(
pos
,
regexp
?)
{
return
data
.
getWordRangeAtPosition
(
pos
,
regexp
);
}
lineAt
(
lineOrPos
)
{
return
data
.
_
lineAt
(
lineOrPos
);
},
offsetAt
(
pos
)
{
return
data
.
_
offsetAt
(
pos
);
},
positionAt
(
offset
)
{
return
data
.
_
positionAt
(
offset
);
},
validateRange
(
ran
)
{
return
data
.
_
validateRange
(
ran
);
},
validatePosition
(
pos
)
{
return
data
.
_
validatePosition
(
pos
);
},
getWordRangeAtPosition
(
pos
,
regexp
?)
{
return
data
.
_
getWordRangeAtPosition
(
pos
,
regexp
);
}
};
}
return
this
.
_document
;
return
Object
.
freeze
(
this
.
_document
)
;
}
_acceptLanguageId
(
newLanguageId
:
string
):
void
{
ok
(
!
this
.
_isDisposed
);
this
.
_languageId
=
newLanguageId
;
}
_acceptIsDirty
(
isDirty
:
boolean
):
void
{
ok
(
!
this
.
_isDisposed
);
this
.
_isDirty
=
isDirty
;
}
private
_save
():
TPromise
<
boolean
>
{
if
(
this
.
_isDisposed
)
{
return
TPromise
.
wrapError
<
boolean
>
(
'
Document has been closed
'
);
}
return
this
.
_proxy
.
$trySaveDocument
(
this
.
_uri
);
}
private
_getTextInRange
(
_range
:
vscode
.
Range
):
string
{
let
range
=
this
.
validateRange
(
_range
);
let
range
=
this
.
_
validateRange
(
_range
);
if
(
range
.
isEmpty
)
{
return
''
;
...
...
@@ -115,7 +129,7 @@ export class ExtHostDocumentData extends MirrorModel2 {
return
resultLines
.
join
(
lineEnding
);
}
lineAt
(
lineOrPosition
:
number
|
vscode
.
Position
):
vscode
.
TextLine
{
private
_
lineAt
(
lineOrPosition
:
number
|
vscode
.
Position
):
vscode
.
TextLine
{
let
line
:
number
;
if
(
lineOrPosition
instanceof
Position
)
{
...
...
@@ -153,13 +167,13 @@ export class ExtHostDocumentData extends MirrorModel2 {
return
result
;
}
offsetAt
(
position
:
vscode
.
Position
):
number
{
position
=
this
.
validatePosition
(
position
);
private
_
offsetAt
(
position
:
vscode
.
Position
):
number
{
position
=
this
.
_
validatePosition
(
position
);
this
.
_ensureLineStarts
();
return
this
.
_lineStarts
.
getAccumulatedValue
(
position
.
line
-
1
)
+
position
.
character
;
}
positionAt
(
offset
:
number
):
vscode
.
Position
{
p
rivate
_p
ositionAt
(
offset
:
number
):
vscode
.
Position
{
offset
=
Math
.
floor
(
offset
);
offset
=
Math
.
max
(
0
,
offset
);
...
...
@@ -174,13 +188,13 @@ export class ExtHostDocumentData extends MirrorModel2 {
// ---- range math
validateRange
(
range
:
vscode
.
Range
):
vscode
.
Range
{
private
_
validateRange
(
range
:
vscode
.
Range
):
vscode
.
Range
{
if
(
!
(
range
instanceof
Range
))
{
throw
new
Error
(
'
Invalid argument
'
);
}
let
start
=
this
.
validatePosition
(
range
.
start
);
let
end
=
this
.
validatePosition
(
range
.
end
);
let
start
=
this
.
_
validatePosition
(
range
.
start
);
let
end
=
this
.
_
validatePosition
(
range
.
end
);
if
(
start
===
range
.
start
&&
end
===
range
.
end
)
{
return
range
;
...
...
@@ -188,7 +202,7 @@ export class ExtHostDocumentData extends MirrorModel2 {
return
new
Range
(
start
.
line
,
start
.
character
,
end
.
line
,
end
.
character
);
}
validatePosition
(
position
:
vscode
.
Position
):
vscode
.
Position
{
private
_
validatePosition
(
position
:
vscode
.
Position
):
vscode
.
Position
{
if
(
!
(
position
instanceof
Position
))
{
throw
new
Error
(
'
Invalid argument
'
);
}
...
...
@@ -224,8 +238,8 @@ export class ExtHostDocumentData extends MirrorModel2 {
return
new
Position
(
line
,
character
);
}
getWordRangeAtPosition
(
_position
:
vscode
.
Position
,
regexp
?:
RegExp
):
vscode
.
Range
{
let
position
=
this
.
validatePosition
(
_position
);
private
_
getWordRangeAtPosition
(
_position
:
vscode
.
Position
,
regexp
?:
RegExp
):
vscode
.
Range
{
let
position
=
this
.
_
validatePosition
(
_position
);
if
(
!
regexp
||
regExpLeadsToEndlessLoop
(
regexp
))
{
regexp
=
getWordDefinitionFor
(
this
.
_languageId
);
}
...
...
src/vs/workbench/test/node/api/extHostDocumentData.test.ts
浏览文件 @
d8904bc1
...
...
@@ -11,6 +11,8 @@ import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData';
import
{
Position
}
from
'
vs/workbench/api/node/extHostTypes
'
;
import
{
Range
as
CodeEditorRange
}
from
'
vs/editor/common/core/range
'
;
import
*
as
EditorCommon
from
'
vs/editor/common/editorCommon
'
;
import
{
MainThreadDocumentsShape
}
from
'
vs/workbench/api/node/extHost.protocol
'
;
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
suite
(
'
ExtHostDocumentData
'
,
()
=>
{
...
...
@@ -18,14 +20,14 @@ suite('ExtHostDocumentData', () => {
let
data
:
ExtHostDocumentData
;
function
assertPositionAt
(
offset
:
number
,
line
:
number
,
character
:
number
)
{
let
position
=
data
.
positionAt
(
offset
);
let
position
=
data
.
document
.
positionAt
(
offset
);
assert
.
equal
(
position
.
line
,
line
);
assert
.
equal
(
position
.
character
,
character
);
}
function
assertOffsetAt
(
line
:
number
,
character
:
number
,
offset
:
number
)
{
let
pos
=
new
Position
(
line
,
character
);
let
actual
=
data
.
offsetAt
(
pos
);
let
actual
=
data
.
document
.
offsetAt
(
pos
);
assert
.
equal
(
actual
,
offset
);
}
...
...
@@ -47,17 +49,40 @@ suite('ExtHostDocumentData', () => {
assert
.
throws
(()
=>
(
<
any
>
data
).
document
.
lineCount
=
9
);
});
test
(
'
save
'
,
function
()
{
let
saved
:
URI
;
let
data
=
new
ExtHostDocumentData
(
new
class
extends
MainThreadDocumentsShape
{
$trySaveDocument
(
uri
)
{
assert
.
ok
(
!
saved
);
saved
=
uri
;
return
TPromise
.
as
(
true
);
}
},
URI
.
parse
(
'
foo:bar
'
),
[],
'
\n
'
,
'
text
'
,
1
,
true
);
return
data
.
document
.
save
().
then
(()
=>
{
assert
.
equal
(
saved
.
toString
(),
'
foo:bar
'
);
data
.
dispose
();
return
data
.
document
.
save
().
then
(()
=>
{
assert
.
ok
(
false
,
'
expected failure
'
);
},
err
=>
{
assert
.
ok
(
err
);
});
});
});
test
(
'
lines
'
,
function
()
{
assert
.
equal
(
data
.
document
.
lineCount
,
4
);
assert
.
throws
(()
=>
data
.
lineAt
(
-
1
));
assert
.
throws
(()
=>
data
.
lineAt
(
data
.
document
.
lineCount
));
assert
.
throws
(()
=>
data
.
lineAt
(
Number
.
MAX_VALUE
));
assert
.
throws
(()
=>
data
.
lineAt
(
Number
.
MIN_VALUE
));
assert
.
throws
(()
=>
data
.
lineAt
(
0.8
));
assert
.
throws
(()
=>
data
.
document
.
lineAt
(
-
1
));
assert
.
throws
(()
=>
data
.
document
.
lineAt
(
data
.
document
.
lineCount
));
assert
.
throws
(()
=>
data
.
document
.
lineAt
(
Number
.
MAX_VALUE
));
assert
.
throws
(()
=>
data
.
document
.
lineAt
(
Number
.
MIN_VALUE
));
assert
.
throws
(()
=>
data
.
document
.
lineAt
(
0.8
));
let
line
=
data
.
lineAt
(
0
);
let
line
=
data
.
document
.
lineAt
(
0
);
assert
.
equal
(
line
.
lineNumber
,
0
);
assert
.
equal
(
line
.
text
.
length
,
16
);
assert
.
equal
(
line
.
text
,
'
This is line one
'
);
...
...
@@ -79,7 +104,7 @@ suite('ExtHostDocumentData', () => {
assert
.
equal
(
line
.
firstNonWhitespaceCharacterIndex
,
0
);
// fetch line again
line
=
data
.
lineAt
(
0
);
line
=
data
.
document
.
lineAt
(
0
);
assert
.
equal
(
line
.
text
,
'
\t
This is line one
'
);
assert
.
equal
(
line
.
firstNonWhitespaceCharacterIndex
,
2
);
});
...
...
@@ -208,32 +233,32 @@ suite('ExtHostDocumentData', () => {
'
aaaa bbbb+cccc abc
'
],
'
\n
'
,
'
text
'
,
1
,
false
);
let
range
=
data
.
getWordRangeAtPosition
(
new
Position
(
0
,
2
));
let
range
=
data
.
document
.
getWordRangeAtPosition
(
new
Position
(
0
,
2
));
assert
.
equal
(
range
.
start
.
line
,
0
);
assert
.
equal
(
range
.
start
.
character
,
0
);
assert
.
equal
(
range
.
end
.
line
,
0
);
assert
.
equal
(
range
.
end
.
character
,
4
);
// ignore bad regular expresson /.*/
range
=
data
.
getWordRangeAtPosition
(
new
Position
(
0
,
2
),
/.*/
);
range
=
data
.
document
.
getWordRangeAtPosition
(
new
Position
(
0
,
2
),
/.*/
);
assert
.
equal
(
range
.
start
.
line
,
0
);
assert
.
equal
(
range
.
start
.
character
,
0
);
assert
.
equal
(
range
.
end
.
line
,
0
);
assert
.
equal
(
range
.
end
.
character
,
4
);
range
=
data
.
getWordRangeAtPosition
(
new
Position
(
0
,
5
),
/
[
a-z+
]
+/
);
range
=
data
.
document
.
getWordRangeAtPosition
(
new
Position
(
0
,
5
),
/
[
a-z+
]
+/
);
assert
.
equal
(
range
.
start
.
line
,
0
);
assert
.
equal
(
range
.
start
.
character
,
5
);
assert
.
equal
(
range
.
end
.
line
,
0
);
assert
.
equal
(
range
.
end
.
character
,
14
);
range
=
data
.
getWordRangeAtPosition
(
new
Position
(
0
,
17
),
/
[
a-z+
]
+/
);
range
=
data
.
document
.
getWordRangeAtPosition
(
new
Position
(
0
,
17
),
/
[
a-z+
]
+/
);
assert
.
equal
(
range
.
start
.
line
,
0
);
assert
.
equal
(
range
.
start
.
character
,
15
);
assert
.
equal
(
range
.
end
.
line
,
0
);
assert
.
equal
(
range
.
end
.
character
,
18
);
range
=
data
.
getWordRangeAtPosition
(
new
Position
(
0
,
11
),
/yy/
);
range
=
data
.
document
.
getWordRangeAtPosition
(
new
Position
(
0
,
11
),
/yy/
);
assert
.
equal
(
range
,
undefined
);
});
});
...
...
@@ -258,12 +283,12 @@ suite('ExtHostDocumentData updates line mapping', () => {
let
position
=
new
Position
(
line
,
character
+
(
previousIsCarriageReturn
?
-
1
:
0
));
if
(
direction
===
AssertDocumentLineMappingDirection
.
OffsetToPosition
)
{
let
actualPosition
=
doc
.
positionAt
(
offset
);
let
actualPosition
=
doc
.
document
.
positionAt
(
offset
);
assert
.
equal
(
positionToStr
(
actualPosition
),
positionToStr
(
position
),
'
positionAt mismatch for offset
'
+
offset
);
}
else
{
// The position coordinate system cannot express the position between \r and \n
let
expectedOffset
=
offset
+
(
previousIsCarriageReturn
?
-
1
:
0
);
let
actualOffset
=
doc
.
offsetAt
(
position
);
let
actualOffset
=
doc
.
document
.
offsetAt
(
position
);
assert
.
equal
(
actualOffset
,
expectedOffset
,
'
offsetAt mismatch for position
'
+
positionToStr
(
position
));
}
...
...
src/vs/workbench/test/node/api/mainThreadDocuments.test.ts
浏览文件 @
d8904bc1
...
...
@@ -8,7 +8,7 @@
import
*
as
assert
from
'
assert
'
;
import
{
BoundModelReferenceCollection
}
from
'
vs/workbench/api/node/mainThreadDocuments
'
;
import
{
Model
}
from
'
vs/editor/common/model/model
'
;
import
{
TPromise
}
from
"
vs/base/common/winjs.base
"
;
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
suite
(
'
BoundModelReferenceCollection
'
,
()
=>
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录