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