Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
c8a6c73d
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,发现更多精彩内容 >>
提交
c8a6c73d
编写于
7月 19, 2017
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix #31040
上级
55307c91
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
31 addition
and
14 deletion
+31
-14
src/vs/editor/contrib/snippet/browser/snippetParser.ts
src/vs/editor/contrib/snippet/browser/snippetParser.ts
+23
-12
src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts
...r/contrib/snippet/test/browser/snippetController2.test.ts
+2
-2
src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts
...editor/contrib/snippet/test/browser/snippetParser.test.ts
+6
-0
未找到文件。
src/vs/editor/contrib/snippet/browser/snippetParser.ts
浏览文件 @
c8a6c73d
...
...
@@ -380,27 +380,33 @@ export class SnippetParser {
// * fill in default for empty placeHolders
// * compact sibling Text markers
function
walk
(
marker
:
Marker
[],
placeholderDefaultValues
:
Map
<
number
,
Marker
[]
>
)
{
const
placeholderDefaultValues
=
new
Map
<
number
,
Marker
[]
>
();
const
incompletePlaceholders
:
Placeholder
[]
=
[];
function
walk
(
marker
:
Marker
[])
{
for
(
let
i
=
0
;
i
<
marker
.
length
;
i
++
)
{
const
thisMarker
=
marker
[
i
];
// fill in default values for repeated placeholders
// like `${1:foo}and$1` becomes `${1:foo}and${1:foo}`
// and `$1and${1:foo}` becomes `${1:foo}and${1:foo}`
if
(
thisMarker
instanceof
Placeholder
)
{
// fill in default values for repeated placeholders
// like `${1:foo}and$1` becomes ${1:foo}and${1:foo}
if
(
!
placeholderDefaultValues
.
has
(
thisMarker
.
index
))
{
// the first placeholder that has a value define the
// value for *all* placeholders of this index
if
(
thisMarker
.
isFinalTabstop
)
{
placeholderDefaultValues
.
set
(
0
);
}
else
if
(
!
placeholderDefaultValues
.
has
(
thisMarker
.
index
)
&&
thisMarker
.
children
.
length
>
0
)
{
placeholderDefaultValues
.
set
(
thisMarker
.
index
,
thisMarker
.
children
);
walk
(
thisMarker
.
children
,
placeholderDefaultValues
);
walk
(
thisMarker
.
children
);
}
else
if
(
thisMarker
.
children
.
length
===
0
)
{
// copy children from first placeholder definition, no need to
// recurse on them because they have been visited already
thisMarker
.
children
=
placeholderDefaultValues
.
get
(
thisMarker
.
index
).
map
(
child
=>
child
.
clone
());
}
else
{
incompletePlaceholders
.
push
(
thisMarker
);
}
}
else
if
(
thisMarker
instanceof
Variable
)
{
walk
(
thisMarker
.
children
,
placeholderDefaultValues
);
walk
(
thisMarker
.
children
);
}
else
if
(
i
>
0
&&
thisMarker
instanceof
Text
&&
marker
[
i
-
1
]
instanceof
Text
)
{
(
<
Text
>
marker
[
i
-
1
]).
string
+=
(
<
Text
>
marker
[
i
]).
string
;
...
...
@@ -409,9 +415,14 @@ export class SnippetParser {
}
}
}
walk
(
marker
);
const
placeholderDefaultValues
=
new
Map
<
number
,
Marker
[]
>
();
walk
(
marker
,
placeholderDefaultValues
);
// fill in defaults
for
(
const
placeholder
of
incompletePlaceholders
)
{
if
(
placeholderDefaultValues
.
has
(
placeholder
.
index
))
{
placeholder
.
children
=
placeholderDefaultValues
.
get
(
placeholder
.
index
).
map
(
m
=>
m
.
clone
());
}
}
if
(
!
placeholderDefaultValues
.
has
(
0
)
&&
// there is no final tabstop
...
...
src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts
浏览文件 @
c8a6c73d
...
...
@@ -231,10 +231,10 @@ suite('SnippetController2', function () {
model
.
setValue
(
''
);
editor
.
setSelection
(
new
Selection
(
1
,
1
,
1
,
1
));
ctrl
.
insert
(
'
import ${2:${1:module}} from
\'
${1:
module
}
\'
$0
'
);
ctrl
.
insert
(
'
import ${2:${1:module}} from
\'
${1:
module
}
\'
$0
'
);
assertContextKeys
(
contextKeys
,
true
,
false
,
true
);
assertSelections
(
editor
,
new
Selection
(
1
,
8
,
1
,
14
),
new
Selection
(
1
,
21
,
1
,
2
9
));
assertSelections
(
editor
,
new
Selection
(
1
,
8
,
1
,
14
),
new
Selection
(
1
,
21
,
1
,
2
7
));
ctrl
.
insert
(
'
foo
'
);
assertSelections
(
editor
,
new
Selection
(
1
,
11
,
1
,
11
),
new
Selection
(
1
,
21
,
1
,
21
));
...
...
src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts
浏览文件 @
c8a6c73d
...
...
@@ -259,7 +259,13 @@ suite('SnippetParser', () => {
assert
.
equal
((
<
Placeholder
>
p2
).
index
,
'
1
'
);
assert
.
equal
((
<
Placeholder
>
p2
).
children
.
length
,
'
1
'
);
assert
.
equal
((
<
Text
>
(
<
Placeholder
>
p2
).
children
[
0
]),
'
err
'
);
});
test
(
'
Repeated snippet placeholder should always inherit, #31040
'
,
function
()
{
assertText
(
'
${1:foo}-abc-$1
'
,
'
foo-abc-foo
'
);
assertText
(
'
${1:foo}-abc-${1}
'
,
'
foo-abc-foo
'
);
assertText
(
'
${1:foo}-abc-${1:bar}
'
,
'
foo-abc-foo
'
);
assertText
(
'
${1}-abc-${1:foo}
'
,
'
foo-abc-foo
'
);
});
test
(
'
backspace esapce in TM only, #16212
'
,
()
=>
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录