private IAnalysisSet NewType_Call(Node node, AnalysisUnit unit, IAnalysisSet[] args, NameExpression[] keywordArgNames) { return(unit.InterpreterScope.GetOrMakeNodeValue(node, Analyzer.NodeValueKind.TypeAnnotation, n => { var name = PythonAnalyzer.GetArg(args, keywordArgNames, null, 0).GetConstantValueAsString().FirstOrDefault(x => !string.IsNullOrEmpty(x)); var baseType = PythonAnalyzer.GetArg(args, keywordArgNames, null, 1) ?? unit.State.ClassInfos[BuiltinTypeId.Object].Instance; if (string.IsNullOrEmpty(name)) { return baseType; } var instPi = new ProtocolInfo(unit.ProjectEntry, unit.State); var np = new NameProtocol(instPi, name, memberType: PythonMemberType.Instance); var cls = new NamespaceProtocol(instPi, "__class__"); instPi.AddProtocol(np); instPi.AddProtocol(cls); var pi = new ProtocolInfo(unit.ProjectEntry, unit.State); pi.AddProtocol(new NameProtocol(pi, name)); pi.AddProtocol(new InstanceProtocol(pi, Array.Empty <IAnalysisSet>(), instPi)); pi.AddReference(n, unit); cls.SetMember(n, unit, null, pi); return pi; })); }
public override Protocol Clone(ProtocolInfo newSelf) { var np = new NamespaceProtocol(newSelf, _name); _values.CopyTo(np._values); return(np); }
private IAnalysisSet NewType_Call(Node node, AnalysisUnit unit, IAnalysisSet[] args, NameExpression[] keywordArgNames) { return(unit.InterpreterScope.GetOrMakeNodeValue(node, Analyzer.NodeValueKind.TypeAnnotation, n => { if (args.Length == 0) { return AnalysisSet.Empty; // No arguments given } var arg = PythonAnalyzer.GetArg(args, keywordArgNames, null, 0); var name = arg.GetConstantValueAsString().FirstOrDefault(x => !string.IsNullOrEmpty(x)); var baseTypeSet = PythonAnalyzer.GetArg(args, keywordArgNames, null, 1) ?? unit.State.ClassInfos[BuiltinTypeId.Object].Instance; if (string.IsNullOrEmpty(name)) { return baseTypeSet; } var instPi = new ProtocolInfo(unit.ProjectEntry, unit.State); var np = new NameProtocol(instPi, name, memberType: PythonMemberType.Instance, typeId: BuiltinTypeId.Type); var cls = new NamespaceProtocol(instPi, "__class__"); // Declares class type instPi.AddProtocol(np); instPi.AddProtocol(cls); // Add base delegate so we can see actual type members var baseType = baseTypeSet.FirstOrDefault(); if (baseType != null) { var bt = new TypeDelegateProtocol(instPi, baseType); instPi.AddProtocol(bt); } var pi = new ProtocolInfo(unit.ProjectEntry, unit.State); pi.AddProtocol(new NameProtocol(pi, name, memberType: PythonMemberType.Instance, typeId: BuiltinTypeId.Type)); pi.AddProtocol(new InstanceProtocol(pi, Array.Empty <IAnalysisSet>(), instPi)); pi.AddReference(n, unit); cls.SetMember(n, unit, null, pi); return pi; })); }
private IAnalysisSet CreateNamedTuple(Node node, AnalysisUnit unit, IAnalysisSet namedTupleName, IAnalysisSet namedTupleArgs) { var args = namedTupleArgs == null ? null : TypingTypeInfo.ToTypeList(namedTupleArgs); var res = new ProtocolInfo(unit.ProjectEntry, unit.State); string name; var description = new List <KeyValuePair <string, string> >(); if (args != null && args.Any()) { var tupleItem = new List <IAnalysisSet>(); foreach (var a in args) { // each arg is going to be either a union containing a string literal and type, // or a list with string literal and type. IAnalysisSet nameSet = a, valueSet = a; if (a is TypingTypeInfo tti) { var list = tti.ToTypeList(); if (list != null && list.Count >= 2) { nameSet = list[0]; valueSet = AnalysisSet.UnionAll(list.Skip(1)); } } if (!nameSet.Split(out IReadOnlyList <ConstantInfo> names, out var rest)) { names = a.OfType <ConstantInfo>().ToArray(); } name = names.Select(n => n.GetConstantValueAsString()).FirstOrDefault(n => !string.IsNullOrEmpty(n)) ?? "unnamed"; var p = new NamespaceProtocol(res, name); var value = ToInstance(valueSet); p.SetMember(node, unit, name, value); tupleItem.Add(value); res.AddProtocol(p); if (description.Any()) { description.Add(new KeyValuePair <string, string>(WellKnownRichDescriptionKinds.Comma, ", ")); } description.AddRange(p.GetRichDescription()); } res.AddProtocol(new TupleProtocol(res, tupleItem)); } name = namedTupleName?.GetConstantValueAsString().FirstOrDefault() ?? "tuple"; var np = new NameProtocol(res, name); if (description.Any()) { np.ExtendDescription(new KeyValuePair <string, string>(WellKnownRichDescriptionKinds.Misc, "(")); np.ExtendDescription(description); np.ExtendDescription(new KeyValuePair <string, string>(WellKnownRichDescriptionKinds.Misc, ")")); } res.AddProtocol(np); return(res); }