public async Task <List <DiagnosticData> > GetCurrentAcuminatorDiagnosticForDocumentSpanAsync(Document document, TextSpan caretSpan,
                                                                                                      CancellationToken cancellationToken = default)
        {
            var componentModelType = _componentModel.GetType();

            try
            {
                object dataTask = _getDiagnosticOnTextSpanMethod.Invoke(_roslynAnalyzersService,
                                                                        new object[] { document, caretSpan, null, false, cancellationToken });
                if (!(dataTask is Task task))
                {
                    return(new List <DiagnosticData>());
                }

                await  task;
                object rawResult = _taskResultPropertyInfo.GetValue(dataTask);

                if (!(rawResult is IEnumerable <object> diagnosticsRaw) || diagnosticsRaw.IsNullOrEmpty())
                {
                    return(new List <DiagnosticData>());
                }

                return(diagnosticsRaw.Select(rawData => DiagnosticData.Create(rawData))
                       .Where(diagnosticData => diagnosticData != null && IsAcuminatorDiagnostic(diagnosticData))
                       .ToList(capacity: 1));
            }
            catch (Exception e)
            {
                return(new List <DiagnosticData>());
            }
        }
        private static object GetDiagnosticServiceInstance(IComponentModel componentModel, Type diagnosticAnalyzerServiceType)
        {
            Type componentModelType   = componentModel.GetType();
            var  getServiceMethodInfo = componentModelType.GetMethod(nameof(componentModel.GetService))
                                        ?.MakeGenericMethod(diagnosticAnalyzerServiceType);

            if (getServiceMethodInfo == null)
            {
                return(null);
            }

            try
            {
                return(getServiceMethodInfo.Invoke(componentModel, null));
            }
            catch (Exception e)
            {
                return(null);
            }
        }
        public ComponentPropertiesEditorViewModel Create(IComponentModel componentModel)
        {
            switch (componentModel)
            {
            case Transform3DComponentModel transformComponentModel:
                return(new Transform3DComponentPropertiesEditorViewModel(transformComponentModel));

            case EllipseRendererComponentModel ellipseRendererComponentModel:
                return(new EllipseRendererComponentPropertiesEditorViewModel(ellipseRendererComponentModel));

            case RectangleRendererComponentModel rectangleRendererComponentModel:
                return(new RectangleRendererComponentPropertiesEditorViewModel(rectangleRendererComponentModel));

            case TextRendererComponentModel textRendererComponentModel:
                return(new TextRendererComponentPropertiesEditorViewModel(textRendererComponentModel));

            case CircleColliderComponentModel circleColliderComponentModel:
                return(new CircleColliderComponentPropertiesEditorViewModel(circleColliderComponentModel));

            case RectangleColliderComponentModel rectangleColliderComponentModel:
                return(new RectangleColliderComponentPropertiesEditorViewModel(rectangleColliderComponentModel));

            default:
                throw new ArgumentOutOfRangeException(nameof(componentModel), $"Component model of type {componentModel.GetType()} is not supported.");
            }
        }