Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
e7e481cc
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
e7e481cc
编写于
12月 16, 2020
作者:
M
msftbot[bot]
提交者:
GitHub
12月 16, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #49887 from ryzngard/issue/import_on_paste_setting
Add experimentation to "Usings on Paste"
上级
364db4b3
38f20f3c
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
177 addition
and
15 deletion
+177
-15
src/EditorFeatures/Core/Implementation/AddImports/AbstractAddImportsPasteCommandHandler.cs
...ation/AddImports/AbstractAddImportsPasteCommandHandler.cs
+14
-1
src/EditorFeatures/Core/Shared/Extensions/ITextBufferExtensions.cs
...rFeatures/Core/Shared/Extensions/ITextBufferExtensions.cs
+20
-0
src/EditorFeatures/Core/Shared/Options/FeatureOnOffOptions.cs
...EditorFeatures/Core/Shared/Options/FeatureOnOffOptions.cs
+3
-2
src/VisualStudio/CSharp/Impl/Options/AdvancedOptionPage.cs
src/VisualStudio/CSharp/Impl/Options/AdvancedOptionPage.cs
+3
-1
src/VisualStudio/CSharp/Impl/Options/AdvancedOptionPageControl.xaml.cs
...dio/CSharp/Impl/Options/AdvancedOptionPageControl.xaml.cs
+9
-2
src/VisualStudio/Core/Impl/Options/AbstractOptionPageControl.cs
...sualStudio/Core/Impl/Options/AbstractOptionPageControl.cs
+29
-0
src/VisualStudio/Core/Impl/Options/Converters/NullableBoolOptionConverter.cs
...re/Impl/Options/Converters/NullableBoolOptionConverter.cs
+41
-0
src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpAddMissingUsingsOnPaste.cs
.../IntegrationTests/CSharp/CSharpAddMissingUsingsOnPaste.cs
+43
-5
src/VisualStudio/VisualBasic/Impl/Options/AdvancedOptionPage.vb
...sualStudio/VisualBasic/Impl/Options/AdvancedOptionPage.vb
+3
-2
src/VisualStudio/VisualBasic/Impl/Options/AdvancedOptionPageControl.xaml.vb
...isualBasic/Impl/Options/AdvancedOptionPageControl.xaml.vb
+11
-2
src/Workspaces/Core/Portable/Experiments/IExperimentationService.cs
...aces/Core/Portable/Experiments/IExperimentationService.cs
+1
-0
未找到文件。
src/EditorFeatures/Core/Implementation/AddImports/AbstractAddImportsPasteCommandHandler.cs
浏览文件 @
e7e481cc
...
...
@@ -8,6 +8,7 @@
using
Microsoft.CodeAnalysis.Editor.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Editor.Shared.Options
;
using
Microsoft.CodeAnalysis.Editor.Shared.Utilities
;
using
Microsoft.CodeAnalysis.Experiments
;
using
Microsoft.CodeAnalysis.Internal.Log
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Text
;
...
...
@@ -40,7 +41,10 @@ public CommandState GetCommandState(PasteCommandArgs args, Func<CommandState> ne
public
void
ExecuteCommand
(
PasteCommandArgs
args
,
Action
nextCommandHandler
,
CommandExecutionContext
executionContext
)
{
// Check that the feature is enabled before doing any work
if
(!
args
.
SubjectBuffer
.
GetFeatureOnOffOption
(
FeatureOnOffOptions
.
AddImportsOnPaste
))
var
optionValue
=
args
.
SubjectBuffer
.
GetOptionalFeatureOnOffOption
(
FeatureOnOffOptions
.
AddImportsOnPaste
);
// If the feature is explicitly disabled we can exit early
if
(
optionValue
.
HasValue
&&
!
optionValue
.
Value
)
{
nextCommandHandler
();
return
;
...
...
@@ -87,6 +91,15 @@ public void ExecuteCommand(PasteCommandArgs args, Action nextCommandHandler, Com
return
;
}
var
experimentationService
=
document
.
Project
.
Solution
.
Workspace
.
Services
.
GetRequiredService
<
IExperimentationService
>();
var
enabled
=
optionValue
.
HasValue
&&
optionValue
.
Value
||
experimentationService
.
IsExperimentEnabled
(
WellKnownExperimentNames
.
ImportsOnPasteDefaultEnabled
);
if
(!
enabled
)
{
return
;
}
using
var
_
=
executionContext
.
OperationContext
.
AddScope
(
allowCancellation
:
true
,
DialogText
);
var
cancellationToken
=
executionContext
.
OperationContext
.
UserCancellationToken
;
...
...
src/EditorFeatures/Core/Shared/Extensions/ITextBufferExtensions.cs
浏览文件 @
e7e481cc
...
...
@@ -48,6 +48,26 @@ internal static bool GetFeatureOnOffOption(this ITextBuffer buffer, PerLanguageO
}
}
internal
static
bool
?
GetOptionalFeatureOnOffOption
(
this
ITextBuffer
buffer
,
PerLanguageOption2
<
bool
?>
option
)
{
// Add a FailFast to help diagnose 984249. Hopefully this will let us know what the issue is.
try
{
var
document
=
buffer
.
CurrentSnapshot
.
GetOpenDocumentInCurrentContextWithChanges
();
if
(
document
!=
null
)
{
return
document
.
Project
.
Solution
.
Options
.
GetOption
(
option
,
document
.
Project
.
Language
);
}
return
option
.
DefaultValue
;
}
catch
(
Exception
e
)
when
(
FatalError
.
ReportAndPropagate
(
e
))
{
throw
ExceptionUtilities
.
Unreachable
;
}
}
internal
static
bool
IsInLspEditorContext
(
this
ITextBuffer
buffer
)
{
if
(
buffer
.
TryGetWorkspace
(
out
var
workspace
))
...
...
src/EditorFeatures/Core/Shared/Options/FeatureOnOffOptions.cs
浏览文件 @
e7e481cc
...
...
@@ -80,8 +80,9 @@ internal static class FeatureOnOffOptions
nameof
(
FeatureOnOffOptions
),
nameof
(
UseEnhancedColors
),
defaultValue
:
1
,
storageLocations
:
new
RoamingProfileStorageLocation
(
"WindowManagement.Options.UseEnhancedColorsForManagedLanguages"
));
public
static
readonly
PerLanguageOption2
<
bool
>
AddImportsOnPaste
=
new
(
nameof
(
FeatureOnOffOptions
),
nameof
(
AddImportsOnPaste
),
defaultValue
:
false
);
public
static
readonly
PerLanguageOption2
<
bool
?>
AddImportsOnPaste
=
new
(
nameof
(
FeatureOnOffOptions
),
nameof
(
AddImportsOnPaste
),
defaultValue
:
null
,
storageLocations
:
new
RoamingProfileStorageLocation
(
$"TextEditor.%LANGUAGE%.Specific.
{
nameof
(
AddImportsOnPaste
)}
"
));
}
[
ExportOptionProvider
,
Shared
]
...
...
src/VisualStudio/CSharp/Impl/Options/AdvancedOptionPage.cs
浏览文件 @
e7e481cc
...
...
@@ -6,6 +6,7 @@
using
System
;
using
System.Runtime.InteropServices
;
using
Microsoft.CodeAnalysis.Experiments
;
using
Microsoft.VisualStudio.ComponentModelHost
;
using
Microsoft.VisualStudio.LanguageServices.Implementation.Options
;
...
...
@@ -17,7 +18,8 @@ internal class AdvancedOptionPage : AbstractOptionPage
protected
override
AbstractOptionPageControl
CreateOptionPage
(
IServiceProvider
serviceProvider
,
OptionStore
optionStore
)
{
var
componentModel
=
(
IComponentModel
)
this
.
Site
.
GetService
(
typeof
(
SComponentModel
));
return
new
AdvancedOptionPageControl
(
optionStore
,
componentModel
);
var
workspace
=
componentModel
.
GetService
<
VisualStudioWorkspace
>();
return
new
AdvancedOptionPageControl
(
optionStore
,
componentModel
,
workspace
.
Services
.
GetService
<
IExperimentationService
>());
}
}
}
src/VisualStudio/CSharp/Impl/Options/AdvancedOptionPageControl.xaml.cs
浏览文件 @
e7e481cc
...
...
@@ -13,6 +13,7 @@
using
Microsoft.CodeAnalysis.Editor.Options
;
using
Microsoft.CodeAnalysis.Editor.Shared.Options
;
using
Microsoft.CodeAnalysis.EmbeddedLanguages.RegularExpressions
;
using
Microsoft.CodeAnalysis.Experiments
;
using
Microsoft.CodeAnalysis.ExtractMethod
;
using
Microsoft.CodeAnalysis.Fading
;
using
Microsoft.CodeAnalysis.ImplementType
;
...
...
@@ -33,7 +34,7 @@ internal partial class AdvancedOptionPageControl : AbstractOptionPageControl
{
private
readonly
ColorSchemeApplier
_colorSchemeApplier
;
public
AdvancedOptionPageControl
(
OptionStore
optionStore
,
IComponentModel
componentModel
)
:
base
(
optionStore
)
public
AdvancedOptionPageControl
(
OptionStore
optionStore
,
IComponentModel
componentModel
,
IExperimentationService
experimentationService
)
:
base
(
optionStore
)
{
_colorSchemeApplier
=
componentModel
.
GetService
<
ColorSchemeApplier
>();
...
...
@@ -49,7 +50,13 @@ public AdvancedOptionPageControl(OptionStore optionStore, IComponentModel compon
BindToOption
(
SeparateImportGroups
,
GenerationOptions
.
SeparateImportDirectiveGroups
,
LanguageNames
.
CSharp
);
BindToOption
(
SuggestForTypesInReferenceAssemblies
,
SymbolSearchOptions
.
SuggestForTypesInReferenceAssemblies
,
LanguageNames
.
CSharp
);
BindToOption
(
SuggestForTypesInNuGetPackages
,
SymbolSearchOptions
.
SuggestForTypesInNuGetPackages
,
LanguageNames
.
CSharp
);
BindToOption
(
AddUsingsOnPaste
,
FeatureOnOffOptions
.
AddImportsOnPaste
,
LanguageNames
.
CSharp
);
BindToOption
(
AddUsingsOnPaste
,
FeatureOnOffOptions
.
AddImportsOnPaste
,
LanguageNames
.
CSharp
,
()
=>
{
// If the option has not been set by the user, check if the option to enable imports on paste
// is enabled from experimentation. If so, default to that. Otherwise default to disabled
return
experimentationService
?.
IsExperimentEnabled
(
WellKnownExperimentNames
.
ImportsOnPasteDefaultEnabled
)
??
false
;
});
BindToOption
(
Split_string_literals_on_enter
,
SplitStringLiteralOptions
.
Enabled
,
LanguageNames
.
CSharp
);
BindToOption
(
EnterOutliningMode
,
FeatureOnOffOptions
.
Outlining
,
LanguageNames
.
CSharp
);
...
...
src/VisualStudio/Core/Impl/Options/AbstractOptionPageControl.cs
浏览文件 @
e7e481cc
...
...
@@ -13,6 +13,7 @@
using
System.Windows.Controls
;
using
System.Windows.Data
;
using
Microsoft.CodeAnalysis.Options
;
using
Microsoft.VisualStudio.LanguageServices.Implementation.Options.Converters
;
namespace
Microsoft.VisualStudio.LanguageServices.Implementation.Options
{
...
...
@@ -76,6 +77,20 @@ private protected void BindToOption(CheckBox checkbox, Option2<bool> optionKey)
_bindingExpressions
.
Add
(
bindingExpression
);
}
private
protected
void
BindToOption
(
CheckBox
checkbox
,
Option2
<
bool
?>
nullableOptionKey
,
Func
<
bool
>
onNullValue
)
{
var
binding
=
new
Binding
()
{
Source
=
new
OptionBinding
<
bool
?>(
OptionStore
,
nullableOptionKey
),
Path
=
new
PropertyPath
(
"Value"
),
UpdateSourceTrigger
=
UpdateSourceTrigger
.
Default
,
Converter
=
new
NullableBoolOptionConverter
(
onNullValue
)
};
var
bindingExpression
=
checkbox
.
SetBinding
(
CheckBox
.
IsCheckedProperty
,
binding
);
_bindingExpressions
.
Add
(
bindingExpression
);
}
private
protected
void
BindToOption
(
CheckBox
checkbox
,
PerLanguageOption2
<
bool
>
optionKey
,
string
languageName
)
{
var
binding
=
new
Binding
()
...
...
@@ -89,6 +104,20 @@ private protected void BindToOption(CheckBox checkbox, PerLanguageOption2<bool>
_bindingExpressions
.
Add
(
bindingExpression
);
}
private
protected
void
BindToOption
(
CheckBox
checkbox
,
PerLanguageOption2
<
bool
?>
nullableOptionKey
,
string
languageName
,
Func
<
bool
>
onNullValue
)
{
var
binding
=
new
Binding
()
{
Source
=
new
PerLanguageOptionBinding
<
bool
?>(
OptionStore
,
nullableOptionKey
,
languageName
),
Path
=
new
PropertyPath
(
"Value"
),
UpdateSourceTrigger
=
UpdateSourceTrigger
.
Default
,
Converter
=
new
NullableBoolOptionConverter
(
onNullValue
)
};
var
bindingExpression
=
checkbox
.
SetBinding
(
CheckBox
.
IsCheckedProperty
,
binding
);
_bindingExpressions
.
Add
(
bindingExpression
);
}
private
protected
void
BindToOption
(
TextBox
textBox
,
Option2
<
int
>
optionKey
)
{
var
binding
=
new
Binding
()
...
...
src/VisualStudio/Core/Impl/Options/Converters/NullableBoolOptionConverter.cs
0 → 100644
浏览文件 @
e7e481cc
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using
System
;
using
System.Collections.Generic
;
using
System.Globalization
;
using
System.Linq
;
using
System.Text
;
using
System.Threading.Tasks
;
using
System.Windows.Data
;
namespace
Microsoft.VisualStudio.LanguageServices.Implementation.Options.Converters
{
internal
class
NullableBoolOptionConverter
:
IValueConverter
{
private
readonly
Func
<
bool
>
_onNullValue
;
public
NullableBoolOptionConverter
(
Func
<
bool
>
onNullValue
)
{
_onNullValue
=
onNullValue
;
}
public
object
?
Convert
(
object
value
,
Type
targetType
,
object
parameter
,
CultureInfo
culture
)
{
if
(
value
is
not
null
or
bool
)
{
return
null
;
}
if
(
value
is
null
)
{
return
_onNullValue
();
}
return
(
bool
)
value
;
}
public
object
ConvertBack
(
object
value
,
Type
targetType
,
object
parameter
,
CultureInfo
culture
)
=>
value
;
}
}
src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpAddMissingUsingsOnPaste.cs
浏览文件 @
e7e481cc
...
...
@@ -23,11 +23,11 @@ public CSharpAddMissingUsingsOnPaste(VisualStudioInstanceFactory instanceFactory
protected
override
string
LanguageName
=>
LanguageNames
.
CSharp
;
[
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
AddMissingImports
)]
public
void
Verify
MissingByDefault
()
public
void
Verify
Disabled
()
{
var
project
=
new
Microsoft
.
VisualStudio
.
IntegrationTest
.
Utilities
.
Common
.
ProjectUtils
.
Project
(
ProjectName
);
VisualStudio
.
SolutionExplorer
.
AddFile
(
project
,
"
Foo
.cs"
,
contents
:
@"
public class
Foo
VisualStudio
.
SolutionExplorer
.
AddFile
(
project
,
"
Example
.cs"
,
contents
:
@"
public class
Example
{
}
"
);
...
...
@@ -42,6 +42,44 @@ static void Main(string[] args)
$$
}"
);
VisualStudio
.
Workspace
.
SetFeatureOption
(
FeatureOnOffOptions
.
AddImportsOnPaste
.
Feature
,
FeatureOnOffOptions
.
AddImportsOnPaste
.
Name
,
LanguageNames
.
CSharp
,
"False"
);
VisualStudio
.
Editor
.
Paste
(
@"Task DoThingAsync() => Task.CompletedTask;"
);
VisualStudio
.
Editor
.
Verify
.
TextContains
(
@"
using System;
class Program
{
static void Main(string[] args)
{
}
Task DoThingAsync() => Task.CompletedTask;
}"
);
}
[
WpfFact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
AddMissingImports
)]
public
void
VerifyDisabledWithNull
()
{
var
project
=
new
Microsoft
.
VisualStudio
.
IntegrationTest
.
Utilities
.
Common
.
ProjectUtils
.
Project
(
ProjectName
);
VisualStudio
.
SolutionExplorer
.
AddFile
(
project
,
"Example.cs"
,
contents
:
@"
public class Example
{
}
"
);
SetUpEditor
(
@"
using System;
class Program
{
static void Main(string[] args)
{
}
$$
}"
);
VisualStudio
.
Workspace
.
SetFeatureOption
(
FeatureOnOffOptions
.
AddImportsOnPaste
.
Feature
,
FeatureOnOffOptions
.
AddImportsOnPaste
.
Name
,
LanguageNames
.
CSharp
,
valueString
:
null
);
VisualStudio
.
Editor
.
Paste
(
@"Task DoThingAsync() => Task.CompletedTask;"
);
...
...
@@ -62,8 +100,8 @@ static void Main(string[] args)
public
void
VerifyAddImportsOnPaste
()
{
var
project
=
new
Microsoft
.
VisualStudio
.
IntegrationTest
.
Utilities
.
Common
.
ProjectUtils
.
Project
(
ProjectName
);
VisualStudio
.
SolutionExplorer
.
AddFile
(
project
,
"
Foo
.cs"
,
contents
:
@"
public class
Foo
VisualStudio
.
SolutionExplorer
.
AddFile
(
project
,
"
Example
.cs"
,
contents
:
@"
public class
Example
{
}
"
);
...
...
src/VisualStudio/VisualBasic/Impl/Options/AdvancedOptionPage.vb
浏览文件 @
e7e481cc
...
...
@@ -3,6 +3,7 @@
' See the LICENSE file in the project root for more information.
Imports
System.Runtime.InteropServices
Imports
Microsoft.CodeAnalysis.Experiments
Imports
Microsoft.VisualStudio.ComponentModelHost
Imports
Microsoft.VisualStudio.LanguageServices.Implementation.Options
...
...
@@ -13,8 +14,8 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Protected
Overrides
Function
CreateOptionPage
(
serviceProvider
As
IServiceProvider
,
optionStore
As
OptionStore
)
As
AbstractOptionPageControl
Dim
componentModel
=
DirectCast
(
Me
.
Site
.
GetService
(
GetType
(
SComponentModel
)),
IComponentModel
)
Return
New
AdvancedOptionPageControl
(
optionStore
,
componentModel
)
Dim
workspace
=
componentModel
.
GetService
(
Of
VisualStudioWorkspace
)()
Return
New
AdvancedOptionPageControl
(
optionStore
,
componentModel
,
workspace
.
Services
.
GetService
(
Of
IExperimentationService
)()
)
End
Function
End
Class
End
Namespace
src/VisualStudio/VisualBasic/Impl/Options/AdvancedOptionPageControl.xaml.vb
浏览文件 @
e7e481cc
...
...
@@ -10,6 +10,7 @@ Imports Microsoft.CodeAnalysis.Editor.Implementation.SplitComment
Imports
Microsoft.CodeAnalysis.Editor.Options
Imports
Microsoft.CodeAnalysis.Editor.Shared.Options
Imports
Microsoft.CodeAnalysis.EmbeddedLanguages.RegularExpressions
Imports
Microsoft.CodeAnalysis.Experiments
Imports
Microsoft.CodeAnalysis.ExtractMethod
Imports
Microsoft.CodeAnalysis.Fading
Imports
Microsoft.CodeAnalysis.ImplementType
...
...
@@ -29,7 +30,7 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
Friend
Class
AdvancedOptionPageControl
Private
ReadOnly
_colorSchemeApplier
As
ColorSchemeApplier
Public
Sub
New
(
optionStore
As
OptionStore
,
componentModel
As
IComponentModel
)
Public
Sub
New
(
optionStore
As
OptionStore
,
componentModel
As
IComponentModel
,
experimentationService
As
IExperimentationService
)
MyBase
.
New
(
optionStore
)
_colorSchemeApplier
=
componentModel
.
GetService
(
Of
ColorSchemeApplier
)()
...
...
@@ -45,7 +46,15 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Options
BindToOption
(
SeparateImportGroups
,
GenerationOptions
.
SeparateImportDirectiveGroups
,
LanguageNames
.
VisualBasic
)
BindToOption
(
SuggestForTypesInReferenceAssemblies
,
SymbolSearchOptions
.
SuggestForTypesInReferenceAssemblies
,
LanguageNames
.
VisualBasic
)
BindToOption
(
SuggestForTypesInNuGetPackages
,
SymbolSearchOptions
.
SuggestForTypesInNuGetPackages
,
LanguageNames
.
VisualBasic
)
BindToOption
(
AddMissingImportsOnPaste
,
FeatureOnOffOptions
.
AddImportsOnPaste
,
LanguageNames
.
VisualBasic
)
BindToOption
(
AddMissingImportsOnPaste
,
FeatureOnOffOptions
.
AddImportsOnPaste
,
LanguageNames
.
VisualBasic
,
Function
()
' If the option has Not been set by the user, check if the option to enable imports on paste
' Is enabled from experimentation. If so, default to that. Otherwise default to disabled
If
experimentationService
Is
Nothing
Then
Return
False
End
If
Return
experimentationService
.
IsExperimentEnabled
(
WellKnownExperimentNames
.
ImportsOnPasteDefaultEnabled
)
End
Function
)
BindToOption
(
EnableOutlining
,
FeatureOnOffOptions
.
Outlining
,
LanguageNames
.
VisualBasic
)
BindToOption
(
Show_outlining_for_declaration_level_constructs
,
BlockStructureOptions
.
ShowOutliningForDeclarationLevelConstructs
,
LanguageNames
.
VisualBasic
)
...
...
src/Workspaces/Core/Portable/Experiments/IExperimentationService.cs
浏览文件 @
e7e481cc
...
...
@@ -33,5 +33,6 @@ internal static class WellKnownExperimentNames
public
const
string
TargetTypedCompletionFilter
=
"Roslyn.TargetTypedCompletionFilter"
;
public
const
string
TriggerCompletionInArgumentLists
=
"Roslyn.TriggerCompletionInArgumentLists"
;
public
const
string
OOPServerGC
=
"Roslyn.OOPServerGC"
;
public
const
string
ImportsOnPasteDefaultEnabled
=
"Roslyn.ImportsOnPasteDefaultEnabled"
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录