protected virtual void AnalyzeWorker(DDG ddg, CancellationToken cancel) { DeclaringModule.Scope.ClearLinkedVariables(); ddg.SetCurrentUnit(this); Ast.Walk(ddg); List <KeyValuePair <string, VariableDef> > toRemove = null; foreach (var variableInfo in DeclaringModule.Scope.Variables) { variableInfo.Value.ClearOldValues(ProjectEntry); if (variableInfo.Value._dependencies.Count == 0 && variableInfo.Value.TypesNoCopy.Count == 0) { if (toRemove == null) { toRemove = new List <KeyValuePair <string, VariableDef> >(); } toRemove.Add(variableInfo); } } if (toRemove != null) { foreach (var nameValue in toRemove) { DeclaringModule.Scope.RemoveVariable(nameValue.Key); // if anyone read this value it could now be gone (e.g. user // deletes a class definition) so anyone dependent upon it // needs to be updated. nameValue.Value.EnqueueDependents(); } } }
protected override void AnalyzeWorker(DDG ddg, CancellationToken cancel) { ddg.SetCurrentUnit(this); InterpreterScope scope; if (!ddg.Scope.TryGetNodeScope(Ast, out scope)) { return; } var classInfo = ((ClassScope)scope).Class; var bases = ClassAnalysisUnit.EvaluateBaseClass( ddg, classInfo, _indexInBasesList, _baseClassNode ); classInfo.SetBase(_indexInBasesList, bases); _outerUnit.Enqueue(); }
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); }