Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
9672d4c1
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 搜索 >>
提交
9672d4c1
编写于
1月 14, 2016
作者:
J
Jonathon Marolf
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Correctly detect existing constructors during code generation
上级
7cb4f224
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
121 addition
and
13 deletion
+121
-13
src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateConstructor/GenerateConstructorTests.cs
...omMembers/GenerateConstructor/GenerateConstructorTests.cs
+7
-0
src/EditorFeatures/CSharpTest/Completion/CompletionProviders/CrefCompletionProviderTests.cs
...letion/CompletionProviders/CrefCompletionProviderTests.cs
+5
-0
src/EditorFeatures/VisualBasicTest/Completion/CompletionProviders/CrefCompletionProviderTests.vb
...letion/CompletionProviders/CrefCompletionProviderTests.vb
+4
-0
src/EditorFeatures/VisualBasicTest/Diagnostics/GenerateConstructor/GenerateConstructorTests.vb
...agnostics/GenerateConstructor/GenerateConstructorTests.vb
+18
-0
src/Features/Core/Portable/GenerateMember/GenerateConstructor/AbstractGenerateConstructorService.State.cs
...teConstructor/AbstractGenerateConstructorService.State.cs
+62
-11
src/Features/Core/Portable/GenerateMember/GenerateConstructor/AbstractGenerateConstructorService.cs
...GenerateConstructor/AbstractGenerateConstructorService.cs
+0
-1
src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs
...arp/Portable/LanguageServices/CSharpSyntaxFactsService.cs
+10
-0
src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs
...anguageServices/SyntaxFactsService/ISyntaxFactsService.cs
+6
-0
src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb
...ortable/LanguageServices/VisualBasicSyntaxFactsService.vb
+9
-1
未找到文件。
src/EditorFeatures/CSharpTest/CodeActions/GenerateFromMembers/GenerateConstructor/GenerateConstructorTests.cs
浏览文件 @
9672d4c1
...
...
@@ -173,5 +173,12 @@ public async Task TestContextualKeywordName()
@"class Program { [|int yield ;|] } "
,
@"class Program { int yield ; public Program ( int yield ) { this . yield = yield ; } } "
);
}
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsGenerateConstructor
)]
public
async
Task
TestGenerateConstructorNotOfferedForDuplicate
()
{
await
TestMissingAsync
(
"using System ; class X { public X ( string v ) { } static void Test ( ) { new X ( new [|string|] ( ) ) ; } } "
);
}
}
}
src/EditorFeatures/CSharpTest/Completion/CompletionProviders/CrefCompletionProviderTests.cs
浏览文件 @
9672d4c1
...
...
@@ -910,6 +910,11 @@ public TextSpan GetInactiveRegionSpanAroundPosition(SyntaxTree tree, int positio
{
throw
new
NotImplementedException
();
}
public
string
GetNameForArgument
(
SyntaxNode
argument
)
{
throw
new
NotImplementedException
();
}
}
}
}
...
...
src/EditorFeatures/VisualBasicTest/Completion/CompletionProviders/CrefCompletionProviderTests.vb
浏览文件 @
9672d4c1
...
...
@@ -816,6 +816,10 @@ End Class]]></a>.Value.NormalizeLineEndings()
Public
Function
GetInactiveRegionSpanAroundPosition
(
tree
As
SyntaxTree
,
position
As
Integer
,
cancellationToken
As
CancellationToken
)
As
TextSpan
Implements
ISyntaxFactsService
.
GetInactiveRegionSpanAroundPosition
Throw
New
NotImplementedException
()
End
Function
Public
Function
GetNameForArgument
(
argument
As
SyntaxNode
)
As
String
Implements
ISyntaxFactsService
.
GetNameForArgument
Throw
New
NotImplementedException
()
End
Function
End
Class
End
Class
End
Namespace
src/EditorFeatures/VisualBasicTest/Diagnostics/GenerateConstructor/GenerateConstructorTests.vb
浏览文件 @
9672d4c1
...
...
@@ -578,6 +578,24 @@ End Class
Public Class [|;;|]Derived
Inherits Base
End Class"
)
End
Function
<
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsGenerateConstructor
)
>
Public
Async
Function
TestGenerateConstructorNotOfferedForDuplicate
()
As
Task
Await
TestMissingAsync
(
"Imports System
Class X
Private v As String
Public Sub New(v As String)
Me.v = v
End Sub
Sub Test()
Dim x As X = New X(New [|String|]())
End Sub
End Class"
)
End
Function
End
Class
...
...
src/Features/Core/Portable/GenerateMember/GenerateConstructor/AbstractGenerateConstructorService.State.cs
浏览文件 @
9672d4c1
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Threading
;
...
...
@@ -10,7 +11,6 @@
using
Microsoft.CodeAnalysis.LanguageServices
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Shared.Utilities
;
using
Roslyn.Utilities
;
namespace
Microsoft.CodeAnalysis.GenerateMember.GenerateConstructor
{
...
...
@@ -93,23 +93,74 @@ private State()
this
.
ParameterTypes
=
this
.
ParameterTypes
??
GetParameterTypes
(
service
,
document
,
cancellationToken
);
this
.
ParameterRefKinds
=
this
.
ParameterRefKinds
??
this
.
Arguments
.
Select
(
service
.
GetRefKind
).
ToList
();
return
!
ClashesWithExistingConstructor
(
service
,
document
,
cancellationToken
);
return
!
ClashesWithExistingConstructor
(
document
,
cancellationToken
);
}
private
bool
ClashesWithExistingConstructor
(
TService
service
,
SemanticDocument
document
,
CancellationToken
cancellationToken
)
private
bool
ClashesWithExistingConstructor
(
SemanticDocument
document
,
CancellationToken
cancellationToken
)
{
var
parameters
=
this
.
ParameterTypes
.
Zip
(
this
.
ParameterRefKinds
,
(
t
,
r
)
=>
CodeGenerationSymbolFactory
.
CreateParameterSymbol
(
attributes
:
null
,
refKind
:
r
,
isParams
:
false
,
type
:
t
,
name
:
string
.
Empty
)).
ToList
();
if
(
this
.
ParameterTypes
==
null
||
this
.
ParameterRefKinds
==
null
)
{
return
false
;
}
if
(
this
.
ParameterTypes
.
Count
!=
this
.
ParameterRefKinds
.
Count
)
{
return
false
;
}
if
(!
this
.
TypeToGenerateIn
.
InstanceConstructors
.
Any
(
c
=>
c
.
Parameters
.
Length
==
this
.
ParameterTypes
.
Count
))
{
return
false
;
}
var
destinationProvider
=
document
.
Project
.
Solution
.
Workspace
.
Services
.
GetLanguageServices
(
this
.
TypeToGenerateIn
.
Language
);
var
syntaxFacts
=
destinationProvider
.
GetService
<
ISyntaxFactsService
>();
for
(
int
i
=
0
;
i
<
ParameterTypes
.
Count
;
i
++)
{
var
compareParameterName
=
false
;
var
type
=
this
.
ParameterTypes
[
i
];
var
refKind
=
this
.
ParameterRefKinds
[
i
];
string
parameterName
=
GetParameterName
(
syntaxFacts
,
i
);
if
(!
string
.
IsNullOrEmpty
(
parameterName
))
{
compareParameterName
=
true
;
}
var
parameterSymbol
=
CodeGenerationSymbolFactory
.
CreateParameterSymbol
(
attributes
:
null
,
refKind
:
refKind
,
isParams
:
false
,
type
:
type
,
name
:
parameterName
);
var
result
=
this
.
TypeToGenerateIn
.
InstanceConstructors
.
Any
(
c
=>
{
if
(
i
>=
c
.
Parameters
.
Length
)
{
return
false
;
}
return
SymbolEquivalenceComparer
.
Instance
.
ParameterEquivalenceComparer
.
Equals
(
parameterSymbol
,
c
.
Parameters
[
i
],
compareParameterName
,
syntaxFacts
.
IsCaseSensitive
);
});
if
(
result
==
false
)
{
return
false
;
}
}
return
true
;
}
private
string
GetParameterName
(
ISyntaxFactsService
service
,
int
i
)
{
if
(
i
>=
this
.
Arguments
?.
Count
)
{
return
string
.
Empty
;
}
return
this
.
TypeToGenerateIn
.
InstanceConstructors
.
Any
(
c
=>
SignatureComparer
.
Instance
.
HaveSameSignature
(
parameters
,
c
.
Parameters
,
compareParameterName
:
true
,
isCaseSensitive
:
syntaxFacts
.
IsCaseSensitive
));
return
service
.
GetNameForArgument
(
this
.
Arguments
?[
i
]);
}
internal
List
<
ITypeSymbol
>
GetParameterTypes
(
...
...
src/Features/Core/Portable/GenerateMember/GenerateConstructor/AbstractGenerateConstructorService.cs
浏览文件 @
9672d4c1
...
...
@@ -28,7 +28,6 @@ protected AbstractGenerateConstructorService()
protected
abstract
bool
TryInitializeClassDeclarationGenerationState
(
SemanticDocument
document
,
SyntaxNode
classDeclaration
,
CancellationToken
cancellationToken
,
out
SyntaxToken
token
,
out
IMethodSymbol
constructor
,
out
INamedTypeSymbol
typeToGenerateIn
);
protected
abstract
bool
TryInitializeConstructorInitializerGeneration
(
SemanticDocument
document
,
SyntaxNode
constructorInitializer
,
CancellationToken
cancellationToken
,
out
SyntaxToken
token
,
out
IList
<
TArgumentSyntax
>
arguments
,
out
INamedTypeSymbol
typeToGenerateIn
);
protected
abstract
bool
TryInitializeSimpleAttributeNameGenerationState
(
SemanticDocument
document
,
SyntaxNode
simpleName
,
CancellationToken
cancellationToken
,
out
SyntaxToken
token
,
out
IList
<
TArgumentSyntax
>
arguments
,
out
IList
<
TAttributeArgumentSyntax
>
attributeArguments
,
out
INamedTypeSymbol
typeToGenerateIn
);
protected
abstract
IList
<
string
>
GenerateParameterNames
(
SemanticModel
semanticModel
,
IEnumerable
<
TArgumentSyntax
>
arguments
,
IList
<
string
>
reservedNames
=
null
);
protected
virtual
IList
<
string
>
GenerateParameterNames
(
SemanticModel
semanticModel
,
IEnumerable
<
TAttributeArgumentSyntax
>
arguments
,
IList
<
string
>
reservedNames
=
null
)
{
return
null
;
}
protected
abstract
string
GenerateNameForArgument
(
SemanticModel
semanticModel
,
TArgumentSyntax
argument
);
...
...
src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs
浏览文件 @
9672d4c1
...
...
@@ -1429,5 +1429,15 @@ public TextSpan GetInactiveRegionSpanAroundPosition(SyntaxTree syntaxTree, int p
return
default
(
TextSpan
);
}
public
string
GetNameForArgument
(
SyntaxNode
argument
)
{
if
((
argument
as
ArgumentSyntax
)?.
NameColon
!=
null
)
{
return
(
argument
as
ArgumentSyntax
).
NameColon
.
Name
.
Identifier
.
ValueText
;
}
return
string
.
Empty
;
}
}
}
src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs
浏览文件 @
9672d4c1
...
...
@@ -156,6 +156,12 @@ internal interface ISyntaxFactsService : ILanguageService
IEnumerable
<
SyntaxNode
>
GetConstructors
(
SyntaxNode
root
,
CancellationToken
cancellationToken
);
bool
TryGetCorrespondingOpenBrace
(
SyntaxToken
token
,
out
SyntaxToken
openBrace
);
/// <summary>
/// Given a <see cref="SyntaxNode"/>, that represents and argument return the string representation of
/// that arguments name.
/// </summary>
string
GetNameForArgument
(
SyntaxNode
argument
);
}
[
Flags
]
...
...
src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb
浏览文件 @
9672d4c1
...
...
@@ -1177,5 +1177,13 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return
Nothing
End
Function
End
Class
Public
Function
GetNameForArgument
(
argument
As
SyntaxNode
)
As
String
Implements
ISyntaxFactsService
.
GetNameForArgument
If
TryCast
(
argument
,
ArgumentSyntax
)
?
.
IsNamed
Then
Return
DirectCast
(
argument
,
SimpleArgumentSyntax
).
NameColonEquals
.
Name
.
Identifier
.
ValueText
End
If
Return
String
.
Empty
End
Function
End
Class
End
Namespace
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录