Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
46cf57b2
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,发现更多精彩内容 >>
提交
46cf57b2
编写于
1月 29, 2021
作者:
J
Johannes Rieken
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
a bunch of failing tests
上级
930b5686
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
106 addition
and
74 deletion
+106
-74
extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts
.../vscode-api-tests/src/singlefolder-tests/commands.test.ts
+3
-0
extensions/vscode-api-tests/src/singlefolder-tests/configuration.test.ts
...de-api-tests/src/singlefolder-tests/configuration.test.ts
+3
-0
extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts
...ons/vscode-api-tests/src/singlefolder-tests/debug.test.ts
+3
-1
extensions/vscode-api-tests/src/singlefolder-tests/editor.test.ts
...ns/vscode-api-tests/src/singlefolder-tests/editor.test.ts
+5
-2
extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts
...sions/vscode-api-tests/src/singlefolder-tests/env.test.ts
+3
-0
extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts
...vscode-api-tests/src/singlefolder-tests/languages.test.ts
+3
-1
extensions/vscode-api-tests/src/singlefolder-tests/quickInput.test.ts
...scode-api-tests/src/singlefolder-tests/quickInput.test.ts
+5
-2
extensions/vscode-api-tests/src/singlefolder-tests/rpc.test.ts
...sions/vscode-api-tests/src/singlefolder-tests/rpc.test.ts
+3
-46
extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts
.../vscode-api-tests/src/singlefolder-tests/terminal.test.ts
+2
-0
extensions/vscode-api-tests/src/singlefolder-tests/types.test.ts
...ons/vscode-api-tests/src/singlefolder-tests/types.test.ts
+3
-0
extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts
...s/vscode-api-tests/src/singlefolder-tests/webview.test.ts
+2
-2
extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts
...ns/vscode-api-tests/src/singlefolder-tests/window.test.ts
+17
-14
extensions/vscode-api-tests/src/singlefolder-tests/workspace.event.test.ts
...-api-tests/src/singlefolder-tests/workspace.event.test.ts
+3
-4
extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts
...ode-api-tests/src/singlefolder-tests/workspace.fs.test.ts
+3
-0
extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts
...-api-tests/src/singlefolder-tests/workspace.tasks.test.ts
+2
-0
extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts
...vscode-api-tests/src/singlefolder-tests/workspace.test.ts
+5
-2
extensions/vscode-api-tests/src/utils.ts
extensions/vscode-api-tests/src/utils.ts
+41
-0
未找到文件。
extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts
浏览文件 @
46cf57b2
...
...
@@ -7,9 +7,12 @@ import 'mocha';
import
*
as
assert
from
'
assert
'
;
import
{
join
}
from
'
path
'
;
import
{
commands
,
workspace
,
window
,
Uri
,
Range
,
Position
,
ViewColumn
}
from
'
vscode
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode API - commands
'
,
()
=>
{
teardown
(
assertNoRpc
);
test
(
'
getCommands
'
,
function
(
done
)
{
let
p1
=
commands
.
getCommands
().
then
(
commands
=>
{
...
...
extensions/vscode-api-tests/src/singlefolder-tests/configuration.test.ts
浏览文件 @
46cf57b2
...
...
@@ -6,9 +6,12 @@
import
'
mocha
'
;
import
*
as
assert
from
'
assert
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode API - configuration
'
,
()
=>
{
teardown
(
assertNoRpc
);
test
(
'
configurations, language defaults
'
,
function
()
{
const
defaultLanguageSettings
=
vscode
.
workspace
.
getConfiguration
().
get
(
'
[abcLang]
'
);
...
...
extensions/vscode-api-tests/src/singlefolder-tests/debug.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,11 +5,13 @@
import
*
as
assert
from
'
assert
'
;
import
{
debug
,
workspace
,
Disposable
,
commands
,
window
}
from
'
vscode
'
;
import
{
disposeAll
}
from
'
../utils
'
;
import
{
assertNoRpc
,
disposeAll
}
from
'
../utils
'
;
import
{
basename
}
from
'
path
'
;
suite
(
'
vscode API - debug
'
,
function
()
{
teardown
(
assertNoRpc
);
test
(
'
breakpoints
'
,
async
function
()
{
assert
.
equal
(
debug
.
breakpoints
.
length
,
0
);
let
onDidChangeBreakpointsCounter
=
0
;
...
...
extensions/vscode-api-tests/src/singlefolder-tests/editor.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,11 +5,14 @@
import
*
as
assert
from
'
assert
'
;
import
{
workspace
,
window
,
Position
,
Range
,
commands
,
TextEditor
,
TextDocument
,
TextEditorCursorStyle
,
TextEditorLineNumbersStyle
,
SnippetString
,
Selection
,
Uri
,
env
}
from
'
vscode
'
;
import
{
createRandomFile
,
deleteFile
,
closeAllEditors
}
from
'
../utils
'
;
import
{
createRandomFile
,
deleteFile
,
closeAllEditors
,
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode API - editors
'
,
()
=>
{
teardown
(
closeAllEditors
);
teardown
(
async
function
()
{
assertNoRpc
();
await
closeAllEditors
();
});
function
withRandomFileEditor
(
initialContents
:
string
,
run
:
(
editor
:
TextEditor
,
doc
:
TextDocument
)
=>
Thenable
<
void
>
):
Thenable
<
boolean
>
{
return
createRandomFile
(
initialContents
).
then
(
file
=>
{
...
...
extensions/vscode-api-tests/src/singlefolder-tests/env.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,9 +5,12 @@
import
*
as
assert
from
'
assert
'
;
import
{
env
,
extensions
,
ExtensionKind
,
UIKind
,
Uri
}
from
'
vscode
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode API - env
'
,
()
=>
{
teardown
(
assertNoRpc
);
test
(
'
env is set
'
,
function
()
{
assert
.
equal
(
typeof
env
.
language
,
'
string
'
);
assert
.
equal
(
typeof
env
.
appRoot
,
'
string
'
);
...
...
extensions/vscode-api-tests/src/singlefolder-tests/languages.test.ts
浏览文件 @
46cf57b2
...
...
@@ -6,10 +6,12 @@
import
*
as
assert
from
'
assert
'
;
import
{
join
}
from
'
path
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
createRandomFile
,
testFs
}
from
'
../utils
'
;
import
{
assertNoRpc
,
createRandomFile
,
testFs
}
from
'
../utils
'
;
suite
(
'
vscode API - languages
'
,
()
=>
{
teardown
(
assertNoRpc
);
const
isWindows
=
process
.
platform
===
'
win32
'
;
function
positionToString
(
p
:
vscode
.
Position
)
{
...
...
extensions/vscode-api-tests/src/singlefolder-tests/quickInput.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,7 +5,7 @@
import
*
as
assert
from
'
assert
'
;
import
{
window
,
commands
}
from
'
vscode
'
;
import
{
closeAllEditors
}
from
'
../utils
'
;
import
{
assertNoRpc
,
closeAllEditors
}
from
'
../utils
'
;
interface
QuickPickExpected
{
events
:
string
[];
...
...
@@ -20,7 +20,10 @@ interface QuickPickExpected {
suite
(
'
vscode API - quick input
'
,
function
()
{
teardown
(
closeAllEditors
);
teardown
(
async
function
()
{
assertNoRpc
();
await
closeAllEditors
();
});
test
(
'
createQuickPick, select second
'
,
function
(
_done
)
{
let
done
=
(
err
?:
any
)
=>
{
...
...
extensions/vscode-api-tests/src/singlefolder-tests/rpc.test.ts
浏览文件 @
46cf57b2
...
...
@@ -3,54 +3,11 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import
*
as
assert
from
'
assert
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode
'
,
function
()
{
test
(
'
rpc protocol, proxies not reachable
'
,
function
()
{
const
symProxy
=
Symbol
.
for
(
'
rpcProxy
'
);
const
symProtocol
=
Symbol
.
for
(
'
rpcProtocol
'
);
const
proxyPaths
:
string
[]
=
[];
const
rpcPaths
:
string
[]
=
[];
function
walk
(
obj
:
any
,
path
:
string
,
seen
:
Set
<
any
>
)
{
if
(
!
obj
)
{
return
;
}
if
(
typeof
obj
!==
'
object
'
&&
typeof
obj
!==
'
function
'
)
{
return
;
}
if
(
seen
.
has
(
obj
))
{
return
;
}
seen
.
add
(
obj
);
if
(
obj
[
symProtocol
])
{
rpcPaths
.
push
(
`PROTOCOL via
${
path
}
`
);
}
if
(
obj
[
symProxy
])
{
proxyPaths
.
push
(
`PROXY '
${
obj
[
symProxy
]}
' via
${
path
}
`
);
}
for
(
const
key
in
obj
)
{
walk
(
obj
[
key
],
`
${
path
}
.
${
String
(
key
)}
`
,
seen
);
}
}
try
{
walk
(
vscode
,
'
vscode
'
,
new
Set
());
}
catch
(
err
)
{
assert
.
fail
(
err
);
}
assert
.
strictEqual
(
rpcPaths
.
length
,
0
,
rpcPaths
.
join
(
'
\n
'
));
assert
.
strictEqual
(
proxyPaths
.
length
,
0
,
proxyPaths
.
join
(
'
\n
'
));
// todo@jrieken
// this should be run after/before each test because some objects are short lived,
// like notebook-editor, documents etc.
test
(
'
no rpc
'
,
function
()
{
assertNoRpc
();
});
});
extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,6 +5,7 @@
import
{
window
,
Pseudoterminal
,
EventEmitter
,
TerminalDimensions
,
workspace
,
ConfigurationTarget
,
Disposable
,
UIKind
,
env
,
EnvironmentVariableMutatorType
,
EnvironmentVariableMutator
,
extensions
,
ExtensionContext
,
TerminalOptions
,
ExtensionTerminalOptions
}
from
'
vscode
'
;
import
{
doesNotThrow
,
equal
,
ok
,
deepEqual
,
throws
}
from
'
assert
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
// Disable terminal tests:
// - Web https://github.com/microsoft/vscode/issues/92826
...
...
@@ -30,6 +31,7 @@ import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert';
let
disposables
:
Disposable
[]
=
[];
teardown
(()
=>
{
assertNoRpc
();
disposables
.
forEach
(
d
=>
d
.
dispose
());
disposables
.
length
=
0
;
});
...
...
extensions/vscode-api-tests/src/singlefolder-tests/types.test.ts
浏览文件 @
46cf57b2
...
...
@@ -6,9 +6,12 @@
import
'
mocha
'
;
import
*
as
assert
from
'
assert
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode API - types
'
,
()
=>
{
teardown
(
assertNoRpc
);
test
(
'
static properties, es5 compat class
'
,
function
()
{
assert
.
ok
(
vscode
.
ThemeIcon
.
File
instanceof
vscode
.
ThemeIcon
);
assert
.
ok
(
vscode
.
ThemeIcon
.
Folder
instanceof
vscode
.
ThemeIcon
);
...
...
extensions/vscode-api-tests/src/singlefolder-tests/webview.test.ts
浏览文件 @
46cf57b2
...
...
@@ -7,7 +7,7 @@ import * as assert from 'assert';
import
'
mocha
'
;
import
*
as
os
from
'
os
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
closeAllEditors
,
delay
,
disposeAll
}
from
'
../utils
'
;
import
{
assertNoRpc
,
closeAllEditors
,
delay
,
disposeAll
}
from
'
../utils
'
;
const
webviewId
=
'
myWebview
'
;
...
...
@@ -26,8 +26,8 @@ suite.skip('vscode API - webview', () => {
}
teardown
(
async
()
=>
{
assertNoRpc
();
await
closeAllEditors
();
disposeAll
(
disposables
);
});
...
...
extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts
浏览文件 @
46cf57b2
...
...
@@ -6,12 +6,15 @@
import
*
as
assert
from
'
assert
'
;
import
{
workspace
,
window
,
commands
,
ViewColumn
,
TextEditorViewColumnChangeEvent
,
Uri
,
Selection
,
Position
,
CancellationTokenSource
,
TextEditorSelectionChangeKind
,
QuickPickItem
,
TextEditor
}
from
'
vscode
'
;
import
{
join
}
from
'
path
'
;
import
{
closeAllEditors
,
pathEquals
,
createRandomFile
}
from
'
../utils
'
;
import
{
closeAllEditors
,
pathEquals
,
createRandomFile
,
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode API - window
'
,
()
=>
{
teardown
(
closeAllEditors
);
teardown
(
async
function
()
{
assertNoRpc
();
await
closeAllEditors
();
});
test
(
'
editor, active text editor
'
,
async
()
=>
{
const
doc
=
await
workspace
.
openTextDocument
(
join
(
workspace
.
rootPath
||
''
,
'
./far.js
'
));
...
...
@@ -429,8 +432,8 @@ suite('vscode API - window', () => {
});
test
(
'
showQuickPick, select first two
'
,
async
function
()
{
const
label
=
'
showQuickPick, select first two
'
;
let
i
=
0
;
//
const label = 'showQuickPick, select first two';
//
let i = 0;
const
resolves
:
((
value
:
string
)
=>
void
)[]
=
[];
let
done
:
()
=>
void
;
const
unexpected
=
new
Promise
<
void
>
((
resolve
,
reject
)
=>
{
...
...
@@ -442,26 +445,26 @@ suite('vscode API - window', () => {
canPickMany
:
true
});
const
first
=
new
Promise
(
resolve
=>
resolves
.
push
(
resolve
));
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
100
));
// Allow UI to update.
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
await
commands
.
executeCommand
(
'
workbench.action.quickOpenSelectNext
'
);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
assert
.
equal
(
await
first
,
'
eins
'
);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
await
commands
.
executeCommand
(
'
workbench.action.quickPickManyToggle
'
);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
const
second
=
new
Promise
(
resolve
=>
resolves
.
push
(
resolve
));
await
commands
.
executeCommand
(
'
workbench.action.quickOpenSelectNext
'
);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
assert
.
equal
(
await
second
,
'
zwei
'
);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
await
commands
.
executeCommand
(
'
workbench.action.quickPickManyToggle
'
);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
await
commands
.
executeCommand
(
'
workbench.action.acceptSelectedQuickOpenItem
'
);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
assert
.
deepStrictEqual
(
await
picks
,
[
'
eins
'
,
'
zwei
'
]);
console
.
log
(
`
${
label
}
:
${
++
i
}
`
);
//
console.log(`${label}: ${++i}`);
done
!
();
return
unexpected
;
});
...
...
extensions/vscode-api-tests/src/singlefolder-tests/workspace.event.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,16 +5,15 @@
import
*
as
assert
from
'
assert
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
createRandomFile
,
withLogDisabled
}
from
'
../utils
'
;
import
{
assertNoRpc
,
createRandomFile
,
disposeAll
,
withLogDisabled
}
from
'
../utils
'
;
suite
(
'
vscode API - workspace events
'
,
()
=>
{
const
disposables
:
vscode
.
Disposable
[]
=
[];
teardown
(()
=>
{
for
(
const
dispo
of
disposables
)
{
dispo
.
dispose
();
}
assertNoRpc
();
disposeAll
(
disposables
);
disposables
.
length
=
0
;
});
...
...
extensions/vscode-api-tests/src/singlefolder-tests/workspace.fs.test.ts
浏览文件 @
46cf57b2
...
...
@@ -6,6 +6,7 @@
import
*
as
assert
from
'
assert
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
posix
}
from
'
path
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
suite
(
'
vscode API - workspace-fs
'
,
()
=>
{
...
...
@@ -15,6 +16,8 @@ suite('vscode API - workspace-fs', () => {
root
=
vscode
.
workspace
.
workspaceFolders
!
[
0
]
!
.
uri
;
});
teardown
(
assertNoRpc
);
test
(
'
fs.stat
'
,
async
function
()
{
const
stat
=
await
vscode
.
workspace
.
fs
.
stat
(
root
);
assert
.
equal
(
stat
.
type
,
vscode
.
FileType
.
Directory
);
...
...
extensions/vscode-api-tests/src/singlefolder-tests/workspace.tasks.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,6 +5,7 @@
import
*
as
assert
from
'
assert
'
;
import
{
window
,
tasks
,
Disposable
,
TaskDefinition
,
Task
,
EventEmitter
,
CustomExecution
,
Pseudoterminal
,
TaskScope
,
commands
,
env
,
UIKind
,
ShellExecution
,
TaskExecution
,
Terminal
,
Event
}
from
'
vscode
'
;
import
{
assertNoRpc
}
from
'
../utils
'
;
// Disable tasks tests:
// - Web https://github.com/microsoft/vscode/issues/90528
...
...
@@ -14,6 +15,7 @@ import { window, tasks, Disposable, TaskDefinition, Task, EventEmitter, CustomEx
let
disposables
:
Disposable
[]
=
[];
teardown
(()
=>
{
assertNoRpc
();
disposables
.
forEach
(
d
=>
d
.
dispose
());
disposables
.
length
=
0
;
});
...
...
extensions/vscode-api-tests/src/singlefolder-tests/workspace.test.ts
浏览文件 @
46cf57b2
...
...
@@ -5,14 +5,17 @@
import
*
as
assert
from
'
assert
'
;
import
*
as
vscode
from
'
vscode
'
;
import
{
createRandomFile
,
deleteFile
,
closeAllEditors
,
pathEquals
,
rndName
,
disposeAll
,
testFs
,
delay
,
withLogDisabled
,
revertAllDirty
}
from
'
../utils
'
;
import
{
createRandomFile
,
deleteFile
,
closeAllEditors
,
pathEquals
,
rndName
,
disposeAll
,
testFs
,
delay
,
withLogDisabled
,
revertAllDirty
,
assertNoRpc
}
from
'
../utils
'
;
import
{
join
,
posix
,
basename
}
from
'
path
'
;
import
*
as
fs
from
'
fs
'
;
import
{
TestFS
}
from
'
../memfs
'
;
suite
(
'
vscode API - workspace
'
,
()
=>
{
teardown
(
closeAllEditors
);
teardown
(
async
function
()
{
assertNoRpc
();
await
closeAllEditors
();
});
test
(
'
MarkdownString
'
,
function
()
{
let
md
=
new
vscode
.
MarkdownString
();
...
...
extensions/vscode-api-tests/src/utils.ts
浏览文件 @
46cf57b2
...
...
@@ -72,3 +72,44 @@ export function withLogDisabled(runnable: () => Promise<any>): () => Promise<voi
}
};
}
export
function
assertNoRpc
()
{
const
symProxy
=
Symbol
.
for
(
'
rpcProxy
'
);
const
symProtocol
=
Symbol
.
for
(
'
rpcProtocol
'
);
const
proxyPaths
:
string
[]
=
[];
const
rpcPaths
:
string
[]
=
[];
function
walk
(
obj
:
any
,
path
:
string
,
seen
:
Set
<
any
>
)
{
if
(
!
obj
)
{
return
;
}
if
(
typeof
obj
!==
'
object
'
&&
typeof
obj
!==
'
function
'
)
{
return
;
}
if
(
seen
.
has
(
obj
))
{
return
;
}
seen
.
add
(
obj
);
if
(
obj
[
symProtocol
])
{
rpcPaths
.
push
(
`PROTOCOL via
${
path
}
`
);
}
if
(
obj
[
symProxy
])
{
proxyPaths
.
push
(
`PROXY '
${
obj
[
symProxy
]}
' via
${
path
}
`
);
}
for
(
const
key
in
obj
)
{
walk
(
obj
[
key
],
`
${
path
}
.
${
String
(
key
)}
`
,
seen
);
}
}
try
{
walk
(
vscode
,
'
vscode
'
,
new
Set
());
}
catch
(
err
)
{
assert
.
fail
(
err
);
}
assert
.
strictEqual
(
rpcPaths
.
length
,
0
,
rpcPaths
.
join
(
'
\n
'
));
assert
.
strictEqual
(
proxyPaths
.
length
,
0
,
proxyPaths
.
join
(
'
\n
'
));
// happens...
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录