Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
06960b0c
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,发现更多精彩内容 >>
提交
06960b0c
编写于
7月 29, 2017
作者:
R
Rob Lourens
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support excluding ./ and / paths in search viewlet - fixes #31492
上级
e5d86bce
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
87 addition
and
10 deletion
+87
-10
src/vs/workbench/parts/search/common/queryBuilder.ts
src/vs/workbench/parts/search/common/queryBuilder.ts
+32
-7
src/vs/workbench/parts/search/test/common/queryBuilder.test.ts
...s/workbench/parts/search/test/common/queryBuilder.test.ts
+55
-3
未找到文件。
src/vs/workbench/parts/search/common/queryBuilder.ts
浏览文件 @
06960b0c
...
...
@@ -23,7 +23,7 @@ export interface ISearchPathPattern {
export
interface
ISearchPathsResult
{
searchPaths
?:
ISearchPathPattern
[];
includeP
attern
?:
glob
.
IExpression
;
p
attern
?:
glob
.
IExpression
;
}
export
class
QueryBuilder
{
...
...
@@ -42,8 +42,8 @@ export class QueryBuilder {
}
private
query
(
type
:
QueryType
,
contentPattern
:
IPatternInfo
,
folderResources
?:
uri
[],
options
:
IQueryOptions
=
{}):
ISearchQuery
{
let
{
searchPaths
,
includePattern
}
=
this
.
parseSearchPaths
(
options
.
includePattern
);
let
excludePattern
=
patternListToIExpression
(
splitGlobPattern
(
options
.
excludePattern
)
);
let
{
searchPaths
,
pattern
:
includePattern
}
=
this
.
parseSearchPaths
(
options
.
includePattern
);
let
excludePattern
=
this
.
parseExcludePattern
(
options
.
excludePattern
);
// Build folderQueries from searchPaths, if given, otherwise folderResources
let
folderQueries
=
folderResources
&&
folderResources
.
map
(
uri
=>
this
.
getFolderQueryForRoot
(
uri
,
options
));
...
...
@@ -111,12 +111,37 @@ export class QueryBuilder {
const
includePattern
=
patternListToIExpression
(
exprSegments
);
if
(
includePattern
)
{
result
.
includeP
attern
=
includePattern
;
result
.
p
attern
=
includePattern
;
}
return
result
;
}
/**
* Takes the input from the excludePattern as seen in the searchViewlet. Runs the same algorithm as parseSearchPaths,
* but the result is a single IExpression that encapsulates all the exclude patterns.
*/
public
parseExcludePattern
(
pattern
:
string
):
glob
.
IExpression
|
undefined
{
const
result
=
this
.
parseSearchPaths
(
pattern
);
let
excludeExpression
=
glob
.
getEmptyExpression
();
if
(
result
.
pattern
)
{
excludeExpression
=
objects
.
mixin
(
excludeExpression
,
result
.
pattern
);
}
if
(
result
.
searchPaths
)
{
result
.
searchPaths
.
forEach
(
searchPath
=>
{
const
excludeFsPath
=
searchPath
.
searchPath
.
fsPath
;
const
excludePath
=
searchPath
.
pattern
?
paths
.
join
(
excludeFsPath
,
searchPath
.
pattern
)
:
excludeFsPath
;
excludeExpression
[
excludePath
]
=
true
;
});
}
return
Object
.
keys
(
excludeExpression
).
length
?
excludeExpression
:
undefined
;
}
private
mergeExcludesFromFolderQueries
(
folderQueries
:
IFolderQuery
[]):
glob
.
IExpression
|
undefined
{
const
mergedExcludes
=
folderQueries
.
reduce
((
merged
:
glob
.
IExpression
,
fq
:
IFolderQuery
)
=>
{
if
(
fq
.
excludePattern
)
{
...
...
@@ -181,11 +206,11 @@ export class QueryBuilder {
}
const
workspace
=
this
.
workspaceContextService
.
getWorkspace
();
if
(
searchPath
===
'
./
'
)
{
return
[];
}
else
if
(
workspace
.
roots
.
length
===
1
)
{
if
(
workspace
.
roots
.
length
===
1
)
{
return
[
paths
.
normalize
(
paths
.
join
(
workspace
.
roots
[
0
].
fsPath
,
searchPath
))];
}
else
if
(
searchPath
===
'
./
'
)
{
return
[];
// ./ or ./**/foo makes sense for single-root but not multiroot
}
else
{
const
relativeSearchPathMatch
=
searchPath
.
match
(
/
\.\/([^\/]
+
)(\/
.+
)?
/
);
if
(
relativeSearchPathMatch
)
{
...
...
src/vs/workbench/parts/search/test/common/queryBuilder.test.ts
浏览文件 @
06960b0c
...
...
@@ -187,13 +187,65 @@ suite('QueryBuilder', () => {
);
});
test
(
'
simple exclude input pattern
'
,
()
=>
{
assertEqualQueries
(
queryBuilder
.
text
(
PATTERN_INFO
,
[
ROOT_1_URI
],
{
excludePattern
:
'
foo
'
}
),
<
ISearchQuery
>
{
contentPattern
:
PATTERN_INFO
,
folderQueries
:
[{
folder
:
ROOT_1_URI
}],
type
:
QueryType
.
Text
,
excludePattern
:
patternsToIExpression
(
globalGlob
(
'
foo
'
)),
useRipgrep
:
true
});
});
test
(
'
exclude ./ syntax
'
,
()
=>
{
assertEqualQueries
(
queryBuilder
.
text
(
PATTERN_INFO
,
[
ROOT_1_URI
],
{
excludePattern
:
'
./bar
'
}
),
<
ISearchQuery
>
{
contentPattern
:
PATTERN_INFO
,
folderQueries
:
[{
folder
:
ROOT_1_URI
}],
excludePattern
:
patternsToIExpression
(
paths
.
join
(
ROOT_1
,
'
bar
'
)),
type
:
QueryType
.
Text
,
useRipgrep
:
true
});
assertEqualQueries
(
queryBuilder
.
text
(
PATTERN_INFO
,
[
ROOT_1_URI
],
{
excludePattern
:
'
./bar/**/*.ts
'
}
),
<
ISearchQuery
>
{
contentPattern
:
PATTERN_INFO
,
folderQueries
:
[{
folder
:
ROOT_1_URI
}],
excludePattern
:
patternsToIExpression
(
paths
.
join
(
ROOT_1
,
'
bar/**/*.ts
'
)),
type
:
QueryType
.
Text
,
useRipgrep
:
true
});
});
suite
(
'
parseSearchPaths
'
,
()
=>
{
test
(
'
simple includes
'
,
()
=>
{
function
testSimpleIncludes
(
includePattern
:
string
,
expectedPatterns
:
string
[]):
void
{
assert
.
deepEqual
(
queryBuilder
.
parseSearchPaths
(
includePattern
),
<
ISearchPathsResult
>
{
includeP
attern
:
patternsToIExpression
(...
expectedPatterns
.
map
(
globalGlob
))
p
attern
:
patternsToIExpression
(...
expectedPatterns
.
map
(
globalGlob
))
},
includePattern
);
}
...
...
@@ -231,7 +283,7 @@ suite('QueryBuilder', () => {
fixPath
(
'
/foo/bar
'
)
+
'
,
'
+
'
a
'
,
<
ISearchPathsResult
>
{
searchPaths
:
[{
searchPath
:
getUri
(
'
/foo/bar
'
)
}],
includeP
attern
:
patternsToIExpression
(
globalGlob
(
'
a
'
))
p
attern
:
patternsToIExpression
(
globalGlob
(
'
a
'
))
}
],
[
...
...
@@ -464,7 +516,7 @@ function assertEqualQueries(actual: ISearchQuery, expected: ISearchQuery): void
function
assertEqualSearchPathResults
(
actual
:
ISearchPathsResult
,
expected
:
ISearchPathsResult
,
message
?:
string
):
void
{
cleanUndefinedQueryValues
(
actual
);
assert
.
deepEqual
(
actual
.
includePattern
,
expected
.
includeP
attern
,
message
);
assert
.
deepEqual
(
actual
.
pattern
,
expected
.
p
attern
,
message
);
assert
.
equal
(
actual
.
searchPaths
&&
actual
.
searchPaths
.
length
,
expected
.
searchPaths
&&
expected
.
searchPaths
.
length
);
if
(
actual
.
searchPaths
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录