コード例 #1
0
ファイル: WebApiAnalyzer.cs プロジェクト: razims/TypeSync
        public CSharpControllerModel AnalyzeController(INamedTypeSymbol classSymbol, bool isDotNetCore)
        {
            var controllerModel = new CSharpControllerModel();

            controllerModel.Name = ControllerHelper.ExtractControllerName(classSymbol.Name);

            var classAttributes = classSymbol.GetAttributes();

            if (!classAttributes.IsDefaultOrEmpty)
            {
                // .net core projects use Route attribute on controllers instead of RoutePrefix
                var routePrefix = isDotNetCore ? AttributeHelper.GetRoute(classAttributes) : AttributeHelper.GetRoutePrefix(classAttributes);

                if (!string.IsNullOrEmpty(routePrefix))
                {
                    controllerModel.RoutePrefix = routePrefix;
                }
            }

            var methodSymbols = ControllerHelper.GetPublicMethods(classSymbol);

            foreach (var methodSymbol in methodSymbols)
            {
                var methodModel = new CSharpControllerMethodModel();

                methodModel.Name = methodSymbol.Name;

                var methodAttributes = methodSymbol.GetAttributes();

                if (!methodAttributes.IsDefaultOrEmpty)
                {
                    var httpMethod = AttributeHelper.DetermineHttpMehod(methodAttributes);

                    if (httpMethod.HasValue)
                    {
                        methodModel.HttpMethod = httpMethod.Value;
                    }

                    var route = AttributeHelper.GetRoute(methodAttributes);

                    if (!string.IsNullOrEmpty(route))
                    {
                        methodModel.Route = route;
                    }
                }

                methodModel.ReturnType = _typeAnalyzer.AnalyzeType(methodSymbol.ReturnType);

                var parameters = methodSymbol.Parameters.ToList();

                foreach (var parameter in parameters)
                {
                    methodModel.Parameters.Add(new Tuple <CSharpTypeModel, string>(_typeAnalyzer.AnalyzeType(parameter.Type), parameter.Name));
                }

                controllerModel.Methods.Add(methodModel);
            }

            var dependencies = GetDependencies(classSymbol);

            foreach (var dependency in dependencies)
            {
                controllerModel.Dependencies.Add(new CSharpDependencyModel()
                {
                    Name           = dependency.Name,
                    Namespace      = dependency.ContainingNamespace.ToString(),
                    DependencyKind = dependency.TypeKind == TypeKind.Class ? DependencyKind.Model : DependencyKind.Enum
                });
            }

            return(controllerModel);
        }