Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
2d01c15a
R
roslyn
项目概览
lwm1986
/
roslyn
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roslyn
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2d01c15a
编写于
7月 29, 2019
作者:
P
Petr Houska
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert removal of special handling of ArgService (reason #37295)
上级
d49329fb
变更
9
显示空白变更内容
内联
并排
Showing
9 changed file
with
33 addition
and
22 deletion
+33
-22
src/Features/CSharp/Portable/CodeRefactorings/CSharpRefactoringHelpersService.cs
...table/CodeRefactorings/CSharpRefactoringHelpersService.cs
+1
-1
src/Features/CSharp/Portable/NameTupleElement/CSharpNameTupleElementCodeRefactoringProvider.cs
...eElement/CSharpNameTupleElementCodeRefactoringProvider.cs
+1
-1
src/Features/CSharp/Portable/UseNamedArguments/CSharpUseNamedArgumentsCodeRefactoringProvider.cs
...guments/CSharpUseNamedArgumentsCodeRefactoringProvider.cs
+1
-1
src/Features/Core/Portable/CodeRefactorings/AbstractRefactoringHelpersService.cs
...ble/CodeRefactorings/AbstractRefactoringHelpersService.cs
+20
-5
src/Features/Core/Portable/NameTupleElement/AbstractNameTupleElementCodeRefactoringProvider.cs
...lement/AbstractNameTupleElementCodeRefactoringProvider.cs
+5
-7
src/Features/Core/Portable/UseNamedArguments/AbstractUseNamedArgumentsCodeRefactoringProvider.cs
...ments/AbstractUseNamedArgumentsCodeRefactoringProvider.cs
+2
-4
src/Features/VisualBasic/Portable/CodeRefactorings/VisualBasicRefactoringHelpersService.vb
.../CodeRefactorings/VisualBasicRefactoringHelpersService.vb
+1
-1
src/Features/VisualBasic/Portable/NameTupleElement/VisualBasicNameTupleElementCodeRefactoringProvider.vb
...ent/VisualBasicNameTupleElementCodeRefactoringProvider.vb
+1
-1
src/Features/VisualBasic/Portable/UseNamedArguments/VisualBasicUseNamedArgumentsCodeRefactoringProvider.vb
...ts/VisualBasicUseNamedArgumentsCodeRefactoringProvider.vb
+1
-1
未找到文件。
src/Features/CSharp/Portable/CodeRefactorings/CSharpRefactoringHelpersService.cs
浏览文件 @
2d01c15a
...
@@ -11,7 +11,7 @@
...
@@ -11,7 +11,7 @@
namespace
Microsoft.CodeAnalysis.CSharp.CodeRefactorings
namespace
Microsoft.CodeAnalysis.CSharp.CodeRefactorings
{
{
[
ExportLanguageService
(
typeof
(
IRefactoringHelpersService
),
LanguageNames
.
CSharp
),
Shared
]
[
ExportLanguageService
(
typeof
(
IRefactoringHelpersService
),
LanguageNames
.
CSharp
),
Shared
]
internal
class
CSharpRefactoringHelpersService
:
AbstractRefactoringHelpersService
<
ExpressionSyntax
>
internal
class
CSharpRefactoringHelpersService
:
AbstractRefactoringHelpersService
<
ExpressionSyntax
,
ArgumentSyntax
>
{
{
protected
override
IEnumerable
<
SyntaxNode
>
ExtractNodesSimple
(
SyntaxNode
node
,
ISyntaxFactsService
syntaxFacts
)
protected
override
IEnumerable
<
SyntaxNode
>
ExtractNodesSimple
(
SyntaxNode
node
,
ISyntaxFactsService
syntaxFacts
)
{
{
...
...
src/Features/CSharp/Portable/NameTupleElement/CSharpNameTupleElementCodeRefactoringProvider.cs
浏览文件 @
2d01c15a
...
@@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.CSharp.NameTupleElement
...
@@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.CSharp.NameTupleElement
{
{
[
ExtensionOrder
(
After
=
PredefinedCodeRefactoringProviderNames
.
IntroduceVariable
)]
[
ExtensionOrder
(
After
=
PredefinedCodeRefactoringProviderNames
.
IntroduceVariable
)]
[
ExportCodeRefactoringProvider
(
LanguageNames
.
CSharp
,
Name
=
nameof
(
CSharpNameTupleElementCodeRefactoringProvider
)),
Shared
]
[
ExportCodeRefactoringProvider
(
LanguageNames
.
CSharp
,
Name
=
nameof
(
CSharpNameTupleElementCodeRefactoringProvider
)),
Shared
]
internal
class
CSharpNameTupleElementCodeRefactoringProvider
:
AbstractNameTupleElementCodeRefactoringProvider
<
ArgumentSyntax
,
TupleExpressionSyntax
,
ExpressionSyntax
>
internal
class
CSharpNameTupleElementCodeRefactoringProvider
:
AbstractNameTupleElementCodeRefactoringProvider
<
ArgumentSyntax
,
TupleExpressionSyntax
>
{
{
[
ImportingConstructor
]
[
ImportingConstructor
]
public
CSharpNameTupleElementCodeRefactoringProvider
()
public
CSharpNameTupleElementCodeRefactoringProvider
()
...
...
src/Features/CSharp/Portable/UseNamedArguments/CSharpUseNamedArgumentsCodeRefactoringProvider.cs
浏览文件 @
2d01c15a
...
@@ -15,7 +15,7 @@ namespace Microsoft.CodeAnalysis.CSharp.UseNamedArguments
...
@@ -15,7 +15,7 @@ namespace Microsoft.CodeAnalysis.CSharp.UseNamedArguments
[
ExportCodeRefactoringProvider
(
LanguageNames
.
CSharp
,
Name
=
nameof
(
CSharpUseNamedArgumentsCodeRefactoringProvider
)),
Shared
]
[
ExportCodeRefactoringProvider
(
LanguageNames
.
CSharp
,
Name
=
nameof
(
CSharpUseNamedArgumentsCodeRefactoringProvider
)),
Shared
]
internal
class
CSharpUseNamedArgumentsCodeRefactoringProvider
:
AbstractUseNamedArgumentsCodeRefactoringProvider
internal
class
CSharpUseNamedArgumentsCodeRefactoringProvider
:
AbstractUseNamedArgumentsCodeRefactoringProvider
{
{
private
abstract
class
BaseAnalyzer
<
TSyntax
,
TSyntaxList
>
:
Analyzer
<
TSyntax
,
TSyntax
,
TSyntaxList
,
ExpressionSyntax
>
private
abstract
class
BaseAnalyzer
<
TSyntax
,
TSyntaxList
>
:
Analyzer
<
TSyntax
,
TSyntax
,
TSyntaxList
>
where
TSyntax
:
SyntaxNode
where
TSyntax
:
SyntaxNode
where
TSyntaxList
:
SyntaxNode
where
TSyntaxList
:
SyntaxNode
{
{
...
...
src/Features/Core/Portable/CodeRefactorings/AbstractRefactoringHelpersService.cs
浏览文件 @
2d01c15a
...
@@ -4,7 +4,6 @@
...
@@ -4,7 +4,6 @@
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Collections.Immutable
;
using
System.Collections.Immutable
;
using
System.Linq
;
using
System.Linq
;
using
System.Runtime.CompilerServices
;
using
System.Threading
;
using
System.Threading
;
using
System.Threading.Tasks
;
using
System.Threading.Tasks
;
using
Microsoft.CodeAnalysis.LanguageServices
;
using
Microsoft.CodeAnalysis.LanguageServices
;
...
@@ -14,8 +13,9 @@
...
@@ -14,8 +13,9 @@
namespace
Microsoft.CodeAnalysis.CodeRefactorings
namespace
Microsoft.CodeAnalysis.CodeRefactorings
{
{
internal
abstract
class
AbstractRefactoringHelpersService
<
TExpressionSyntax
>
:
IRefactoringHelpersService
internal
abstract
class
AbstractRefactoringHelpersService
<
TExpressionSyntax
,
TArgumentSyntax
>
:
IRefactoringHelpersService
where
TExpressionSyntax
:
SyntaxNode
where
TExpressionSyntax
:
SyntaxNode
where
TArgumentSyntax
:
SyntaxNode
{
{
public
async
Task
<
ImmutableArray
<
TSyntaxNode
>>
GetRelevantNodesAsync
<
TSyntaxNode
>(
public
async
Task
<
ImmutableArray
<
TSyntaxNode
>>
GetRelevantNodesAsync
<
TSyntaxNode
>(
Document
document
,
TextSpan
selectionRaw
,
Document
document
,
TextSpan
selectionRaw
,
...
@@ -105,9 +105,10 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I
...
@@ -105,9 +105,10 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I
AddNodesForTokenToLeft
(
syntaxFacts
,
relevantNodesBuilder
,
location
,
tokenToLeft
,
cancellationToken
);
AddNodesForTokenToLeft
(
syntaxFacts
,
relevantNodesBuilder
,
location
,
tokenToLeft
,
cancellationToken
);
// If the wanted node is an expression syntax -> traverse upwards even if location is deep within a SyntaxNode.
// If the wanted node is an expression syntax -> traverse upwards even if location is deep within a SyntaxNode.
if
(
typeof
(
TSyntaxNode
).
IsSubclassOf
(
typeof
(
TExpressionSyntax
))
||
typeof
(
TSyntaxNode
)
==
typeof
(
TExpressionSyntax
))
// We want to treat more types like expressions, e.g.: ArgumentSyntax should still trigger even if deep-in.
if
(
IsWantedTypeExpressionLike
<
TSyntaxNode
>())
{
{
await
AddNodesDeepIn
Expression
(
document
,
location
,
relevantNodesBuilder
,
cancellationToken
).
ConfigureAwait
(
false
);
await
AddNodesDeepIn
(
document
,
location
,
relevantNodesBuilder
,
cancellationToken
).
ConfigureAwait
(
false
);
}
}
}
}
...
@@ -119,6 +120,20 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I
...
@@ -119,6 +120,20 @@ internal abstract class AbstractRefactoringHelpersService<TExpressionSyntax> : I
}
}
}
}
private
static
bool
IsWantedTypeExpressionLike
<
TSyntaxNode
>()
where
TSyntaxNode
:
SyntaxNode
{
var
wantedType
=
typeof
(
TSyntaxNode
);
var
expressionType
=
typeof
(
TExpressionSyntax
);
var
argumentType
=
typeof
(
TArgumentSyntax
);
return
IsAEqualOrSubclassOfB
(
wantedType
,
expressionType
)
||
IsAEqualOrSubclassOfB
(
wantedType
,
argumentType
);
static
bool
IsAEqualOrSubclassOfB
(
Type
a
,
Type
b
)
{
return
a
.
IsSubclassOf
(
b
)
||
a
==
b
;
}
}
private
async
Task
<(
SyntaxToken
tokenToRightOrIn
,
SyntaxToken
tokenToLeft
,
int
location
)>
GetTokensToRightOrInToLeftAndUpdatedLocation
(
private
async
Task
<(
SyntaxToken
tokenToRightOrIn
,
SyntaxToken
tokenToLeft
,
int
location
)>
GetTokensToRightOrInToLeftAndUpdatedLocation
(
Document
document
,
Document
document
,
SyntaxNode
root
,
SyntaxNode
root
,
...
@@ -404,7 +419,7 @@ protected virtual IEnumerable<SyntaxNode> ExtractNodesInHeader(SyntaxNode root,
...
@@ -404,7 +419,7 @@ protected virtual IEnumerable<SyntaxNode> ExtractNodesInHeader(SyntaxNode root,
}
}
}
}
protected
virtual
async
Task
AddNodesDeepIn
Expression
<
TSyntaxNode
>(
protected
virtual
async
Task
AddNodesDeepIn
<
TSyntaxNode
>(
Document
document
,
int
position
,
Document
document
,
int
position
,
ArrayBuilder
<
TSyntaxNode
>
relevantNodesBuilder
,
ArrayBuilder
<
TSyntaxNode
>
relevantNodesBuilder
,
CancellationToken
cancellationToken
)
where
TSyntaxNode
:
SyntaxNode
CancellationToken
cancellationToken
)
where
TSyntaxNode
:
SyntaxNode
...
...
src/Features/Core/Portable/NameTupleElement/AbstractNameTupleElementCodeRefactoringProvider.cs
浏览文件 @
2d01c15a
...
@@ -12,10 +12,9 @@
...
@@ -12,10 +12,9 @@
namespace
Microsoft.CodeAnalysis.NameTupleElement
namespace
Microsoft.CodeAnalysis.NameTupleElement
{
{
abstract
class
AbstractNameTupleElementCodeRefactoringProvider
<
TArgumentSyntax
,
TTupleExpressionSyntax
,
TExpresionSyntax
>
:
CodeRefactoringProvider
abstract
class
AbstractNameTupleElementCodeRefactoringProvider
<
TArgumentSyntax
,
TTupleExpressionSyntax
>
:
CodeRefactoringProvider
where
TArgumentSyntax
:
SyntaxNode
where
TArgumentSyntax
:
SyntaxNode
where
TExpresionSyntax
:
SyntaxNode
where
TTupleExpressionSyntax
:
SyntaxNode
where
TTupleExpressionSyntax
:
TExpresionSyntax
{
{
protected
abstract
bool
IsCloseParenOrComma
(
SyntaxToken
token
);
protected
abstract
bool
IsCloseParenOrComma
(
SyntaxToken
token
);
protected
abstract
TArgumentSyntax
WithName
(
TArgumentSyntax
argument
,
string
argumentName
);
protected
abstract
TArgumentSyntax
WithName
(
TArgumentSyntax
argument
,
string
argumentName
);
...
@@ -45,9 +44,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
...
@@ -45,9 +44,8 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
}
}
var
syntaxFacts
=
document
.
GetLanguageService
<
ISyntaxFactsService
>();
var
syntaxFacts
=
document
.
GetLanguageService
<
ISyntaxFactsService
>();
var
expressions
=
await
document
.
TryGetRelevantNodesAsync
<
TExpresionSyntax
>(
span
,
cancellationToken
).
ConfigureAwait
(
false
);
var
potentialArguments
=
await
document
.
TryGetRelevantNodesAsync
<
TArgumentSyntax
>(
span
,
cancellationToken
).
ConfigureAwait
(
false
);
var
argument
=
expressions
.
FirstOrDefault
(
var
argument
=
potentialArguments
.
FirstOrDefault
(
n
=>
n
?.
Parent
is
TTupleExpressionSyntax
);
n
=>
n
.
Parent
is
TArgumentSyntax
&&
n
.
Parent
.
Parent
is
TTupleExpressionSyntax
)?.
Parent
as
TArgumentSyntax
;
if
(
argument
==
null
||
!
syntaxFacts
.
IsSimpleArgument
(
argument
))
if
(
argument
==
null
||
!
syntaxFacts
.
IsSimpleArgument
(
argument
))
{
{
return
default
;
return
default
;
...
@@ -63,7 +61,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
...
@@ -63,7 +61,7 @@ public override async Task ComputeRefactoringsAsync(CodeRefactoringContext conte
}
}
syntaxFacts
.
GetPartsOfTupleExpression
<
TArgumentSyntax
>(
tuple
,
out
_
,
out
var
arguments
,
out
_
);
syntaxFacts
.
GetPartsOfTupleExpression
<
TArgumentSyntax
>(
tuple
,
out
_
,
out
var
arguments
,
out
_
);
var
argumentIndex
=
a
rguments
.
IndexOf
(
argument
);
var
argumentIndex
=
potentialA
rguments
.
IndexOf
(
argument
);
var
elements
=
tupleType
.
TupleElements
;
var
elements
=
tupleType
.
TupleElements
;
if
(
elements
.
IsDefaultOrEmpty
||
argumentIndex
>=
elements
.
Length
)
if
(
elements
.
IsDefaultOrEmpty
||
argumentIndex
>=
elements
.
Length
)
{
{
...
...
src/Features/Core/Portable/UseNamedArguments/AbstractUseNamedArgumentsCodeRefactoringProvider.cs
浏览文件 @
2d01c15a
...
@@ -20,19 +20,17 @@ protected interface IAnalyzer
...
@@ -20,19 +20,17 @@ protected interface IAnalyzer
Task
ComputeRefactoringsAsync
(
CodeRefactoringContext
context
,
SyntaxNode
root
);
Task
ComputeRefactoringsAsync
(
CodeRefactoringContext
context
,
SyntaxNode
root
);
}
}
protected
abstract
class
Analyzer
<
TBaseArgumentSyntax
,
TSimpleArgumentSyntax
,
TArgumentListSyntax
,
TExpressionSyntax
>
:
IAnalyzer
protected
abstract
class
Analyzer
<
TBaseArgumentSyntax
,
TSimpleArgumentSyntax
,
TArgumentListSyntax
>
:
IAnalyzer
where
TBaseArgumentSyntax
:
SyntaxNode
where
TBaseArgumentSyntax
:
SyntaxNode
where
TSimpleArgumentSyntax
:
TBaseArgumentSyntax
where
TSimpleArgumentSyntax
:
TBaseArgumentSyntax
where
TArgumentListSyntax
:
SyntaxNode
where
TArgumentListSyntax
:
SyntaxNode
where
TExpressionSyntax
:
SyntaxNode
{
{
public
async
Task
ComputeRefactoringsAsync
(
public
async
Task
ComputeRefactoringsAsync
(
CodeRefactoringContext
context
,
SyntaxNode
root
)
CodeRefactoringContext
context
,
SyntaxNode
root
)
{
{
var
(
document
,
textSpan
,
cancellationToken
)
=
context
;
var
(
document
,
textSpan
,
cancellationToken
)
=
context
;
var
expressions
=
await
context
.
TryGetSelectedNodesAsync
<
TExpressionSyntax
>().
ConfigureAwait
(
false
);
var
argument
=
await
context
.
TryGetSelectedNodeAsync
<
TBaseArgumentSyntax
>().
ConfigureAwait
(
false
)
as
TSimpleArgumentSyntax
;
var
argument
=
expressions
.
FirstOrDefault
(
n
=>
n
.
Parent
is
TSimpleArgumentSyntax
)?.
Parent
as
TSimpleArgumentSyntax
;
if
(
argument
==
null
)
if
(
argument
==
null
)
{
{
return
;
return
;
...
...
src/Features/VisualBasic/Portable/CodeRefactorings/VisualBasicRefactoringHelpersService.vb
浏览文件 @
2d01c15a
...
@@ -9,7 +9,7 @@ Imports Microsoft.CodeAnalysis.LanguageServices
...
@@ -9,7 +9,7 @@ Imports Microsoft.CodeAnalysis.LanguageServices
Namespace
Microsoft.CodeAnalysis.VisualBasic.CodeRefactorings
Namespace
Microsoft.CodeAnalysis.VisualBasic.CodeRefactorings
<
ExportLanguageService
(
GetType
(
IRefactoringHelpersService
),
LanguageNames
.
VisualBasic
),
[
Shared
]
>
<
ExportLanguageService
(
GetType
(
IRefactoringHelpersService
),
LanguageNames
.
VisualBasic
),
[
Shared
]
>
Friend
Class
VisualBasicRefactoringHelpersService
Friend
Class
VisualBasicRefactoringHelpersService
Inherits
AbstractRefactoringHelpersService
(
Of
ExpressionSyntax
)
Inherits
AbstractRefactoringHelpersService
(
Of
ExpressionSyntax
,
ArgumentSyntax
)
Protected
Overrides
Iterator
Function
ExtractNodesSimple
(
node
As
SyntaxNode
,
syntaxFacts
As
ISyntaxFactsService
)
As
IEnumerable
(
Of
SyntaxNode
)
Protected
Overrides
Iterator
Function
ExtractNodesSimple
(
node
As
SyntaxNode
,
syntaxFacts
As
ISyntaxFactsService
)
As
IEnumerable
(
Of
SyntaxNode
)
For
Each
baseExtraction
In
MyBase
.
ExtractNodesSimple
(
node
,
syntaxFacts
)
For
Each
baseExtraction
In
MyBase
.
ExtractNodesSimple
(
node
,
syntaxFacts
)
...
...
src/Features/VisualBasic/Portable/NameTupleElement/VisualBasicNameTupleElementCodeRefactoringProvider.vb
浏览文件 @
2d01c15a
...
@@ -9,7 +9,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.NameTupleElement
...
@@ -9,7 +9,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.NameTupleElement
<
ExtensionOrder
(
After
:
=
PredefinedCodeRefactoringProviderNames
.
IntroduceVariable
)
>
<
ExtensionOrder
(
After
:
=
PredefinedCodeRefactoringProviderNames
.
IntroduceVariable
)
>
<
ExportCodeRefactoringProvider
(
LanguageNames
.
VisualBasic
,
Name
:
=
NameOf
(
VisualBasicNameTupleElementCodeRefactoringProvider
)),
[
Shared
]
>
<
ExportCodeRefactoringProvider
(
LanguageNames
.
VisualBasic
,
Name
:
=
NameOf
(
VisualBasicNameTupleElementCodeRefactoringProvider
)),
[
Shared
]
>
Friend
Class
VisualBasicNameTupleElementCodeRefactoringProvider
Friend
Class
VisualBasicNameTupleElementCodeRefactoringProvider
Inherits
AbstractNameTupleElementCodeRefactoringProvider
(
Of
SimpleArgumentSyntax
,
TupleExpressionSyntax
,
ExpressionSyntax
)
Inherits
AbstractNameTupleElementCodeRefactoringProvider
(
Of
SimpleArgumentSyntax
,
TupleExpressionSyntax
)
<
ImportingConstructor
>
<
ImportingConstructor
>
Public
Sub
New
()
Public
Sub
New
()
...
...
src/Features/VisualBasic/Portable/UseNamedArguments/VisualBasicUseNamedArgumentsCodeRefactoringProvider.vb
浏览文件 @
2d01c15a
...
@@ -14,7 +14,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseNamedArguments
...
@@ -14,7 +14,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseNamedArguments
Inherits
AbstractUseNamedArgumentsCodeRefactoringProvider
Inherits
AbstractUseNamedArgumentsCodeRefactoringProvider
Private
Class
ArgumentAnalyzer
Private
Class
ArgumentAnalyzer
Inherits
Analyzer
(
Of
ArgumentSyntax
,
SimpleArgumentSyntax
,
ArgumentListSyntax
,
ExpressionSyntax
)
Inherits
Analyzer
(
Of
ArgumentSyntax
,
SimpleArgumentSyntax
,
ArgumentListSyntax
)
Protected
Overrides
Function
IsPositionalArgument
(
argument
As
SimpleArgumentSyntax
)
As
Boolean
Protected
Overrides
Function
IsPositionalArgument
(
argument
As
SimpleArgumentSyntax
)
As
Boolean
Return
argument
.
NameColonEquals
Is
Nothing
Return
argument
.
NameColonEquals
Is
Nothing
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录