Ejemplo n.º 1
0
        public DataType FindByExternalType(DoshikExternalApiType externalType)
        {
            if (externalType == null)
            {
                return(null);
            }

            return(AllTypes.FirstOrDefault(x => x.ExternalType == externalType));
        }
Ejemplo n.º 2
0
 public string GetApiTypeFullCodeName(DoshikExternalApiType type)
 {
     return(string.Join("::", type.FullyQualifiedCodeName));
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Найти "лучшую перегрузку" метода
        /// </summary>
        public FindOverloadResult FindBestMethodOverload(
            bool isStatic,
            DoshikExternalApiType type, string methodName,
            List <FindOverloadParameter> parameters)
        {
            // ToDo: потом нужно как-то сделать нахождение перегрузки метода с учетом даункаста(учитывая правила даункаста встроенных типов и implicit методов определенных у некоторых типов)
            // а пока перегрузка будет находиться только если ЯВНО указывать конкретный тип параметров.
            // то есть в случае если не получается найти метод - нужно сделать явный тайпкаст в коде.

            var result = new FindOverloadResult();

            var suitableOverloads = new List <DoshikExternalApiTypeMethodOverload>();

            foreach (var method in type.Methods)
            {
                if (method.CodeName == methodName)
                {
                    foreach (var overload in method.Overloads)
                    {
                        if (isStatic == overload.IsStatic)
                        {
                            suitableOverloads.Add(overload);
                        }
                    }
                }
            }

            result.OverloadCount = suitableOverloads.Count;

            // Распределяем параметры в один из списков - входной или выходной

            var inParameters  = new List <DoshikExternalApiType>();
            var outParameters = new List <DoshikExternalApiType>();
            var outParametersAreInTheEndOfSequence = true;

            foreach (var parameter in parameters)
            {
                if (parameter.IsOut)
                {
                    outParameters.Add(parameter.Type);
                }
                else
                {
                    if (outParameters.Count > 0)
                    {
                        outParametersAreInTheEndOfSequence = false;
                        break;
                    }

                    inParameters.Add(parameter.Type);
                }
            }

            // У языка нет ограничения на то, должны ли out параметры быть в конце или out параметр может быть например в середине списка параметров
            // Но в external api out параметры всегда идут в конце после in параметров, по этому для этого случая (поиск перегрузки именно для external api, а не для каких-то локальных методов)
            // будем проверять что входные и выходные параметры не перемешиваются - а если перемешиваются то значит перегрузку такую не нашли (то есть НЕ находим в этом случае перегрузку)
            if (outParametersAreInTheEndOfSequence)
            {
                foreach (var overload in suitableOverloads)
                {
                    if (DoParametersMatchOverload(inParameters, outParameters, overload))
                    {
                        result.BestOverload = overload;
                        break;
                    }
                }
            }

            return(result);
        }