Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }