Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
153a1ba3
V
vscode
项目概览
掘金者说
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
153a1ba3
编写于
3月 24, 2020
作者:
A
Alex Dima
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Simplify encoding / decoding code
上级
c0f2ad1d
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
69 addition
and
67 deletion
+69
-67
src/vs/workbench/api/common/shared/semanticTokensDto.ts
src/vs/workbench/api/common/shared/semanticTokensDto.ts
+69
-67
未找到文件。
src/vs/workbench/api/common/shared/semanticTokensDto.ts
浏览文件 @
153a1ba3
...
...
@@ -25,113 +25,115 @@ const enum EncodedSemanticTokensType {
Delta
=
2
}
function
toUint8Array
(
arr
:
Uint32Array
):
Uint8Array
{
return
new
Uint8Array
(
arr
.
buffer
,
arr
.
byteOffset
,
arr
.
length
*
4
);
function
reverseEndianness
(
arr
:
Uint8Array
):
void
{
for
(
let
i
=
0
,
len
=
arr
.
length
;
i
<
len
;
i
+=
4
)
{
// flip bytes 0<->3 and 1<->2
const
b0
=
arr
[
i
+
0
];
const
b1
=
arr
[
i
+
1
];
const
b2
=
arr
[
i
+
2
];
const
b3
=
arr
[
i
+
3
];
arr
[
i
+
0
]
=
b3
;
arr
[
i
+
1
]
=
b2
;
arr
[
i
+
2
]
=
b1
;
arr
[
i
+
3
]
=
b0
;
}
}
function
toUint32Array
(
arr
:
Uint8Array
,
byteOffset
:
number
,
length
:
number
):
Uint32Array
{
return
new
Uint32Array
(
arr
.
buffer
,
arr
.
byteOffset
+
byteOffset
,
length
);
function
toLittleEndianBuffer
(
arr
:
Uint32Array
):
VSBuffer
{
const
uint8Arr
=
new
Uint8Array
(
arr
.
buffer
,
arr
.
byteOffset
,
arr
.
length
*
4
);
if
(
!
platform
.
isLittleEndian
())
{
// the byte order must be changed
reverseEndianness
(
uint8Arr
);
}
return
VSBuffer
.
wrap
(
uint8Arr
);
}
function
fromLittleEndianBuffer
(
buff
:
VSBuffer
):
Uint32Array
{
const
uint8Arr
=
buff
.
buffer
;
if
(
!
platform
.
isLittleEndian
())
{
// the byte order must be changed
reverseEndianness
(
uint8Arr
);
}
return
new
Uint32Array
(
uint8Arr
.
buffer
,
uint8Arr
.
byteOffset
);
}
export
function
encodeSemanticTokensDto
(
semanticTokens
:
ISemanticTokensDto
):
VSBuffer
{
const
isLittleEndian
=
platform
.
isLittleEndian
();
const
buff
=
VSBuffer
.
alloc
(
encodeSemanticTokensDtoSize
(
semanticTokens
));
const
dest
=
new
Uint32Array
(
encodeSemanticTokensDtoSize
(
semanticTokens
));
let
offset
=
0
;
buff
.
writeUInt32LE
(
semanticTokens
.
id
,
offset
);
offset
+=
4
;
dest
[
offset
++
]
=
semanticTokens
.
id
;
if
(
semanticTokens
.
type
===
'
full
'
)
{
buff
.
writeUInt32LE
(
EncodedSemanticTokensType
.
Full
,
offset
);
offset
+=
4
;
buff
.
writeUInt32LE
(
semanticTokens
.
data
.
length
,
offset
);
offset
+=
4
;
if
(
isLittleEndian
)
{
const
uint8Arr
=
toUint8Array
(
semanticTokens
.
data
);
buff
.
set
(
uint8Arr
,
offset
);
offset
+=
uint8Arr
.
length
;
dest
[
offset
++
]
=
EncodedSemanticTokensType
.
Full
;
dest
[
offset
++
]
=
semanticTokens
.
data
.
length
;
dest
.
set
(
semanticTokens
.
data
,
offset
);
offset
+=
semanticTokens
.
data
.
length
;
}
else
{
for
(
const
uint
of
semanticTokens
.
data
)
{
buff
.
writeUInt32LE
(
uint
,
offset
);
offset
+=
4
;
}
}
}
else
{
buff
.
writeUInt32LE
(
EncodedSemanticTokensType
.
Delta
,
offset
);
offset
+=
4
;
buff
.
writeUInt32LE
(
semanticTokens
.
deltas
.
length
,
offset
);
offset
+=
4
;
dest
[
offset
++
]
=
EncodedSemanticTokensType
.
Delta
;
dest
[
offset
++
]
=
semanticTokens
.
deltas
.
length
;
for
(
const
delta
of
semanticTokens
.
deltas
)
{
buff
.
writeUInt32LE
(
delta
.
start
,
offset
);
offset
+=
4
;
buff
.
writeUInt32LE
(
delta
.
deleteCount
,
offset
);
offset
+=
4
;
dest
[
offset
++
]
=
delta
.
start
;
dest
[
offset
++
]
=
delta
.
deleteCount
;
if
(
delta
.
data
)
{
buff
.
writeUInt32LE
(
delta
.
data
.
length
,
offset
);
offset
+=
4
;
if
(
isLittleEndian
)
{
const
uint8Arr
=
toUint8Array
(
delta
.
data
);
buff
.
set
(
uint8Arr
,
offset
);
offset
+=
uint8Arr
.
length
;
dest
[
offset
++
]
=
delta
.
data
.
length
;
dest
.
set
(
delta
.
data
,
offset
);
offset
+=
delta
.
data
.
length
;
}
else
{
for
(
const
uint
of
delta
.
data
)
{
buff
.
writeUInt32LE
(
uint
,
offset
);
offset
+=
4
;
dest
[
offset
++
]
=
0
;
}
}
}
else
{
buff
.
writeUInt32LE
(
0
,
offset
);
offset
+=
4
;
}
}
}
return
buff
;
return
toLittleEndianBuffer
(
dest
);
}
function
encodeSemanticTokensDtoSize
(
semanticTokens
:
ISemanticTokensDto
):
number
{
let
result
=
0
;
result
+=
4
;
// id
result
+=
4
;
// type
result
+=
(
+
1
// id
+
1
// type
);
if
(
semanticTokens
.
type
===
'
full
'
)
{
result
+=
4
;
// data length
result
+=
semanticTokens
.
data
.
byteLength
;
result
+=
(
+
1
// data length
+
semanticTokens
.
data
.
length
);
}
else
{
result
+=
4
;
// delta count
result
+=
(
+
1
// delta count
);
result
+=
(
+
1
// start
+
1
// deleteCount
+
1
// data length
)
*
semanticTokens
.
deltas
.
length
;
for
(
const
delta
of
semanticTokens
.
deltas
)
{
result
+=
4
;
// start
result
+=
4
;
// deleteCount
result
+=
4
;
// data length
if
(
delta
.
data
)
{
result
+=
delta
.
data
.
byteL
ength
;
result
+=
delta
.
data
.
l
ength
;
}
}
}
return
result
;
}
export
function
decodeSemanticTokensDto
(
buff
:
VSBuffer
):
ISemanticTokensDto
{
const
isLittleEndian
=
platform
.
isLittleEndian
(
);
export
function
decodeSemanticTokensDto
(
_
buff
:
VSBuffer
):
ISemanticTokensDto
{
const
src
=
fromLittleEndianBuffer
(
_buff
);
let
offset
=
0
;
const
id
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
const
type
:
EncodedSemanticTokensType
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
const
id
=
src
[
offset
++
]
;
const
type
:
EncodedSemanticTokensType
=
src
[
offset
++
]
;
if
(
type
===
EncodedSemanticTokensType
.
Full
)
{
const
length
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
let
data
:
Uint32Array
;
if
(
isLittleEndian
)
{
data
=
toUint32Array
(
buff
.
buffer
,
offset
,
length
);
offset
+=
4
*
length
;
}
else
{
data
=
new
Uint32Array
(
length
);
for
(
let
j
=
0
;
j
<
length
;
j
++
)
{
data
[
j
]
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
}
}
const
length
=
src
[
offset
++
];
const
data
=
src
.
subarray
(
offset
,
offset
+
length
);
offset
+=
length
;
return
{
id
:
id
,
type
:
'
full
'
,
data
:
data
};
}
const
deltaCount
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
const
deltaCount
=
src
[
offset
++
]
;
let
deltas
:
{
start
:
number
;
deleteCount
:
number
;
data
?:
Uint32Array
;
}[]
=
[];
for
(
let
i
=
0
;
i
<
deltaCount
;
i
++
)
{
const
start
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
const
deleteCount
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
const
length
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
const
start
=
src
[
offset
++
]
;
const
deleteCount
=
src
[
offset
++
]
;
const
length
=
src
[
offset
++
]
;
let
data
:
Uint32Array
|
undefined
;
if
(
length
>
0
)
{
if
(
isLittleEndian
)
{
data
=
toUint32Array
(
buff
.
buffer
,
offset
,
length
);
offset
+=
4
*
length
;
}
else
{
data
=
new
Uint32Array
(
length
);
for
(
let
j
=
0
;
j
<
length
;
j
++
)
{
data
[
j
]
=
buff
.
readUInt32LE
(
offset
);
offset
+=
4
;
}
}
data
=
src
.
subarray
(
offset
,
offset
+
length
);
offset
+=
length
;
}
deltas
[
i
]
=
{
start
,
deleteCount
,
data
};
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录