private static string GetMemberKind(AnalysisValue type, ModuleInfo declModule, bool isRef) { SpecializedNamespace specialCallable = type as SpecializedNamespace; if (specialCallable != null) { if (specialCallable.Original == null) { return("data"); } return(GetMemberKind(specialCallable.Original, declModule, isRef)); } switch (type.MemberType) { case PythonMemberType.Function: if (type is BuiltinFunctionInfo || type.DeclaringModule != declModule.ProjectEntry) { return("funcref"); } return("function"); case PythonMemberType.Method: return("method"); case PythonMemberType.Property: return("property"); case PythonMemberType.Class: if (isRef || type is BuiltinClassInfo || (type is ClassInfo && type.DeclaringModule.GetModuleInfo() != declModule)) { return("typeref"); } return("type"); case PythonMemberType.Module: return("moduleref"); case PythonMemberType.Instance: default: return("data"); } }
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); }