private VariableResolveResult Node_Expr_StaticPropertyFetch(XmlNode node)
{
var classNode = node.GetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.Class);
var nameNode = node.GetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.Name);
if (classNode.TryGetSubNode(AstConstants.Node + ":" + AstConstants.Nodes.Name, out classNode) &&
classNode.TryGetSubNode(AstConstants.Subnode + ":" + AstConstants.Subnodes.Parts, out classNode) &&
classNode.TryGetSubNode(AstConstants.Scalar + ":" + AstConstants.Scalars.Array, out classNode) &&
classNode.TryGetSubNode(AstConstants.Scalar + ":" + AstConstants.Scalars.String, out classNode))
{
string className = classNode.InnerText;
if (className == "self" || className == "parent")
{
return new VariableResolveResult(new Variable("$UNKNOWN$", VariableScope.Class), true);
//throw new NotImplementedException("We need a way to handle class scopes before this can be effectively handled");
}
XmlNode nameStringNode;
if (nameNode.TryGetSubNode(AstConstants.Scalar + ":" + AstConstants.Scalars.String, out nameStringNode))
{
Variable field;
if (!_variableStorage.ClassVariables.TryGetValue(className, out field))
{
field = new Variable(className, VariableScope.Class);
_variableStorage.ClassVariables.Add(className, field);
}
if (field.Info.TryGetVariableByString(nameStringNode.InnerText, out field))
{
return new VariableResolveResult(field);
}
field = new Variable(nameStringNode.InnerText, VariableScope.Class);
_variableStorage.ClassVariables[className].Info.Variables.Add(new VariableTreeDimension() { Key = nameStringNode.InnerText }, field);
return new VariableResolveResult(field, true);
}
}
return new VariableResolveResult(new Variable("$UNKNOWN$", VariableScope.Class), true);
}