Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
d47f6b4f
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,体验更适合开发者的 AI 搜索 >>
提交
d47f6b4f
编写于
10月 17, 2018
作者:
R
Rob Lourens
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix #61041
上级
9b739ad6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
46 addition
and
26 deletion
+46
-26
src/vs/workbench/api/node/extHostSearch.fileIndex.ts
src/vs/workbench/api/node/extHostSearch.fileIndex.ts
+20
-15
src/vs/workbench/parts/search/common/queryBuilder.ts
src/vs/workbench/parts/search/common/queryBuilder.ts
+1
-1
src/vs/workbench/services/search/node/searchService.ts
src/vs/workbench/services/search/node/searchService.ts
+25
-10
未找到文件。
src/vs/workbench/api/node/extHostSearch.fileIndex.ts
浏览文件 @
d47f6b4f
...
...
@@ -7,7 +7,6 @@ import * as path from 'path';
import
*
as
arrays
from
'
vs/base/common/arrays
'
;
import
{
CancelablePromise
,
createCancelablePromise
}
from
'
vs/base/common/async
'
;
import
{
CancellationToken
,
CancellationTokenSource
}
from
'
vs/base/common/cancellation
'
;
import
{
toErrorMessage
}
from
'
vs/base/common/errorMessage
'
;
import
{
canceled
}
from
'
vs/base/common/errors
'
;
import
*
as
glob
from
'
vs/base/common/glob
'
;
import
*
as
resources
from
'
vs/base/common/resources
'
;
...
...
@@ -17,9 +16,9 @@ import { URI } from 'vs/base/common/uri';
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
import
{
compareItemsByScore
,
IItemAccessor
,
prepareQuery
,
ScorerCache
}
from
'
vs/base/parts/quickopen/common/quickOpenScorer
'
;
import
{
ICachedSearchStats
,
IFileIndexProviderStats
,
IFileMatch
,
IFileSearchStats
,
IFolderQuery
,
IRawSearchQuery
,
ISearchCompleteStats
,
ISearchQuery
}
from
'
vs/platform/search/common/search
'
;
import
{
IDirectoryEntry
,
IDirectoryTree
,
IInternalFileMatch
}
from
'
vs/workbench/services/search/node/fileSearchManager
'
;
import
{
QueryGlobTester
,
resolvePatternsForProvider
}
from
'
vs/workbench/services/search/node/search
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
resolvePatternsForProvider
,
QueryGlobTester
}
from
'
vs/workbench/services/search/node/search
'
;
import
{
IInternalFileMatch
,
IDirectoryTree
,
IDirectoryEntry
}
from
'
vs/workbench/services/search/node/fileSearchManager
'
;
interface
IInternalSearchComplete
<
T
=
IFileSearchStats
>
{
limitHit
:
boolean
;
...
...
@@ -67,10 +66,6 @@ export class FileIndexSearchEngine {
}
public
search
(
_onResult
:
(
match
:
IInternalFileMatch
)
=>
void
):
TPromise
<
{
isLimitHit
:
boolean
,
stats
:
IFileIndexProviderStats
}
>
{
if
(
this
.
config
.
folderQueries
.
length
!==
1
)
{
throw
new
Error
(
'
Searches just one folder
'
);
}
// Searches a single folder
const
folderQuery
=
this
.
config
.
folderQueries
[
0
];
...
...
@@ -99,15 +94,25 @@ export class FileIndexSearchEngine {
});
}
return
this
.
searchInFolder
(
folderQuery
,
_onResult
)
.
then
(
stats
=>
{
resolve
({
isLimitHit
:
this
.
isLimitHit
,
stats
});
},
(
err
:
Error
)
=>
{
reject
(
new
Error
(
toErrorMessage
(
err
)));
return
Promise
.
all
(
this
.
config
.
folderQueries
.
map
(
fq
=>
this
.
searchInFolder
(
folderQuery
,
onResult
))).
then
(
stats
=>
{
resolve
({
isLimitHit
:
this
.
isLimitHit
,
stats
:
{
directoriesWalked
:
this
.
dirsWalked
,
filesWalked
:
this
.
filesWalked
,
fileWalkTime
:
stats
.
map
(
s
=>
s
.
fileWalkTime
).
reduce
((
s
,
c
)
=>
s
+
c
,
0
),
providerTime
:
stats
.
map
(
s
=>
s
.
providerTime
).
reduce
((
s
,
c
)
=>
s
+
c
,
0
),
providerResultCount
:
stats
.
map
(
s
=>
s
.
providerResultCount
).
reduce
((
s
,
c
)
=>
s
+
c
,
0
)
}
});
},
(
errs
:
Error
[])
=>
{
if
(
!
Array
.
isArray
(
errs
))
{
errs
=
[
errs
];
}
errs
=
errs
.
filter
(
e
=>
!!
e
);
return
TPromise
.
wrapError
(
errs
[
0
]);
});
});
}
...
...
src/vs/workbench/parts/search/common/queryBuilder.ts
浏览文件 @
d47f6b4f
...
...
@@ -86,7 +86,7 @@ export class QueryBuilder {
const
query
:
ISearchQuery
=
{
type
,
folderQueries
,
folderQueries
:
folderQueries
||
[]
,
usingSearchPaths
:
!!
(
searchPaths
&&
searchPaths
.
length
),
extraFileResources
:
options
.
extraFileResources
,
filePattern
:
options
.
filePattern
...
...
src/vs/workbench/services/search/node/searchService.ts
浏览文件 @
d47f6b4f
...
...
@@ -9,7 +9,7 @@ import { CancellationToken } from 'vs/base/common/cancellation';
import
{
canceled
}
from
'
vs/base/common/errors
'
;
import
{
Event
}
from
'
vs/base/common/event
'
;
import
{
Disposable
,
IDisposable
,
toDisposable
}
from
'
vs/base/common/lifecycle
'
;
import
{
ResourceMap
,
values
}
from
'
vs/base/common/map
'
;
import
{
ResourceMap
,
values
,
keys
}
from
'
vs/base/common/map
'
;
import
{
Schemas
}
from
'
vs/base/common/network
'
;
import
*
as
objects
from
'
vs/base/common/objects
'
;
import
{
StopWatch
}
from
'
vs/base/common/stopwatch
'
;
...
...
@@ -215,24 +215,26 @@ export class SearchService extends Disposable implements ISearchService {
const
diskSearchQueries
:
IFolderQuery
[]
=
[];
const
searchPs
:
TPromise
<
ISearchComplete
>
[]
=
[];
query
.
folderQueries
.
forEach
(
fq
=>
{
const
fqs
=
this
.
groupFolderQueriesByScheme
(
query
);
keys
(
fqs
).
forEach
(
scheme
=>
{
const
schemeFQs
=
fqs
.
get
(
scheme
);
let
provider
=
query
.
type
===
QueryType
.
File
?
this
.
fileSearchProviders
.
get
(
fq
.
folder
.
scheme
)
||
this
.
fileIndexProviders
.
get
(
fq
.
folder
.
scheme
)
:
this
.
textSearchProviders
.
get
(
fq
.
folder
.
scheme
);
this
.
fileSearchProviders
.
get
(
scheme
)
||
this
.
fileIndexProviders
.
get
(
scheme
)
:
this
.
textSearchProviders
.
get
(
scheme
);
if
(
!
provider
&&
fq
.
folder
.
scheme
===
'
file
'
)
{
diskSearchQueries
.
push
(
fq
);
if
(
!
provider
&&
scheme
===
'
file
'
)
{
diskSearchQueries
.
push
(
...
schemeFQs
);
}
else
if
(
!
provider
)
{
throw
new
Error
(
'
No search provider registered for scheme:
'
+
fq
.
folder
.
scheme
);
throw
new
Error
(
'
No search provider registered for scheme:
'
+
scheme
);
}
else
{
const
one
Folder
Query
=
{
const
one
Scheme
Query
=
{
...
query
,
...{
folderQueries
:
[
fq
]
folderQueries
:
schemeFQs
}
};
searchPs
.
push
(
provider
.
search
(
one
Folder
Query
,
onProviderProgress
,
token
));
searchPs
.
push
(
provider
.
search
(
one
Scheme
Query
,
onProviderProgress
,
token
));
}
});
...
...
@@ -260,6 +262,19 @@ export class SearchService extends Disposable implements ISearchService {
});
}
private
groupFolderQueriesByScheme
(
query
:
ISearchQuery
):
Map
<
string
,
IFolderQuery
[]
>
{
const
queries
=
new
Map
<
string
,
IFolderQuery
[]
>
();
query
.
folderQueries
.
forEach
(
fq
=>
{
const
schemeFQs
=
queries
.
get
(
fq
.
folder
.
scheme
)
||
[];
schemeFQs
.
push
(
fq
);
queries
.
set
(
fq
.
folder
.
scheme
,
schemeFQs
);
});
return
queries
;
}
private
sendTelemetry
(
query
:
ISearchQuery
,
endToEndTime
:
number
,
complete
:
ISearchComplete
):
void
{
const
fileSchemeOnly
=
query
.
folderQueries
.
every
(
fq
=>
fq
.
folder
.
scheme
===
'
file
'
);
const
otherSchemeOnly
=
query
.
folderQueries
.
every
(
fq
=>
fq
.
folder
.
scheme
!==
'
file
'
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录