提交 d68f519e 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #19875 from CyrusNajmabadi/lessAllocations2

Reduce allocations in IsGeneratedSymbolWithGeneratedCodeAttribute.
......@@ -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.
先完成此消息的编辑!
想要评论请 注册