/// <summary> /// 返回所有HttpApi诊断器 /// </summary> /// <param name="context"></param> /// <returns></returns> private IEnumerable <HttpApiDiagnostic> GetHttpApiDiagnostics(HttpApiContext context) { yield return(new AttributeDiagnostic(context)); yield return(new ReturnTypeDiagnostic(context)); yield return(new RefParameterDiagnostic(context)); yield return(new NotMethodDefindedDiagnostic(context)); yield return(new GenericMethodDiagnostic(context)); yield return(new UriAttributeDiagnostic(context)); }
/// <summary> /// 初始化 /// </summary> /// <param name="context">上下文</param> public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeAction(syntaxNodeContext => { var httpApiContext = new HttpApiContext(syntaxNodeContext); if (httpApiContext.IsHtttApi == true) { foreach (var item in this.GetHttpApiDiagnostics(httpApiContext)) { item.Report(); } } }, SyntaxKind.InterfaceDeclaration); }
/// <summary> /// 返回所有HttpApi诊断器 /// </summary> /// <param name="context"></param> /// <returns></returns> private IEnumerable <HttpApiDiagnosticProvider> GetDiagnosticProviders(HttpApiContext context) { yield return(new CtorAttributeDiagnosticProvider(context)); yield return(new ReturnTypeDiagnosticProvider(context)); yield return(new RefParameterDiagnosticProvider(context)); yield return(new NotMethodDefindedDiagnosticProvider(context)); yield return(new GenericMethodDiagnosticProvider(context)); yield return(new UriAttributeDiagnosticProvider(context)); yield return(new ModifierDiagnosticProvider(context)); }
/// <summary> /// 初始化 /// </summary> /// <param name="context">上下文</param> public override void Initialize(AnalysisContext context) { context.RegisterSyntaxNodeAction(syntaxNodeContext => { if (HttpApiContext.TryParse(syntaxNodeContext, out var httpApiContext)) { if (httpApiContext != null) { var diagnostics = this .GetDiagnosticProviders(httpApiContext) .SelectMany(d => d.CreateDiagnostics()); foreach (var item in diagnostics) { syntaxNodeContext.ReportDiagnostic(item); } } } }, SyntaxKind.InterfaceDeclaration); }
/// <summary> /// 尝试解析 /// </summary> /// <param name="syntaxNodeContext"></param> /// <param name="context"></param> /// <returns></returns> public static bool TryParse(SyntaxNodeAnalysisContext syntaxNodeContext, out HttpApiContext?context) { context = null; var syntax = syntaxNodeContext.Node as InterfaceDeclarationSyntax; if (syntax == null) { return(false); } var @interface = syntaxNodeContext.Compilation.GetSemanticModel(syntax.SyntaxTree).GetDeclaredSymbol(syntax); if (@interface == null) { return(false); } var ihttpApi = syntaxNodeContext.Compilation.GetTypeByMetadataName(IHttpApiTypeName); if (ihttpApi == null) { return(false); } var iapiAttribute = syntaxNodeContext.Compilation.GetTypeByMetadataName(IApiAttributeTypeName); if (IsHttpApiInterface(@interface, ihttpApi, iapiAttribute) == false) { return(false); } var methods = @interface.GetMembers().OfType <IMethodSymbol>().ToArray(); var uriAttribute = syntaxNodeContext.Compilation.GetTypeByMetadataName(UriAttributeTypeName); var attributeCtorUsageAttribute = syntaxNodeContext.Compilation.GetTypeByMetadataName(AttributeCtorUsageTypName); context = new HttpApiContext(syntax, @interface, methods, uriAttribute, attributeCtorUsageAttribute); return(true); }
/// <summary> /// HttpApi诊断器 /// </summary> /// <param name="context">上下文</param> public HttpApiDiagnosticProvider(HttpApiContext context) { this.Context = context; }
/// <summary> /// HttpApi诊断器 /// </summary> /// <param name="context">上下文</param> public HttpApiDiagnostic(HttpApiContext context) { this.Context = context; }