Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lwm1986
roslyn
提交
74c477c8
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,发现更多精彩内容 >>
提交
74c477c8
编写于
2月 23, 2017
作者:
C
CyrusNajmabadi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add specialized formatting for teh equals expressions we create.
上级
f5fe0503
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
104 addition
and
16 deletion
+104
-16
src/Features/Core/Portable/Features.csproj
src/Features/Core/Portable/Features.csproj
+1
-0
src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs
...GetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs
+54
-0
src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeAction.cs
...HashCodeFromMembers/GenerateEqualsAndGetHashCodeAction.cs
+19
-5
src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs
...arp/Portable/LanguageServices/CSharpSyntaxFactsService.cs
+7
-3
src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs
...anguageServices/SyntaxFactsService/ISyntaxFactsService.cs
+2
-0
src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions_CreateEqualsMethod.cs
...ns/ICodeDefinitionFactoryExtensions_CreateEqualsMethod.cs
+12
-7
src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb
...ortable/LanguageServices/VisualBasicSyntaxFactsService.vb
+9
-1
未找到文件。
src/Features/Core/Portable/Features.csproj
浏览文件 @
74c477c8
...
@@ -129,6 +129,7 @@
...
@@ -129,6 +129,7 @@
<Compile
Include=
"AddPackage\InstallPackageDirectlyCodeAction.cs"
/>
<Compile
Include=
"AddPackage\InstallPackageDirectlyCodeAction.cs"
/>
<Compile
Include=
"AddConstructorParametersFromMembers\State.cs"
/>
<Compile
Include=
"AddConstructorParametersFromMembers\State.cs"
/>
<Compile
Include=
"GenerateConstructorFromMembers\GenerateConstructorWithDialogCodeAction.cs"
/>
<Compile
Include=
"GenerateConstructorFromMembers\GenerateConstructorWithDialogCodeAction.cs"
/>
<Compile
Include=
"GenerateEqualsAndGetHashCodeFromMembers\FormatLargeBinaryExpressionRule.cs"
/>
<Compile
Include=
"GenerateEqualsAndGetHashCodeFromMembers\GenerateEqualsAndHashWithDialogCodeAction.cs"
/>
<Compile
Include=
"GenerateEqualsAndGetHashCodeFromMembers\GenerateEqualsAndHashWithDialogCodeAction.cs"
/>
<Compile
Include=
"PickMembers\IPickMembersService.cs"
/>
<Compile
Include=
"PickMembers\IPickMembersService.cs"
/>
<Compile
Include=
"PickMembers\PickMembersResult.cs"
/>
<Compile
Include=
"PickMembers\PickMembersResult.cs"
/>
...
...
src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/FormatLargeBinaryExpressionRule.cs
0 → 100644
浏览文件 @
74c477c8
// 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.Collections.Generic
;
using
Microsoft.CodeAnalysis.CodeActions
;
using
Microsoft.CodeAnalysis.Formatting.Rules
;
using
Microsoft.CodeAnalysis.LanguageServices
;
using
Microsoft.CodeAnalysis.Options
;
namespace
Microsoft.CodeAnalysis.GenerateEqualsAndGetHashCodeFromMembers
{
internal
partial
class
GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider
{
private
partial
class
GenerateEqualsAndGetHashCodeAction
:
CodeAction
{
private
class
FormatLargeBinaryExpressionRule
:
AbstractFormattingRule
{
private
ISyntaxFactsService
_syntaxFacts
;
public
FormatLargeBinaryExpressionRule
(
ISyntaxFactsService
syntaxFacts
)
{
_syntaxFacts
=
syntaxFacts
;
}
public
override
AdjustNewLinesOperation
GetAdjustNewLinesOperation
(
SyntaxToken
previousToken
,
SyntaxToken
currentToken
,
OptionSet
optionSet
,
NextOperation
<
AdjustNewLinesOperation
>
nextOperation
)
{
if
(
_syntaxFacts
.
IsLogicalAndExpression
(
previousToken
.
Parent
))
{
return
FormattingOperations
.
CreateAdjustNewLinesOperation
(
1
,
AdjustNewLinesOption
.
PreserveLines
);
}
return
nextOperation
.
Invoke
();
}
public
override
void
AddIndentBlockOperations
(
List
<
IndentBlockOperation
>
list
,
SyntaxNode
node
,
OptionSet
optionSet
,
NextAction
<
IndentBlockOperation
>
nextOperation
)
{
if
(
_syntaxFacts
.
IsReturnStatement
(
node
))
{
list
.
Add
(
FormattingOperations
.
CreateRelativeIndentBlockOperation
(
node
.
GetFirstToken
(),
node
.
GetFirstToken
().
GetNextToken
(),
node
.
GetLastToken
(),
indentationDelta
:
1
,
option
:
IndentBlockOption
.
RelativePosition
));
return
;
}
nextOperation
.
Invoke
(
list
);
}
}
}
}
}
\ No newline at end of file
src/Features/Core/Portable/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeAction.cs
浏览文件 @
74c477c8
...
@@ -7,6 +7,9 @@
...
@@ -7,6 +7,9 @@
using
Microsoft.CodeAnalysis.CodeActions
;
using
Microsoft.CodeAnalysis.CodeActions
;
using
Microsoft.CodeAnalysis.CodeGeneration
;
using
Microsoft.CodeAnalysis.CodeGeneration
;
using
Microsoft.CodeAnalysis.Editing
;
using
Microsoft.CodeAnalysis.Editing
;
using
Microsoft.CodeAnalysis.Formatting
;
using
Microsoft.CodeAnalysis.Formatting.Rules
;
using
Microsoft.CodeAnalysis.LanguageServices
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Shared.Extensions
;
using
Microsoft.CodeAnalysis.Text
;
using
Microsoft.CodeAnalysis.Text
;
...
@@ -14,8 +17,10 @@ namespace Microsoft.CodeAnalysis.GenerateEqualsAndGetHashCodeFromMembers
...
@@ -14,8 +17,10 @@ namespace Microsoft.CodeAnalysis.GenerateEqualsAndGetHashCodeFromMembers
{
{
internal
partial
class
GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider
internal
partial
class
GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider
{
{
private
class
GenerateEqualsAndGetHashCodeAction
:
CodeAction
private
partial
class
GenerateEqualsAndGetHashCodeAction
:
CodeAction
{
{
private
static
readonly
SyntaxAnnotation
s_specializedFormattingAnnotation
=
new
SyntaxAnnotation
();
private
readonly
bool
_generateEquals
;
private
readonly
bool
_generateEquals
;
private
readonly
bool
_generateGetHashCode
;
private
readonly
bool
_generateGetHashCode
;
private
readonly
GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider
_service
;
private
readonly
GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider
_service
;
...
@@ -60,13 +65,21 @@ protected override async Task<Document> GetChangedDocumentAsync(CancellationToke
...
@@ -60,13 +65,21 @@ protected override async Task<Document> GetChangedDocumentAsync(CancellationToke
var
syntaxTree
=
await
_document
.
GetSyntaxTreeAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
syntaxTree
=
await
_document
.
GetSyntaxTreeAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
return
await
CodeGenerator
.
AddMemberDeclarationsAsync
(
var
newDocument
=
await
CodeGenerator
.
AddMemberDeclarationsAsync
(
_document
.
Project
.
Solution
,
_document
.
Project
.
Solution
,
_containingType
,
_containingType
,
members
,
members
,
new
CodeGenerationOptions
(
contextLocation
:
syntaxTree
.
GetLocation
(
_textSpan
)),
new
CodeGenerationOptions
(
contextLocation
:
syntaxTree
.
GetLocation
(
_textSpan
)),
cancellationToken
)
cancellationToken
).
ConfigureAwait
(
false
);
.
ConfigureAwait
(
false
);
var
rules
=
new
List
<
IFormattingRule
>
{
new
FormatLargeBinaryExpressionRule
(
_document
.
GetLanguageService
<
ISyntaxFactsService
>())
};
rules
.
AddRange
(
Formatter
.
GetDefaultFormattingRules
(
_document
));
var
formattedDocument
=
await
Formatter
.
FormatAsync
(
newDocument
,
s_specializedFormattingAnnotation
,
options
:
null
,
rules
:
rules
,
cancellationToken
:
cancellationToken
).
ConfigureAwait
(
false
);
return
formattedDocument
;
}
}
private
async
Task
<
IMethodSymbol
>
CreateGetHashCodeMethodAsync
(
CancellationToken
cancellationToken
)
private
async
Task
<
IMethodSymbol
>
CreateGetHashCodeMethodAsync
(
CancellationToken
cancellationToken
)
...
@@ -80,7 +93,8 @@ private async Task<IMethodSymbol> CreateEqualsMethodAsync(CancellationToken canc
...
@@ -80,7 +93,8 @@ private async Task<IMethodSymbol> CreateEqualsMethodAsync(CancellationToken canc
{
{
var
compilation
=
await
_document
.
Project
.
GetCompilationAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
var
compilation
=
await
_document
.
Project
.
GetCompilationAsync
(
cancellationToken
).
ConfigureAwait
(
false
);
return
_document
.
GetLanguageService
<
SyntaxGenerator
>().
CreateEqualsMethod
(
return
_document
.
GetLanguageService
<
SyntaxGenerator
>().
CreateEqualsMethod
(
compilation
,
_containingType
,
_selectedMembers
,
cancellationToken
);
compilation
,
_containingType
,
_selectedMembers
,
s_specializedFormattingAnnotation
,
cancellationToken
);
}
}
public
override
string
Title
public
override
string
Title
...
...
src/Workspaces/CSharp/Portable/LanguageServices/CSharpSyntaxFactsService.cs
浏览文件 @
74c477c8
...
@@ -231,9 +231,10 @@ public bool IsLockStatement(SyntaxNode node)
...
@@ -231,9 +231,10 @@ public bool IsLockStatement(SyntaxNode node)
}
}
public
bool
IsUsingStatement
(
SyntaxNode
node
)
public
bool
IsUsingStatement
(
SyntaxNode
node
)
{
=>
node
.
Kind
()
==
SyntaxKind
.
UsingStatement
;
return
node
is
UsingStatementSyntax
;
}
public
bool
IsReturnStatement
(
SyntaxNode
node
)
=>
node
.
Kind
()
==
SyntaxKind
.
ReturnStatement
;
public
bool
IsThisConstructorInitializer
(
SyntaxToken
token
)
public
bool
IsThisConstructorInitializer
(
SyntaxToken
token
)
{
{
...
@@ -1806,6 +1807,9 @@ public void GetPartsOfConditionalExpression(SyntaxNode node, out SyntaxNode cond
...
@@ -1806,6 +1807,9 @@ public void GetPartsOfConditionalExpression(SyntaxNode node, out SyntaxNode cond
public
SyntaxNode
WalkDownParentheses
(
SyntaxNode
node
)
public
SyntaxNode
WalkDownParentheses
(
SyntaxNode
node
)
=>
(
node
as
ExpressionSyntax
)?.
WalkDownParentheses
()
??
node
;
=>
(
node
as
ExpressionSyntax
)?.
WalkDownParentheses
()
??
node
;
public
bool
IsLogicalAndExpression
(
SyntaxNode
node
)
=>
node
.
Kind
()
==
SyntaxKind
.
LogicalAndExpression
;
public
bool
IsLogicalNotExpression
(
SyntaxNode
node
)
public
bool
IsLogicalNotExpression
(
SyntaxNode
node
)
=>
node
.
Kind
()
==
SyntaxKind
.
LogicalNotExpression
;
=>
node
.
Kind
()
==
SyntaxKind
.
LogicalNotExpression
;
...
...
src/Workspaces/Core/Portable/LanguageServices/SyntaxFactsService/ISyntaxFactsService.cs
浏览文件 @
74c477c8
...
@@ -75,6 +75,7 @@ internal interface ISyntaxFactsService : ILanguageService
...
@@ -75,6 +75,7 @@ internal interface ISyntaxFactsService : ILanguageService
bool
IsExpressionOfAwaitExpression
(
SyntaxNode
node
);
bool
IsExpressionOfAwaitExpression
(
SyntaxNode
node
);
SyntaxNode
GetExpressionOfAwaitExpression
(
SyntaxNode
node
);
SyntaxNode
GetExpressionOfAwaitExpression
(
SyntaxNode
node
);
bool
IsLogicalAndExpression
(
SyntaxNode
node
);
bool
IsLogicalNotExpression
(
SyntaxNode
node
);
bool
IsLogicalNotExpression
(
SyntaxNode
node
);
SyntaxNode
GetOperandOfPrefixUnaryExpression
(
SyntaxNode
node
);
SyntaxNode
GetOperandOfPrefixUnaryExpression
(
SyntaxNode
node
);
...
@@ -164,6 +165,7 @@ internal interface ISyntaxFactsService : ILanguageService
...
@@ -164,6 +165,7 @@ internal interface ISyntaxFactsService : ILanguageService
bool
IsForEachStatement
(
SyntaxNode
node
);
bool
IsForEachStatement
(
SyntaxNode
node
);
bool
IsLockStatement
(
SyntaxNode
node
);
bool
IsLockStatement
(
SyntaxNode
node
);
bool
IsUsingStatement
(
SyntaxNode
node
);
bool
IsUsingStatement
(
SyntaxNode
node
);
bool
IsReturnStatement
(
SyntaxNode
node
);
bool
IsLocalDeclarationStatement
(
SyntaxNode
node
);
bool
IsLocalDeclarationStatement
(
SyntaxNode
node
);
bool
IsDeclaratorOfLocalDeclarationStatement
(
SyntaxNode
declator
,
SyntaxNode
localDeclarationStatement
);
bool
IsDeclaratorOfLocalDeclarationStatement
(
SyntaxNode
declator
,
SyntaxNode
localDeclarationStatement
);
...
...
src/Workspaces/Core/Portable/Shared/Extensions/ICodeDefinitionFactoryExtensions_CreateEqualsMethod.cs
浏览文件 @
74c477c8
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
using
System
;
using
System
;
using
System.Collections.Generic
;
using
System.Collections.Generic
;
using
System.Collections.Immutable
;
using
System.Linq
;
using
System.Linq
;
using
System.Threading
;
using
System.Threading
;
using
Microsoft.CodeAnalysis
;
using
Microsoft.CodeAnalysis
;
...
@@ -23,9 +24,12 @@ internal static partial class ICodeDefinitionFactoryExtensions
...
@@ -23,9 +24,12 @@ internal static partial class ICodeDefinitionFactoryExtensions
Compilation
compilation
,
Compilation
compilation
,
INamedTypeSymbol
containingType
,
INamedTypeSymbol
containingType
,
IList
<
ISymbol
>
symbols
,
IList
<
ISymbol
>
symbols
,
SyntaxAnnotation
statementAnnotation
,
CancellationToken
cancellationToken
)
CancellationToken
cancellationToken
)
{
{
var
statements
=
CreateEqualsMethodStatements
(
factory
,
compilation
,
containingType
,
symbols
,
cancellationToken
);
var
statements
=
CreateEqualsMethodStatements
(
factory
,
compilation
,
containingType
,
symbols
,
cancellationToken
);
statements
=
statements
.
SelectAsArray
(
s
=>
s
.
WithAdditionalAnnotations
(
statementAnnotation
));
return
CodeGenerationSymbolFactory
.
CreateMethodSymbol
(
return
CodeGenerationSymbolFactory
.
CreateMethodSymbol
(
attributes
:
null
,
attributes
:
null
,
...
@@ -40,7 +44,7 @@ internal static partial class ICodeDefinitionFactoryExtensions
...
@@ -40,7 +44,7 @@ internal static partial class ICodeDefinitionFactoryExtensions
statements
:
statements
);
statements
:
statements
);
}
}
private
static
I
List
<
SyntaxNode
>
CreateEqualsMethodStatements
(
private
static
I
mmutableArray
<
SyntaxNode
>
CreateEqualsMethodStatements
(
SyntaxGenerator
factory
,
SyntaxGenerator
factory
,
Compilation
compilation
,
Compilation
compilation
,
INamedTypeSymbol
containingType
,
INamedTypeSymbol
containingType
,
...
@@ -48,11 +52,11 @@ internal static partial class ICodeDefinitionFactoryExtensions
...
@@ -48,11 +52,11 @@ internal static partial class ICodeDefinitionFactoryExtensions
CancellationToken
cancellationToken
)
CancellationToken
cancellationToken
)
{
{
var
iequatableType
=
compilation
.
GetTypeByMetadataName
(
"System.IEquatable`1"
);
var
iequatableType
=
compilation
.
GetTypeByMetadataName
(
"System.IEquatable`1"
);
var
statements
=
new
List
<
SyntaxNode
>
();
var
statements
=
ArrayBuilder
<
SyntaxNode
>.
GetInstance
();
var
parts
=
StringBreaker
.
BreakIntoWordParts
(
containingType
.
Name
);
var
parts
=
StringBreaker
.
BreakIntoWordParts
(
containingType
.
Name
);
string
localName
=
"v"
;
var
localName
=
"v"
;
for
(
int
i
=
parts
.
Count
-
1
;
i
>=
0
;
i
--)
for
(
var
i
=
parts
.
Count
-
1
;
i
>=
0
;
i
--)
{
{
var
p
=
parts
[
i
];
var
p
=
parts
[
i
];
if
(
char
.
IsLetter
(
containingType
.
Name
[
p
.
Start
]))
if
(
char
.
IsLetter
(
containingType
.
Name
[
p
.
Start
]))
...
@@ -120,7 +124,8 @@ internal static partial class ICodeDefinitionFactoryExtensions
...
@@ -120,7 +124,8 @@ internal static partial class ICodeDefinitionFactoryExtensions
foreach
(
var
member
in
members
)
foreach
(
var
member
in
members
)
{
{
var
symbolNameExpression
=
factory
.
IdentifierName
(
member
.
Name
);
var
symbolNameExpression
=
factory
.
IdentifierName
(
member
.
Name
);
var
thisSymbol
=
factory
.
MemberAccessExpression
(
factory
.
ThisExpression
(),
symbolNameExpression
).
WithAdditionalAnnotations
(
Simplification
.
Simplifier
.
Annotation
);
var
thisSymbol
=
factory
.
MemberAccessExpression
(
factory
.
ThisExpression
(),
symbolNameExpression
)
.
WithAdditionalAnnotations
(
Simplification
.
Simplifier
.
Annotation
);
var
otherSymbol
=
factory
.
MemberAccessExpression
(
localNameExpression
,
symbolNameExpression
);
var
otherSymbol
=
factory
.
MemberAccessExpression
(
localNameExpression
,
symbolNameExpression
);
#if false
#if false
...
@@ -161,7 +166,7 @@ internal static partial class ICodeDefinitionFactoryExtensions
...
@@ -161,7 +166,7 @@ internal static partial class ICodeDefinitionFactoryExtensions
statements
.
Add
(
factory
.
ReturnStatement
(
statements
.
Add
(
factory
.
ReturnStatement
(
expressions
.
Aggregate
(
factory
.
LogicalAndExpression
)));
expressions
.
Aggregate
(
factory
.
LogicalAndExpression
)));
return
statements
;
return
statements
.
ToImmutableAndFree
()
;
}
}
private
static
bool
ImplementsIEquatable
(
ITypeSymbol
memberType
,
INamedTypeSymbol
iequatableType
)
private
static
bool
ImplementsIEquatable
(
ITypeSymbol
memberType
,
INamedTypeSymbol
iequatableType
)
...
...
src/Workspaces/VisualBasic/Portable/LanguageServices/VisualBasicSyntaxFactsService.vb
浏览文件 @
74c477c8
...
@@ -205,7 +205,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
...
@@ -205,7 +205,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End
Function
End
Function
Public
Function
IsUsingStatement
(
node
As
SyntaxNode
)
As
Boolean
Implements
ISyntaxFactsService
.
IsUsingStatement
Public
Function
IsUsingStatement
(
node
As
SyntaxNode
)
As
Boolean
Implements
ISyntaxFactsService
.
IsUsingStatement
Return
TypeOf
node
Is
UsingStatementSyntax
Return
node
.
Kind
()
=
SyntaxKind
.
UsingStatement
End
Function
Public
Function
IsReturnStatement
(
node
As
SyntaxNode
)
As
Boolean
Implements
ISyntaxFactsService
.
IsReturnStatement
Return
node
.
Kind
()
=
SyntaxKind
.
ReturnStatement
End
Function
End
Function
Public
Function
IsThisConstructorInitializer
(
token
As
SyntaxToken
)
As
Boolean
Implements
ISyntaxFactsService
.
IsThisConstructorInitializer
Public
Function
IsThisConstructorInitializer
(
token
As
SyntaxToken
)
As
Boolean
Implements
ISyntaxFactsService
.
IsThisConstructorInitializer
...
@@ -1607,6 +1611,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
...
@@ -1607,6 +1611,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return
If
(
TryCast
(
node
,
ExpressionSyntax
)
?
.
WalkDownParentheses
(),
node
)
Return
If
(
TryCast
(
node
,
ExpressionSyntax
)
?
.
WalkDownParentheses
(),
node
)
End
Function
End
Function
Public
Function
IsLogicalAndExpression
(
node
As
SyntaxNode
)
As
Boolean
Implements
ISyntaxFactsService
.
IsLogicalAndExpression
Return
node
.
IsKind
(
SyntaxKind
.
AndAlsoExpression
)
End
Function
Public
Function
IsLogicalNotExpression
(
node
As
SyntaxNode
)
As
Boolean
Implements
ISyntaxFactsService
.
IsLogicalNotExpression
Public
Function
IsLogicalNotExpression
(
node
As
SyntaxNode
)
As
Boolean
Implements
ISyntaxFactsService
.
IsLogicalNotExpression
Return
node
.
IsKind
(
SyntaxKind
.
NotExpression
)
Return
node
.
IsKind
(
SyntaxKind
.
NotExpression
)
End
Function
End
Function
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录