/// <summary> /// Creates a variable use from the given element. Must be a <see cref="ABB.SrcML.SRC.Expression"/>, <see cref="ABB.SrcML.SRC.Name"/>, or <see cref="ABB.SrcML.SRC.ExpressionStatement"/> /// </summary> /// <param name="element">The element to parse</param> /// <param name="context">The parser context</param> /// <returns>A variable use object</returns> // TODO make this fit in with the rest of the parse methods public virtual VariableUse CreateVariableUse(XElement element, ParserContext context) { XElement nameElement; if(element.Name == SRC.Name) { nameElement = element; } else if(element.Name == SRC.Expression) { nameElement = element.Element(SRC.Name); } else if(element.Name == SRC.ExpressionStatement || element.Name == SRC.Argument) { nameElement = element.Element(SRC.Expression).Element(SRC.Name); } else { throw new ArgumentException("element should be an expression, expression statement, argument, or name", "element"); } var lastNameElement = NameHelper.GetLastNameElement(nameElement); var variableUse = new VariableUse() { Location = context.CreateLocation(lastNameElement, true), Name = lastNameElement.Value, ParentScope = context.CurrentScope, ProgrammingLanguage = ParserLanguage, }; return variableUse; }
/// <summary> /// Creates a resolvable use from an expression /// </summary> /// <param name="element">The element to parse</param> /// <param name="context">The parser context</param> /// <returns>A resolvable use object</returns> // TODO make this fit in with the rest of the parse methods (rename to parse) public virtual IResolvesToType CreateResolvableUse(XElement element, ParserContext context) { var use = new VariableUse() { Location = context.CreateLocation(element, true), ParentScope = context.CurrentScope, ProgrammingLanguage = ParserLanguage, }; return use; }