示例#1
0
        internal VariableDef CreateTypedVariable(Node node, AnalysisUnit unit, string name, IAnalysisSet types, bool addRef = true)
        {
            VariableDef res, outer, immediateOuter;

            if (!Variables.TryGetValue(name, out res))
            {
                // Normal CreateVariable would use AddVariable, which will put
                // the typed one in the wrong scope.
                res = base.AddVariable(name);
            }

            if (addRef)
            {
                res.AddReference(node, unit);
            }
            PropagateIsInstanceTypes(node, unit, types, res);

            outer = OuterScope.GetVariable(node, unit, name, addRef);
            if (OuterScope.Variables.TryGetValue(name, out immediateOuter) && immediateOuter != res)
            {
                if (addRef && immediateOuter != outer)
                {
                    res.AddReference(node, unit);
                }
                PropagateIsInstanceTypes(node, unit, types, immediateOuter);

                OuterScope.GetLinkedVariables(name).Add(res);
            }
            return(res);
        }
示例#2
0
        public override bool AssignVariable(string name, Node location, AnalysisUnit unit, IAnalysisSet values)
        {
            var vars = CreateVariable(location, unit, name, false);

            var res = AssignVariableWorker(location, unit, values, vars);

            if (OuterScope != null)
            {
                var outerVar = OuterScope.GetVariable(location, unit, name, false);
                if (outerVar != null && outerVar != vars)
                {
                    OuterScope.AssignVariable(name, location, unit, values);
                }
            }

            return(res);
        }
示例#3
0
 public override VariableDef GetVariable(Node node, AnalysisUnit unit, string name, bool addRef = true)
 => base.GetVariable(node, unit, name, addRef) ?? OuterScope.GetVariable(node, unit, name, addRef);