本文整理汇总了C#中CompilationStartAnalysisContext.RegisterOperationAction方法的典型用法代码示例。如果您正苦于以下问题:C# CompilationStartAnalysisContext.RegisterOperationAction方法的具体用法?C# CompilationStartAnalysisContext.RegisterOperationAction怎么用?C# CompilationStartAnalysisContext.RegisterOperationAction使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CompilationStartAnalysisContext
的用法示例。
在下文中一共展示了CompilationStartAnalysisContext.RegisterOperationAction方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: RegisterOperationAction
/// <summary>Called once at compilation start to register actions in the compilation context.</summary>
/// <param name="context">The analysis context.</param>
internal void RegisterOperationAction(CompilationStartAnalysisContext context)
{
context.RegisterOperationAction(
(operationContext) =>
{
IArrayCreationExpression arrayCreation = (IArrayCreationExpression)operationContext.Operation;
// ToDo: Need to suppress analysis of array creation expressions within attribute applications.
// Detect array creation expression that have rank 1 and size 0. Such expressions
// can be replaced with Array.Empty<T>(), provided that the element type can be a generic type argument.
if (arrayCreation.DimensionSizes.Length == 1
//// Pointer types can't be generic type arguments.
&& arrayCreation.ElementType.TypeKind != TypeKind.Pointer)
{
Optional<object> arrayLength = arrayCreation.DimensionSizes[0].ConstantValue;
if (arrayLength.HasValue &&
arrayLength.Value is int &&
(int)arrayLength.Value == 0)
{
Report(operationContext, arrayCreation.Syntax);
}
}
},
OperationKind.ArrayCreationExpression);
}
示例2: OnCompilationStart
private static void OnCompilationStart(CompilationStartAnalysisContext context)
{
var listType = context.Compilation.GetTypeByMetadataName(IListMetadataName);
var readonlyListType = context.Compilation.GetTypeByMetadataName(IReadOnlyListMetadataName);
var enumerableType = context.Compilation.GetTypeByMetadataName(EnumerableMetadataName);
if (readonlyListType == null || enumerableType == null || listType == null)
{
return;
}
context.RegisterOperationAction(operationContext =>
{
var invocation = (IInvocationExpression)operationContext.Operation;
if (!IsPossibleLinqInvocation(invocation))
{
return;
}
var methodSymbol = invocation.TargetMethod.ReducedFrom ?? invocation.TargetMethod;
var targetType = invocation.GetReceiverType(operationContext.Compilation, beforeConversion: true, cancellationToken: operationContext.CancellationToken);
if (methodSymbol == null || targetType == null)
{
return;
}
if (!IsSingleParameterLinqMethod(methodSymbol, enumerableType))
{
return;
}
if (!IsTypeWithInefficientLinqMethods(targetType, readonlyListType, listType))
{
return;
}
operationContext.ReportDiagnostic(Diagnostic.Create(Rule, invocation.Syntax.GetLocation()));
}, OperationKind.InvocationExpression);
}
开发者ID:bkoelman,项目名称:roslyn-analyzers,代码行数:38,代码来源:DoNotUseEnumerableMethodsOnIndexableCollectionsInsteadUseTheCollectionDirectly.cs