/// <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));
        }
Beispiel #2
0
 /// <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);
 }
Beispiel #3
0
        /// <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));
        }
Beispiel #4
0
        /// <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;
 }
Beispiel #7
0
 /// <summary>
 /// HttpApi诊断器
 /// </summary>
 /// <param name="context">上下文</param>
 public HttpApiDiagnostic(HttpApiContext context)
 {
     this.Context = context;
 }