Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
5fa64467
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,发现更多精彩内容 >>
提交
5fa64467
编写于
3月 08, 2017
作者:
C
CyrusNajmabadi
提交者:
GitHub
3月 08, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #17638 from CyrusNajmabadi/nullPropagateExpressionTrees
Don't offer ?. if it's going to be used in an Expression-Tree.
上级
6276234b
bc131705
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
77 addition
and
21 deletion
+77
-21
src/EditorFeatures/CSharpTest/UseNullPropagation/UseNullPropagationTests.cs
.../CSharpTest/UseNullPropagation/UseNullPropagationTests.cs
+22
-0
src/EditorFeatures/TestUtilities/TestExportProvider.cs
src/EditorFeatures/TestUtilities/TestExportProvider.cs
+6
-5
src/EditorFeatures/VisualBasic/UseAutoProperty/UseAutoPropertyAnalyzer.vb
...es/VisualBasic/UseAutoProperty/UseAutoPropertyAnalyzer.vb
+1
-3
src/Features/CSharp/Portable/UseNullPropagation/CSharpUseNullPropagationDiagnosticAnalyzer.cs
...Propagation/CSharpUseNullPropagationDiagnosticAnalyzer.cs
+3
-0
src/Features/Core/Portable/UseNullPropagation/AbstractUseNullPropagationDiagnosticAnalyzer.cs
...opagation/AbstractUseNullPropagationDiagnosticAnalyzer.cs
+26
-12
src/Features/VisualBasic/Portable/UseNullPropagation/VisualBasicUseNullPropagationDiagnosticAnalyzer.vb
...gation/VisualBasicUseNullPropagationDiagnosticAnalyzer.vb
+4
-0
src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSemanticFactsService.vb
...table/LanguageServices/VisualBasicSemanticFactsService.vb
+15
-1
未找到文件。
src/EditorFeatures/CSharpTest/UseNullPropagation/UseNullPropagationTests.cs
浏览文件 @
5fa64467
...
...
@@ -338,5 +338,27 @@ void Foo()
}
class C { public void M(string s) { } }"
);
}
[
WorkItem
(
17623
,
"https://github.com/dotnet/roslyn/issues/17623"
)]
[
Fact
,
Trait
(
Traits
.
Feature
,
Traits
.
Features
.
CodeActionsUseNullPropagation
)]
public
async
Task
TestInExpressionTree
()
{
await
TestMissingInRegularAndScriptAsync
(
@"
using System;
using System.Linq.Expressions;
class Program
{
void Main(string s)
{
Method<string>(t => [||]s != null ? s.ToString() : null); // works
}
public void Method<T>(Expression<Func<T, string>> functor)
{
}
}"
);
}
}
}
\ No newline at end of file
src/EditorFeatures/TestUtilities/TestExportProvider.cs
浏览文件 @
5fa64467
...
...
@@ -67,7 +67,7 @@ private static Type[] GetNeutralAndCSharpAndVisualBasicTypes()
typeof
(
CodeAnalysis
.
CSharp
.
Rename
.
CSharpRenameConflictLanguageService
),
typeof
(
CodeAnalysis
.
VisualBasic
.
Rename
.
VisualBasicRenameRewriterLanguageServiceFactory
),
typeof
(
CodeAnalysis
.
CSharp
.
CSharpSemanticFactsServiceFactory
),
typeof
(
CodeAnalysis
.
VisualBasic
.
VisualBasicSemanticFactsService
),
typeof
(
CodeAnalysis
.
VisualBasic
.
VisualBasicSemanticFactsService
Factory
),
typeof
(
CodeAnalysis
.
CSharp
.
CodeGeneration
.
CSharpSyntaxGenerator
),
typeof
(
CodeAnalysis
.
VisualBasic
.
CodeGeneration
.
VisualBasicSyntaxGenerator
),
typeof
(
CSharp
.
LanguageServices
.
CSharpContentTypeLanguageService
),
...
...
@@ -89,8 +89,8 @@ private static Type[] GetNeutralAndCSharpAndVisualBasicTypes()
}
/// <summary>
/// Create fresh ExportProvider that doesn
t share anything with others.
///
test can use this
export provider to create all new MEF components not shared with others.
/// Create fresh ExportProvider that doesn
't share anything with others. Tests can use this
/// export provider to create all new MEF components not shared with others.
/// </summary>
public
static
ExportProvider
CreateExportProviderWithCSharpAndVisualBasic
()
{
...
...
@@ -98,8 +98,9 @@ public static ExportProvider CreateExportProviderWithCSharpAndVisualBasic()
}
/// <summary>
/// Create fresh ComposableCatalog that doesnt share anything with others.
/// everything under this catalog should have been created from scratch that doesnt share anything with others.
/// Create fresh ComposableCatalog that doest share anything with others. Everything under
/// this catalog should have been created from scratch that doesn't share anything with
/// others.
/// </summary>
public
static
ComposableCatalog
CreateAssemblyCatalogWithCSharpAndVisualBasic
()
{
...
...
src/EditorFeatures/VisualBasic/UseAutoProperty/UseAutoPropertyAnalyzer.vb
浏览文件 @
5fa64467
...
...
@@ -13,8 +13,6 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UseAutoProperty
Friend
Class
UseAutoPropertyAnalyzer
Inherits
AbstractUseAutoPropertyAnalyzer
(
Of
PropertyBlockSyntax
,
FieldDeclarationSyntax
,
ModifiedIdentifierSyntax
,
ExpressionSyntax
)
Private
ReadOnly
_semanticFacts
As
New
VisualBasicSemanticFactsService
()
Protected
Overrides
Function
SupportsReadOnlyProperties
(
compilation
As
Compilation
)
As
Boolean
Return
DirectCast
(
compilation
,
VisualBasicCompilation
).
LanguageVersion
>=
LanguageVersion
.
VisualBasic14
End
Function
...
...
@@ -146,7 +144,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UseAutoProperty
If
node
.
Kind
()
=
SyntaxKind
.
IdentifierName
Then
Dim
symbolInfo
=
semanticModel
.
GetSymbolInfo
(
node
)
If
field
.
Equals
(
symbolInfo
.
Symbol
)
Then
If
_semanticFacts
.
IsWrittenTo
(
semanticModel
,
node
,
cancellationToken
)
Then
If
VisualBasicSemanticFactsService
.
Instance
.
IsWrittenTo
(
semanticModel
,
node
,
cancellationToken
)
Then
Return
True
End
If
End
If
...
...
src/Features/CSharp/Portable/UseNullPropagation/CSharpUseNullPropagationDiagnosticAnalyzer.cs
浏览文件 @
5fa64467
...
...
@@ -26,6 +26,9 @@ protected override bool ShouldAnalyze(ParseOptions options)
protected
override
ISyntaxFactsService
GetSyntaxFactsService
()
=>
CSharpSyntaxFactsService
.
Instance
;
protected
override
ISemanticFactsService
GetSemanticFactsService
()
=>
CSharpSemanticFactsService
.
Instance
;
protected
override
SyntaxKind
GetSyntaxKindToAnalyze
()
=>
SyntaxKind
.
ConditionalExpression
;
...
...
src/Features/Core/Portable/UseNullPropagation/AbstractUseNullPropagationDiagnosticAnalyzer.cs
浏览文件 @
5fa64467
...
...
@@ -37,15 +37,25 @@ protected AbstractUseNullPropagationDiagnosticAnalyzer()
public
override
DiagnosticAnalyzerCategory
GetAnalyzerCategory
()
=>
DiagnosticAnalyzerCategory
.
SemanticDocumentAnalysis
;
protected
abstract
TSyntaxKind
GetSyntaxKindToAnalyze
();
protected
abstract
ISyntaxFactsService
GetSyntaxFactsService
();
protected
abstract
bool
IsEquals
(
TBinaryExpressionSyntax
condition
);
protected
abstract
bool
IsNotEquals
(
TBinaryExpressionSyntax
condition
);
protected
abstract
bool
ShouldAnalyze
(
ParseOptions
options
);
protected
abstract
ISyntaxFactsService
GetSyntaxFactsService
();
protected
abstract
ISemanticFactsService
GetSemanticFactsService
();
protected
override
void
InitializeWorker
(
AnalysisContext
context
)
=>
context
.
RegisterSyntaxNodeAction
(
AnalyzeSyntax
,
GetSyntaxKindToAnalyze
());
{
context
.
RegisterCompilationStartAction
(
startContext
=>
{
var
expressionTypeOpt
=
startContext
.
Compilation
.
GetTypeByMetadataName
(
"System.Linq.Expressions.Expression`1"
);
startContext
.
RegisterSyntaxNodeAction
(
c
=>
AnalyzeSyntax
(
c
,
expressionTypeOpt
),
GetSyntaxKindToAnalyze
());
});
private
void
AnalyzeSyntax
(
SyntaxNodeAnalysisContext
context
)
}
private
void
AnalyzeSyntax
(
SyntaxNodeAnalysisContext
context
,
INamedTypeSymbol
expressionTypeOpt
)
{
var
conditionalExpression
=
(
TConditionalExpressionSyntax
)
context
.
Node
;
if
(!
ShouldAnalyze
(
conditionalExpression
.
SyntaxTree
.
Options
))
...
...
@@ -102,7 +112,7 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
return
;
}
// Needs to be of the form
e
:
// Needs to be of the form:
// x == null ? null : ... or
// x != null ? ... : null;
if
(
isEquals
&&
!
syntaxFacts
.
IsNullLiteralExpression
(
whenTrueNode
))
...
...
@@ -124,6 +134,14 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
return
;
}
// ?. is not available in expression-trees. Disallow the fix in that case.
var
semanticFacts
=
GetSemanticFactsService
();
var
semanticModel
=
context
.
SemanticModel
;
if
(
semanticFacts
.
IsInExpressionTree
(
semanticModel
,
conditionNode
,
expressionTypeOpt
,
cancellationToken
))
{
return
;
}
var
locations
=
ImmutableArray
.
Create
(
conditionalExpression
.
GetLocation
(),
conditionPartToCheck
.
GetLocation
(),
...
...
@@ -162,26 +180,22 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
private
static
SyntaxNode
Unwrap
(
ISyntaxFactsService
syntaxFacts
,
SyntaxNode
node
)
{
var
invocation
=
node
as
TInvocationExpression
;
if
(
invocation
!=
null
)
if
(
node
is
TInvocationExpression
invocation
)
{
return
syntaxFacts
.
GetExpressionOfInvocationExpression
(
invocation
);
}
var
memberAccess
=
node
as
TMemberAccessExpression
;
if
(
memberAccess
!=
null
)
if
(
node
is
TMemberAccessExpression
memberAccess
)
{
return
syntaxFacts
.
GetExpressionOfMemberAccessExpression
(
memberAccess
);
}
var
conditionalAccess
=
node
as
TConditionalAccessExpression
;
if
(
conditionalAccess
!=
null
)
if
(
node
is
TConditionalAccessExpression
conditionalAccess
)
{
return
syntaxFacts
.
GetExpressionOfConditionalAccessExpression
(
conditionalAccess
);
}
var
elementAccess
=
node
as
TElementAccessExpression
;
if
(
elementAccess
!=
null
)
if
(
node
is
TElementAccessExpression
elementAccess
)
{
return
syntaxFacts
.
GetExpressionOfElementAccessExpression
(
elementAccess
);
}
...
...
src/Features/VisualBasic/Portable/UseNullPropagation/VisualBasicUseNullPropagationDiagnosticAnalyzer.vb
浏览文件 @
5fa64467
...
...
@@ -26,6 +26,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseNullPropagation
Return
VisualBasicSyntaxFactsService
.
Instance
End
Function
Protected
Overrides
Function
GetSemanticFactsService
()
As
ISemanticFactsService
Return
VisualBasicSemanticFactsService
.
instance
End
Function
Protected
Overrides
Function
GetSyntaxKindToAnalyze
()
As
SyntaxKind
Return
SyntaxKind
.
TernaryConditionalExpression
End
Function
...
...
src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSemanticFactsService.vb
浏览文件 @
5fa64467
...
...
@@ -4,16 +4,30 @@ Imports System.Collections.Immutable
Imports
System.Composition
Imports
System.Runtime.InteropServices
Imports
System.Threading
Imports
Microsoft.CodeAnalysis.Host
Imports
Microsoft.CodeAnalysis.Host.Mef
Imports
Microsoft.CodeAnalysis.LanguageServices
Imports
Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery
Imports
Microsoft.CodeAnalysis.VisualBasic.Syntax
Namespace
Microsoft.CodeAnalysis.VisualBasic
<
ExportLanguageService
(
GetType
(
ISemanticFactsService
),
LanguageNames
.
VisualBasic
),
[
Shared
]
>
<
ExportLanguageServiceFactory
(
GetType
(
ISemanticFactsService
),
LanguageNames
.
VisualBasic
),
[
Shared
]
>
Friend
Class
VisualBasicSemanticFactsServiceFactory
Implements
ILanguageServiceFactory
Public
Function
CreateLanguageService
(
languageServices
As
HostLanguageServices
)
As
ILanguageService
Implements
ILanguageServiceFactory
.
CreateLanguageService
Return
VisualBasicSemanticFactsService
.
Instance
End
Function
End
Class
Friend
Class
VisualBasicSemanticFactsService
Implements
ISemanticFactsService
Public
Shared
ReadOnly
Instance
As
New
VisualBasicSemanticFactsService
()
Private
Sub
New
()
End
Sub
Public
ReadOnly
Property
SupportsImplicitInterfaceImplementation
As
Boolean
Implements
ISemanticFactsService
.
SupportsImplicitInterfaceImplementation
Get
Return
False
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录