Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET
Roslyn
提交
d68f519e
R
Roslyn
项目概览
dotNET
/
Roslyn
通知
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,发现更多精彩内容 >>
提交
d68f519e
编写于
5月 31, 2017
作者:
C
CyrusNajmabadi
提交者:
GitHub
5月 31, 2017
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #19875 from CyrusNajmabadi/lessAllocations2
Reduce allocations in IsGeneratedSymbolWithGeneratedCodeAttribute.
上级
da4b17b9
d0bf08a8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
65 addition
and
56 deletion
+65
-56
src/Compilers/Core/Portable/InternalUtilities/GeneratedCodeUtilities.cs
...Core/Portable/InternalUtilities/GeneratedCodeUtilities.cs
+65
-56
未找到文件。
src/Compilers/Core/Portable/InternalUtilities/GeneratedCodeUtilities.cs
浏览文件 @
d68f519e
...
...
@@ -8,16 +8,21 @@
namespace
Roslyn.Utilities
{
internal
static
class
GeneratedCodeUtilities
internal
static
class
GeneratedCodeUtilities
{
private
static
readonly
string
[]
s_autoGeneratedStrings
=
new
[]
{
"<autogenerated"
,
"<auto-generated"
};
internal
static
bool
IsGeneratedSymbolWithGeneratedCodeAttribute
(
ISymbol
symbol
,
INamedTypeSymbol
generatedCodeAttribute
)
{
private
static
readonly
string
[]
s_autoGeneratedStrings
=
new
[]
{
"<autogenerated"
,
"<auto-generated"
};
Debug
.
Assert
(
symbol
!=
null
);
Debug
.
Assert
(
generatedCodeAttribute
!=
null
);
internal
static
bool
IsGeneratedSymbolWithGeneratedCodeAttribute
(
ISymbol
symbol
,
INamedTypeSymbol
generatedCodeAttribute
)
// Don't check this for namespaces. Namespaces cannot have attributes on them. And,
// currently, calling DeclaringSyntaxReferences on an INamespaceSymbol is more expensive
// than is desirable.
if
(
symbol
.
Kind
!=
SymbolKind
.
Namespace
)
{
Debug
.
Assert
(
symbol
!=
null
);
Debug
.
Assert
(
generatedCodeAttribute
!=
null
);
// GeneratedCodeAttribute can only be applied once on a symbol.
// For partial symbols with more than one definition, we must treat them as non-generated code symbols.
if
(
symbol
.
DeclaringSyntaxReferences
.
Length
>
1
)
...
...
@@ -25,77 +30,81 @@ internal static class GeneratedCodeUtilities
return
false
;
}
if
(
symbol
.
GetAttributes
().
Any
(
a
=>
a
.
AttributeClass
==
generatedCodeAttribute
))
foreach
(
var
attribute
in
symbol
.
GetAttributes
(
))
{
return
true
;
if
(
generatedCodeAttribute
.
Equals
(
attribute
.
AttributeClass
))
{
return
true
;
}
}
return
symbol
.
ContainingSymbol
!=
null
&&
IsGeneratedSymbolWithGeneratedCodeAttribute
(
symbol
.
ContainingSymbol
,
generatedCodeAttribute
);
}
internal
static
bool
IsGeneratedCode
(
SyntaxTree
tree
,
Func
<
SyntaxTrivia
,
bool
>
isComment
,
CancellationToken
cancellationToken
)
{
return
IsGeneratedCodeFile
(
tree
.
FilePath
)
||
BeginsWithAutoGeneratedComment
(
tree
,
isComment
,
cancellationToken
);
}
return
symbol
.
ContainingSymbol
!=
null
&&
IsGeneratedSymbolWithGeneratedCodeAttribute
(
symbol
.
ContainingSymbol
,
generatedCodeAttribute
);
}
private
static
bool
IsGeneratedCodeFile
(
string
filePath
)
internal
static
bool
IsGeneratedCode
(
SyntaxTree
tree
,
Func
<
SyntaxTrivia
,
bool
>
isComment
,
CancellationToken
cancellationToken
)
{
return
IsGeneratedCodeFile
(
tree
.
FilePath
)
||
BeginsWithAutoGeneratedComment
(
tree
,
isComment
,
cancellationToken
);
}
private
static
bool
IsGeneratedCodeFile
(
string
filePath
)
{
if
(!
string
.
IsNullOrEmpty
(
filePath
))
{
if
(!
string
.
IsNullOrEmpty
(
filePath
))
var
fileName
=
PathUtilities
.
GetFileName
(
filePath
);
if
(
fileName
.
StartsWith
(
"TemporaryGeneratedFile_"
,
StringComparison
.
OrdinalIgnoreCase
))
{
var
fileName
=
PathUtilities
.
GetFileName
(
filePath
);
if
(
fileName
.
StartsWith
(
"TemporaryGeneratedFile_"
,
StringComparison
.
OrdinalIgnoreCase
))
{
return
true
;
}
return
true
;
}
var
extension
=
PathUtilities
.
GetExtension
(
fileName
);
if
(!
string
.
IsNullOrEmpty
(
extension
))
var
extension
=
PathUtilities
.
GetExtension
(
fileName
);
if
(!
string
.
IsNullOrEmpty
(
extension
))
{
var
fileNameWithoutExtension
=
PathUtilities
.
GetFileName
(
filePath
,
includeExtension
:
false
);
if
(
fileNameWithoutExtension
.
EndsWith
(
".designer"
,
StringComparison
.
OrdinalIgnoreCase
)
||
fileNameWithoutExtension
.
EndsWith
(
".generated"
,
StringComparison
.
OrdinalIgnoreCase
)
||
fileNameWithoutExtension
.
EndsWith
(
".g"
,
StringComparison
.
OrdinalIgnoreCase
)
||
fileNameWithoutExtension
.
EndsWith
(
".g.i"
,
StringComparison
.
OrdinalIgnoreCase
))
{
var
fileNameWithoutExtension
=
PathUtilities
.
GetFileName
(
filePath
,
includeExtension
:
false
);
if
(
fileNameWithoutExtension
.
EndsWith
(
".designer"
,
StringComparison
.
OrdinalIgnoreCase
)
||
fileNameWithoutExtension
.
EndsWith
(
".generated"
,
StringComparison
.
OrdinalIgnoreCase
)
||
fileNameWithoutExtension
.
EndsWith
(
".g"
,
StringComparison
.
OrdinalIgnoreCase
)
||
fileNameWithoutExtension
.
EndsWith
(
".g.i"
,
StringComparison
.
OrdinalIgnoreCase
))
{
return
true
;
}
return
true
;
}
}
return
false
;
}
private
static
bool
BeginsWithAutoGeneratedComment
(
SyntaxTree
tree
,
Func
<
SyntaxTrivia
,
bool
>
isComment
,
CancellationToken
cancellationToken
)
return
false
;
}
private
static
bool
BeginsWithAutoGeneratedComment
(
SyntaxTree
tree
,
Func
<
SyntaxTrivia
,
bool
>
isComment
,
CancellationToken
cancellationToken
)
{
var
root
=
tree
.
GetRoot
(
cancellationToken
);
if
(
root
.
HasLeadingTrivia
)
{
var
root
=
tree
.
GetRoot
(
cancellationToken
);
if
(
root
.
HasLeadingTrivia
)
{
var
leadingTrivia
=
root
.
GetLeadingTrivia
();
var
leadingTrivia
=
root
.
GetLeadingTrivia
();
foreach
(
var
trivia
in
leadingTrivia
)
foreach
(
var
trivia
in
leadingTrivia
)
{
if
(!
isComment
(
trivia
))
{
if
(!
isComment
(
trivia
))
{
continue
;
}
continue
;
}
var
text
=
trivia
.
ToString
();
var
text
=
trivia
.
ToString
();
// Check to see if the text of the comment contains an auto generated comment.
foreach
(
var
autoGenerated
in
s_autoGeneratedStrings
)
// Check to see if the text of the comment contains an auto generated comment.
foreach
(
var
autoGenerated
in
s_autoGeneratedStrings
)
{
if
(
text
.
Contains
(
autoGenerated
))
{
if
(
text
.
Contains
(
autoGenerated
))
{
return
true
;
}
return
true
;
}
}
}
return
false
;
}
return
false
;
}
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录