Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
221aa3d6
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,发现更多精彩内容 >>
提交
221aa3d6
编写于
10月 26, 2018
作者:
M
Matt Bierner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Introduce RequestQueueingType
Allow for finer control over how requests are queued
上级
eafe48e9
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
90 addition
and
17 deletion
+90
-17
extensions/typescript-language-features/src/test/requestQueue.test.ts
...ypescript-language-features/src/test/requestQueue.test.ts
+48
-8
extensions/typescript-language-features/src/tsServer/requestQueue.ts
...typescript-language-features/src/tsServer/requestQueue.ts
+28
-7
extensions/typescript-language-features/src/tsServer/server.ts
...sions/typescript-language-features/src/tsServer/server.ts
+14
-2
未找到文件。
extensions/typescript-language-features/src/test/requestQueue.test.ts
浏览文件 @
221aa3d6
...
...
@@ -5,7 +5,7 @@
import
*
as
assert
from
'
assert
'
;
import
'
mocha
'
;
import
{
RequestQueue
}
from
'
../tsServer/requestQueue
'
;
import
{
RequestQueue
,
RequestQueueingType
}
from
'
../tsServer/requestQueue
'
;
suite
(
'
RequestQueue
'
,
()
=>
{
test
(
'
should be empty on creation
'
,
async
()
=>
{
...
...
@@ -33,11 +33,11 @@ suite('RequestQueue', () => {
assert
.
strictEqual
(
queue
.
length
,
0
);
const
request1
=
queue
.
createRequest
(
'
a
'
,
1
);
queue
.
push
({
request
:
request1
,
expectsResponse
:
true
,
isAsync
:
false
});
queue
.
push
({
request
:
request1
,
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
Normal
});
assert
.
strictEqual
(
queue
.
length
,
1
);
const
request2
=
queue
.
createRequest
(
'
b
'
,
2
);
queue
.
push
({
request
:
request2
,
expectsResponse
:
true
,
isAsync
:
false
});
queue
.
push
({
request
:
request2
,
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
Normal
});
assert
.
strictEqual
(
queue
.
length
,
2
);
{
...
...
@@ -61,12 +61,52 @@ suite('RequestQueue', () => {
const
queue
=
new
RequestQueue
();
assert
.
strictEqual
(
queue
.
length
,
0
);
const
request1
=
queue
.
createRequest
(
'
low
'
,
1
);
queue
.
push
({
request
:
request1
,
expectsResponse
:
true
,
isAsync
:
false
,
lowPriority
:
true
});
queue
.
push
({
request
:
queue
.
createRequest
(
'
low-1
'
,
1
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
LowPriority
});
queue
.
push
({
request
:
queue
.
createRequest
(
'
low-2
'
,
1
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
LowPriority
});
queue
.
push
({
request
:
queue
.
createRequest
(
'
normal-1
'
,
2
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
Normal
});
queue
.
push
({
request
:
queue
.
createRequest
(
'
normal-2
'
,
2
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
Normal
});
const
request2
=
queue
.
createRequest
(
'
normal
'
,
2
);
queue
.
push
({
request
:
request2
,
expectsResponse
:
true
,
isAsync
:
false
});
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
3
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
normal-1
'
);
}
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
2
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
normal-2
'
);
}
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
1
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
low-1
'
);
}
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
0
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
low-2
'
);
}
});
test
(
'
should not push fence requests front of low priority requests
'
,
async
()
=>
{
const
queue
=
new
RequestQueue
();
assert
.
strictEqual
(
queue
.
length
,
0
);
queue
.
push
({
request
:
queue
.
createRequest
(
'
low-1
'
,
0
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
LowPriority
});
queue
.
push
({
request
:
queue
.
createRequest
(
'
fence
'
,
0
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
Fence
});
queue
.
push
({
request
:
queue
.
createRequest
(
'
low-2
'
,
0
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
LowPriority
});
queue
.
push
({
request
:
queue
.
createRequest
(
'
normal
'
,
0
),
expectsResponse
:
true
,
isAsync
:
false
,
queueingType
:
RequestQueueingType
.
Normal
});
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
3
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
low-1
'
);
}
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
2
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
fence
'
);
}
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
1
);
...
...
@@ -75,7 +115,7 @@ suite('RequestQueue', () => {
{
const
item
=
queue
.
shift
();
assert
.
strictEqual
(
queue
.
length
,
0
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
low
'
);
assert
.
strictEqual
(
item
!
.
request
.
command
,
'
low
-2
'
);
}
});
});
...
...
extensions/typescript-language-features/src/tsServer/requestQueue.ts
浏览文件 @
221aa3d6
...
...
@@ -5,11 +5,31 @@
import
*
as
Proto
from
'
../protocol
'
;
export
enum
RequestQueueingType
{
/**
* Normal request that is executed in order.
*/
Normal
=
1
,
/**
* Request that normal requests jump in front of in the queue.
*/
LowPriority
=
2
,
/**
* A fence that blocks request reordering.
*
* Fences are not reordered but unlike a normal request, a fence will never jump in front of a low priority request
* in the request queue.
*/
Fence
=
3
,
}
export
interface
RequestItem
{
readonly
request
:
Proto
.
Request
;
readonly
expectsResponse
:
boolean
;
readonly
isAsync
:
boolean
;
readonly
lowPriority
?:
boolean
;
readonly
queueingType
:
RequestQueueingType
;
}
export
class
RequestQueue
{
...
...
@@ -21,20 +41,21 @@ export class RequestQueue {
}
public
push
(
item
:
RequestItem
):
void
{
// insert before existing lowPriority requestItems in the queue.
if
(
!
item
.
lowPriority
&&
this
.
length
)
{
if
(
item
.
queueingType
===
RequestQueueingType
.
Normal
)
{
// insert before lowPriority items queue.
for
(
let
i
=
this
.
length
-
1
;
i
>
-
1
;
i
--
)
{
if
(
!
this
.
queue
[
i
].
l
owPriority
)
{
if
(
this
.
queue
[
i
].
queueingType
!==
RequestQueueingType
.
L
owPriority
)
{
this
.
queue
.
splice
(
i
+
1
,
0
,
item
);
return
;
}
}
//
i
f all of the items are lowPriority insert at top
//
I
f all of the items are lowPriority insert at top
this
.
queue
.
unshift
(
item
);
return
;
}
else
{
//if none is low priority just push to end
this
.
queue
.
push
(
item
);
}
//if none is low priority just push to end
this
.
queue
.
push
(
item
);
}
public
shift
():
RequestItem
|
undefined
{
...
...
extensions/typescript-language-features/src/tsServer/server.ts
浏览文件 @
221aa3d6
...
...
@@ -22,7 +22,7 @@ import Tracer from '../utils/tracer';
import
{
TypeScriptVersion
,
TypeScriptVersionProvider
}
from
'
../utils/versionProvider
'
;
import
{
Reader
}
from
'
../utils/wireProtocol
'
;
import
{
CallbackMap
}
from
'
./callbackMap
'
;
import
{
RequestQueue
,
RequestItem
}
from
'
./requestQueue
'
;
import
{
RequestQueue
,
RequestItem
,
RequestQueueingType
}
from
'
./requestQueue
'
;
export
class
TypeScriptServerSpawner
{
public
constructor
(
...
...
@@ -301,7 +301,7 @@ export class TypeScriptServer extends Disposable {
request
:
request
,
expectsResponse
:
executeInfo
.
expectsResult
,
isAsync
:
executeInfo
.
isAsync
,
lowPriority
:
executeInfo
.
lowPriority
queueingType
:
getQueueingType
(
command
,
executeInfo
.
lowPriority
)
};
let
result
:
Promise
<
any
>
;
if
(
executeInfo
.
expectsResult
)
{
...
...
@@ -405,3 +405,15 @@ export class TypeScriptServer extends Disposable {
}
}
const
fenceCommands
=
new
Set
([
'
change
'
,
'
close
'
,
'
open
'
]);
function
getQueueingType
(
command
:
string
,
lowPriority
?:
boolean
):
RequestQueueingType
{
if
(
fenceCommands
.
has
(
command
))
{
return
RequestQueueingType
.
Fence
;
}
return
lowPriority
?
RequestQueueingType
.
LowPriority
:
RequestQueueingType
.
Normal
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录