internal NamespaceBuilder CreateNamespace(Importer.XmlReader reader, string uri, string prefix, string qualifiedName) { if (qualifiedName == null) { qualifiedName = "Ns" + (++this.namespaceCounter); } NamespaceBuilder result = this.GetNamespace(uri); if (result != null) { if (result.Uri != uri) { this.AddWarning("Namespace '" + result.FullName + "' has conflicting URIs: '" + result.FullName + "' and '" + uri + "'", reader.Uri, LinePositionSpan.Zero); } return(result); } string[] names = qualifiedName.Split('.'); int i = 0; NamespaceBuilder currentNs = null; while (i < names.Length) { if (i == 0) { NamespaceBuilder rootNs = this.Model.Symbols.OfType <NamespaceBuilder>().FirstOrDefault(ns => ns.Name == names[0] && ns.Namespace == null); currentNs = rootNs; } else { currentNs = currentNs.Declarations.OfType <NamespaceBuilder>().FirstOrDefault(ns => ns.Name == names[i]); } if (currentNs != null) { ++i; } else { NamespaceBuilder parentNs = currentNs; while (i < names.Length) { NamespaceBuilder ns = this.Factory.Namespace(); ns.Name = names[i]; ns.Namespace = parentNs; ++i; if (i == names.Length) { ns.Prefix = prefix; ns.Uri = uri; result = ns; this.namespaces.Add(uri, ns); } parentNs = ns; } } } return(result); }
private void RegisterReader(string uri, Importer.XmlReader reader) { HashSet <Importer.XmlReader> rs; if (!this.readers.TryGetValue(uri, out rs)) { rs = new HashSet <Importer.XmlReader>(); this.readers.Add(uri, rs); } rs.Add(reader); }
internal TObject Register(Importer.XmlReader reader, XName xname, TXObject xobj, TObject obj, bool allowReverse = true) { TObject oldObject = null; if (this.objectsByName.TryGetValue(xname, out oldObject)) { TXObject oldElem = this.elementsByObject[oldObject]; this.importer.AddError("The " + this.name + " '" + xname + "' is already imported from '" + oldElem.BaseUri + "' at '" + SoalImporter.GetLinePositionSpan(oldElem) + "'.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj)); return(null); } if (this.objectsByElement.TryGetValue(xobj, out oldObject)) { TXObject oldElem = this.elementsByObject[oldObject]; this.importer.AddError("The " + this.name + " '" + xname + "' has already an object assigned to it.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj)); return(null); } TXObject oldXObject = null; if (this.elementsByName.TryGetValue(xname, out oldXObject)) { this.importer.AddError("The " + this.name + " '" + xname + "' is already registered to '" + oldXObject.BaseUri + "' at '" + SoalImporter.GetLinePositionSpan(oldXObject) + "'.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj)); return(null); } this.objectsByName.Add(xname, obj); this.objectsByElement.Add(xobj, obj); this.elementsByName.Add(xname, xobj); if (allowReverse) { if (this.elementsByObject.TryGetValue(obj, out oldXObject)) { this.importer.AddError("The object is alredy registered to " + this.name + " in '" + oldXObject.BaseUri + "' at '" + SoalImporter.GetLinePositionSpan(oldXObject) + "'.", reader.Uri, SoalImporter.GetLinePositionSpan(xobj)); return(null); } if (!this.elementsByObject.ContainsKey(obj)) { this.elementsByObject.Add(obj, xobj); } } return(obj); }