//------------------------------------------------------------ // CreateGetTypeFromHandleMethodSym // /// <summary> /// <para>Defined in FuncBindUtil.cs</para> /// </summary> /// <param name="treeNode"></param> /// <returns></returns> //------------------------------------------------------------ internal METHSYM CreateGetTypeFromHandleMethodSym(BASENODE treeNode) { if (GetTypeFromHandleMethodSym != null) { return(GetTypeFromHandleMethodSym); } // System.RuntimeTypeHandle TYPESYM handleTypeSym = this.GetRequiredPredefinedType(PREDEFTYPE.TYPEHANDLE); DebugUtil.Assert(handleTypeSym != null); TypeArray paramArray = new TypeArray(); paramArray.Add(handleTypeSym); paramArray = Compiler.MainSymbolManager.AllocParams(paramArray); GetTypeFromHandleMethodSym = FindPredefMeth( treeNode, PREDEFNAME.GETTYPEFROMHANDLE, this.GetRequiredPredefinedType(PREDEFTYPE.TYPE), paramArray, true, MemLookFlagsEnum.None); DebugUtil.Assert(GetTypeFromHandleMethodSym != null); return(GetTypeFromHandleMethodSym); }
//------------------------------------------------------------ // CLSDREC.DefineExtensionMethodCore // /// <summary></summary> /// <param name="methodSym"></param> //------------------------------------------------------------ internal void DefineExtensionMethodCore(METHSYM methodSym) { DebugUtil.Assert(methodSym != null); DebugUtil.Assert(methodSym.ParameterTypes.Count > 0); TypeArray paramTypes = methodSym.ParameterTypes; AGGTYPESYM ats = paramTypes[0] as AGGTYPESYM; if (ats == null) { return; } AGGSYM targetAggSym = ats.GetAggregate(); METHSYM instanceMethSym = Compiler.MainSymbolManager.CreateGlobalSym( SYMKIND.METHSYM, methodSym.Name, targetAggSym) as METHSYM; instanceMethSym.ContainingAggDeclSym = targetAggSym.FirstDeclSym; instanceMethSym.IsUnsafe = methodSym.IsUnsafe; instanceMethSym.TypeVariables = methodSym.TypeVariables; TypeArray instParamTypes = new TypeArray(); for (int i = 1; i < paramTypes.Count; ++i) { instParamTypes.Add(paramTypes[i]); } instanceMethSym.ParameterTypes = Compiler.MainSymbolManager.AllocParams(instParamTypes); instanceMethSym.ReturnTypeSym = methodSym.ReturnTypeSym; instanceMethSym.Access = methodSym.Access; instanceMethSym.IsStatic = false; instanceMethSym.IsParameterArray = methodSym.IsParameterArray; instanceMethSym.IsVarargs = methodSym.IsVarargs; instanceMethSym.StaticExtensionMethodSym = methodSym; }