Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
9ab8300e
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 搜索 >>
提交
9ab8300e
编写于
7月 05, 2019
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
insta
💄
上级
6fcabcdc
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
18 addition
and
19 deletion
+18
-19
src/vs/platform/instantiation/common/instantiationService.ts
src/vs/platform/instantiation/common/instantiationService.ts
+18
-19
未找到文件。
src/vs/platform/instantiation/common/instantiationService.ts
浏览文件 @
9ab8300e
...
...
@@ -19,13 +19,20 @@ const _enableTracing = false;
declare
var
Proxy
:
any
;
const
_canUseProxy
=
typeof
Proxy
===
'
function
'
;
class
CyclicDependencyError
extends
Error
{
constructor
(
graph
:
Graph
<
any
>
)
{
super
(
'
cyclic dependency between services
'
);
this
.
message
=
graph
.
toString
();
}
}
export
class
InstantiationService
implements
IInstantiationService
{
_serviceBrand
:
any
;
pr
otected
readonly
_services
:
ServiceCollection
;
pr
otected
readonly
_strict
:
boolean
;
pr
otected
readonly
_parent
?:
InstantiationService
;
pr
ivate
readonly
_services
:
ServiceCollection
;
pr
ivate
readonly
_strict
:
boolean
;
pr
ivate
readonly
_parent
?:
InstantiationService
;
constructor
(
services
:
ServiceCollection
=
new
ServiceCollection
(),
strict
:
boolean
=
false
,
parent
?:
InstantiationService
)
{
this
.
_services
=
services
;
...
...
@@ -143,27 +150,19 @@ export class InstantiationService implements IInstantiationService {
type
Triple
=
{
id
:
ServiceIdentifier
<
any
>
,
desc
:
SyncDescriptor
<
any
>
,
_trace
:
Trace
};
const
graph
=
new
Graph
<
Triple
>
(
data
=>
data
.
id
.
toString
());
function
throwCycleError
()
{
const
err
=
new
Error
(
'
[createInstance] cyclic dependency between services
'
);
err
.
message
=
graph
.
toString
();
throw
err
;
}
let
count
=
0
;
let
cycleCount
=
0
;
const
stack
=
[{
id
,
desc
,
_trace
}];
while
(
stack
.
length
)
{
const
item
=
stack
.
pop
()
!
;
graph
.
lookupOrInsertNode
(
item
);
// TODO@joh use the graph to find a cycle
// a weak heuristic for cycle checks
if
(
count
++
>
100
)
{
throwCycleError
();
// a weak but working heuristic for cycle checks
if
(
cycleCount
++
>
100
)
{
throw
new
CyclicDependencyError
(
graph
);
}
// check all dependencies for existence and if they need to be created first
let
dependencies
=
_util
.
getServiceDependencies
(
item
.
desc
.
ctor
);
for
(
let
dependency
of
dependencies
)
{
for
(
let
dependency
of
_util
.
getServiceDependencies
(
item
.
desc
.
ctor
))
{
let
instanceOrDesc
=
this
.
_getServiceInstanceOrDescriptor
(
dependency
.
id
);
if
(
!
instanceOrDesc
&&
!
dependency
.
optional
)
{
...
...
@@ -179,18 +178,18 @@ export class InstantiationService implements IInstantiationService {
}
while
(
true
)
{
le
t
roots
=
graph
.
roots
();
cons
t
roots
=
graph
.
roots
();
// if there is no more roots but still
// nodes in the graph we have a cycle
if
(
roots
.
length
===
0
)
{
if
(
!
graph
.
isEmpty
())
{
throw
CycleError
(
);
throw
new
CyclicDependencyError
(
graph
);
}
break
;
}
for
(
le
t
{
data
}
of
roots
)
{
for
(
cons
t
{
data
}
of
roots
)
{
// create instance and overwrite the service collections
const
instance
=
this
.
_createServiceInstanceWithOwner
(
data
.
id
,
data
.
desc
.
ctor
,
data
.
desc
.
staticArguments
,
data
.
desc
.
supportsDelayedInstantiation
,
data
.
_trace
);
this
.
_setServiceInstance
(
data
.
id
,
instance
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录