예제 #1
0
        public override BoundNode VisitMethodInfo(BoundMethodInfo node)
        {
            var rewrittenMethod = VisitMethodSymbol(node.Method);

            // No need to rewrite the node's type, because it is always System.Reflection.MethodInfo
            return(node.Update(rewrittenMethod, node.GetMethodFromHandle, node.Type));
        }
예제 #2
0
파일: SaveAnalysis.cs 프로젝트: yuts/PTVS
        private Dictionary <string, object> GenerateMethod(BoundMethodInfo bmi)
        {
            var res = GenerateFunction(bmi.Function);

            if (bmi.Instance != null && bmi.Instance.TypeId != BuiltinTypeId.NoneType)
            {
                res["bound"] = true;
            }
            return(res);
        }
예제 #3
0
        private void EmitMethodInfoExpression(BoundMethodInfo node)
        {
            _builder.EmitOpCode(ILOpCode.Ldtoken);
            EmitSymbolToken(node.Method, node.Syntax, null);

            MethodSymbol getMethod = node.GetMethodFromHandle;
            Debug.Assert((object)getMethod != null);

            if (getMethod.ParameterCount == 1)
            {
                _builder.EmitOpCode(ILOpCode.Call, stackAdjustment: 0); //argument off, return value on
            }
            else
            {
                Debug.Assert(getMethod.ParameterCount == 2);
                _builder.EmitOpCode(ILOpCode.Ldtoken);
                EmitSymbolToken(node.Method.ContainingType, node.Syntax);
                _builder.EmitOpCode(ILOpCode.Call, stackAdjustment: -1); //2 arguments off, return value on
            }

            EmitSymbolToken(getMethod, node.Syntax, null);
            if (node.Type != getMethod.ReturnType)
            {
                _builder.EmitOpCode(ILOpCode.Castclass);
                EmitSymbolToken(node.Type, node.Syntax);
            }
        }
예제 #4
0
 public override BoundNode VisitMethodInfo(BoundMethodInfo node)
 {
     var rewrittenMethod = VisitMethodSymbol(node.Method);
     // No need to rewrite the node's type, because it is always System.Reflection.MethodInfo
     return node.Update(rewrittenMethod, node.GetMethodFromHandle, node.Type);
 }
예제 #5
0
파일: SaveAnalysis.cs 프로젝트: yuts/PTVS
        private object GetMemberValueInternal(AnalysisValue type, ModuleInfo declModule, bool isRef)
        {
            SpecializedNamespace specialCallable = type as SpecializedNamespace;

            if (specialCallable != null)
            {
                if (specialCallable.Original == null)
                {
                    return(null);
                }
                return(GetMemberValueInternal(specialCallable.Original, declModule, isRef));
            }

            switch (type.MemberType)
            {
            case PythonMemberType.Function:
                FunctionInfo fi = type as FunctionInfo;
                if (fi != null)
                {
                    if (fi.DeclaringModule.GetModuleInfo() != declModule)
                    {
                        return(GenerateFuncRef(fi));
                    }
                    else
                    {
                        return(GenerateFunction(fi));
                    }
                }

                BuiltinFunctionInfo bfi = type as BuiltinFunctionInfo;
                if (bfi != null)
                {
                    return(GenerateFuncRef(bfi));
                }

                return("function");

            case PythonMemberType.Method:
                BoundMethodInfo mi = type as BoundMethodInfo;
                if (mi != null)
                {
                    return(GenerateMethod(mi));
                }
                return("method");

            case PythonMemberType.Property:
                FunctionInfo prop = type as FunctionInfo;
                if (prop != null)
                {
                    return(GenerateProperty(prop));
                }
                break;

            case PythonMemberType.Class:
                ClassInfo ci = type as ClassInfo;
                if (ci != null)
                {
                    if (isRef || ci.DeclaringModule.GetModuleInfo() != declModule)
                    {
                        // TODO: Save qualified name so that classes defined in classes/function can be resolved
                        return(GetTypeRef(ci.DeclaringModule.ModuleName, ci.Name));
                    }
                    else
                    {
                        return(GenerateClass(ci, declModule));
                    }
                }

                BuiltinClassInfo bci = type as BuiltinClassInfo;
                if (bci != null)
                {
                    return(GetTypeRef(bci.PythonType.DeclaringModule.Name, bci.PythonType.Name));
                }
                return("type");

            case PythonMemberType.Constant:
                ConstantInfo constantInfo = type as ConstantInfo;
                if (constantInfo != null)
                {
                    return(GenerateConstant(constantInfo));
                }
                break;

            case PythonMemberType.Module:
                if (type is ModuleInfo)
                {
                    return(GetModuleName(((ModuleInfo)type).Name));
                }
                else if (type is BuiltinModule)
                {
                    return(GetModuleName(((BuiltinModule)type).Name));
                }
                break;

            case PythonMemberType.Instance:
                return(new Dictionary <string, object> {
                    { "type", GenerateTypeName(type, true) }
                });

            default:
                return(new Dictionary <string, object>()
                {
                    { "type", GenerateTypeName(type.PythonType) }
                });
            }
            return(null);
        }
예제 #6
0
        private object GetMemberValue(Namespace type, bool isRef)
        {
            switch (type.ResultType)
            {
            case PythonMemberType.Function:
                FunctionInfo fi = type as FunctionInfo;
                if (fi != null)
                {
                    return(GenerateFunction(fi));
                }

                BuiltinFunctionInfo bfi = type as BuiltinFunctionInfo;
                if (bfi != null)
                {
                    return(GenerateFunction(bfi));
                }
                return("function");

            case PythonMemberType.Method:
                BoundMethodInfo mi = type as BoundMethodInfo;
                if (mi != null)
                {
                    return(GenerateFunction(mi.Function));
                }
                return("method");

            case PythonMemberType.Property:
                FunctionInfo prop = type as FunctionInfo;
                if (prop != null)
                {
                    return(GenerateProperty(prop));
                }
                break;

            case PythonMemberType.Class:
                ClassInfo ci = type as ClassInfo;
                if (ci != null)
                {
                    if (isRef)
                    {
                        return(GenerateClassRef(ci));
                    }
                    else
                    {
                        return(GenerateClass(ci));
                    }
                }

                BuiltinClassInfo bci = type as BuiltinClassInfo;
                if (bci != null)
                {
                    return(GenerateClassRef(bci));
                }
                return("type");

            case PythonMemberType.Constant:
                ConstantInfo constantInfo = type as ConstantInfo;
                if (constantInfo != null)
                {
                    return(GenerateConstant(constantInfo));
                }
                break;

            case PythonMemberType.Module:
                if (type is ModuleInfo)
                {
                    return(new Dictionary <string, object>()
                    {
                        { "module_name", ((ModuleInfo)type).Name }
                    });
                }
                else if (type is BuiltinModule)
                {
                    return(new Dictionary <string, object>()
                    {
                        { "module_name", ((BuiltinModule)type).Name }
                    });
                }
                break;

            case PythonMemberType.Instance:
                InstanceInfo instInfo = type as InstanceInfo;
                if (instInfo != null)
                {
                    return(new Dictionary <string, object>()
                    {
                        { "type", GenerateTypeName(instInfo.ClassInfo) }
                    });
                }

                SequenceInfo seqInfo = type as SequenceInfo;
                if (seqInfo != null)
                {
                    return(new Dictionary <string, object>()
                    {
                        { "type", GenerateTypeName(seqInfo.ClassInfo) }
                    });
                }
                break;

            default:
                return(new Dictionary <string, object>()
                {
                    { "type", GenerateTypeName(type.PythonType) }
                });
            }
            return(null);
        }