Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
515a6e0d
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
515a6e0d
编写于
5月 15, 2017
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
extract edit making logic, #24855
上级
696cfa85
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
42 addition
and
28 deletion
+42
-28
src/vs/editor/contrib/snippet/browser/snippetSession.ts
src/vs/editor/contrib/snippet/browser/snippetSession.ts
+42
-28
未找到文件。
src/vs/editor/contrib/snippet/browser/snippetSession.ts
浏览文件 @
515a6e0d
...
...
@@ -15,7 +15,7 @@ import { IPosition } from 'vs/editor/common/core/position';
import
{
dispose
}
from
'
vs/base/common/lifecycle
'
;
import
{
EditorSnippetVariableResolver
}
from
"
vs/editor/contrib/snippet/common/snippetVariables
"
;
class
OneSnippet
{
export
class
OneSnippet
{
private
readonly
_editor
:
ICommonCodeEditor
;
private
readonly
_snippet
:
TextmateSnippet
;
...
...
@@ -204,41 +204,24 @@ export class SnippetSession {
return
selection
;
}
private
readonly
_editor
:
ICommonCodeEditor
;
private
readonly
_template
:
string
;
private
readonly
_overwriteBefore
:
number
;
private
readonly
_overwriteAfter
:
number
;
private
readonly
_snippets
:
OneSnippet
[];
constructor
(
editor
:
ICommonCodeEditor
,
template
:
string
,
overwriteBefore
:
number
=
0
,
overwriteAfter
:
number
=
0
)
{
this
.
_editor
=
editor
;
this
.
_template
=
template
;
this
.
_overwriteBefore
=
overwriteBefore
;
this
.
_overwriteAfter
=
overwriteAfter
;
this
.
_snippets
=
[];
}
dispose
():
void
{
dispose
(
this
.
_snippets
);
}
insert
():
void
{
static
makeInsertEditsAndSnippets
(
editor
:
ICommonCodeEditor
,
template
:
string
,
overwriteBefore
:
number
=
0
,
overwriteAfter
:
number
=
0
):
{
edits
:
IIdentifiedSingleEditOperation
[],
snippets
:
OneSnippet
[]
}
{
let
delta
=
0
;
let
edits
:
IIdentifiedSingleEditOperation
[]
=
[];
let
model
=
this
.
_editor
.
getModel
();
let
snippets
:
OneSnippet
[]
=
[];
let
model
=
editor
.
getModel
();
// know what text the overwrite[Before|After] extensions
// of the primary curser have selected because only when
// secondary selections extend to the same text we can grow them
let
firstBeforeText
=
model
.
getValueInRange
(
SnippetSession
.
adjustSelection
(
model
,
this
.
_editor
.
getSelection
(),
this
.
_
overwriteBefore
,
0
));
let
firstAfterText
=
model
.
getValueInRange
(
SnippetSession
.
adjustSelection
(
model
,
this
.
_editor
.
getSelection
(),
0
,
this
.
_
overwriteAfter
));
let
firstBeforeText
=
model
.
getValueInRange
(
SnippetSession
.
adjustSelection
(
model
,
editor
.
getSelection
(),
overwriteBefore
,
0
));
let
firstAfterText
=
model
.
getValueInRange
(
SnippetSession
.
adjustSelection
(
model
,
editor
.
getSelection
(),
0
,
overwriteAfter
));
// sort selections by their start position but remeber
// the original index. that allows you to create correct
// offset-based selection logic without changing the
// primary selection
const
indexedSelection
=
this
.
_
editor
.
getSelections
()
const
indexedSelection
=
editor
.
getSelections
()
.
map
((
selection
,
idx
)
=>
({
selection
,
idx
}))
.
sort
((
a
,
b
)
=>
Range
.
compareRangesUsingStarts
(
a
.
selection
,
b
.
selection
));
...
...
@@ -246,8 +229,8 @@ export class SnippetSession {
// extend selection with the `overwriteBefore` and `overwriteAfter` and then
// compare if this matches the extensions of the primary selection
let
extensionBefore
=
SnippetSession
.
adjustSelection
(
model
,
selection
,
this
.
_
overwriteBefore
,
0
);
let
extensionAfter
=
SnippetSession
.
adjustSelection
(
model
,
selection
,
0
,
this
.
_
overwriteAfter
);
let
extensionBefore
=
SnippetSession
.
adjustSelection
(
model
,
selection
,
overwriteBefore
,
0
);
let
extensionAfter
=
SnippetSession
.
adjustSelection
(
model
,
selection
,
0
,
overwriteAfter
);
if
(
firstBeforeText
!==
model
.
getValueInRange
(
extensionBefore
))
{
extensionBefore
=
selection
;
}
...
...
@@ -263,7 +246,7 @@ export class SnippetSession {
// adjust the template string to match the indentation and
// whitespace rules of this insert location (can be different for each cursor)
const
start
=
snippetSelection
.
getStartPosition
();
const
adjustedTemplate
=
SnippetSession
.
normalizeWhitespace
(
model
,
start
,
t
his
.
_t
emplate
);
const
adjustedTemplate
=
SnippetSession
.
normalizeWhitespace
(
model
,
start
,
template
);
const
snippet
=
SnippetParser
.
parse
(
adjustedTemplate
).
resolveVariables
(
new
EditorSnippetVariableResolver
(
model
,
snippetSelection
));
const
offset
=
model
.
getOffsetAt
(
start
)
+
delta
;
...
...
@@ -273,9 +256,40 @@ export class SnippetSession {
// that ensures the primiary cursor stays primary despite not being
// the one with lowest start position
edits
[
idx
]
=
EditOperation
.
replaceMove
(
snippetSelection
,
snippet
.
text
);
this
.
_snippets
[
idx
]
=
new
OneSnippet
(
this
.
_
editor
,
snippet
,
offset
);
snippets
[
idx
]
=
new
OneSnippet
(
editor
,
snippet
,
offset
);
}
return
{
edits
,
snippets
};
}
private
readonly
_editor
:
ICommonCodeEditor
;
private
readonly
_template
:
string
;
private
readonly
_overwriteBefore
:
number
;
private
readonly
_overwriteAfter
:
number
;
private
_snippets
:
OneSnippet
[];
constructor
(
editor
:
ICommonCodeEditor
,
template
:
string
,
overwriteBefore
:
number
=
0
,
overwriteAfter
:
number
=
0
)
{
this
.
_editor
=
editor
;
this
.
_template
=
template
;
this
.
_overwriteBefore
=
overwriteBefore
;
this
.
_overwriteAfter
=
overwriteAfter
;
this
.
_snippets
=
[];
}
dispose
():
void
{
dispose
(
this
.
_snippets
);
}
insert
():
void
{
const
model
=
this
.
_editor
.
getModel
();
const
{
edits
,
snippets
}
=
SnippetSession
.
makeInsertEditsAndSnippets
(
this
.
_editor
,
this
.
_template
,
this
.
_overwriteBefore
,
this
.
_overwriteAfter
);
// keep snippets around
this
.
_snippets
=
snippets
;
// make insert edit and start with first selections
const
newSelections
=
model
.
pushEditOperations
(
this
.
_editor
.
getSelections
(),
edits
,
undoEdits
=>
{
if
(
this
.
_snippets
[
0
].
hasPlaceholder
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录