Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
50dae61e
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,发现更多精彩内容 >>
提交
50dae61e
编写于
3月 23, 2017
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
more tests for fuzzyScore, #22153
上级
8b24b77b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
66 addition
and
28 deletion
+66
-28
src/vs/base/common/filters.ts
src/vs/base/common/filters.ts
+34
-13
src/vs/base/test/common/filters.test.ts
src/vs/base/test/common/filters.test.ts
+32
-15
未找到文件。
src/vs/base/common/filters.ts
浏览文件 @
50dae61e
...
...
@@ -490,9 +490,11 @@ function initTable() {
}
return
table
;
}
const
_table
=
initTable
();
const
_arrows
=
initTable
();
const
_debug
=
false
;
function
printTable
(
table
:
number
[][],
pattern
:
string
,
patternLen
:
number
,
word
:
string
,
wordLen
:
number
):
string
{
function
pad
(
s
:
string
,
n
:
number
,
pad
=
'
'
)
{
while
(
s
.
length
<
n
)
{
...
...
@@ -518,6 +520,10 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] {
const
patternLen
=
pattern
.
length
>
25
?
25
:
pattern
.
length
;
const
wordLen
=
word
.
length
>
100
?
100
:
word
.
length
;
if
(
patternLen
===
0
)
{
return
[
-
1
,
[]];
}
if
(
patternLen
>
wordLen
)
{
return
undefined
;
}
...
...
@@ -609,35 +615,50 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] {
while
(
i
>
0
&&
j
>
0
)
{
let
value
=
_table
[
i
][
j
];
let
arrow
=
_arrows
[
i
][
j
];
if
(
arrow
===
-
1
)
{
// left
if
(
arrow
===
-
1
||
arrow
===
1
)
{
// keep going left, we cannot
// skip a character in the pattern
j
-=
1
;
}
else
if
(
arrow
===
1
)
{
// top
i
-=
1
;
}
else
if
(
arrow
===
0
)
{
//diag
j
-=
1
;
i
-=
1
;
total
+=
value
;
matches
.
unshift
(
j
);
if
(
i
===
0
)
{
let
score
=
value
-
_table
[
i
][
j
];
if
(
i
===
0
&&
score
===
1
)
{
// we have reached the first pattern char and now
// test that it has scored properly, like `o -> bbOO`
// and not `o -> foobar`
let
score
=
value
-
_table
[
i
][
j
];
if
(
score
===
1
)
{
return
undefined
;
}
return
undefined
;
}
else
if
(
score
<
1
)
{
// we went diagonal by inheriting a good
// result, not by matching keep going left
i
+=
1
;
}
else
{
// all good
total
+=
value
;
matches
.
unshift
(
j
);
}
}
}
total
-=
Math
.
min
(
matches
[
0
],
3
)
*
3
;
// penalty for first matching character
if
(
matches
.
length
!==
patternLen
)
{
// we didn't match all pattern
// characters in order
return
undefined
;
}
if
(
j
>
3
)
{
j
=
3
;
}
total
-=
j
*
3
;
// penalty for first matching character
total
-=
(
1
+
matches
[
matches
.
length
-
1
])
-
(
pattern
.
length
);
// penalty for all non matching characters between first and last
if
(
_debug
)
{
console
.
log
(
`
${
pattern
}
&
${
word
}
=>
${
total
}
points`
);
console
.
log
(
`
${
pattern
}
&
${
word
}
=>
${
total
}
points
for
${
matches
}
`
);
}
return
[
total
,
matches
];
...
...
src/vs/base/test/common/filters.test.ts
浏览文件 @
50dae61e
...
...
@@ -239,30 +239,47 @@ suite('Filters', () => {
});
test
(
'
fuzzyScore
'
,
function
()
{
assertMatches
(
'
ab
'
,
'
abA
'
,
'
^a^bA
'
,
fuzzyScore
);
assertMatches
(
'
ccm
'
,
'
cacmelCase
'
,
'
^ca^c^melCase
'
,
fuzzyScore
);
assertMatches
(
'
bti
'
,
'
the_black_knight
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
ccm
'
,
'
camelCase
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
BK
'
,
'
the_black_knight
'
,
'
the_^black_^knight
'
,
fuzzyScore
);
assertMatches
(
'
KeyboardLayout=
'
,
'
KeyboardLayout
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
LLL
'
,
'
SVisualLoggerLogsList
'
,
'
SVisual^Logger^Logs^List
'
,
fuzzyScore
);
assertMatches
(
'
sllll
'
,
'
SVisualLoggerLogsList
'
,
'
^SVisua^l^Logger^Logs^List
'
,
fuzzyScore
);
assertMatches
(
'
sl
'
,
'
SVisualLoggerLogsList
'
,
'
^SVisual^LoggerLogsList
'
,
fuzzyScore
);
assertMatches
(
'
LLLL
'
,
'
SVilLoLosLi
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
fob
'
,
'
foobar
'
,
'
^f^oo^bar
'
,
fuzzyScore
);
assertMatches
(
'
ob
'
,
'
foobar
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
fobz
'
,
'
foobar
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
ba
'
,
'
?AB?
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
ccm
'
,
'
camelCasecm
'
,
'
^camel^Casec^m
'
,
fuzzyScore
);
assertMatches
(
'
myvable
'
,
'
myvariable
'
,
'
^m^y^v^aria^b^l^e
'
,
fuzzyScore
);
assertMatches
(
'
fdm
'
,
'
findModel
'
,
'
^fin^d^Model
'
,
fuzzyScore
);
assertMatches
(
'
KeyboardLayout=
'
,
'
KeyboardLayout
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
LLLL
'
,
'
SVisualLoggerLogsList
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
TEdit
'
,
'
TextEdit
'
,
'
^Text^E^d^i^t
'
,
fuzzyScore
);
assertMatches
(
'
TEdit
'
,
'
text_edit
'
,
'
^text_^e^d^i^t
'
,
fuzzyScore
);
assertMatches
(
'
TEdit
'
,
'
Textedit
'
,
'
^T^exte^d^i^t
'
,
fuzzyScore
);
assertMatches
(
'
Tedit
'
,
'
TextEdit
'
,
'
^Text^E^d^i^t
'
,
fuzzyScore
);
assertMatches
(
'
TEdit
'
,
'
TextEditor
'
,
'
^Text^E^d^i^tor
'
,
fuzzyScore
);
assertMatches
(
'
TEdit
'
,
'
Textedit
'
,
'
^T^exte^d^i^t
'
,
fuzzyScore
);
assertMatches
(
'
TEdit
'
,
'
text_edit
'
,
'
^text_^e^d^i^t
'
,
fuzzyScore
);
assertMatches
(
'
TEditDit
'
,
'
TextEditorDecorationType
'
,
'
^Text^E^d^i^tor^Decorat^ion^Type
'
,
fuzzyScore
);
assertMatches
(
'
TEdit
'
,
'
TextEditorDecorationType
'
,
'
^Text^Editor^Decorat^ion^Type
'
,
fuzzyScore
);
assertMatches
(
'
Tedit
'
,
'
TextEdit
'
,
'
^Text^E^d^i^t
'
,
fuzzyScore
);
assertMatches
(
'
ba
'
,
'
?AB?
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
bkn
'
,
'
the_black_knight
'
,
'
the_^black_^k^night
'
,
fuzzyScore
);
assertMatches
(
'
bt
'
,
'
the_black_knight
'
,
'
the_^black_knigh^t
'
,
fuzzyScore
);
assertMatches
(
'
ccm
'
,
'
camelCasecm
'
,
'
^camel^Casec^m
'
,
fuzzyScore
);
assertMatches
(
'
fdm
'
,
'
findModel
'
,
'
^fin^d^Model
'
,
fuzzyScore
);
assertMatches
(
'
fob
'
,
'
foobar
'
,
'
^f^oo^bar
'
,
fuzzyScore
);
assertMatches
(
'
fobz
'
,
'
foobar
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
foobar
'
,
'
foobar
'
,
'
^f^o^o^b^a^r
'
,
fuzzyScore
);
assertMatches
(
'
form
'
,
'
editor.formatOnSave
'
,
'
editor.^f^o^r^matOnSave
'
,
fuzzyScore
);
assertMatches
(
'
g p
'
,
'
Git: Pull
'
,
'
^Git:^ ^Pull
'
,
fuzzyScore
);
assertMatches
(
'
g p
'
,
'
Git: Pull
'
,
'
^Git:^ ^Pull
'
,
fuzzyScore
);
assertMatches
(
'
gip
'
,
'
Git: Pull
'
,
'
^G^it: ^Pull
'
,
fuzzyScore
);
assertMatches
(
'
is
'
,
'
isValid
'
,
'
^i^sValid
'
,
fuzzyScore
);
assertMatches
(
'
gip
'
,
'
Git: Pull
'
,
'
^G^it: ^Pull
'
,
fuzzyScore
);
assertMatches
(
'
gp
'
,
'
Git: Pull
'
,
'
^Git: ^Pull
'
,
fuzzyScore
);
assertMatches
(
'
gp
'
,
'
Git_Git_Pull
'
,
'
^Git_Git_^Pull
'
,
fuzzyScore
);
assertMatches
(
'
is
'
,
'
ImportStatement
'
,
'
^Import^Statement
'
,
fuzzyScore
);
assertMatches
(
'
is
'
,
'
isValid
'
,
'
^i^sValid
'
,
fuzzyScore
);
assertMatches
(
'
lowrd
'
,
'
lowWord
'
,
'
^l^ow^Wo^r^d
'
,
fuzzyScore
);
assertMatches
(
'
myvable
'
,
'
myvariable
'
,
'
^m^y^v^aria^b^l^e
'
,
fuzzyScore
);
assertMatches
(
'
no
'
,
''
,
undefined
,
fuzzyScore
);
assertMatches
(
'
no
'
,
'
match
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
ob
'
,
'
foobar
'
,
undefined
,
fuzzyScore
);
assertMatches
(
'
sl
'
,
'
SVisualLoggerLogsList
'
,
'
^SVisual^LoggerLogsList
'
,
fuzzyScore
);
assertMatches
(
'
sllll
'
,
'
SVisualLoggerLogsList
'
,
'
^SVisua^l^Logger^Logs^List
'
,
fuzzyScore
);
});
test
(
'
topScore
'
,
function
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录