protected override void AnalyzeWorker(DDG ddg) { var newScope = (DeclaringModule.NodeScopes[Ast] as ClassScope).Class; newScope.Bases.Clear(); // Process base classes foreach (var baseClass in Ast.Bases) { baseClass.Walk(ddg); var bases = ddg._eval.Evaluate(baseClass); newScope.Bases.Add(bases); foreach (var baseValue in bases) { ClassInfo ci = baseValue as ClassInfo; if (ci != null) { ci.SubClasses.AddTypes(Ast, newScope._analysisUnit, new[] { newScope }); } } } ddg.WalkBody(Ast.Body, newScope._analysisUnit); }
protected override void AnalyzeWorker(DDG ddg, CancellationToken cancel) { InterpreterScope scope; if (!ddg.Scope.TryGetNodeScope(Ast, out scope)) { return; } var classInfo = ((ClassScope)scope).Class; var bases = new List <INamespaceSet>(); if (Ast.Bases.Count == 0) { if (ddg.ProjectState.LanguageVersion.Is3x()) { // 3.x all classes inherit from object by default bases.Add(ddg.ProjectState.ClassInfos[BuiltinTypeId.Object]); } } else { // Process base classes for (int i = 0; i < Ast.Bases.Count; i++) { var baseClassArg = Ast.Bases[i]; ddg.SetCurrentUnit(_baseEvals[i]); if (baseClassArg.Name != null) { if (baseClassArg.Name == "metaclass") { var metaClass = baseClassArg.Expression; metaClass.Walk(ddg); var metaClassValue = ddg._eval.Evaluate(metaClass); if (metaClassValue.Count > 0) { classInfo.GetOrCreateMetaclassVariable().AddTypes(_outerUnit, metaClassValue); } } continue; } var baseExpr = baseClassArg.Expression; var baseSet = EvaluateBaseClass(ddg, classInfo, i, baseExpr); bases.Add(baseSet); } } classInfo.SetBases(bases); foreach (var baseSet in bases) { foreach (var baseClassInfo in baseSet.OfType <ClassInfo>()) { baseClassInfo.Mro.AddDependency(this); } } ddg.SetCurrentUnit(this); ddg.WalkBody(Ast.Body, classInfo.AnalysisUnit); }