Beispiel #1
0
 static void TryAddExtension(LanguageProperties language, Action <IMethodOrProperty> methodFound, IMethodOrProperty ext, IReturnType resolvedType)
 {
     // now add the extension method if it fits the type
     if (MemberLookupHelper.IsApplicable(resolvedType, ext.Parameters[0].ReturnType, ext as IMethod))
     {
         IMethod method = ext as IMethod;
         if (method != null && method.TypeParameters.Count > 0)
         {
             IReturnType[] typeArguments = new IReturnType[method.TypeParameters.Count];
             MemberLookupHelper.InferTypeArgument(method.Parameters[0].ReturnType, resolvedType, typeArguments);
             for (int i = 0; i < typeArguments.Length; i++)
             {
                 if (typeArguments[i] != null)
                 {
                     ext            = (IMethod)ext.CreateSpecializedMember();
                     ext.ReturnType = ConstructedReturnType.TranslateType(ext.ReturnType, typeArguments, true);
                     for (int j = 0; j < ext.Parameters.Count; ++j)
                     {
                         ext.Parameters[j].ReturnType = ConstructedReturnType.TranslateType(ext.Parameters[j].ReturnType, typeArguments, true);
                     }
                     break;
                 }
             }
         }
         methodFound(ext);
     }
 }
Beispiel #2
0
        /// <summary>
        /// Translates typeToTranslate using the type arguments from parentType;
        /// </summary>
        static IReturnType TranslateIfRequired(IReturnType parentType, IReturnType typeToTranslate)
        {
            if (typeToTranslate == null)
            {
                return(null);
            }
            ConstructedReturnType parentConstructedType = parentType.CastToConstructedReturnType();

            if (parentConstructedType != null)
            {
                return(ConstructedReturnType.TranslateType(typeToTranslate, parentConstructedType.TypeArguments, false));
            }
            else
            {
                return(typeToTranslate);
            }
        }