Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
daad75c2
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,发现更多精彩内容 >>
提交
daad75c2
编写于
12月 18, 2020
作者:
M
Martin Aeschlimann
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[css] update to vscode-uri@3.0
上级
d6a6b44a
变更
12
显示空白变更内容
内联
并排
Showing
12 changed file
with
29 addition
and
217 deletion
+29
-217
extensions/css-language-features/client/src/customData.ts
extensions/css-language-features/client/src/customData.ts
+3
-3
extensions/css-language-features/client/src/node/nodeFs.ts
extensions/css-language-features/client/src/node/nodeFs.ts
+2
-2
extensions/css-language-features/client/src/requests.ts
extensions/css-language-features/client/src/requests.ts
+0
-58
extensions/css-language-features/package.json
extensions/css-language-features/package.json
+2
-1
extensions/css-language-features/server/package.json
extensions/css-language-features/server/package.json
+2
-2
extensions/css-language-features/server/src/node/nodeFs.ts
extensions/css-language-features/server/src/node/nodeFs.ts
+2
-2
extensions/css-language-features/server/src/requests.ts
extensions/css-language-features/server/src/requests.ts
+1
-75
extensions/css-language-features/server/src/test/requests.test.ts
...ns/css-language-features/server/src/test/requests.test.ts
+0
-62
extensions/css-language-features/server/src/utils/documentContext.ts
...css-language-features/server/src/utils/documentContext.ts
+2
-2
extensions/css-language-features/server/test/index.js
extensions/css-language-features/server/test/index.js
+1
-1
extensions/css-language-features/server/yarn.lock
extensions/css-language-features/server/yarn.lock
+9
-9
extensions/css-language-features/yarn.lock
extensions/css-language-features/yarn.lock
+5
-0
未找到文件。
extensions/css-language-features/client/src/customData.ts
浏览文件 @
daad75c2
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import
{
workspace
,
extensions
,
Uri
,
EventEmitter
,
Disposable
}
from
'
vscode
'
;
import
{
resolvePath
,
joinPath
}
from
'
./requests
'
;
import
{
Utils
}
from
'
vscode-uri
'
;
export
function
getCustomDataSource
(
toDispose
:
Disposable
[])
{
let
pathsInWorkspace
=
getCustomDataPathsInAllWorkspaces
();
...
...
@@ -50,7 +50,7 @@ function getCustomDataPathsInAllWorkspaces(): string[] {
if
(
Array
.
isArray
(
paths
))
{
for
(
const
path
of
paths
)
{
if
(
typeof
path
===
'
string
'
)
{
dataPaths
.
push
(
resolvePath
(
rootFolder
,
path
).
toString
());
dataPaths
.
push
(
Utils
.
resolvePath
(
rootFolder
,
path
).
toString
());
}
}
}
...
...
@@ -80,7 +80,7 @@ function getCustomDataPathsFromAllExtensions(): string[] {
const
customData
=
extension
.
packageJSON
?.
contributes
?.
css
?.
customData
;
if
(
Array
.
isArray
(
customData
))
{
for
(
const
rp
of
customData
)
{
dataPaths
.
push
(
joinPath
(
extension
.
extensionUri
,
rp
).
toString
());
dataPaths
.
push
(
Utils
.
joinPath
(
extension
.
extensionUri
,
rp
).
toString
());
}
}
}
...
...
extensions/css-language-features/client/src/node/nodeFs.ts
浏览文件 @
daad75c2
...
...
@@ -5,11 +5,11 @@
import
*
as
fs
from
'
fs
'
;
import
{
Uri
}
from
'
vscode
'
;
import
{
getScheme
,
RequestService
,
FileType
}
from
'
../requests
'
;
import
{
RequestService
,
FileType
}
from
'
../requests
'
;
export
function
getNodeFSRequestService
():
RequestService
{
function
ensureFileUri
(
location
:
string
)
{
if
(
getScheme
(
location
)
!==
'
file
'
)
{
if
(
!
location
.
startsWith
(
'
file://
'
)
)
{
throw
new
Error
(
'
fileRequestService can only handle file URLs
'
);
}
}
...
...
extensions/css-language-features/client/src/requests.ts
浏览文件 @
daad75c2
...
...
@@ -88,61 +88,3 @@ export interface RequestService {
stat
(
uri
:
string
):
Promise
<
FileStat
>
;
readDirectory
(
uri
:
string
):
Promise
<
[
string
,
FileType
][]
>
;
}
export
function
getScheme
(
uri
:
string
)
{
return
uri
.
substr
(
0
,
uri
.
indexOf
(
'
:
'
));
}
export
function
dirname
(
uri
:
string
)
{
const
lastIndexOfSlash
=
uri
.
lastIndexOf
(
'
/
'
);
return
lastIndexOfSlash
!==
-
1
?
uri
.
substr
(
0
,
lastIndexOfSlash
)
:
''
;
}
export
function
basename
(
uri
:
string
)
{
const
lastIndexOfSlash
=
uri
.
lastIndexOf
(
'
/
'
);
return
uri
.
substr
(
lastIndexOfSlash
+
1
);
}
const
Slash
=
'
/
'
.
charCodeAt
(
0
);
const
Dot
=
'
.
'
.
charCodeAt
(
0
);
export
function
isAbsolutePath
(
path
:
string
)
{
return
path
.
charCodeAt
(
0
)
===
Slash
;
}
export
function
resolvePath
(
uri
:
Uri
,
path
:
string
):
Uri
{
if
(
isAbsolutePath
(
path
))
{
return
uri
.
with
({
path
:
normalizePath
(
path
.
split
(
'
/
'
))
});
}
return
joinPath
(
uri
,
path
);
}
export
function
normalizePath
(
parts
:
string
[]):
string
{
const
newParts
:
string
[]
=
[];
for
(
const
part
of
parts
)
{
if
(
part
.
length
===
0
||
part
.
length
===
1
&&
part
.
charCodeAt
(
0
)
===
Dot
)
{
// ignore
}
else
if
(
part
.
length
===
2
&&
part
.
charCodeAt
(
0
)
===
Dot
&&
part
.
charCodeAt
(
1
)
===
Dot
)
{
newParts
.
pop
();
}
else
{
newParts
.
push
(
part
);
}
}
if
(
parts
.
length
>
1
&&
parts
[
parts
.
length
-
1
].
length
===
0
)
{
newParts
.
push
(
''
);
}
let
res
=
newParts
.
join
(
'
/
'
);
if
(
parts
[
0
].
length
===
0
)
{
res
=
'
/
'
+
res
;
}
return
res
;
}
export
function
joinPath
(
uri
:
Uri
,
...
paths
:
string
[]):
Uri
{
const
parts
=
uri
.
path
.
split
(
'
/
'
);
for
(
let
path
of
paths
)
{
parts
.
push
(...
path
.
split
(
'
/
'
));
}
return
uri
.
with
({
path
:
normalizePath
(
parts
)
});
}
extensions/css-language-features/package.json
浏览文件 @
daad75c2
...
...
@@ -808,7 +808,8 @@
},
"dependencies"
:
{
"vscode-languageclient"
:
"^7.0.0"
,
"vscode-nls"
:
"^4.1.2"
"vscode-nls"
:
"^4.1.2"
,
"vscode-uri"
:
"^3.0.0"
},
"devDependencies"
:
{
"@types/node"
:
"^12.11.7"
...
...
extensions/css-language-features/server/package.json
浏览文件 @
daad75c2
...
...
@@ -10,9 +10,9 @@
"main"
:
"./out/node/cssServerMain"
,
"browser"
:
"./dist/browser/cssServerMain"
,
"dependencies"
:
{
"vscode-css-languageservice"
:
"^5.0.
0
"
,
"vscode-css-languageservice"
:
"^5.0.
1
"
,
"vscode-languageserver"
:
"^7.0.0"
,
"vscode-uri"
:
"^
2.1.2
"
"vscode-uri"
:
"^
3.0.0
"
},
"devDependencies"
:
{
"@types/mocha"
:
"7.0.2"
,
...
...
extensions/css-language-features/server/src/node/nodeFs.ts
浏览文件 @
daad75c2
...
...
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import
{
RequestService
,
getScheme
}
from
'
../requests
'
;
import
{
RequestService
}
from
'
../requests
'
;
import
{
URI
as
Uri
}
from
'
vscode-uri
'
;
import
*
as
fs
from
'
fs
'
;
...
...
@@ -11,7 +11,7 @@ import { FileType } from 'vscode-css-languageservice';
export
function
getNodeFSRequestService
():
RequestService
{
function
ensureFileUri
(
location
:
string
)
{
if
(
getScheme
(
location
)
!==
'
file
'
)
{
if
(
!
location
.
startsWith
(
'
file://
'
)
)
{
throw
new
Error
(
'
fileRequestService can only handle file URLs
'
);
}
}
...
...
extensions/css-language-features/server/src/requests.ts
浏览文件 @
daad75c2
...
...
@@ -3,7 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import
{
URI
}
from
'
vscode-uri
'
;
import
{
RequestType
,
Connection
}
from
'
vscode-languageserver
'
;
import
{
RuntimeEnvironment
}
from
'
./cssServer
'
;
...
...
@@ -99,79 +98,6 @@ export function getRequestService(handledSchemas: string[], connection: Connecti
};
}
export
function
getScheme
(
uri
:
string
)
{
function
getScheme
(
uri
:
string
)
{
return
uri
.
substr
(
0
,
uri
.
indexOf
(
'
:
'
));
}
export
function
dirname
(
uri
:
string
)
{
const
lastIndexOfSlash
=
uri
.
lastIndexOf
(
'
/
'
);
return
lastIndexOfSlash
!==
-
1
?
uri
.
substr
(
0
,
lastIndexOfSlash
)
:
''
;
}
export
function
basename
(
uri
:
string
)
{
const
lastIndexOfSlash
=
uri
.
lastIndexOf
(
'
/
'
);
return
uri
.
substr
(
lastIndexOfSlash
+
1
);
}
const
Slash
=
'
/
'
.
charCodeAt
(
0
);
const
Dot
=
'
.
'
.
charCodeAt
(
0
);
export
function
extname
(
uri
:
string
)
{
for
(
let
i
=
uri
.
length
-
1
;
i
>=
0
;
i
--
)
{
const
ch
=
uri
.
charCodeAt
(
i
);
if
(
ch
===
Dot
)
{
if
(
i
>
0
&&
uri
.
charCodeAt
(
i
-
1
)
!==
Slash
)
{
return
uri
.
substr
(
i
);
}
else
{
break
;
}
}
else
if
(
ch
===
Slash
)
{
break
;
}
}
return
''
;
}
export
function
isAbsolutePath
(
path
:
string
)
{
return
path
.
charCodeAt
(
0
)
===
Slash
;
}
export
function
resolvePath
(
uriString
:
string
,
path
:
string
):
string
{
if
(
isAbsolutePath
(
path
))
{
const
uri
=
URI
.
parse
(
uriString
);
const
parts
=
path
.
split
(
'
/
'
);
return
uri
.
with
({
path
:
normalizePath
(
parts
)
}).
toString
();
}
return
joinPath
(
uriString
,
path
);
}
export
function
normalizePath
(
parts
:
string
[]):
string
{
const
newParts
:
string
[]
=
[];
for
(
const
part
of
parts
)
{
if
(
part
.
length
===
0
||
part
.
length
===
1
&&
part
.
charCodeAt
(
0
)
===
Dot
)
{
// ignore
}
else
if
(
part
.
length
===
2
&&
part
.
charCodeAt
(
0
)
===
Dot
&&
part
.
charCodeAt
(
1
)
===
Dot
)
{
newParts
.
pop
();
}
else
{
newParts
.
push
(
part
);
}
}
if
(
parts
.
length
>
1
&&
parts
[
parts
.
length
-
1
].
length
===
0
)
{
newParts
.
push
(
''
);
}
let
res
=
newParts
.
join
(
'
/
'
);
if
(
parts
[
0
].
length
===
0
)
{
res
=
'
/
'
+
res
;
}
return
res
;
}
export
function
joinPath
(
uriString
:
string
,
...
paths
:
string
[]):
string
{
const
uri
=
URI
.
parse
(
uriString
);
const
parts
=
uri
.
path
.
split
(
'
/
'
);
for
(
let
path
of
paths
)
{
parts
.
push
(...
path
.
split
(
'
/
'
));
}
return
uri
.
with
({
path
:
normalizePath
(
parts
)
}).
toString
();
}
extensions/css-language-features/server/src/test/requests.test.ts
已删除
100644 → 0
浏览文件 @
d6a6b44a
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import
'
mocha
'
;
import
*
as
assert
from
'
assert
'
;
import
{
joinPath
,
normalizePath
,
resolvePath
,
extname
}
from
'
../requests
'
;
suite
(
'
requests
'
,
()
=>
{
test
(
'
join
'
,
async
function
()
{
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar
'
,
'
x
'
),
'
foo://a/foo/bar/x
'
);
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar/
'
,
'
x
'
),
'
foo://a/foo/bar/x
'
);
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar/
'
,
'
/x
'
),
'
foo://a/foo/bar/x
'
);
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar/
'
,
'
x/
'
),
'
foo://a/foo/bar/x/
'
);
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar/
'
,
'
x
'
,
'
y
'
),
'
foo://a/foo/bar/x/y
'
);
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar/
'
,
'
x/
'
,
'
/y
'
),
'
foo://a/foo/bar/x/y
'
);
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar/
'
,
'
.
'
,
'
/y
'
),
'
foo://a/foo/bar/y
'
);
assert
.
equal
(
joinPath
(
'
foo://a/foo/bar/
'
,
'
x/y/z
'
,
'
..
'
),
'
foo://a/foo/bar/x/y
'
);
});
test
(
'
resolve
'
,
async
function
()
{
assert
.
equal
(
resolvePath
(
'
foo://a/foo/bar
'
,
'
x
'
),
'
foo://a/foo/bar/x
'
);
assert
.
equal
(
resolvePath
(
'
foo://a/foo/bar/
'
,
'
x
'
),
'
foo://a/foo/bar/x
'
);
assert
.
equal
(
resolvePath
(
'
foo://a/foo/bar/
'
,
'
/x
'
),
'
foo://a/x
'
);
assert
.
equal
(
resolvePath
(
'
foo://a/foo/bar/
'
,
'
x/
'
),
'
foo://a/foo/bar/x/
'
);
});
test
(
'
normalize
'
,
async
function
()
{
function
assertNormalize
(
path
:
string
,
expected
:
string
)
{
assert
.
equal
(
normalizePath
(
path
.
split
(
'
/
'
)),
expected
,
path
);
}
assertNormalize
(
'
a
'
,
'
a
'
);
assertNormalize
(
'
/a
'
,
'
/a
'
);
assertNormalize
(
'
a/
'
,
'
a/
'
);
assertNormalize
(
'
a/b
'
,
'
a/b
'
);
assertNormalize
(
'
/a/foo/bar/x
'
,
'
/a/foo/bar/x
'
);
assertNormalize
(
'
/a/foo/bar//x
'
,
'
/a/foo/bar/x
'
);
assertNormalize
(
'
/a/foo/bar///x
'
,
'
/a/foo/bar/x
'
);
assertNormalize
(
'
/a/foo/bar/x/
'
,
'
/a/foo/bar/x/
'
);
assertNormalize
(
'
a/foo/bar/x/
'
,
'
a/foo/bar/x/
'
);
assertNormalize
(
'
a/foo/bar/x//
'
,
'
a/foo/bar/x/
'
);
assertNormalize
(
'
//a/foo/bar/x//
'
,
'
/a/foo/bar/x/
'
);
assertNormalize
(
'
a/.
'
,
'
a
'
);
assertNormalize
(
'
a/./b
'
,
'
a/b
'
);
assertNormalize
(
'
a/././b
'
,
'
a/b
'
);
assertNormalize
(
'
a/n/../b
'
,
'
a/b
'
);
assertNormalize
(
'
a/n/../
'
,
'
a/
'
);
assertNormalize
(
'
a/n/../
'
,
'
a/
'
);
assertNormalize
(
'
/a/n/../..
'
,
'
/
'
);
assertNormalize
(
'
..
'
,
''
);
assertNormalize
(
'
/..
'
,
'
/
'
);
});
test
(
'
extname
'
,
async
function
()
{
function
assertExtName
(
input
:
string
,
expected
:
string
)
{
assert
.
equal
(
extname
(
input
),
expected
,
input
);
}
assertExtName
(
'
foo://a/foo/bar
'
,
''
);
assertExtName
(
'
foo://a/foo/bar.foo
'
,
'
.foo
'
);
assertExtName
(
'
foo://a/foo/.foo
'
,
''
);
});
});
extensions/css-language-features/server/src/utils/documentContext.ts
浏览文件 @
daad75c2
...
...
@@ -6,7 +6,7 @@
import
{
DocumentContext
}
from
'
vscode-css-languageservice
'
;
import
{
endsWith
,
startsWith
}
from
'
../utils/strings
'
;
import
{
WorkspaceFolder
}
from
'
vscode-languageserver
'
;
import
{
resolvePath
}
from
'
../requests
'
;
import
{
Utils
,
URI
}
from
'
vscode-uri
'
;
export
function
getDocumentContext
(
documentUri
:
string
,
workspaceFolders
:
WorkspaceFolder
[]):
DocumentContext
{
function
getRootFolder
():
string
|
undefined
{
...
...
@@ -31,7 +31,7 @@ export function getDocumentContext(documentUri: string, workspaceFolders: Worksp
}
}
base
=
base
.
substr
(
0
,
base
.
lastIndexOf
(
'
/
'
)
+
1
);
return
resolvePath
(
base
,
ref
);
return
Utils
.
resolvePath
(
URI
.
parse
(
base
),
ref
).
toString
(
);
},
};
}
...
...
extensions/css-language-features/server/test/index.js
浏览文件 @
daad75c2
...
...
@@ -28,7 +28,7 @@ if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
const
mocha
=
new
Mocha
(
options
);
glob
.
sync
(
__dirname
+
'
/../out/test/**/*.test.js
'
)
glob
.
sync
(
path
.
join
(
__dirname
,
'
../out/test/**/*.test.js
'
)
)
.
forEach
(
file
=>
mocha
.
addFile
(
file
));
mocha
.
run
(
failures
=>
process
.
exit
(
failures
?
-
1
:
0
));
extensions/css-language-features/server/yarn.lock
浏览文件 @
daad75c2
...
...
@@ -12,15 +12,15 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a"
integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==
vscode-css-languageservice@^5.0.
0
:
version "5.0.
0
"
resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.0.
0.tgz#04fd899e25407a2fccd8f59a5896e2f020269bda
"
integrity sha512-
DTMa8QbVmujFPvD3NxoC5jjIXCyCG+cvn3hNzwQRhvhsk8LblNymBZBwzfcDdgEtqsi4O/2AB5HnMIRzxhzEzg
==
vscode-css-languageservice@^5.0.
1
:
version "5.0.
1
"
resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.0.
1.tgz#0061e0af23e7c49feba3abfda90799a4877738ee
"
integrity sha512-
9Lzf7XQD82ykwuyuma2r5g2NkrFth96k7PC4YCwtMoLIKxHXGDqHm7NIzjvY2qi43WgUROpw9XXTKKr8NmNuhA
==
dependencies:
vscode-languageserver-textdocument "^1.0.1"
vscode-languageserver-types "^3.16.0"
vscode-nls "^5.0.0"
vscode-uri "^
2.1.2
"
vscode-uri "^
3.0.0
"
vscode-jsonrpc@6.0.0:
version "6.0.0"
...
...
@@ -57,7 +57,7 @@ vscode-nls@^5.0.0:
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840"
integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==
vscode-uri@^
2.1.2
:
version "
2.1.2
"
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-
2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c
"
integrity sha512-
8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A
==
vscode-uri@^
3.0.0
:
version "
3.0.0
"
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-
3.0.0.tgz#a881b16614999d97e71d5d29ea453d4f8c19499d
"
integrity sha512-
boWPjBN8UPv8/9OnEGumoXgIVreVjs3RyqULtfHC3GRT1aCnaotYRKOhZERmaMsCVVt6nPmmI/ec7i1FH2kctw
==
extensions/css-language-features/yarn.lock
浏览文件 @
daad75c2
...
...
@@ -78,6 +78,11 @@ vscode-nls@^4.1.2:
resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167"
integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==
vscode-uri@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.0.tgz#a881b16614999d97e71d5d29ea453d4f8c19499d"
integrity sha512-boWPjBN8UPv8/9OnEGumoXgIVreVjs3RyqULtfHC3GRT1aCnaotYRKOhZERmaMsCVVt6nPmmI/ec7i1FH2kctw==
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录