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); }
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); }
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);