Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
141f0554
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,发现更多精彩内容 >>
提交
141f0554
编写于
9月 20, 2018
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
first cut on project level snippets #8102
上级
549f13c0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
67 addition
and
13 deletion
+67
-13
src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts
...kbench/parts/snippets/electron-browser/snippetsService.ts
+67
-13
未找到文件。
src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts
浏览文件 @
141f0554
...
...
@@ -20,7 +20,7 @@ import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser';
import
{
setSnippetSuggestSupport
}
from
'
vs/editor/contrib/suggest/suggest
'
;
import
{
localize
}
from
'
vs/nls
'
;
import
{
IEnvironmentService
}
from
'
vs/platform/environment/common/environment
'
;
import
{
IFileService
,
FileChangeType
,
FileOperationError
,
FileOperationResult
}
from
'
vs/platform/files/common/files
'
;
import
{
IFileService
,
FileChangeType
}
from
'
vs/platform/files/common/files
'
;
import
{
registerSingleton
}
from
'
vs/platform/instantiation/common/extensions
'
;
import
{
ILifecycleService
,
LifecyclePhase
}
from
'
vs/platform/lifecycle/common/lifecycle
'
;
import
{
ILogService
}
from
'
vs/platform/log/common/log
'
;
...
...
@@ -28,6 +28,7 @@ import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/s
import
{
Snippet
,
SnippetFile
}
from
'
vs/workbench/parts/snippets/electron-browser/snippetsFile
'
;
import
{
ExtensionsRegistry
,
IExtensionPointUser
}
from
'
vs/workbench/services/extensions/common/extensionsRegistry
'
;
import
{
languagesExtPoint
}
from
'
vs/workbench/services/mode/common/workbenchModeService
'
;
import
{
IWorkspaceContextService
,
IWorkspace
}
from
'
vs/platform/workspace/common/workspace
'
;
namespace
schema
{
...
...
@@ -109,7 +110,6 @@ namespace schema {
};
}
function
watch
(
service
:
IFileService
,
resource
:
URI
,
callback
:
(
type
:
FileChangeType
,
resource
:
URI
)
=>
any
):
IDisposable
{
let
listener
=
service
.
onFileChanges
(
e
=>
{
for
(
const
change
of
e
.
changes
)
{
...
...
@@ -132,18 +132,22 @@ class SnippetsService implements ISnippetsService {
readonly
_serviceBrand
:
any
;
private
readonly
_disposables
:
IDisposable
[]
=
[];
private
readonly
_
initPromise
:
Promise
<
any
>
;
private
readonly
_
pendingWork
:
Thenable
<
any
>
[]
=
[]
;
private
readonly
_files
=
new
Map
<
string
,
SnippetFile
>
();
constructor
(
@
IEnvironmentService
private
readonly
_environmentService
:
IEnvironmentService
,
@
IWorkspaceContextService
private
readonly
_contextService
:
IWorkspaceContextService
,
@
IModeService
private
readonly
_modeService
:
IModeService
,
@
ILogService
private
readonly
_logService
:
ILogService
,
@
IFileService
private
readonly
_fileService
:
IFileService
,
@
ILifecycleService
lifecycleService
:
ILifecycleService
,
)
{
this
.
_initExtensionSnippets
();
this
.
_initPromise
=
Promise
.
resolve
(
lifecycleService
.
when
(
LifecyclePhase
.
Running
).
then
(()
=>
this
.
_initUserSnippets
()));
this
.
_pendingWork
.
push
(
Promise
.
resolve
(
lifecycleService
.
when
(
LifecyclePhase
.
Running
).
then
(()
=>
{
this
.
_initExtensionSnippets
();
this
.
_initUserSnippets
();
this
.
_initWorkspaceSnippets
();
})));
setSnippetSuggestSupport
(
new
SnippetSuggestProvider
(
this
.
_modeService
,
this
));
}
...
...
@@ -152,12 +156,18 @@ class SnippetsService implements ISnippetsService {
dispose
(
this
.
_disposables
);
}
private
_joinSnippets
():
Promise
<
any
>
{
const
promises
=
this
.
_pendingWork
.
slice
(
0
);
this
.
_pendingWork
.
length
=
0
;
return
Promise
.
all
(
promises
);
}
getSnippetFiles
():
Promise
<
SnippetFile
[]
>
{
return
this
.
_
initPromise
.
then
(()
=>
values
(
this
.
_files
));
return
this
.
_
joinSnippets
()
.
then
(()
=>
values
(
this
.
_files
));
}
getSnippets
(
languageId
:
LanguageId
):
Promise
<
Snippet
[]
>
{
return
this
.
_
initPromise
.
then
(()
=>
{
return
this
.
_
joinSnippets
()
.
then
(()
=>
{
const
langName
=
this
.
_modeService
.
getLanguageIdentifier
(
languageId
).
language
;
const
result
:
Snippet
[]
=
[];
const
promises
:
Promise
<
any
>
[]
=
[];
...
...
@@ -227,15 +237,49 @@ class SnippetsService implements ISnippetsService {
});
}
private
_initWorkspaceSnippets
():
void
{
// workspace stuff
let
disposables
:
IDisposable
[]
=
[];
let
updateWorkspaceSnippets
=
()
=>
{
disposables
=
dispose
(
disposables
);
this
.
_pendingWork
.
push
(
this
.
_initWorkspaceFolderSnippets
(
this
.
_contextService
.
getWorkspace
(),
disposables
));
};
this
.
_disposables
.
push
({
dispose
()
{
dispose
(
disposables
);
}
});
this
.
_disposables
.
push
(
this
.
_contextService
.
onDidChangeWorkspaceFolders
(
updateWorkspaceSnippets
));
this
.
_disposables
.
push
(
this
.
_contextService
.
onDidChangeWorkbenchState
(
updateWorkspaceSnippets
));
updateWorkspaceSnippets
();
}
private
_initWorkspaceFolderSnippets
(
workspace
:
IWorkspace
,
bucket
:
IDisposable
[]):
Thenable
<
any
>
{
let
promises
=
workspace
.
folders
.
map
(
folder
=>
{
const
snippetFolder
=
folder
.
toResource
(
'
.vscode
'
);
return
this
.
_fileService
.
existsFile
(
snippetFolder
).
then
(
value
=>
{
if
(
value
)
{
this
.
_initFolderSnippets
(
snippetFolder
,
true
,
bucket
);
}
else
{
// watch
bucket
.
push
(
watch
(
this
.
_fileService
,
snippetFolder
,
(
type
)
=>
{
if
(
type
===
FileChangeType
.
ADDED
)
{
this
.
_initFolderSnippets
(
snippetFolder
,
true
,
bucket
);
}
}));
}
});
});
return
Promise
.
all
(
promises
);
}
private
_initUserSnippets
():
Thenable
<
any
>
{
const
userSnippetsFolder
=
URI
.
file
(
join
(
this
.
_environmentService
.
appSettingsHome
,
'
snippets
'
));
return
this
.
_fileService
.
createFolder
(
userSnippetsFolder
).
then
(()
=>
this
.
_initFolderSnippets
(
userSnippetsFolder
,
this
.
_disposables
));
return
this
.
_fileService
.
createFolder
(
userSnippetsFolder
).
then
(()
=>
this
.
_initFolderSnippets
(
userSnippetsFolder
,
false
,
this
.
_disposables
));
}
private
_initFolderSnippets
(
folder
:
URI
,
bucket
:
IDisposable
[]):
Thenable
<
any
>
{
private
_initFolderSnippets
(
folder
:
URI
,
onlyCodeSnippets
:
boolean
,
bucket
:
IDisposable
[]):
Thenable
<
any
>
{
const
addUserSnippet
=
(
filepath
:
URI
)
=>
{
const
ext
=
extname
(
filepath
.
path
);
if
(
ext
===
'
.json
'
)
{
if
(
!
onlyCodeSnippets
&&
ext
===
'
.json
'
)
{
const
langName
=
basename
(
filepath
.
path
,
'
.json
'
);
this
.
_files
.
set
(
filepath
.
toString
(),
new
SnippetFile
(
filepath
,
[
langName
],
undefined
,
this
.
_fileService
));
...
...
@@ -267,10 +311,20 @@ class SnippetsService implements ISnippetsService {
});
}));
bucket
.
push
({
dispose
:
()
=>
{
// add a disposable that removes all snippets
// from this folder. that ensures snippets disappear
// when the folder goes away
this
.
_files
.
forEach
((
value
,
index
)
=>
{
if
(
resources
.
isEqualOrParent
(
value
.
location
,
folder
))
{
this
.
_files
.
delete
(
index
);
}
});
}
});
}).
then
(
undefined
,
err
=>
{
if
(
FileOperationError
.
isFileOperationError
(
err
)
&&
err
.
fileOperationResult
===
FileOperationResult
.
FILE_NOT_FOUND
)
{
return
;
}
this
.
_logService
.
error
(
`Failed snippets from folder '
${
folder
.
toString
()}
'`
,
err
);
});
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录