Ejemplo n.º 1
0
    public SD_Mehod_ReflectedConstructor(ConstructorInfo constructorInfo, SymbolDefinition memberOf)
    {
        modifiers =
            constructorInfo.IsPublic ? Modifiers.Public :
            constructorInfo.IsFamilyOrAssembly ? Modifiers.Internal | Modifiers.Protected :
            constructorInfo.IsAssembly ? Modifiers.Internal :
            constructorInfo.IsFamily ? Modifiers.Protected :
            Modifiers.Private;
        if (constructorInfo.IsAbstract)
        {
            modifiers |= Modifiers.Abstract;
        }
        if (constructorInfo.IsStatic)
        {
            modifiers |= Modifiers.Static;
        }
        accessLevel = AccessLevelFromModifiers(modifiers);

        name         = ".ctor";
        kind         = SymbolKind.Constructor;
        parentSymbol = memberOf;

        returnType = new SymbolReference(memberOf);

        if (parameters == null)
        {
            parameters = new List <SD_Instance_Parameter>();
        }
        foreach (var p in constructorInfo.GetParameters())
        {
            var isByRef        = p.ParameterType.IsByRef;
            var parameterType  = isByRef ? p.ParameterType.GetElementType() : p.ParameterType;
            var parameterToAdd = new SD_Instance_Parameter
            {
                kind         = SymbolKind.Parameter,
                parentSymbol = this,
                name         = p.Name,
                type         = ReflectedTypeReference.ForType(parameterType),
                modifiers    = isByRef ? (p.IsOut ? Modifiers.Out : Modifiers.Ref) : Attribute.IsDefined(p, typeof(ParamArrayAttribute)) ? Modifiers.Params : Modifiers.None,
            };
            if (p.RawDefaultValue != DBNull.Value)
            {
                parameterToAdd.defaultValue = p.RawDefaultValue == null ? "null" : p.RawDefaultValue.ToString();
            }
            parameters.Add(parameterToAdd);
        }
    }
Ejemplo n.º 2
0
    public static MethodDefinition ResolveMethodOverloads(int numArguments, List <TypeDefinitionBase> argumentTypes, Modifiers[] modifiers, List <MethodDefinition> candidates)
    {
        // find best match
        MethodDefinition bestMatch = null;
        var bestExactMatches       = -1;

        foreach (var method in candidates)
        {
            var parameters   = method.GetParameters();
            var expandParams = true;

tryNotExpanding:

            var exactMatches = 0;
            SD_Instance_Parameter paramsArray = null;
            for (var i = 0; i < UnityEngine.Mathf.Min(numArguments, parameters.Count); ++i)
            {
                if (argumentTypes[i] == null)
                {
                    exactMatches = -1;
                    break;
                }

                if (expandParams && paramsArray == null && parameters[i].IsParametersArray)
                {
                    paramsArray = parameters[i];
                }

                TypeDefinitionBase parameterType = null;
                if (paramsArray != null)
                {
                    var arrayType = paramsArray.TypeOf() as SD_Type_Array;
                    if (arrayType != null)
                    {
                        parameterType = arrayType.elementType;
                    }
                }
                else
                {
                    if (i >= parameters.Count)
                    {
                        exactMatches = -1;
                        break;
                    }
                    parameterType = parameters[i].TypeOf() as TypeDefinitionBase;
                }
                parameterType = parameterType == null ? unknownType : parameterType.SubstituteTypeParameters(method);

                if (argumentTypes[i].IsSameType(parameterType))
                {
                    ++exactMatches;
                    continue;
                }
                if (!argumentTypes[i].CanConvertTo(parameterType))
                {
                    exactMatches = -1;
                    break;
                }
            }
            if (exactMatches < 0)
            {
                if (paramsArray == null)
                {
                    continue;
                }

                expandParams = false;
                paramsArray  = null;
                goto tryNotExpanding;
            }
            if (exactMatches > bestExactMatches)
            {
                bestExactMatches = exactMatches;
                bestMatch        = method;
            }
            else if (exactMatches == bestExactMatches)
            {
                if (method.NumTypeParameters == 0 && bestMatch.NumTypeParameters > 0)
                {
                    bestMatch = method;
                }
            }
        }

        if (bestMatch != null)
        {
            return(bestMatch);
        }
        if (candidates.Count <= 1)
        {
            return(unresolvedMethodOverload);
        }
        return(ambiguousMethodOverload);// candidates[0];
    }
    public SD_Method_Reflected(MethodInfo methodInfo, SymbolDefinition memberOf)
    {
        modifiers =
            methodInfo.IsPublic ? Modifiers.Public :
            methodInfo.IsFamilyOrAssembly ? Modifiers.Internal | Modifiers.Protected :
            methodInfo.IsAssembly ? Modifiers.Internal :
            methodInfo.IsFamily ? Modifiers.Protected :
            Modifiers.Private;
        if (methodInfo.IsAbstract)
        {
            modifiers |= Modifiers.Abstract;
        }
        if (methodInfo.IsVirtual)
        {
            modifiers |= Modifiers.Virtual;
        }
        if (methodInfo.IsStatic)
        {
            modifiers |= Modifiers.Static;
        }
        if (methodInfo.GetBaseDefinition().DeclaringType != methodInfo.DeclaringType)
        {
            modifiers = (modifiers & ~Modifiers.Virtual) | Modifiers.Override;
        }
        if (methodInfo.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false) && IsStatic)
        {
            var parentType = memberOf.parentSymbol as TypeDefinitionBase;
            if (parentType.kind == SymbolKind.Class && parentType.IsStatic && parentType.NumTypeParameters == 0)
            {
                isExtensionMethod = true;
                ++parentType.numExtensionMethods;
            }
        }
        accessLevel = AccessLevelFromModifiers(modifiers);

        reflectedMethodInfo = methodInfo;
        var genericMarker = methodInfo.Name.IndexOf('`');

        name         = genericMarker < 0 ? methodInfo.Name : methodInfo.Name.Substring(0, genericMarker);
        parentSymbol = memberOf;

        var tp = methodInfo.GetGenericArguments();

        if (tp.Length > 0)
        {
            var numGenericArgs = tp.Length;
            typeParameters = new List <SD_Type_Parameter>(tp.Length);
            for (var i = tp.Length - numGenericArgs; i < tp.Length; ++i)
            {
                var tpDef = new SD_Type_Parameter {
                    kind = SymbolKind.TypeParameter, name = tp[i].Name, parentSymbol = this
                };
                typeParameters.Add(tpDef);
            }
        }

        returnType = ReflectedTypeReference.ForType(methodInfo.ReturnType);

        if (parameters == null)
        {
            parameters = new List <SD_Instance_Parameter>();
        }
        var methodParameters = methodInfo.GetParameters();

        for (var i = 0; i < methodParameters.Length; ++i)
        {
            var p = methodParameters[i];

            var isByRef        = p.ParameterType.IsByRef;
            var parameterType  = isByRef ? p.ParameterType.GetElementType() : p.ParameterType;
            var parameterToAdd = new SD_Instance_Parameter
            {
                kind         = SymbolKind.Parameter,
                parentSymbol = this,
                name         = p.Name,
                type         = ReflectedTypeReference.ForType(parameterType),
                modifiers    = isByRef ? (p.IsOut ? Modifiers.Out : Modifiers.Ref) : Attribute.IsDefined(p, typeof(ParamArrayAttribute)) ? Modifiers.Params : Modifiers.None,
            };
            if (i == 0 && isExtensionMethod)
            {
                parameterToAdd.modifiers |= Modifiers.This;
            }
            if (p.RawDefaultValue != DBNull.Value)
            {
                //var dv = Attribute.GetCustomAttribute(p, typeof(System.ComponentModel.DefaultValueAttribute));
                parameterToAdd.defaultValue = p.RawDefaultValue == null ? "null" : p.RawDefaultValue.ToString();
            }
            parameters.Add(parameterToAdd);
        }
    }