public extendPath ( Analyzer analyzer, string pathname ) : string | ||
analyzer | Analyzer | |
pathname | string | |
Résultat | string |
public DataType VisitClass(ClassDef c) { var path = scope.extendPath(analyzer, c.name.Name); ClassType classType = new ClassType(c.name.Name, scope, path); List <DataType> baseTypes = new List <DataType>(); foreach (var @base in c.args) { DataType baseType = @base.Accept(this); switch (baseType) { case ClassType _: classType.addSuper(baseType); break; case UnionType ut: foreach (DataType parent in ut.types) { classType.addSuper(parent); } break; default: analyzer.putProblem(@base, @base + " is not a class"); break; } baseTypes.Add(baseType); } // XXX: Not sure if we should add "bases", "name" and "dict" here. They // must be added _somewhere_ but I'm just not sure if it should be HERE. addSpecialAttribute(classType.Table, "__bases__", analyzer.TypeFactory.CreateTuple(baseTypes.ToArray())); addSpecialAttribute(classType.Table, "__name__", DataType.Str); addSpecialAttribute(classType.Table, "__dict__", analyzer.TypeFactory.CreateDict(DataType.Str, DataType.Unknown)); addSpecialAttribute(classType.Table, "__module__", DataType.Str); addSpecialAttribute(classType.Table, "__doc__", DataType.Str); // Bind ClassType to name here before resolving the body because the // methods need this type as self. scope.Bind(analyzer, c.name, classType, BindingKind.CLASS); if (c.body != null) { var sOld = this.scope; this.scope = classType.Table; c.body.Accept(this); this.scope = sOld; } return(DataType.Cont); }
ClassType newClass(string name, State table, ClassType superClass, params ClassType[] moreSupers) { var path = table.extendPath(analyzer, name); ClassType t = new ClassType(name, table, path, superClass); foreach (ClassType c in moreSupers) { t.addSuper(c); } return t; }