//TODO: implement support for using blocks, once SrcML has been fixed to parse them correctly ///// <summary> ///// Gets all of the variable declarations from a container ///// </summary> ///// <param name="container">the container</param> ///// <param name="fileUnit">the containing file unit</param> ///// <returns>An enumerable of variable declarations</returns> //public override IEnumerable<VariableDeclaration> GetVariableDeclarationsFromContainer(XElement container, XElement fileUnit, Scope parentScope) { // if(null == container) return Enumerable.Empty<VariableDeclaration>(); // if(container.Name != SRC.Using) { return // base.GetVariableDeclarationsFromContainer(container, fileUnit, parentScope); } //parse // using typeUseElement //} #region Private methods private NamespaceUse CreateNamespaceUsePrefix(XElement nameElement, ParserContext context) { IEnumerable <XElement> parentNameElements = Enumerable.Empty <XElement>(); parentNameElements = NameHelper.GetNameElementsExceptLast(nameElement); NamespaceUse current = null, root = null; if (parentNameElements.Any()) { foreach (var element in parentNameElements) { var namespaceUse = new NamespaceUse { Name = element.Value, Location = context.CreateLocation(element, false), ProgrammingLanguage = this.ParserLanguage, }; if (null == root) { root = namespaceUse; } if (current != null) { current.ChildScopeUse = namespaceUse; } current = namespaceUse; } } return(root); }
private NamespaceUse CreateNamespaceUsePrefix(XElement nameElement, ParserContext context) { IEnumerable<XElement> parentNameElements = Enumerable.Empty<XElement>(); parentNameElements = NameHelper.GetNameElementsExceptLast(nameElement); NamespaceUse current = null, root = null; if(parentNameElements.Any()) { foreach(var element in parentNameElements) { var namespaceUse = new NamespaceUse { Name = element.Value, Location = context.CreateLocation(element, false), ProgrammingLanguage = this.ParserLanguage, }; if(null == root) { root = namespaceUse; } if(current != null) { current.ChildScopeUse = namespaceUse; } current = namespaceUse; } } return root; }
/// <summary> /// Creates an <see cref="Alias"/> object from a using import (such as using in C++ and C# and import in Java). /// </summary> /// <param name="aliasStatement">The statement to parse. Should be of type <see cref="AliasElementName"/></param> /// <param name="context">The context to place the resulting alias in</param> /// <returns>a new alias object that represents this alias statement</returns> public Alias ParseAliasElement(XElement aliasStatement, ParserContext context) { if(null == aliasStatement) throw new ArgumentNullException("aliasStatement"); if(aliasStatement.Name != AliasElementName) throw new ArgumentException(String.Format("must be a {0} statement", AliasElementName), "usingStatement"); var alias = new Alias() { Location = context.CreateLocation(aliasStatement, true), ProgrammingLanguage = ParserLanguage, }; IEnumerable<XElement> namespaceNames = GetNamesFromAlias(aliasStatement); if(!AliasIsNamespaceImport(aliasStatement)) { var lastNameElement = namespaceNames.LastOrDefault(); namespaceNames = from name in namespaceNames where name.IsBefore(lastNameElement) select name; alias.ImportedNamedScope = new NamedScopeUse() { Name = lastNameElement.Value, Location = context.CreateLocation(lastNameElement), ProgrammingLanguage = ParserLanguage, }; } NamespaceUse current = null; foreach(var namespaceName in namespaceNames) { var use = new NamespaceUse() { Name = namespaceName.Value, Location = context.CreateLocation(namespaceName), ProgrammingLanguage = ParserLanguage, }; if(alias.ImportedNamespace == null) { alias.ImportedNamespace = use; current = use; } else { current.ChildScopeUse = use; current = use; } } return alias; }