public DataType FindByExternalType(DoshikExternalApiType externalType) { if (externalType == null) { return(null); } return(AllTypes.FirstOrDefault(x => x.ExternalType == externalType)); }
public string GetApiTypeFullCodeName(DoshikExternalApiType type) { return(string.Join("::", type.FullyQualifiedCodeName)); }
/// <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); }