Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
1efea8da
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,发现更多精彩内容 >>
提交
1efea8da
编写于
4月 19, 2016
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
debt - simplify _createInstance method
上级
7e5a8b96
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
42 deletion
+25
-42
src/vs/platform/instantiation/common/instantiationService.ts
src/vs/platform/instantiation/common/instantiationService.ts
+25
-42
未找到文件。
src/vs/platform/instantiation/common/instantiationService.ts
浏览文件 @
1efea8da
...
...
@@ -106,52 +106,35 @@ export class InstantiationService implements IInstantiationService {
private
_createInstance
<
T
>
(
desc
:
SyncDescriptor
<
T
>
,
args
:
any
[]):
T
{
let
allArguments
:
any
[]
=
[];
let
serviceInjections
=
_util
.
getServiceDependencies
(
desc
.
ctor
);
let
fixedArguments
=
desc
.
staticArguments
().
concat
(
args
);
let
expectedFirstServiceIndex
=
fixedArguments
.
length
;
let
actualFirstServiceIndex
=
Number
.
MAX_VALUE
;
serviceInjections
.
forEach
(
serviceInjection
=>
{
// @IServiceName
let
{
id
,
index
}
=
serviceInjection
;
// let service = this._lock.runUnlocked(() => this[serviceId]);
allArguments
[
index
]
=
this
.
_getOrCreateServiceInstance
(
id
);
actualFirstServiceIndex
=
Math
.
min
(
actualFirstServiceIndex
,
index
);
});
// insert the fixed arguments into the array of all ctor
// arguments. don't overwrite existing values tho it indicates
// something is off
let
i
=
0
;
for
(
let
arg
of
fixedArguments
)
{
let
hasValue
=
allArguments
[
i
]
!==
void
0
;
if
(
!
hasValue
)
{
allArguments
[
i
]
=
arg
;
// arguments given by createInstance-call and/or the descriptor
let
staticArgs
=
desc
.
staticArguments
().
concat
(
args
);
// arguments defined by service decorators
let
serviceDependencies
=
_util
.
getServiceDependencies
(
desc
.
ctor
).
sort
((
a
,
b
)
=>
a
.
index
-
b
.
index
);
let
serviceArgs
=
serviceDependencies
.
map
(
dependency
=>
this
.
_getOrCreateServiceInstance
(
dependency
.
id
));
let
firstServiceArgPos
=
serviceDependencies
.
length
>
0
?
serviceDependencies
[
0
].
index
:
staticArgs
.
length
;
// check for argument mismatches, adjust static args if needed
if
(
staticArgs
.
length
!==
firstServiceArgPos
)
{
console
.
warn
(
`[createInstance] First service dependency of
${
desc
.
ctor
.
name
}
at position
${
firstServiceArgPos
+
1
}
conflicts with
${
staticArgs
.
length
}
static arguments`
);
let
delta
=
firstServiceArgPos
-
staticArgs
.
length
;
if
(
delta
>
0
)
{
staticArgs
=
staticArgs
.
concat
(
new
Array
(
delta
));
}
else
{
staticArgs
=
staticArgs
.
slice
(
0
,
firstServiceArgPos
);
}
i
+=
1
;
}
allArguments
.
unshift
(
desc
.
ctor
);
// ctor is first arg
// services are the last arguments of ctor-calls. We check if static ctor arguments
// (like those from a [sync|async] desriptor) or args that are passed by createInstance
// don't override positions of those arguments
if
(
actualFirstServiceIndex
!==
Number
.
MAX_VALUE
&&
actualFirstServiceIndex
!==
expectedFirstServiceIndex
)
{
let
msg
=
`[createInstance] constructor '
${
desc
.
ctor
.
name
}
' has first`
+
` service dependency at position
${
actualFirstServiceIndex
+
1
}
but is called with`
+
`
${
expectedFirstServiceIndex
-
1
}
static arguments that are expected to come first`
;
// throw new Error(msg);
console
.
warn
(
msg
);
}
// now create the instance
const
argArray
=
[
desc
.
ctor
];
argArray
.
push
(...
staticArgs
);
argArray
.
push
(...
serviceArgs
);
// return this._lock.runUnlocked(() => {
const
instance
=
create
.
apply
(
null
,
allArguments
);
desc
.
_validate
(
instance
);
return
<
T
>
instance
;
// });
const
instance
=
create
.
apply
(
null
,
argArray
);
desc
.
_validate
(
instance
);
return
<
T
>
instance
;
}
private
_getOrCreateServiceInstance
<
T
>
(
id
:
ServiceIdentifier
<
T
>
):
T
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录